Leerdurchlauf der while-Schleife nach Abfrage



  • @Kintaro777 sagte in Leerdurchlauf der while-Schleife nach Abfrage:

    Habe mich vertan.

    Das Programm funktioniert doch nicht wie gewünscht, da die Eingabe so lange wiederholt werden soll, bis G,E, oder Z eingegeben wurde.

    Das Space entfernt das Enter VOR der Eingabe. Das funktioniert, wenn du mehrmals mit scanf einen char einliest.
    Du musst aber das Enter NACH dem Zeichen entfernen, weil du danach mit getch arbeitest. Ich zitiere mich mal:

    Also einfach nach dem scanf einmal getch aufrufen und das Ergebnis verwerfen. Oder mit scanf(" %c%*c", &angebot); gleich 2 Zeichen lesen und dabei das hintere (das Enter) ignorieren.

    Wobei: das würde das Problem mit "printf("Weitere Eingabe? ('J' oder 'N')\n");" beheben. Du brauchst eine loop, die solange ein Zeichen einliest, bis es G, Z oder E ist. Deine Verschachtelung macht den Code sehr schlecht lesbar.



  • Also das mit der Eingabe funktioniert so fehlerfrei, auch wenn ich das falsch verstanden habe.
    Mit getch aufrufen und verwerfen meinst du einfach in form von "getch();"

    Ja ich denke auch, dass ich das mit einer Kombination aus while und switch machen muss. Ich bin nur verwirrt, weil das so bisher nicht behandelt wurde. Die Programmieraufgaben aus den vorherigen Klausuren des gleichen Moduls konnte ich wirklich in 10 Minuten aufschreiben. Deshalb denke ich die ganze Zeit ich stehe hier irgendwie komplett auf dem Schlauch.



  • Du kannst auch sowas machen:

    while (1) {
        printf("Bitte das gewuenschte Kursangebot ('G', 'Z', 'E') eingeben:\n");
        scanf(" %c", &angebot);
        if (strchr("GZE", angebot))
            break;
        printf("Kursangebot ist unbekannt!\n");
    }
    

    Edit: statt printf kannst du auch puts nehmen, wenn du eh keinen Formatstring verwendest und einen Zeilenumbruch wünscht.



  • strchr ist mir bisher nicht bekannt und wurde auch nie behandelt. Ich muss mir mal die funktionsweisen von switch angucken und das wohl darüber irgendwie regeln.

    Nur mal zum Vergleich:

    In einer anderen Klausur des gleichen Moduls musste man eine gerade positive Zahl einlesen und alle geraden Zahlen von Null bis zu dieser Zahl ausgeben.

    Die schwierigste Aufgabe war noch eine Matrix mit regelmäßig aufsteigenden Werten zu initialisieren und auszugeben.

    Hatte mich sehr gut vorbereitet gefühlt und dann kam so etwas 😃



  • @Kintaro777 sagte in Leerdurchlauf der while-Schleife nach Abfrage:

    strchr ist mir bisher nicht bekannt und wurde auch nie behandelt. Ich muss mir mal die funktionsweisen von switch angucken und das wohl darüber irgendwie regeln.

    Das sucht ein Zeichen in einem String.

    Hier könntest du stattdessen einfach schreiben:

    if (angebot == 'G' || angebot == 'Z' || angebot == 'E') break;
    

    Wenn du einen großen Switch machen willst, dann solltest du darauf achten, dass die einzelnen cases möglichst nur eine Funktion aufrufen, ansonsten wird das schnell unübersichtlich.



  • Danke. Bevor ich genau verstanden habe, wie du das meintest (was ich jetzt habe), hast du mich auf eine Idee gebracht und jetzt funktioniert es wirklich, falls ich nicht wieder einen Testfall übersehen habe.

    Ich habe es jetzt wie folgt gelöst:

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    int main(void) {
    	char gruppe = 'G', einzel = 'E', zehner = 'Z', angebot, kurs, wdh;
    	double tagumstz, preis;
    	tagumstz = 0.00;
    	do{
    	printf("Bitte das gewuenschte Kursangebot ('G', 'Z', 'E') eingeben:\n");
    	scanf(" %c", &angebot);
    	while(angebot!='G' && angebot!='Z'&& angebot !='E') {
    		printf("Kursangebot ist unbekannt!\n");
    		printf("Bitte das gewuenschte Kursangebot eingeben. \n");
    		scanf(" %c", &angebot);
    		
    	}
    	kurs = angebot;
    	preis = 24;
    	if (kurs == einzel)
    		preis = 72;
    	if (kurs == zehner)
    		preis = 24*10*0.9;
    	tagumstz = tagumstz + preis;
    	printf("Weitere Eingabe? ('J' oder 'N')\n");
    	wdh=getch();
    	} while (wdh!='N');
    	printf("Der Tagesumsatz betraegt: %f Euro", tagumstz);
    	return EXIT_SUCCESS;
    	
    	
    		
    	
    }
    

    aber die strchr-Funktion merke ich mir auf jeden Fall.



  • @Kintaro777 sagte in Leerdurchlauf der while-Schleife nach Abfrage:

    char gruppe = 'G', einzel = 'E', zehner = 'Z'

    Wozu sind diese Variablen da?



  • Die sind entstanden, weil ich noch nicht wusste, wie ich das letztlich realisieren würde. Klar jetzt kann man sie natürlich auch streichen. Ich bin aber erstmal froh, dass es funktioniert :P. Wahrscheinlich kann ich mir einer der Variablen "angebot" und "kurs" auch sparen. Muss ich mir nochmal angucken. Mache gerade nebenbei noch etwas anderes.





  • @Swordfish
    Vielen Dank für den Hinweis.

    Die initialisierung des Umsatzes in Form einer GKZ war jedoch in der Aufgabenstellung vorgegeben.



  • @Kintaro777 sagte in Leerdurchlauf der while-Schleife nach Abfrage:

    Die initialisierung des Umsatzes in Form einer GKZ war jedoch in der Aufgabenstellung vorgegeben.

    Das ist traurig. Gib das Feedback vielleicht an denjenigen weiter von dem du die Aufgabe bekommen hast.



  • @Kintaro777

    scanf(" %c") + scanf(" %c%*c", &angebot)
    
    • ist beides sinnfrei, du wirst Probleme bei Leereingaben, bei Mehrzeicheneingaben und bei gepipten stdin bekommen
    • scanf UND getch zu benutzen, ist sinnfrei
    • getch ist kein Standard
    • 2x "scanf(" %c", &angebot)" einzubauen ist auch sinnfrei
    • ...

Anmelden zum Antworten