Einfaches Rechenprogramm verfängt sich in Endlosschleife.



  • Hallo,
    ich arbeite mich aktuell wieder in C++ ein und habe deshalb zur Übung ein einfaches Rechenprogramm geschrieben. Das läuft allerdings mit einigen Problemen, seitdem ich es um eine while- Schleife erweitern wollte. Hier der Code:

    #include <iostream>
    using namespace std;
    
    const float Mwst = 19;
    int main()
    { 
      float Nettopreis, Bruttopreis, Steuer;
      int Modus;
    
      while (Modus == 10)
      {
        cout << "Waehlen sie einen Modus aus:1 =  MWST Rechner" << endl;
        cout << "Waehlen sie einen Modus aus:2 =  Mwst meines Preises" << endl;
        cout << "Waehlen sie einen Modus aus:3 = Wie hoch ist die Mwst?" << endl;
        cout << "Waehlen sie einen Modus aus:10 = Programm beenden" << endl;
        cin >> Modus;
    
      switch (Modus)
      {
    
             case 1:
    
             cout << "Geben Sie einen Nettopreis ein:" << endl;
             cin >> Nettopreis;
             if (Nettopreis > 0)
               {
                 Steuer = Nettopreis * Mwst /100;
                 cout << "Die Mehrwertssteuer betraegt:" << Steuer << endl;
                 Bruttopreis = Nettopreis + Steuer;
                 cout << "Der Bruttopreis ist:" << Bruttopreis << endl;
                 cin >> Nettopreis;
               }
             else
               {
                cout << "Ein Preis kann nicht negativ sein!" << endl;
                cout << "Geben Sie einen Nettopreis ein:" << endl;
                cin >> Nettopreis;
                  if (Nettopreis > 0)
                   {
                     Steuer = Nettopreis * Mwst /100;
                     cout << "Die Mehrwertssteuer betraegt:" << Steuer << endl;
                     Bruttopreis = Nettopreis + Steuer;
                     cout << "Der Bruttopreis ist:" << Bruttopreis << endl;
                     cin >> Nettopreis;
                   }
               break; 
               }
    
             case 2:
             cout << "Geben Sie einen Preis ein:" << endl;
             cin >> Nettopreis;
             if (Nettopreis > 0)
               {
                 Steuer = Nettopreis * Mwst /100;
                 cout << "Die Mehrwertssteuer betraegt:" << Steuer << endl;
                 cin >> Steuer;
               }
             else
               {
                cout << "Ein Preis kann nicht negativ sein!" << endl;
                cout << "Geben Sie einen Nettopreis ein:" << endl;
                cin >> Nettopreis;
                  if (Nettopreis > 0)
                   {
                     Steuer = Nettopreis * Mwst /100;
                     cout << "Die Mehrwertssteuer betraegt:" << Steuer << endl;
                     Bruttopreis = Nettopreis + Steuer;
                     cout << "Der Bruttopreis ist:" << Bruttopreis << endl;
                     cin >> Nettopreis;
                   }
               break;
               }
             case 3:
                  cout << "Die Mehrwertssteuer betraegt:" << Mwst << "%" << endl;
                  cin >> Steuer;
               break;
             default :
                     cout << "Waehlen sie einen der angebotenen Modi aus!" << endl;
                     cin >> Modus;
      }
    }
    
    }
    

    Zur Erklärung:
    Ich möchte, dass das Programm dann beendet wird, wenn ich den Wert 10 eingebe, allerdings ist es so, dass mir das Programm die Meldung "Waehlen sie einen der angebotenen Modi aus!" ausgibt, obwohl diese ja für andere Zahlen vorgesehen ist.
    mein zweites Problem ist, dass sich das Programm in einer Endlosschleife verfängt, sobald ich einen Buchstaben oder ein Sonderzeichen eingebe (Das ist mir zufällig passier, sonst wär es mir wohl nie aufgefalllen.)
    Also wisst ihr, weshalb diese Probleme auftreten?
    Danke.



    • 1. Die Schleife wird nie ausgeführt weil die Variable noch gar nicht initialisiert ist.
    • 2. Wenn Modus 10 ist, wird im switch der default Weg genommen. Sollte aber klar sein warum.
    • Wenn du eine falsche Eingabe machst musst du danach irgendwie den Puffer von cin leeren, sonst liegt die falsche Eingabe immer noch drin und es geht nie weiter.


  • Du hast keinen case-Fall für 10 eingebaut.



  • DarkShadow44 schrieb:

    • 1. Die Schleife wird nie ausgeführt weil die Variable noch gar nicht initialisiert ist.
    • 2. Wenn Modus 10 ist, wird im switch der default Weg genommen. Sollte aber klar sein warum.
    • Wenn du eine falsche Eingabe machst musst du danach irgendwie den Puffer von cin leeren, sonst liegt die falsche Eingabe immer noch drin und es geht nie weiter.

    Danke.
    Aber was bedeutet "den Puffer von cin leeren"? Und wie genau macht man das?



  • benimus schrieb:

    DarkShadow44 schrieb:

    • 1. Die Schleife wird nie ausgeführt weil die Variable noch gar nicht initialisiert ist.
    • 2. Wenn Modus 10 ist, wird im switch der default Weg genommen. Sollte aber klar sein warum.
    • Wenn du eine falsche Eingabe machst musst du danach irgendwie den Puffer von cin leeren, sonst liegt die falsche Eingabe immer noch drin und es geht nie weiter.

    Danke.
    Aber was bedeutet "den Puffer von cin leeren"? Und wie genau macht man das?

    std::cin.ignore(std::numeric_limits<std::streamsize>::max());
    


  • Könntest Du mir auch bitte erklären was das genau bewirkt und wo ich diesen Befehl im Script platzieren muss?



  • Wieso nennen das eig. alle Script?
    Der Befehl ignoriert die nächsten std::numeric_limitsstd::streamsize::max() Zeichen, was soviel wie alle Zeichen bedeutet, indem er sie liest und direkt danach verwirft.
    Füg ihn vor jeder Eingabeoperation ein.


  • Mod

    Ich habe schwere Zweifel, dass der Vorschlag das macht, was der Threadersteller wünscht. Denn wie Nathan richtig beschreibt, verwirft das ALLE Zeichen (wirklich alle, nicht nur so gut wie alle). Vergangene, jetzige, zukünftige.
    Nimm lieber

    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    Das verwirft alle Zeichen, bis ein '\n' (Zeilenumbruch) auftaucht.



  • Jetzt habe ich die empfohlene Zeile hinzugefügt, doch das Problem bleibt das selbe.
    Das genaue Problem:
    Ich habe das Programm gestartet, nachdem ich ihn überarbeitet habe, im Menü habe ich den Punkt 1 ausgewählt und als Preis "j" eingegeben (das selbe würde passieren, wenn ich anstatt eines Buchstaben ein Sonderzeichen eingäbe). Das Programm gibt dann ein Ergebnis aus und springt dann automatisch zum Menü zurück. Ohne, dass ich etwas eingegeben habe wählt es Menüpunkt eins aus und rechnet dann mit dem Wert weiter, den ich am Anfang eingegeben habe, gibt das Ergebnis aus, springt zum Menü zurück, usw.
    Ein Screenshot:
    http://www.fotos-hochladen.net/view/unbenanntmg5nehytxq.png



  • Hier noch der neue Quellcode:

    #include <iostream>
    using namespace std;
    int Modus = 0;
    const float Mwst = 19;
    int main()
    { 
      float Nettopreis, Bruttopreis, Steuer;
    
        Menue:
        cout << "Waehlen sie einen Modus aus:1 =  MWST Rechner" << endl;
        cout << "Waehlen sie einen Modus aus:2 =  Mwst meines Preises" << endl;
        cout << "Waehlen sie einen Modus aus:3 = Wie hoch ist die Mwst?" << endl;
        cout << "Waehlen sie einen Modus aus:10 = Programm beenden" << endl;
        cin >> Modus;
      switch (Modus)
      {
           case 1: 
             cout << "Geben Sie einen Nettopreis ein:" << endl;
             std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
             cin >> Nettopreis;
             if (Nettopreis > 0)
               {
                 Steuer = Nettopreis * Mwst /100;
                 cout << "Die Mehrwertssteuer betraegt:\n" << Steuer << endl;
                 Bruttopreis = Nettopreis + Steuer;
                 cout << "Der Bruttopreis ist:\n" << Bruttopreis << endl;
                 cout << "Sie kehren nun zum Menue zurueck.\n" << endl;
                 goto Menue;
               }
             else
               {
                while (Nettopreis <= 0)
                {
                cout << "Ein Preis kann nicht negativ sein!\n" << endl;
                cout << "Geben Sie einen Nettopreis ein:" << endl;
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
                cin >> Nettopreis;
                  if (Nettopreis > 0)
                   {
                     Steuer = Nettopreis * Mwst /100;
                     cout << "Die Mehrwertssteuer betraegt:\n" << Steuer << endl;
                     Bruttopreis = Nettopreis + Steuer;
                     cout << "Der Bruttopreis ist:\n" << Bruttopreis << endl;
                     cout << "Sie kehren nun zum Menue zurueck.\n" << endl;
                     goto Menue;
                   }
                }
    
               }
    
             case 2:
             cout << "Geben Sie einen Preis ein:" << endl;
             std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
             cin >> Nettopreis;
             if (Nettopreis > 0)
               {
                 Steuer = Nettopreis * Mwst /100;
                 cout << "Die Mehrwertssteuer betraegt:\n" << Steuer << endl;
                 cout << "Sie kehren nun zum Menue zurueck.\n" << endl;
                 goto Menue;
               }
             else
               {
               while (Nettopreis <= 0)
               {
                cout << "Ein Preis kann nicht negativ sein!\n" << endl;
                cout << "Geben Sie einen Nettopreis ein:" << endl;
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
                cin >> Nettopreis;
                  if (Nettopreis > 0)
                   {
                     Steuer = Nettopreis * Mwst /100;
                     cout << "Die Mehrwertssteuer betraegt:\n" << Steuer << endl;
                     Bruttopreis = Nettopreis + Steuer;
                     cout << "Der Bruttopreis ist:" << Bruttopreis << endl;
                     cout << "Sie kehren nun zum Menue zurueck.\n" << endl;
                     goto Menue;
                   }
               } 
               break;
               }
             case 3:
                  cout << "Die Mehrwertssteuer betraegt:\n" << Mwst << "%" << endl;
                  cout << "Sie kehren nun zum Menue zurueck.\n" << endl;
                  goto Menue;
               break;
             case 10:
                  cout << "Programm beendet" << endl;
                  break;
             default :
                     cout << "Waehlen sie einen der angebotenen Modi aus!" << endl;
                     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
                     cin >> Modus;
      }
    }
    


  • Machs lieber so: (Habe ein paar Korrekturen vorgenommen, hoffe das passt so, ich glaube du hattest nen Copy&Paste Fehler drin ;))

    #include <iostream> 
    using namespace std; 
    const float Mwst = 19; 
    
    bool getFloat(float& val) // returns true if successful
    {
    	cin.clear();
    	std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    
    	cin >> val;
    	return !cin.fail();
    }
    
    int main() 
    { 
    	int Modus = 0; 
    	float Nettopreis, Bruttopreis, Steuer; 
    
    	while(Modus != 10)
    	{
    		cout << "Waehlen sie einen Modus aus:1 =  MWST Rechner" << endl; 
    		cout << "Waehlen sie einen Modus aus:2 =  Mwst meines Preises" << endl; 
    		cout << "Waehlen sie einen Modus aus:3 = Wie hoch ist die Mwst?" << endl; 
    		cout << "Waehlen sie einen Modus aus:10 = Programm beenden" << endl; 
    		cin >> Modus;
    
    		switch (Modus) 
    		{ 
    		case 1: 
    			cout << "Geben Sie einen Nettopreis ein:" << endl;
    			while (!getFloat(Nettopreis) || Nettopreis <= 0) 
    			{ 
    				cout << "Ein Preis kann nicht negativ sein!" << endl; 
    				cout << "Geben Sie einen Nettopreis ein:" << endl; 
    			}
    
    			Steuer = Nettopreis * Mwst /100; 
    			cout << "Die Mehrwertssteuer betraegt:" << Steuer << endl; 
    			Bruttopreis = Nettopreis + Steuer; 
    			cout << "Der Bruttopreis ist:" << Bruttopreis << endl; 
    			break;
    		case 2: 
    			cout << "Geben Sie einen Preis ein:" << endl; 
    			while (!getFloat(Nettopreis) || Nettopreis <= 0) 
    			{ 
    				cout << "Ein Preis kann nicht negativ sein!" << endl; 
    				cout << "Geben Sie einen Nettopreis ein:" << endl; 
    			}
    			Steuer = Nettopreis * Mwst /100; 
    			cout << "Die Mehrwertssteuer betraegt:" << Steuer << endl; 
    			break;
    		case 3: 
    			cout << "Die Mehrwertssteuer betraegt:" << Mwst << "%" << endl; 
    			break; 
    		case 10: 
    			cout << "Programm beendet" << endl; 
    			return 0; 
    		default: 
    			cout << "Waehlen sie einen der angebotenen Modi aus!" << endl; 
    			cin.clear();
    			std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    		}
    		cout  << endl << "Sie kehren nun zum Menu zurueck." << endl << endl; 
    	}
    }
    


  • 😮 goto 😮

    Warum hast du denn die Schleife entfernt?
    goto geht gar nicht!

    while heißt solange
    Solange die Bedingung erfüllt (wahr) ist, läuft die Schleife weiter.

    Überprüfe doch mal deine Schleifenbedingung aus deinem Eröffnungspost darauf, ob die sinnvoll ist.





  • DarkShadow44 schrieb:

    Machs lieber so: (Habe ein paar Korrekturen vorgenommen, hoffe das passt so, ich glaube du hattest nen Copy&Paste Fehler drin ;))

    [...]
    

    Danke sehr für die Verbesserung! Aber eine Frage habe ich dann doch noch:
    welchen Sinn die Funktion in Zeile 5- 12? Also was genau bedeutet bzw. bewirkt "getFloat"(ist das nur der Name der Variablen?), "cin.clear();", "(float& val)" und "return !cin.fail();"?



  • Das ist eine Funktion.
    Les darüber in einem C++ Lehrbuch deiner Wahl nach.


Anmelden zum Antworten