Problem mit Binärrechner, Array und Compilerausgabe
-
Und
for(i=ceil(y); i>0; i--);
ist eine ziemlich unübersichtliche Schreibweise für
i=0;
.Durch das ; am Ende der for-Schleife erzeugst du eine leere Anweisung. D.h. die for-Schleife tut nichts außer i zu dekrementieren bis es 0 ist.
-
DANrulz81 schrieb:
O.k. Sollte ich dem Fall den Array erst definieren, wenn ich i durch ceil(y) ermittelt habe?
Wäre eine Idee, ja.
-
O.k. Danke, das habe ich gemacht, und er durchläuft die Schleife nun i mal.
DirkB schrieb:
Und
for(i=ceil(y); i>0; i--);
ist eine ziemlich unübersichtliche Schreibweise für
i=0;
.Durch das ; am Ende der for-Schleife erzeugst du eine leere Anweisung. D.h. die for-Schleife tut nichts außer i zu dekrementieren bis es 0 ist.
Da sollte aber i nicht mehr 0 sein, sondern ceil(y), also bei x = 5 sollte da dann i = 3 sein.
SeppJ schrieb:
DANrulz81 schrieb:
Wie kann ich die Ausgabe so einrichten, dass er automatisch die Zeichen setzt und das diese dann in der richtigen Reihenfolge mit "array[2], array[1], array[0]" gefüllt werden, ohne die Unmenge an Schreibarbeit, jeden Teil des Arrays einzufügen? Ich hoffe, ich habe mich verständlich ausgedrückt
Mit einer Schleife.
Ja, aber wie mache ich das am geschicktesten? Mit einer FOR - Schleife?
-
DANrulz81 schrieb:
SeppJ schrieb:
DANrulz81 schrieb:
Wie kann ich die Ausgabe so einrichten, dass er automatisch die Zeichen setzt und das diese dann in der richtigen Reihenfolge mit "array[2], array[1], array[0]" gefüllt werden, ohne die Unmenge an Schreibarbeit, jeden Teil des Arrays einzufügen? Ich hoffe, ich habe mich verständlich ausgedrückt
Mit einer Schleife.
Ja, aber wie mache ich das am geschicktesten? Mit einer FOR - Schleife?
Da habe ich eine gute Idee: Mach es einmal mit while, einmal mit do...while und einmal mit for. Und meinetwegen auch einmal mit if und goto. Und hinterher entscheidest du, welches das geste war. Da lernst du viel bei.
-
DANrulz81 schrieb:
Da sollte aber i nicht mehr 0 sein, sondern ceil(y), also bei x = 5 sollte da dann i = 3 sein.
Das ist aber immer noch eine Schleife. Und die wird solange durchlaufen wie i > 0 ist.
Du fängst mit i=3 an.
i ist jetzt 3 und damit > 0 als wird die (leere) Schleifenanweisung bearbeitet und dann i-- gemacht.
i ist jetzt 2 und damit > 0 als wird wieder die (leere) Schleifenanweisung bearbeitet und dann i--
i ist jetzt 1 und damit > 0 als wird wieder die (leere) Schleifenanweisung bearbeitet und dann i--
i ist jetzt 0 und damit nicht mehr > 0 , die Schleife ist fertig.
-
DANrulz81 schrieb:
DirkB schrieb:
Und
for(i=ceil(y); i>0; i--);
ist eine ziemlich unübersichtliche Schreibweise für
i=0;
.Durch das ; am Ende der for-Schleife erzeugst du eine leere Anweisung. D.h. die for-Schleife tut nichts außer i zu dekrementieren bis es 0 ist.
Da sollte aber i nicht mehr 0 sein, sondern ceil(y), also bei x = 5 sollte da dann i = 3 sein.
Probiere mal aus:
int i; for(i=5; i>0; i--); printf("Durchgang "); printf("%d\n", i);
vs.
int i; for(i=5; i>0; i--) printf("Durchgang: "); printf("%d\n", i);
vs.
int i; for(i=5; i>0; i--) { printf("Durchgang: "); printf("%d\n", i); }
-
@DANrulz81
Hast du schon mit einer anderen Sprache programmiert?
-
DirkB schrieb:
@DANrulz81
Hast du schon mit einer anderen Sprache programmiert?Ja, ich habe mit QBasic angefangen, als ich 9 war. Das ist jetzt 21 Jahre her
, und bin meistens bei Basic geblieben, bis auf 1 Jahre Pascal in der Schule. Und seit 2000 auch immer mal wieder ein bisschen Assembler. Nun hab ich mich entschieden, C zu lernen, da ich das auch mal für Mikrocontroller einsetzen möchte.
DaRe schrieb:
DANrulz81 schrieb:
DirkB schrieb:
Und
for(i=ceil(y); i>0; i--);
ist eine ziemlich unübersichtliche Schreibweise für
i=0;
.Durch das ; am Ende der for-Schleife erzeugst du eine leere Anweisung. D.h. die for-Schleife tut nichts außer i zu dekrementieren bis es 0 ist.
Da sollte aber i nicht mehr 0 sein, sondern ceil(y), also bei x = 5 sollte da dann i = 3 sein.
Probiere mal aus:
int i; for(i=5; i>0; i--); printf("Durchgang "); printf("%d\n", i);
vs.
int i; for(i=5; i>0; i--) printf("Durchgang: "); printf("%d\n", i);
vs.
int i; for(i=5; i>0; i--) { printf("Durchgang: "); printf("%d\n", i); }
O.k., danke. Das hab ich nun bei mir geändert:
#include <math.h> #include <stdio.h> int main() { double y; int x=0, i=0, rest=0, uebertrag=0; printf("\nBitte eine Zahl eingeben: "); scanf("%i",&x); y = log(x)/log(2); printf("\n\nBin\x84re L\x84nge: %lf , also ist sie %1.lf Bits lang\n\n\n", y, ceil(y)); i=ceil(y); int bin[i]; for(i=ceil(y); i>0; i--){ rest=x%2; // printf("\n***%i",x); // printf("\n***%i", rest); bin[i]=rest; uebertrag=x/2; // printf("\n***%i\n\n", uebertrag); rest=uebertrag%2; // printf("\n***%i",rest); bin[i]=rest; x=uebertrag/2; // printf("\n***%i\n\n",x); } /*printf("%i", bin[0]);*/ return 0; }
-
Und wie lernst du gerade C?
Hast du ein Buch oder ein Tutorial?
-
DirkB schrieb:
Und wie lernst du gerade C?
Hast du ein Buch oder ein Tutorial?Zwei Bücher und auch ein bisschen im Internet.
Bücher sind diese:
http://www.amazon.de/C-Programmieren-Anfang-Helmut-Erlenkötter/dp/3499600749/ref=sr_1_1?ie=UTF8&qid=1324471048&sr=8-1Zu Weihnachten kommt noch dieses dazu:
http://www.amazon.de/von-bis-umfassende-Handbuch-Computing/dp/3836214113/ref=sr_1_1?s=books&ie=UTF8&qid=1324471172&sr=1-1Und Tutorials was sich halt so findet. Ich versuche halt so oft wie möglich zu programmieren, um das zu festigen und nicht alles gleich wieder zu vergessen.
-
DANrulz81 schrieb:
Zu Weihnachten kommt noch dieses dazu:
http://www.amazon.de/von-bis-umfassende-Handbuch-Computing/dp/3836214113/ref=sr_1_1?s=books&ie=UTF8&qid=1324471172&sr=1-1Ah, du bist in die Wolf-Falle getappt. Kein Wunder, dass das alles so daneben geht; dieser spezielle Autor ist hier schon einschlägig bekannt, und er beherrscht die Sprache sicher nicht gut genug, um Bücher darüber zu schreiben.
Ein gut gemeinter Rat: Wirf diese Bücher weg (bzw. gib sie nach Weihnachten zurück), bevor du sein Halbwissen und seine schlechten Angewohnheiten übernimmst, und halte dich in der Zukunft an renommierte Fachbuchverlage wie O'Reilly oder Addison-Wesley, die einen Ruf zu verteidigen haben. Vor Galileo Computing müssen wir hier immer wieder warnen.
-
Ah, du bist in die Wolf-Falle getappt. Kein Wunder, dass das alles so daneben geht; dieser spezielle Autor ist hier schon einschlägig bekannt, und er beherrscht die Sprache sicher nicht gut genug, um Bücher darüber zu schreiben.
Ein gut gemeinter Rat: Wirf diese Bücher weg (bzw. gib sie nach Weihnachten zurück), bevor du sein Halbwissen und seine schlechten Angewohnheiten übernimmst, und halte dich in der Zukunft an renommierte Fachbuchverlage wie O'Reilly oder Addison-Wesley, die einen Ruf zu verteidigen haben. Vor Galileo Computing müssen wir hier immer wieder warnen.
O.k. Schade, zumal ich dieses Buch aufgrund der Empfehlung hier auf der Seite gekauft habe: http://www.c-plusplus.net/cms/modules.php?op=modload&name=mbBooks&file=index&func=isbn&isbn=3898423921
Ich hab jetzt nochmals den Code überarbeitet, allerdings kommt immer noch nichts gescheites bei raus:
#include <math.h> #include <stdio.h> int main() { double y; int x=0, i=0, rest=0, uebertrag=0, zaehler=0; printf("\nBitte eine Zahl eingeben: "); scanf("%i",&x); y = log(x)/log(2); /*Länge der binären Zahl ermitteln*/ printf("\n\nBin\x84re L\x84nge: %2.lf , also ist sie %1.lf Bits lang\n\n\n", y, ceil(y)); i=ceil(y); int bin[i]; for(i=ceil(y); i>0; i--){ rest=x%2; bin[i]=rest; uebertrag=x/2; i--; rest=uebertrag%2; bin[i]=rest; x=uebertrag/2; }; for(zaehler=ceil(y); zaehler>0; zaehler--){ printf("%i ",bin[i++]); }; return 0; }
-
Wenn du schon programmieren kannst wäre auch der K&R etwas für dich.
http://www.amazon.de/Programmieren-Reference-Manual-deutscher-Sprache/dp/3446138781/ref=sr_1_4?ie=UTF8&qid=1324477385&sr=8-4
Wenn du gut Englisch kannst, nimm lieber das Original.Das Buch beschreibt die Grundlagen von C und vermittelt auch die Denkweise dahinter. Leider nur bis C89, also VLA werden noch nicht behandelt.
DANrulz81 schrieb:
..., allerdings kommt immer noch nichts gescheites bei raus:
Leider hilft diese Art von Fehlermeldung uns hier nicht weiter.
Was passiert, wie ist die Aussgabe und was erwartest du?
-
DirkB schrieb:
Leider hilft diese Art von Fehlermeldung uns hier nicht weiter.
Was passiert, wie ist die Aussgabe und was erwartest du?Sorry, mein Fehler. Ich erwarte eine Ausgabe ähnlich dieser:
1 0 1 0 0 0 1
Bekomme aber diese:
-
Ohne das Programm gelesen zu haben: Du liest und/oder schreibst über die Grenzen eines Arrays. Denk dran, dass diese bei 0 losgehen. Falls du denkst, trotzdem alles richtig gemacht zu haben, benutze einen Debugger, damit findet man solche Fehler ganz leicht, daher ist es eine gute Idee, den Umgang damit zu lernen.
-
SeppJ schrieb:
Ohne das Programm gelesen zu haben: Du liest und/oder schreibst über die Grenzen eines Arrays. Denk dran, dass diese bei 0 losgehen. Falls du denkst, trotzdem alles richtig gemacht zu haben, benutze einen Debugger, damit findet man solche Fehler ganz leicht, daher ist es eine gute Idee, den Umgang damit zu lernen.
Da hast du sicher recht. Ich benutzte Code::Blocks mit dem GCC - Compiler. Dort ist ein Debugger dabei, der erstellt mir immer eine .exe und eine .o . Die exe führt er natürlich aus, die .o bringt mir leider keine Infos, nur kryptische Zeichen. Hast du einen Vorschlag, welcher Debugger gut und leicht zu bedienen ist?
-
Mit der Brechstange:
#include <math.h> #include <stdio.h> int main() { double y; int x=0, i=0, rest=0, uebertrag=0, zaehler=0; printf("\nBitte eine Zahl eingeben: "); scanf("%i",&x); y = log(x)/log(2); /*Länge der binären Zahl ermitteln*/ printf("\n\nBin\x84re L\x84nge: %2.1f , also ist sie %1.f Bits lang\n\n\n", y, ceil(y)); // gcc %lf i=ceil(y); int bin[i]; for(i=ceil(y); i>0; i--) { rest=x%2; bin[i]=rest; uebertrag=x/2; i--; rest=uebertrag%2; bin[i]=rest; x=uebertrag/2; }; for(zaehler=1; zaehler<ceil(y)+1; zaehler++) { printf("%i ",bin[zaehler]); }; return 0; }
Da sollten noch ein paar Zeilen zu viel drin sein. Und auch sonst hab ich den Verdacht das das noch eleganter geht :xmas1:
P.S. mein gcc mag wie ich den betreibe kein
printf("%2.lf");
-> elef nicht einsef
MfG f.-th.
-
Die große Zahl am Anfang kommt daher, dass du nicht das Element bin[0] beschreibst, aber ausliest. Arrays fangen in C immer bei 0 an
for(i=ceil(y)-1; i>=0; i--) { bin[i] = x%2; x=x/2; }; for(zaehler=0; zaehler<ceil(y); zaehler++) { printf("%i ",bin[zaehler]); };
Du kannst auch aus dem cmd-Fenster kopieren. Mit der Maus markieren und dann das Symbol oben links in der Titelzeile anklicken bearbeiten->kopieren.
-
@f.-th.
Danke, so funktioniert es. Ist eigentlich logisch:for(zaehler=1; zaehler<ceil(y)+1; zaehler++) { printf("%i ",bin[zaehler]); };
Die for - Schleife beginnt bei 1. Solange der Zähler noch kleiner ceil(y)+1 ist, wird der Zähler inkrementiert und als Arraynummer verwendet.
Das geht sicher eleganter, nur bin ich schon froh, dass ich das so hinbekommen habe. Außerdem wollte ich einen Binärumrechner programmieren, der eine variable Länge von Zahlen umrechnen kann. Da hab ich bis jetzt immer nur Beispiele mit fester länge gefunden.
-
Ich hab noch einen Fehler gefunden:
Immer wenn ich eine Zahl eingegeben habe, die nur ein 1 und den Rest 0 erzeugte, gab es ein fehlerhafte Darstellung:
Bitte eine Zahl eingeben: 4 Binäre Länge: 2.000000 , also ist sie 2 Bits lang 0 0 Process returned 0 (0x0) execution time : 1.837 s Press any key to continue.
Hier nochmal der vollständige und funktionierende Code:
#include <math.h> #include <stdio.h> int main() { double y; int x=0, i=0, rest=0, uebertrag=0, zaehler=0; printf("\nBitte eine Zahl eingeben: "); scanf("%i",&x); y = log(x)/log(2); /*Länge der binären Zahl ermitteln*/ y=y+0.0001; printf("\n\nBin\x84re L\x84nge: %lf , also ist sie %1.lf Bits lang\n\n\n", y, ceil(y)); i=ceil(y); int bin[i]; for(i=ceil(y); i>0; i--){ rest=x%2; bin[i]=rest; uebertrag=x/2; i--; rest=uebertrag%2; bin[i]=rest; x=uebertrag/2; }; for(zaehler=1; zaehler<ceil(y)+1; zaehler++) { printf("%i ",bin[zaehler]); }; printf("\n\n"); return 0; }
Vielen Dank an alle für die Geduld und Hilfe.
@DirkB: Sehr elegant gelöst