Programm wiederholen J N Abfrage



  • 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.h

    Wenn 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 denn

    int 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
    toom

    Leider 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
    toom

    Ich 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...


Anmelden zum Antworten