Endlosschleife bei ungültiger Eingabe?



  • Hallo zusammen!

    Ich habe vor einigen Wochen mit C++ angefangen und bin gerade dabei einen kleinen Taschenrechner zu programmieren, den ich schrittweise verbessern möchte.

    In der letzten Bearbeitung habe ich eine Schleife eingebaut, damit das Programm nicht nach jeder Rechnung beendet wird. Soweit funktioniert auch alles, allerdings kommt es bei einer ungültigen Eingabe zu einer Endlosschleife und ich verstehe nicht genau wieso.

    Beispiel:

    Eingabe: 5 * 4
    Ausgabe: = 20
    Eingabe: n
    Ausgabe: = 20
    = 20
    = 20

    Wieso kommt es hier zu einer Endloswiederholung?
    Hier ist der Rechner:

    #include <iostream>
    using namespace std;
    
    double zahl1, zahl2, ergebnis, rechnung();
    char op;
    
    int main ()
    {
    	cout << endl;
    	cout <<"Taschenrechner v2" << endl;
    	cout <<"*****************" << endl << endl;
    
    	cout <<"Bitte Rechnung eingeben: " << endl;
    	do
    	{
    		cin >> zahl1 >> op >> zahl2;
    		cout << "= " << rechnung() << endl << endl;
    	} while (zahl1 != 0.0);
    
    	return 0;
    }
    
    double rechnung()
    {
    
    	switch(op)
    	{
    		case '+': ergebnis = zahl1 + zahl2;
    		break;
    
    		case '-': ergebnis = zahl1 - zahl2;
    		break;
    
    		case 'x':
    		case 'X':
    		case '*': ergebnis = zahl1 * zahl2;
    		break;
    
    		case '/': ergebnis = zahl1 / zahl2;
    		break;
    
    		default: cout << "Ungültige Eingabe. ";
    	}
    
    	return ergebnis;
    }
    

    lg,
    zuup



  • Hallo zuup,

    Willkommen im C++-Forum.

    Deine Frage lässt sich leicht beantworten. Gibst Du etwas ein, was cin (ein std::istream) nicht als Zahl (Typ int) interpretiert, so geht derselbe in den Fehlerzustand. Diesen fragst Du nach Zeile 16 nicht ab(!) sondern machst einfach weiter. Ist ein std::istream im Zustand Fehler, so macht er keine Eingabe mehr, sondern kommt sofort zurück, was in Deinem Fall zu einer Endlos-Schleife führt.

    Daher besser:

    cout <<"Bitte Rechnung eingeben: " << endl;
        while( cin >> zahl1 >> op >> zahl2  &&  zahl1 != 0 )
        {
            cout << "= " << rechnung() << endl << endl;
        }
    

    die Schleife bricht dann bei einer fehlerhaften Eingabe ab.

    Ein Tipp: verzichte möglichst immer(!) auf globale Variablen. In Deinem Fall kannst Du zahl1 , zahl2 und op in main() deklarieren und anschließend als Parameter an rechnung() übergeben. Und ergebnis ist nur lokal in rechnung() nötig. Alles zusammen:

    #include <iostream>
    using namespace std;
    
    double rechnung( double zahl1, char op, double zahl2 );
    
    int main ()
    {
        cout <<"\nTaschenrechner v2" << endl;
        cout <<"*****************\n" << endl;
        cout <<"Bitte Rechnung eingeben: " << endl;
        double zahl1, zahl2;
        char op;
        while( cin >> zahl1 >> op >> zahl2  &&  zahl1 != 0 )
        {
            cout << "= " << rechnung( zahl1, op, zahl2 ) << endl << endl;
        }
        return 0;
    }
    
    double rechnung( double zahl1, char op, double zahl2 )
    {
        double ergebnis; 
        switch(op)
        {
            case '+': ergebnis = zahl1 + zahl2;
            break;
    
            case '-': ergebnis = zahl1 - zahl2;
            break;
    
            case 'x':
            case 'X':
            case '*': ergebnis = zahl1 * zahl2;
            break;
    
            case '/': ergebnis = zahl1 / zahl2;
            break;
    
            default: cout << "Ungültige Eingabe. ";
        }
        return ergebnis;
    }
    

    Gruß
    Werner


Log in to reply