Programm wiederholen J N Abfrage
-
Ich möchte am Programmende eine Abfrage tätigen ob das Prg nocheinmal ausgeführt werden soll und zwar ohne die Eingabe mit Enter bestätigen zu müssen. So wie ich es im Bsp. mache, wird immer bei der nächsten scanf() der Buchstabe 'j' also die Auswahl mit eingetragen. Was kann ich tun???
Hier ist ein Ausschnitt aus einem Prg. mit meinem Versuch.main()
{
#define START 1
#define EINLESEN 2
#define HALBE 3
#define SCHLEIFE 4
#define ABFRAGE 5long Pruefzahl, Pruef_halbe=0;
short SK_count=1, END=0, Erster_Eintrag=0;
double Rest=0;
int loop=0;
char wdh;time_t t1, t2, Dauer;
do{
switch (SK_count)
{ case START:
clrscr();
printf("Gib die Zahl ein! ") ;
fflush(stdin);
scanf("%d",&Pruefzahl); // Eingabe der Prüfzahl
if (Pruefzahl>=1) SK_count=EINLESEN;
break;case ABFRAGE:
t2 = time(NULL);
Dauer=t2 - t1 ;
printf("\n\nDauer der Pruefung: %d s",Dauer); // Abfrage ob weitere Umläufe ausgeführt werden sollen.printf("\n\n\n\t\t\t\t Weitere Pruefzahlen?");
wdh=getch();
if (wdh=='j' || wdh=='y' || wdh=='J' || wdh=='Y') SK_count=START;
if (wdh=='n' || wdh=='N')
{
printf("\n\n\t\tGood by!");
END=1;
}
break;
default:
printf("default ") ;
break;
}
}while (!END);
}
-
/* Deniz Duelec - 11. Mai 2003 - Compiled with MS VC++ 6.0 see also http://msdn.microsoft.com/library/ default.asp?url=/library/en-us/vclib/html/_crt__getch.2c_._getche.asp Info in German: Die Funktion _getch() liest eine Taste ohne das man Return braucht (benoetigt conio.h) Das lesen der Taste ist kein Problem der Programmiersprache sondern eines des Betriebssystems. */ #include <conio.h> //for the function "_gethch()" #include <ctype.h> //for the function "toupper" #include <stdio.h> //for the funktion "printf" int main( void ) { int taste=0; do { printf("\nRunning program...\n"); printf("Press Y to restart program\n" ); taste = _getch(); //press key taste = toupper( taste ); //upercase key } while( taste == 'Y' ); return (0); }
-
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.