Ja/Nein-Auswahl und versehentliche Vertipper



  • Hallo, bin das erste Mal hier...
    Ich bin C++ Beginner und komme bei einer Übung nicht weiter.
    (Ich mache diese Übungen für mich, also ist nicht für die Schule oder so.)

    --> Ich habe ein Auswahlmenü, und ein Punkt davon ist "Grundrechnungsarten".
    Darin befinden sich alle vier Grundrechnungsarten +, -, *, /.
    (Ich weiß nicht, wie man ein Sub-Menü macht, deshalb sind diese 4 Grundrechnungsarten alle innerhalb 1 Funktion).

    Jede Grundrechnungsart an sich funktioniert, und wenn man eine Rechnung beendet hat, fragt das Programm, ob man noch eine weitere Rechnung der jeweiligen Grundrechnungsart machen möchte (ja/nein).

    Die Auswahl "j" funktioniert.

    Bei n kommt einmal die Aussage "ungültige Eingabe" und einmal nicht, obwohl der Code bei allen 4 Arten gleich geschrieben ist; das Programm springt dann weiter zur nächsten Grundrechnungsart.
    --> da hätte ich gerne, dass es einfach weiter springt zur nächsten Grundrechnungsart, ohne Kommentar.

    Bei allen anderen Ziffern und Buchstaben (falls vertippt) wirft es "ungültige Eingabe" aus und springt gleich weiter zur nächsten Grundrechnungsart.
    --> da hätte ich gerne, dass man nach der Ausgabe "ungültige Eingabe" zurück zu der Ja/Nein-Auswahl kommt.

    Nach stundenlanger Herum-Probiererei komme ich einfach nicht dahinter, wie ich das mit n und den anderen Ziffern/Buchstaben hinbekomme.

    Vielleicht kann mir da jemand helfen.
    Vielen Dank schon mal im Voraus.

    Das ist mein Code:

     ... cout << " *** Addition: \n";
    		double a, b;					
    		double erga;
    
    		cout << "Geben Sie eine Zahl ein:              ";	
    		cin >> a;
    
    		cout << "Gebene Sie eine weitere Zahl ein:     ";
    		cin >> b;
    		cout << "---------------------------------------------\n";
    
    		erga = a + b;
    		cout << "Das Ergebnis lautet:   " << erga << "\n\n";
    		erga = a + b;
    
    		char eingabe;
    		do
    		{
    			cout << "Wollen Sie eine weitere Addition durchfuehren? (j = ja, n = nein)   ";
    			cin >> eingabe;
    
    			if (eingabe == 'j' || eingabe == 'J')
    			{
    				double a, b;				
    				double erga;
    
    				cout << "\nGeben Sie eine Zahl ein:            ";
    				cin >> a;
    
    				cout << "Geben Sie eine weitere Zahl ein:     ";
    				cin >> b;
    				cout << "---------------------------------------------\n";
    
    				erga = a + b;
    				cout << "Das Ergebnis lautet:    " << erga << "\n\n";
    				erga = a + b;
    			}
    
    			if (eingabe == 'n' || eingabe == 'N')
    			{
    				cout << "\n";
    			}
    			else (eingabe != 'j' || eingabe != 'J' && eingabe != 'n' || eingabe != 'N');
    			{
    				cout << "*** ungueltige Eingabe ***";
    			}
    		} while (eingabe == 'j' || eingabe == 'J');... 
    


  • else (eingabe != 'j' || eingabe != 'J' && eingabe != 'n' || eingabe != 'N');

    • das soll wohl eher else if sein
    • das ; am Ende willst du sicher auch nicht
    • wann wird der Ausdruck denn wahr?


  • Das '\n' von der Entertaste ist auch ein Zeichen.



  • E\ntertaste?



  • Eingabeströme sind in C++ ein fortgeschrittenes Thema, daher würde ich dir raten, (noch) nicht zu sehr ins Detail zu gehen bei der Fehlerbehandlung. Es gibt andere, wichtigere Dinge.

    Die wichtigste Information ist, dass >> so lange Zeichen aus dem Eingabestrom liest, wie diese zu dem passenden Datentyp passen. Zusätzlich wird aber bei der Eingabe von Tastatur eine gesamte Zeile eingelesen, also ggf. auch mehr, als >> eigentlich lesen will. Wenn du zum Beispiel 100.5.6 eingibst, dann liest das cin >> a; solange wie sinnvoll, also bis 100.5 und lässt das .6<enter> im Eingabestrom. Die Eingabe von b über cin >> b läuft dann ohne Benutzerinteraktion durch, denn .6<enter> ist ja noch da. Im Fehlerfall (wenn du z.B. XXX eingibst, wo eine Zahl stehen sollte) geht der Stream in einen Fehlerstatus und liest nicht weiter, bis du diesen wieder aufhebst. Diesen kannst du mit cin.fail() abfragen oder (besser) einfach das Einlesen direkt abzufragen: cin konvertiert nämlich in ein boolean und ist true, wenn keine Fehler im Stream sind.

    while (!(cin >> a)) { 
        if (cin.eof()) programmende(); // der Eingabestrom ist geschlossen, es kommt nichts mehr!
        cout << "Fehler, bitte erneut eingeben!\n";
        cin.clear(); // Fehlerstatus wieder aufheben, sodass wieder gelesen werden kann
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // restliche Zeichen im Stream wegschmeißen
    }
    

    Sinnvollerweise packst du das in eine Funktion, damit du so a und b einlesen kannst.

    Bei deiner char-Abfrage bietet es sich an, stattdessen getline zu nehmen und einfach einen std::string einzulesen. Der enthält dann die gesamte Zeile bis zum Enter.



  • Guten Morgen,
    vielen Dank für eure Hilfe.
    Das Programm läuft jetzt so, wie ich mir das vorgestellt habe.

    Ich musste die if-Location generell etwas umstrukturieren,
    und hab ein "break;" hinter das cout << "\n"; vom if (eingabe == 'n' [...]) gemacht.

    Und voilà - jetzt geht's 🙂
    Ausdauer zahlt sich aus!


Log in to reply