Leerdurchlauf der while-Schleife nach Abfrage



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

    wdh=getch();

    Warum liest du hier nicht auch mit scanf?

    Ich würde mal vermuten, dass hier das \n von der vorherigen Eingabe geliefert wird.



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

    Warum liest du hier nicht auch mit scanf?

    Ist doch klar: damit der Benutzer nicht Enter drücken muss.

    Ich würde mal vermuten, dass hier das \n von der vorherigen Eingabe geliefert wird.

    Genau.

    @Kintaro777: das Problem hast du auch, wenn du weiter mit scanf liest. Daher muss man in solchen Fällen ein Space beim scanf nutzen: scanf(" %c", &angebot) - allerdings entfernt das nur das Enter VOR der Eingabe, aber nicht danach.

    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.



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

    Ist doch klar: damit der Benutzer nicht Enter drücken muss.

    Aber warum muss er bei der anderen Eingabe Enter drücken? Ich würde in einem Programm nicht beide Versionen nebeneinander erwarten.



  • @SeppJ
    Danke, habe den Wink verstanden und das Programm entsprechend geändert. Habe nun auch bei den scanf Funktionen ein Leerzeichen eingefügt und jetzt funktioniert das Programm wie gewünscht.

    Ich Frage mich nur noch immer, ob dies die eleganteste Lösung ist oder man hier besser mit einer switch(case) funktion arbeitet. Das was für mich bisher unbekannt war, war die erste Wiederholung, falls angebot!=G,Z oder E und ich habe immernoch das Gefühl ich hätte es umständlich gelöst.

    Hier der funktionierende Code:

    #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);
    	if (angebot == gruppe)
    	kurs = angebot;
    		else {
    		if (angebot == einzel)
    		kurs = angebot; 
    			else {
    				if (angebot == zehner) 
    				kurs = angebot;
    				else {
    					printf("Kursangebot ist unbekannt!\n");	
    					printf("Bitte das gewuenschte Kursangebot eingeben:\n");
    					scanf(" %c", &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;
    	
    	
    		
    	
    }
    

    Mit getch() habe ich übrigens gearbeitet, weil es so in Beispielen für ähnliche Anwendungen gezeigt wurde und hielt das für "passender".



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

    ```c

    und das schließende ``` muss jeweils alleine in einer Zeile stehen.
    Du kannst Deine Beiträge im Nachhinein noch bearbeiten. Dem Menüpunkt "Bearbeiten" findest Du in dem Drei-Punkte-Menü rechts unter Deinen Beiträgen.
    Danke.



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



  • @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