Programm wiederholen
-
Hallo an alle.
Zur Zeit versuche ich mir C mit dem c-howto selbst beizubringen. Ich steh also noch völlig am Anfang und bin gerade bei Funktionen angelangt.
Just for fun habe ich selbst ein kleines Programm geschrieben, das, basierend auf meinen Eingaben, einen bestimmten Wert beim Pokern errechnen soll und danach, nach Drücken einer bestimmten Taste, nochmals ausgeführt werden soll, damit ich das Programm nicht immer neu starten mussDie Eingaben, die Rechnung und die Ausgabe funktionieren super.
Probleme habe ich allerdings beim Wiederholen des Programms. Im Internet habe ich gelesen, dass man dafür eine do-while-Schleife nutzen kann, die eine Eingabe ausliest und darauf basierend den Schleifenblock nochmals ausführt. Das klappt aber irgendwie nicht und ich verstehe nicht warum.#include<stdio.h> int main() { do { float BB, ante, spieler, chips; char c; printf("---------------M-Rechner----------------"); printf("\nBB: "); scanf("%f", &BB); printf("\nAnte: "); scanf("%f", &ante); printf("\nSpieler: "); scanf("%f", &spieler); printf("\nStack: "); scanf("%f", &chips); printf("\nM: %.3f", chips/(BB+0.5*BB+ante*spieler)); printf("\nNochmal? (j/n): "); c = getchar(); } while (c=='j'); return 0; }
Mein Compiler (CodeBlocks) zeigt mit in Zeile 30 einen Fehler an
-
Lagere deine Fachlichkeit in eine Funktion aus, die du dann in main() mit einer do-while Schleife entsprechend oft aufrufst.
-
Das '\n' von der Entertaste steht noch im Eingabestrom und wird mit
getchar
eingelesen.
Dies muss erst entfernt werden.Ersetzte Zeile 29 durch
scanf(" %c", &c); // c = getchar();
Achte auf das Leerzeichen vor dem %
Oder du hälst dich an: https://www.c-plusplus.net/forum/p1146014#1146014
-
Hallo.
Erstmal danke für eure Antworten.
Lagere deine Fachlichkeit in eine Funktion aus, die du dann in main() mit einer do-while Schleife entsprechend oft aufrufst.
Versteh ich nicht so recht.... Mit Funktionen hab ich noch so meine Probleme. Meiner Meinung nach machen die das Programm viel komplizierter. Ich hab das, was ich geschrieben habe, einmal mit Funktionen geschrieben. Aber das sieht irgendwie falsch aus.
Das '\n' von der Entertaste steht noch im Eingabestrom und wird mit getchar eingelesen.
Dies muss erst entfernt werden.Ersetzte Zeile 29 durch
C:
scanf(" %c", &c); // c = getchar();
Achte auf das Leerzeichen vor dem %Das funktioniert auch nicht. Dass die Entertaste noch im Puffer steckt, hat mich auf eine Idee gebracht, was ich im Tutorial gelernt habe.
char c, temp; do { . . printf("\nNochmal? (j/n): "); scanf("%c%c", &c, &temp); } while(c == 'j');
funktioniert auch nicht
-
Vielleicht hättest du die Fehlermeldung zeigen sollen
Dann wären die Tipps besser
-
f.-th. schrieb:
Vielleicht hättest du die Fehlermeldung zeigen sollen
Dann wären die Tipps besser
Ja da hast du Recht. Bisher hatte ich aber noch nicht so gravierende Probleme, dass ich in den Logs nachschauen musste. Hab es aber jetzt gefunden.
30:14: error: 'c' undeclared (first use in this function) 30:14: note: each undeclared identifier is reported only once for each function it appears in
Das klingt für mich, als wäre die Variable c nicht deklariert?!
edit:
Hmm... hab jetzt mal folgendes geändert (Zeile 10 und Zeile 28-30):
#include<stdio.h> int main() { do { float BB, ante, spieler, chips; int c, temp; printf("---------------M-Rechner----------------"); printf("\nBB: "); scanf("%f", &BB); printf("\nAnte: "); scanf("%f", &ante); printf("\nSpieler: "); scanf("%f", &spieler); printf("\nStack: "); scanf("%f", &chips); printf("\nM: %.3f", chips/(BB+0.5*BB+ante*spieler)); printf("\nNochmal? (j oder n): \n"); scanf("%c%c", &c, &temp); } while ('c' == 'j'); return 0; }
Das Programm kann jetzt ausgeführt und benutzt werden. Wenn ich allerdings bei der Frage 'Nochmal?' das 'j' eintippe und mit Enter bestätige, wird das Programm beendet...
-
In c wird das '\n' eingelesen, und die Eingabe in temp. (Reihenfolge beachten)
Zudem vergleichst du zwei Zeichen-Konstanten miteinander.
Der Vergleich ist immer unwahr.
Sollte aber der Compiler als Warnung anmeckern.
Sieh mal genauer hin, was links vom == steht.%c erwartet übrigens einen Zeiger auf ein
char
, nicht auf einint
.
getchar
hingegen gibt einint
zurück.Vielleicht probierst du es doch noch mal mit meinem Vorachlag, denn:
Das Leerzeichen im Formatstring weistscanf
an, alle Whitespace (dazu gehört auch '\n') zu überlesen.
-
Shelldor schrieb:
30:14: error: 'c' undeclared (first use in this function) 30:14: note: each undeclared identifier is reported only once for each function it appears in
Das klingt für mich, als wäre die Variable c nicht deklariert?!
Beachte den Scope.
c existiert nur innerhalb der do-while-Schleife.
Der Test ist aber außerhalb.Definiere c (als char) in Zeile 6 und gut ist.
-
DirkB schrieb:
Shelldor schrieb:
30:14: error: 'c' undeclared (first use in this function) 30:14: note: each undeclared identifier is reported only once for each function it appears in
Das klingt für mich, als wäre die Variable c nicht deklariert?!
Beachte den Scope.
c existiert nur innerhalb der do-while-Schleife.
Der Test ist aber außerhalb.Definiere c (als char) in Zeile 6 und gut ist.
Waaaaahnsinn!!! Das hat funktioniert wie du gesagt hast
Es lag tatsächlich daran, dass das c innerhalb der Schleife deklariert wurde.
Ohhh man. ich bin so blöd
-
30:14: error: 'c' undeclared (first use in this function)
Das bedeutet der Compiler kennt an dieser Stelle des Quelltextes 'c' nicht.
Nun überlege mal warum das so ist.
-
Okay, hast schon
-
DirkB schrieb:
Beachte den Scope.
c existiert nur innerhalb der do-while-Schleife.
Der Test ist aber außerhalb.
Definiere c (als char) in Zeile 6 und gut ist.Wäre auch meine erste Idee gewesen, aber: kann man in C überhaupt Variablen so definieren.
Sorry hab's irgendwie vergessen, aber zweifle daran.
-
EOP schrieb:
DirkB schrieb:
Beachte den Scope.
c existiert nur innerhalb der do-while-Schleife.
Der Test ist aber außerhalb.
Definiere c (als char) in Zeile 6 und gut ist.Wäre auch meine erste Idee gewesen, aber: kann man in C überhaupt Variablen so definieren.
Sorry hab's irgendwie vergessen, aber zweifle daran.Seit kurzem (ca. 1999) geht das.
-
DirkB schrieb:
Seit kurzem (ca. 1999) geht das.
Huch, wie die Zeit vergeht.
-
Shelldor schrieb:
Das Programm kann jetzt ausgeführt und benutzt werden. Wenn ich allerdings bei der Frage 'Nochmal?' das 'j' eintippe und mit Enter bestätige, wird das Programm beendet...
logisch, in zeile 30 schreibst du ja auch 'c'=='j'. da das immer unwahr bzw. falsch ist, wird die schleife logischerweise auch abgebrochen.