C Code Korrekturlesen bitte, besonders Menüstruktur! einfacher "Taschenrechner"
-
µngbd schrieb:
Jetzt kannst du nur jedes zweite Mal abbrechen. Sonst wird's schon passen. Bis auf Eingabefehler natürlich, aber die sind langweilig. Andererseits bräuchtest du die nur in Eingabe() abfangen. Bei Interesse zB hier weiterlesen:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349-and-start-is-1.html
int c; // int c, nicht char c. while ((c = getchar()) != EOF && c != '\n'); // kein {} block, stimmt s
also damit funktionierts wunderbar!
nur irgendwie habe ich den Ausdruck noch nicht ganz verstanden:
ich definiere mit ein INTEGER c, warum? c ist doch 99 im ASCII-Code. Der Sinn erschließt sich mir nicht. Wieso hat die while-schleife keinen Block? In ihrer Bedigung wird c solange ein character zugewiesen (aber als integer gespeichert?!) solange != EOF (EOF = End Of File, aber was bedeutet das hier genau?? Ende der Funktion?) Ich wäre sehr dankbar wenn mir das einer ein wenig weiter aufdröseln könnte
Danke im Voraus!
Grüße
-
EOF = End of file. Das wird oft durch einen negativen Wert dargestellt, daher ist es gefährlich da einen char zu benutzen, der oft unsigned ist.
-
chmbw schrieb:
Wieso hat die while-schleife keinen Block?
Das sollte man sicherheitshalber so schreiben:
while ((c = getchar()) != EOF && c != '\n') ;
Dann kann man sich den Kommentar sparen, weil das ; ins Auge springt. Das ist eine leere Anweisung, die tut einfach nichts. Die muss dort sein, weil die nächste Anweisung (oder der nächste Block) eben zum while gehört, so ist die Syntax. Genauso solltest du sagen:
while(Hauptmenue() != 0) ; // und weil Vergleiche auf != 0 redundant sind, sagt man oft stattdessen while(Hauptmenue()) ;
chmbw schrieb:
EOF = End Of File, aber was bedeutet das hier genau?? Ende der Funktion?
EOF heisst immer End Of File. Die Standard-Eingabe ist auch nur eine Datei. Damit fängt man den Fall ab, dass die Eingabe zu Ende ist. Das kann passieren, wenn man eine Datei als Eingabe an das Programm leitet (zB
type file.txt | program
auf Windows), oder wenn man explizit die Eingabe beendet, das geht auf den meisten Terminals mit Strg-D oder Strg-Z oder so.chmbw schrieb:
aber als integer gespeichert?!
Ein char ist auch nur eine Ganzzahl, aber der Wertebereich ist meistens kleiner. 'A' ist nur eine andere Weise, um 65 zu sagen (ASCII vorausgesetzt). EOF darf aber kein gültiges Zeichen sein, deshalb muss man für die Rückgabe von getchar() einen grösseren Wertebereich nehmen.
-
EOF darf aber kein gültiges Zeichen sein, deshalb muss man für die Rückgabe von getchar() einen grösseren Wertebereich nehmen.
Da fällt mir ein, dass fricky mal erzählt hat, dass auf 8-Bit-Dingern ein int trotzdem 16 Bit hat. Ich hab mir damals gedacht, dass 8 Bits für eine Zahl wohl doch recht wenig wären, und mir das so erklärt. Aber wenn ein char so gross wie ein int wäre, würde getchar() nicht mehr funktionieren, oder?
-
µngbd schrieb:
Da fällt mir ein, dass fricky mal erzählt hat, dass auf 8-Bit-Dingern ein int trotzdem 16 Bit hat.
bezogen darauf, dass ich noch nie 'nen compiler gesehen habe, der 8-bittige ints hat (wohl aber einen, wo man das einstellen konnte, default war aber auch bei dem 16-bit int). im C-std findeste etwa sowas:
— minimum value for an object of type int INT_MIN -32767 // -(2^15 - 1) — maximum value for an object of type int INT_MAX +32767 // 2^15 -1
und wieder mal sind die standard auswendigkenner gefragt: ist ein 8-bit int laut C-standard theoretisch möglich?
-
zder davebardsley in http://www.linuxforums.org/forum/linux-programming-scripting/44480-sizeof-int.html bestätigt dich und der link http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size sagt auch "An int must be at least 16 bits long.".
-
Nicht wenn ich mit 8Bit ~65000 Zahl darstellen kann! Ich nehm einfach einen komprimierungsalgorithmus...
-
Genmutant schrieb:
Nicht wenn ich mit 8Bit ~65000 Zahl darstellen kann! Ich nehm einfach einen komprimierungsalgorithmus...
Viel Erfolg http://en.wikipedia.org/wiki/Minimum_message_length
-
Genmutant schrieb:
Nicht wenn ich mit 8Bit ~65000 Zahl darstellen kann!
musste passend runden, 0...256...512...768... usw., dann klappt das *fg*
-
;fricky schrieb:
Genmutant schrieb:
Nicht wenn ich mit 8Bit ~65000 Zahl darstellen kann!
musste passend runden, 0...256...512...768... usw., dann klappt das *fg*
Geht sogar noch komprimierter. Sozusagen am komprimiertesten:
int passendRunden(int x){ if(x==0) return 0; else return x/2; }
oder etwas langsamer aber nicht rekursiv:
int passendRunden(int x){ while(x*=3); x*=5; }