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; }
und w = w++; ist auch nicht gut. Entweder: w++; oder: w=w+1; oder: w+=1; Gruß, Klaus
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....
> rest = rest%2; // rest ist = 1 oder 0 > : > if(rest<=1) rest ist IMMER kleiner oder gleich 1 da rest nur 0 oder 1 sein kann
@ 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; }
Speedy schrieb: > 5. Variablen richtig deklarieren (w nicht als int sondern z.B. als > unsigned char) Warum?
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?
@rolf doch habe ich aber ich wusste nicht wieso, warum schmeiss ich es denn umgehend weg? wie soll ich das den sonst machen? MfG
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; }
ach sehe grade habe die kommentare noch nicht angepasst also einfach ignorieren :)
der Kommentar hat aber noch nie gepasst: if(rest<=1) // wenn der rest größer oder gleich 1 ist Klaus
{i+= q;} erzeugt das gleiche wie i = i + q daselbe gillt für i+= leer
@klaus einfach ignorieren ind er klammer stand auch mal was anderes ;), es hat mal gepasst^^
Nimm doch mal eine Beispiel-Zahl und geh Deinen Programm-Code von Hand durch.
// 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?
ah danke euch allen habe den fehler glaube ich gefunden, anstoß durch Rolf :) werde es morgen mal ändern :),
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; }
Jan schrieb: > die Binomische Zahl ich glaube, du verwendest da den falschen Begriff für das was du da errechnet hast ....
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... ;-)
Am geilsten ist immer noch i = i + leer. Das zeigt das er null kapiert hat war er hier macht.
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.