hi hoffe Ihr könnt mir helfen :)
habe mal hinter jedem Vorgang ein kommentar hinterlassen damit ihr es
versteht :)
Mein Problem: ich bekomme die while Schleife nicht richtig zu laufen :/
er gibt mir in der Konsole nur 1 oder 0 raus aber kein ganzes Byte.
Hoffe ihr wisst wo der Fehler liegt.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int w = 1, rest, eingabe, bin = 0, q=1, max = 9;
cout << "geben sie eine zahl kleiner als 256 ein: ";
cin >> rest; //eingabe der Dez. Zahl
while(w<max) // soll 8 mal wiederholt werden
{
rest = rest%2; // rest ist = 1 oder 0
w = w++; // auf w wird 1 inkrementiert
if(rest<=1) // wenn der rest größer oder gleich 1 ist
bin + q; // addiere 1 auf bin
else
bin + 0;
q = q*10; // nehme q*10, 8 durchgänge= 1,10,100,1000,10000 ....
}
cout << rest; //gebe nach 8 durchläöufen den rest aus.
cin.get();
cin.get();
return 0;
}
Sorry das ich das mal so sagen muss, aber der Code ist Scheisse.
Auch wenn es so vielleicht funktionieren mag, das ist so richtiges
Ghetto-C.
Im einzelnen:
1. Einrücken (ja, immer und auf jeden Fall)
2. Klammern setzen bei if und else (um dangling else zu verhindern)
3. Eine Zeile pro Deklaration
4. Variablen initialisieren
5. Variablen richtig deklarieren (w nicht als int sondern z.B. als
unsigned char)
6. statt "while(w<max)" besser "while (w < max)"
7. w = w++; (ohne worte)
8. was soll das doppelte "cin.get()"
ohne Anspruch auf Vollständigkeit....
@ sebastian
ah natürlich, manchmal hat man echt nen brett vorm kopf,
mhh funktioniert immer noch nicht :/
@Klaus ja ich weiß das hatte ich auch erst so aber da ich anfänger bin
bin ich schnell verunsichert :/
@Speedy
Ja ich weiß :)
ich bin noch glatter Anfänger danke für deine Tipps, aus Fehlern lernt
man besser ich werde die mal abarbeiten :)
PS: bei einem cin.get(); schließt sich das Konsolenfenster sofort nach
eingabe der Zahl, bei 2 nicht.
werde mich gleich erneut melden;
Habe alles geändert, aber es will einfach nur 1 oder 0 anzeigen
ichverstehe es nicht :(
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int rest = 0, bin = 0, max = 9;
char w = 1, q = 1;
cout << "geben sie eine zahl kleiner als 256 ein: ";
cin >> rest; //eingabe der Dez. Zahl
while(w < max) // soll 8 mal wiederholt werden
{
rest = rest%2; // rest ist = 1 oder 0
w++; // auf w wird 1 inkrementiert
if(rest<=1) // wenn der rest größer oder gleich 1 ist
{bin + q;} // addiere 1 auf bin
else
{bin + 0;}
q = q*10; // nehme q*10, 8 durchgänge= 1,10,100,1000,10000 ....
}
cout << bin; //gebe nach 8 durchläöufen den rest aus.
cin.get();
cin.get();
return 0;
}
Jan schrieb:> bin + q; // addiere 1 auf bin
Dieser Code hat keinen Effekt, und ...
> bin + 0;
dieser erst recht nicht. Du rechnest da nur aus, was rauskommt, wenn du
zu bin q dazuaddierst, dann schmeißt du das Ergebnis ungesehen weg. Hast
du da keine Warnung vom Compiler erhalten?
Speedy schrieb:> 5. Variablen richtig deklarieren (w nicht als int sondern z.B. als> unsigned char)
Warum sollte unsigned char besser sein als int?
Jan schrieb:> @rolf> doch habe ich aber ich wusste nicht wieso,> warum schmeiss ich es denn umgehend weg?
weil du nichts mit dem Ergebnis tust!
du rechnest
5 + 3
schön.
Und?
Nix und. Es gibt kein und. Da kommt irgendein Ergebnis aus, aber du tust
nichts damit.
zb in einer Variablen speichern
i = 5 + 3;
oder direkt ausgeben
printf( "%d", 5 + 3 );
oder das Ergebnis an eine Funktion weitergeben
MeineFunktion( 5 + 3 );
das alles sind Beispiele, bei denen mit dem Ergebnis etwas gemacht wird.
Aber bei
5 + 3;
tust du nichts mit dem Ergebnis. Du lässt es ausrechnen und dann
verschwindet es auf nimmer wiedersehen im Bithimmel.
so okay ich komme weiter aber noch nciht ganz,
er gibt jetzt immer 11111111 aus egal welche Zahl, aber meckern tut der
compiler nicht mehr :) Und nochmal großen Dank für eure Hilfe ^^
hier der neue code, habe ihn etwas verfeinert
// deztobin.cpp : Definiert den Einstiegspunkt für die
Konsolenanwendung.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int rest = 0, bin = 0, max = 8, i = 0, w = 0, q = 1, leer = 0;
cout << "geben sie eine zahl kleiner als 256 ein: ";
cin >> rest; //eingabe der Dez. Zahl
while(w < max) // soll 8 mal wiederholt werden
{
rest = rest%2; // rest ist = 1 oder 0
w++; // auf w wird 1 inkrementiert
if(rest<=1) // wenn der rest größer oder gleich 1 ist
{i+= q;} // addiere 1 auf bin
else
{i+= leer;}
q = q*10; // nehme q*10, 8 durchgänge= 1,10,100,1000,10000 ....
}
cout << i; //gebe nach 8 durchläöufen den rest aus.
cin.get();
cin.get();
return 0;
}
// Convert a decimal integer do a binary string
// added a test printf() you can remove later
// Turbo C modified for Pelles C vegaseat 19nov2004
#include <stdio.h>
void dec2bin(long decimal, char *binary);
int main()
{
long decimal;
char binary[80];
printf("\n\n Enter an integer value : ");
scanf("%ld",&decimal);
dec2bin(decimal,binary);
printf("\n The binary value of %ld is %s \n",decimal,binary);
getchar(); // trap enter
getchar(); // wait
return 0;
}
//
// accepts a decimal integer and returns a binary coded string
//
void dec2bin(long decimal, char *binary)
{
int k = 0, n = 0;
int neg_flag = 0;
int remain;
int old_decimal; // for test
char temp[80];
// take care of negative input
if (decimal < 0)
{
decimal = -decimal;
neg_flag = 1;
}
do
{
old_decimal = decimal; // for test
remain = decimal % 2;
// whittle down the decimal number
decimal = decimal / 2;
// this is a test to show the action
printf("%d/2 = %d remainder = %d\n", old_decimal, decimal, remain);
// converts digit 0 or 1 to character '0' or '1'
temp[k++] = remain + '0';
} while (decimal > 0);
if (neg_flag)
temp[k++] = '-'; // add - sign
else
temp[k++] = ' '; // space
// reverse the spelling
while (k >= 0)
binary[n++] = temp[--k];
binary[n-1] = 0; // end with NULL
}
mfg
Jan schrieb:> @klaus einfach ignorieren ind er klammer stand auch mal was anderes ;),> es hat mal gepasst^^
soll ich auch ignorieren dass du 8 mal prüfst
ob deine eingebene Zahl gerade oder ungerade ist ?
und übrigens:
rest = rest%2;
schaut schon wieder aus wie:
rest = rest++;
aber ich ignoriere das jetzt mal...
Klaus
Jan schrieb:> ach sehe grade habe die kommentare noch nicht angepasst also einfach> ignorieren :)
Die ignorieren wir sowieso.
Weil deine Kommentare, so wie bei allen Neulingen, sinnlose Kommentare
sind.
Mio hat weiter oben den meiner Meinung nach wichtigsten Tip gegeben:
Erfinde eine Zahl und geh dein Programm selber durch (du spielst
Computer).
Schnapp dir Papier und Bleistift und mach alle Anweisungen, die dir dein
Programm vorschreibt. Dein Einstieg ist nach
cin >> rest;
Welche Beleung haben zu diesem Zeitpunkt deine Variablen, das schreibst
du dir auf einem Papier auf und ab dort übernimmst jetzt du das Kommando
und arbeitest dein Programm Befehl für Befehl weiter durch. Du machst
genau das, und nur genau das, was der Programmtext von dir fordert.
Das hat dann auch den Vorteil, dass du ein wenig Gefühl dafür bekommst,
was die Anweisungen eigentlich machen (und ich hoffe mal, du weißt
wenigstens in der Theorie was jede Anweisung für sich alleine gesehen
eigentlich tun soll)
Jan schrieb:> @klaus einfach ignorieren ind er klammer stand auch mal was anderes ;),> es hat mal gepasst^^
Schon.
Aber der Kommentar an sich ist SChwachsinn.
Warum soll ich mir zu
if( rest <= 1 )
als Kommentar dazuschreiben: Wenn rest kleiner oder gleich 1 ist.
Das diese Operation hier passiert, das sehe ich im Source Code genau so
gut. Das brauch ich mir nicht dazuschreiben.
Du malst ja auch nicht ein rotes Kästchen auf Papier und schreibst dann
daneben hin, das das jetzt ein rotes Kästchen ist.
Klaus schrieb:> und übrigens:>> rest = rest%2;>> schaut schon wieder aus wie:>> rest = rest++;
Ist es aber nicht. rest = rest++ ist undefiniertes Verhalten,
rest = rest%2 ist sehr wohl definiert. Ob es jetzt in diesem Kontext
eine sinnvolle Rechnung ist, ist nochmal eine andere Sache.
Jan schrieb:> so okay ich komme weiter aber noch nciht ganz,> er gibt jetzt immer 11111111 aus egal welche Zahl, aber meckern tut der> compiler nicht mehr :)> cin >> rest; //eingabe der Dez. Zahl> while(w < max) // soll 8 mal wiederholt werden> {> rest = rest%2; // rest ist = 1 oder 0
Überleg dir mal, was hier passiert. Was wird beim ersten
Schleifendurchlauf nach dieser Zeile aus rest? Was bedeutet das für die
nachfolgenden Durchläufe?
So danke nochmal :) jetzt klappt es :)
meine Fehler:
0 bzw. werden auf rest gespeichert damit rechne ich ja weiter habe dden
int eingabe hinzugefügt und denn dahinter immer durch 2 geteilt ^^
und der vergleichs operator <= wurde auf >= um geändert :)
jetzt Zeigt er mir die Binomische Zahl richtig von rechts nach links an
:) heir nochmal jetzt der Frische code
@ usr
danke aber erstens ist der mir zu kompliziert und 2. macht es ja dann
keinen spaß wenn man einen fertigen code bekommt :)
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int rest = 0, bin = 0, max = 8, i = 0, w = 0, q = 1, leer = 0, eingabe =
0;
cout << "\n\geben sie eine zahl kleiner als 256 ein: ";
cin >> eingabe;
while(w < max)
{
rest = eingabe%2;
eingabe = eingabe/2; // eingabe reingeholt um richtig weiter zu rechnen
:)
w++;
if(rest>=1) // vorher <=
{i = i + q;}
else
{i = i + leer;}
q = q*10;
}
cout << i;
cin.get();
cin.get();
main();
return 0;
}
Wegstaben Verbuchsler schrieb:> Jan schrieb:>> die Binomische Zahl>> ich glaube, du verwendest da den falschen Begriff für das was du da> errechnet hast ....
Ja, ja, so sind sie, unsere Berufsschüler, Studenten, Bachelors und
Masters: "binomisch" nicht von "binär" unterscheiden können... ;-)
ja mg ich war müde xD
ich weiß das die binomischen Zahlen aus der Mathematik kommen xD
@speedy was ist daran so falsch es funktioniert doch?
Und ein bischen freundlichkeit schadet nicht ;)
Was funktioniert?
i = i + leer?
das kann man genausogut weglassen.
Die Konstante leer die hier fälschlicherweise als Variable deklariet
ist, ist "0".
Addition mit 0.
Weitere fragen?
Man Speedy, nicht jeder kann als so ein Programmiergott wie Du auf die
Welt kommen.
Es hat sich im Laufe des Threads ja wohl herausgestellt das Jan Anfänger
ist.
Man probiert, macht Fehler und lernt aus Fehlern. Man lernt nicht, wenn
man mit arrogant wirkenden Postings belegt wird - das frustriert eher.
Hilfreicher, und didaktisch sinnvoller wäre es doch gewesen, Jan zu
fragen warum er diese Anweisung im Code hat und warum sein Programm dann
doch keine führenden 0-en ausgibt, die er ja wohl beabsichtigt hat.
Und vielleicht hätte er dann auch verstanden, dass seine Vorstellung zum
Inhalt von i falsch ist.