Programm wiederholen J N Abfrage
-
Was ist denn da jetzt anders als im obigen Bsp?
Der Effekt ist immer noch der selbe. Nur das wenn ich den Rückgabewert als int deklariere und der Eingabewerte der scanf() ebenfalls int ist gibt´s einen Absturz?!
-
Gutes Thema und selten behandelt.
Hier mein Vorschlag.#include <stdio.h> int main() { unsigned char c = 0; unsigned int i; printf("Starten mit 'Enter'.\n"); printf("Beenden mit 'n'.\n\n"); //Solange c nicht n, mache es. while((c = getchar()) != 'n') { //Mache etwas for(i = 0; i < 100; i++) { printf("%d\n", i); } //i auf 0 setzen i = 0; printf("Nochmal?\n"); } return 0; }
-
wenn ich das richtig verstanden hab will er sich nur das enter drücken ersparen, ansonsten vergiss meinen betrag
int c
do{
printf("Again? ");
c=getch();
putchar(c);
while((c == 'j') || (c == 'J'));
-
Hi fasti,
du hast recht. Ist wohl die bessere Lösung.
-
Leider ist das Problem immer noch das gleiche. Ich habe unten einen kurzen src hinterlegt. Testet ihn und ihr werdet sehen was ich meine.
(Das j wird in die scanf eingetragen, obwohl ich das nicht will.)#include <stdio.h> #include <conio.h> #include <ctype.h> int main() { short Wert; int wdh; do { clrscr(); printf("Gib eine Zahl ein: "); scanf("%d",&Wert); printf("\n\n\t Noch einmal? (J/N)"); wdh=getch(); putchar(wdh); } while(toupper(wdh)=='J'); // Wenn hier mit j ein neuer Durchgang gestartet wird, // wird das j auch in die scanf-Funktion eingetragen. }
-
Hallo plc-tippser,
Wieso das 'j' nach scanf übertragen wird, kann ich dir nicht sagen.
Ich lasse die conio.h weg.
Die stdio.h hat getch() ebenfalls.
Nur scheint getch() hier anders zu funktionieren.
Die ideale Lösung habe ich noch nicht gefunden, aber
im folgendem Code wird einfach mit irgendeiner Taste fortgesetzt
und mit 'n' beendet.
Das Programm kann auch sofort am Anfang beendet werden.
Praktisch, wenn der Programmablauf längere Zeit dauern würde und
der User es sich nochmal überlegen möchte.
Ich bleibe weiterhin an dem Thema mit dran:
nur 'j' = start bzw. neu
nur 'n' = exit#include <stdio.h> int main() { int g = 0; printf("Proggi v1.1\n"); printf("Start: 'any Key'\n"); printf("Ende: 'n'\n\n"); g = getch(); //Beim Programmstart mit 'n' abbrechen. if(g == 'n') { system("EXIT"); } else { do//mache irgendwas { int i = 0; int t = 0; printf("Zahl eingeben.\n\n"); scanf("%d", &t); printf("\nEingegebene Zahl war: %d\n\n", t); for(i = 1; i < t + 1; i++) { printf("%4d\n", i); sleep(1000); } printf("\nNochmal?\n"); printf("Neustart: 'any Key'\n"); printf("Ende: 'n'\n\n"); g = getch(); }//end do while(g != 'n');//zum beenden n drücken }//end else return 0; }//end main
-
plc_tippser schrieb:
(Das j wird in die scanf eingetragen, obwohl ich das nicht will.)
wird es nicht.
azoikum schrieb:
//Beim Programmstart mit 'n' abbrechen.
if(g == 'n')
{
system("EXIT");
}ich glaube was du brauchst ist
return 0 ;
-
Hi toom,
danke für den Tip mit return 0;
-
Vor dem Einlesevorgang von getch() würde ich noch einmal die stdin-Datei flushen:
#include <stdio.h> #include <conio.h> int main(void) { int key = (int)'\0'; do { printf("exit? y(es) or n(o)\n\n"); fflush(stdin); key = getch(); } while (key != 'y'); return(0); }
Ansonsten kann man manchmal wirklich verzweifeln, denn durch eine falsche Eingabe könnte die stdin blockiert sein.
-
Hei azoikum,
meine stdio.h hat kein getch()???
Und die system() ist auch nur in der stdlib.h
und sleep() in der dos.hWenn ich libs alle zugefügt habe, trägt mir das Prog. direkt den Buchstaben in die scanf ein. Ich bin verzweifelt.
Was soll das return 0? Das war bei Dir drin.
Naja, ich hoffe ja auf eine Lösung. Vieleicht kann ich ja die scanf solange verzögern, bis keine Taste mehr gedrückt ist?!
Das mit dem fflush habe ich schon bis zum abwinken probiert. Das löscht doch den Tastaturpuffer oder so ähnlich, oder?
Leider trotzdem kein Erfolg.Gruß an alle
-
Bau mal folgendes vor deinem scanf() ein:
while(kbhit()) getch();
Obwohl das fflush(stdin) vor scanf() reichen müsste. Vielleicht hängt ja auch deine Taste immer
-
das return (0); ist der rückgabewert, wenn dein main als int angelegt ist und beendet an dieser stelle die main-function, wenn main als void angelegt ist, kannst du das prog mit exit(1); beenden.
-
Hi plc-tippser,
war ne Weile am proggen. Daher meine Verspätung.
Warum getch(); bei mir nur allein mit der stdio.h funktioniert,
weiß ich nicht. Ich benutze als Compiler den "Dev c/c++ 4" von Bloodshed.
Ob es jetzt daran liegt... (noch) keine Ahnung.
Dankeschön an *mausele_* und AJ.
Hätte ich jenes, was AJ schrieb, eher gelesen,
hätte es mir eine Menge Zeit und Nerven gespart.
Aber so hatte es auch etwas Gutes. Bin schließlich selbst darauf gekommen.
Dank an *mausele_* für die Erklärung zu return 0.
Leuchtet ein.
Im nachfolgendem Proggi hatte sich ein scanf(); immer die Zeichen
geschnappt, die beim wiederholen des Proggis für getch(); bestimmt waren.
Result: Die switch() Anweisung ist immer bis zum default: durchgelaufen.
Habe das scanf(); durch getch(); ersetzt.
Logik: ein getch(); am Ende von do{}=Prog. wiederholen und
ein getch(); am Anfang vor switch()=Auswahl treffen.
Sinn: Eingabefehler sind ausgeschlossen.
Prog. kann fortgesetzt werden.#include <stdio.h> int main() { char g = 0; printf("--------------------------------\n"); printf("Timey v 1.1 (azoikum 2oo3)\n"); printf("--------------------------------\n\n"); printf("Start: 'any Key'\n"); printf("Ende: 'x'\n\n"); g = getch(); //am Beginn die Möglichkeit mit x zu beenden if(g == 'x') { return 0; } else { do { int t = 0; int i = 0; int j = 0; printf("Bitte eine Auswahl treffen:\n"); printf("'h' = Stunden\n'm' = Minuten\n's' = Sekunden\n"); g = getch();//statt scanf(); switch(g) { case 'h': printf("\nTimey wird in Stunden gestartet.\n"); printf("Stunden eingeben: "); scanf("%d", &t); printf("Countdown endet in %d Stunden.\n", t); for(i = t; i > 0; i--) { printf("\nnoch %3d Stunde(n),\n", i); for(j = 1; j < 61; j ++) { sleep(60000); printf("%2d,", j); if((j == 10) || (j == 20) || (j == 30) || (j == 40) || (j == 50) || (j == 60)) printf("\n"); } } break; case 'm': printf("\nTimey wird in Minuten gestartet.\n"); printf("Minuten eingeben: "); scanf("%d", &t); printf("Countdown endet in %d Minuten.\n", t); for(i = t; i > 0; i--) { printf("\nnoch %3d Minute(n),\n", i); for(j = 1; j < 61; j ++) { sleep(1000); printf("%2d,", j); if((j == 10) || (j == 20) || (j == 30) || (j == 40) || (j == 50) || (j == 60)) printf("\n"); } } break; case 's': printf("\nTimey wird in Sekunden gestartet.\n"); printf("Sekunden eingeben: "); scanf("%d", &t); printf("Countdown endet in %d Sekunden.\n", t); for(i = t; i > 0; i--) { printf("\nnoch %3d Sekunde(n),\n", i); for(j = 1; j < 61; j ++) { sleep(10); printf("|"); //if(j == 60) printf("\n"); } } break; default: printf("\nEingabefehler.\n'h' = Stunden\n'm' = Minuten\n's' = Sekunden\n'x' = Exit\n"); break; }//end switch printf("\n\nCountdown abgelaufen.\n"); printf("\nTimey weiter benutzen?\n"); printf("Start: 'any Key'\n"); printf("Ende: 'x'\n\n"); g = getch(); }//end do while(g != 'x');//zum beenden x drücken }//end else return 0; }//end main
-
azoikum schrieb:
int t = 0; int i = 0; int j = 0;
kleiner Tipp:
int t = 0, i = 0, j = 0 ;
und noch eins. Man sollte nicht in einem C-prog C++ tags verwenden (die definition der int variablen sollten oben im kopf der main funktion erfolgen.
mfg
toom
-
Hi toom,
ermal danke.
Trotzdem hätte ich dazu ein paar Fragen.
Punkt 1:
Ist dennint x = 0, y = 0;
und
int x = 0;
int y = 0;nicht bloß eine Stilfrage? (Kerninghan & Ritchie)
Punkt 2:
Ich wollte mit der lokalen Variante der Variablen erreichen,
daß sie beim Durchlauf wieder auf 0 gesetzt werden.
Wäre das in diesem Fall ok?
-
toom schrieb:
azoikum schrieb:
int t = 0; int i = 0; int j = 0;
kleiner Tipp:
int t = 0, i = 0, j = 0 ;
und noch eins. Man sollte nicht in einem C-prog C++ tags verwenden (die definition der int variablen sollten oben im kopf der main funktion erfolgen.
mfg
toomLeider falsch, man kann in C zu Beginn eines Blockes Variablen definieren. Man kann in C++ an jeder beliebigen Stelle Variablen definieren.
-
tobidope schrieb:
Leider falsch, man kann in C zu Beginn eines Blockes Variablen definieren. Man kann in C++ an jeder beliebigen Stelle Variablen definieren.
viel spass bei der suche der definition wenn dein code bisschen länger ist...
azoikum schrieb:
nicht bloß eine Stilfrage? (Kerninghan & Ritchie)
mfg
toom
-
viel spass bei der suche der definition wenn dein code bisschen länger ist...
Hi toom, dein Argument leuchtet mir ein.
Dieses aber nicht.
-
toom schrieb:
tobidope schrieb:
Leider falsch, man kann in C zu Beginn eines Blockes Variablen definieren. Man kann in C++ an jeder beliebigen Stelle Variablen definieren.
viel spass bei der suche der definition wenn dein code bisschen länger ist...
azoikum schrieb:
nicht bloß eine Stilfrage? (Kerninghan & Ritchie)
mfg
toomIch muss da nicht sehr lange suchen. Immer zu Anfang eines Blockes. Nutze Variablen so lokal wie möglich. Nach Ende des Blockes sind sie wieder weg.
-
Hallo alle zusammen,
ich habe eine Antwort auf mein genanntes Problem und glaube das die erste Antwort von DDuelec super war. Es liegt am Betriebssystem. Ich habe es auf die ganze Zeit auf 3 unterschiedlichen Rechnern mit Win 98 getestet. Dort ist das immer so aufgetreten wie ichs beschrieben habe. Unter 2000, XP und wahrscheinlich 95 tritt dieser Effekt mit dem scanf() nicht auf. Hat jetzt jemand einen Vorschlag, wie ich das Betriebssystem unabhängig schreiben kann?????
Ich wünsche allen einen guten Rutsch...