Leerdurchlauf der while-Schleife nach Abfrage



  • Guten Tag,

    ich habe eine Prüfung geschrieben in der eine Programmieraufgabe gestellt wurde.
    Ich versuche noch immer eine ordentliche Lösung dafür zu finden scheitere jedoch an mehreren kleinen Stolpersteinen.

    Der um den es mir hier zunächst geht, ist der, dass nach der ersten Abfrage, nochmal die erste Ausgabe erfolgt, jedoch keine Eingabe mehr abgewartet wird und direkt wieder zur Wiederholungsabfrage springt.

    #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:");
    	scanf("%c", &angebot);
    	if (angebot == gruppe)
    		if (angebot == einzel) 
    			if (angebot == zehner) 
    	kurs = angebot;
    	else {
    	printf("Kursangebot ist unbekannt!");	
    	printf("Bitte das gewuenschte Kursangebot eingeben:");
    	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')");
    	wdh=getch();
    	} while (wdh!='N');
    	printf("Der Tagesumsatz betraegt: %f Euro", tagumstz);
    	return EXIT_SUCCESS;
    	
    	
    		
    	
    }
    

    Davon abgesehen funktionieren noch ein paar Sachen nicht. Die würde ich aber evtl. selber erkennen, wenn ich zunächst mal wüsste, wo hier der Fehler liegt.

    Danke im Voraus.

    Gruß,
    Kintaro



  •        if (angebot == gruppe)
    		if (angebot == einzel) 
    			if (angebot == zehner) 
    	kurs = angebot;
    

    Was soll das machen?



  • Das ist ein anderes Problem, das ich noch nicht gelöst habe.
    Das Programm soll bei Eingabe von G,Z,oder E einen entsprechenden Betrag auf den Tagesumsatz addieren und nach der Schleife den Gesamtumsatz ausgeben.
    Wenn etwas anderes als G,Z oder E eingegeben wird, soll eine Fehlermeldung ausgegeben und erneut nach dem Kurstyp gefragt werden.

    Ich denke man soll das wohl über eine Kombination von while und switch machen. Wurde davon leider kalt erwischt, weil die Aufgabe in den vorherigen Klausuren ganz anders waren.


  • Mod

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

    Das ist ein anderes Problem, das ich noch nicht gelöst habe.

    Hmm, dieser Code steht genau zwischen der letzten Zeile, die noch funktioniert, und der Zeile, deren Auswirkung du vermisst. Bist du immer noch sicher, dass dies ein anderes Problem ist?

    Ziehen wir die Prüfung doch andersrum auf: Vergiss alles, was du dir beim Schreiben des Codes gedacht hast. Dein Lehrer stellt die Aufgabe, zu erklären, was

           if (a == 1)
    		if (a == 2) 
    			if (a == 3) 
                            	k = a;
    

    macht. Wie antwortest du?



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


Anmelden zum Antworten