while Schleife mit continue und break



  • Hallo liebe Gemeinde.

    Ich wollte ein Programm schreiben, bei dem ich zwei Zahlen kleiner als 100 miteinander Vergleiche. Wenn eine der beiden Zahlen größer als 100 ist, soll abgebrochen werden.

    Folgenden Programmcode habe ich aufgesetzt:

    #include <iostream>
    using namespace std;
    
    int main()
    {
       float x, y;
       cout << "Geben Sie zwei Zahlen zwischen 0 und 100 ein!" << endl;
       cout << "x:";
       cin  >> x;
       cout << "y:";
       cin  >> y;
    
       while((x<=100)&&(y<=100))
       {
          if(x<y)
          {
             cout << "x = " << x << " ist kleiner als y = " << y << endl;
          }
          if(y<x)
          {
             cout << "y = " << y << " ist kleiner als x = " << x << endl;
          }
          if(x||y > 100)
          {
             cout << "Abbruch!" << endl;
             break;
          }
          continue;
       }
    
       return 0;
    }
    

    So einfach wie das Programm ist, es ist ein Fehler drinnen, auf den ich einfach nicht komme:

    Wenn ich z. Bsp. x = 55 und y = 56 ist, kommt folgende Ausgabe:

    Geben Sie zwei Zahlen zwischen 0 und 100 ein!
    x: 55
    y: 56
    x = 55 ist kleiner als y = 56
    Abbruch!
    

    Wo liegt der Denkfehler? Ich komme nicht drauf!

    Vielen Dank für die Antworten im Voraus.

    Gruß

    Max



  • silent_max schrieb:

    if(x||y > 100)
    
    if(x > 100 || y > 100)
    


  • Ersteinmal Danke für Deine schnelle Antwort.

    Den Fehler hat es behoben.

    Jedoch ist jetzt ein neuer Fehler aufgetreten, den ich nicht sehe.

    Jetzt kommt in einer Endlosschleife folgende Ausgabe:

    x = 55 ist kleiner als y = 56
    


  • silent_max schrieb:

    Ersteinmal Danke für Deine schnelle Antwort.

    Den Fehler hat es behoben.

    Jedoch ist jetzt ein neuer Fehler aufgetreten, den ich nicht sehe.

    Jetzt kommt in einer Endlosschleife folgende Ausgabe:

    x = 55 ist kleiner als y = 56
    

    Wieso wundert dich das? 55 ist nunmal kleiner als 56. Und beide sind kleiner als 100. 😉



  • Weil ich eigentlich gedacht habe, dass durch die Continue Anweisung zurück gesprungen wird und ich wieder zwei Zahlen eingeben kann...



  • silent_max schrieb:

    Weil ich eigentlich gedacht habe, dass durch die Continue Anweisung zurück gesprungen wird und ich wieder zwei Zahlen eingeben kann...

    Achso. Nein. Da hast du was falsch verstanden. continue leitet den nächsten Schleifendurchgang ein. Du landest also in Zeile 13. continue ist in dem Fall sogar total überflüssig, weil es die letzte Anweisung deiner Schleife ist. Du landest danach sowieso wieder am Schleifenanfang.



  • Achso...

    Sorry, dass ich so frage, aber wie muss ich das Programm umschreiben, damit ich erneut Zahlen für x und y eingeben kann? Weil so war das Programm eigentlich gedacht, dass die Eingabe von x und y verglichen wird, welche Zahl größer ist und dann zurück springt, damit ich erneut für x und y Zahlen eingeben kann. Abbruckbedingung soll die Eingabe von 101 sein.

    Weil auch wenn ich das "conitune" weg lasse, kommt immer noch die Endlosschleife.



  • int main()
    {
       float x, y;
    
       while((x<=100)&&(y<=100))
       {
    		cout << "Geben Sie zwei Zahlen zwischen 0 und 100 ein!" << endl;
    		cout << "x:";
    		cin  >> x;
    		cout << "y:";
    		cin  >> y;
    
    		if(x<y)
    		{
    			cout << "x = " << x << " ist kleiner als y = " << y << endl;
    		}
    		if(y<x)
    		{
    			cout << "y = " << y << " ist kleiner als x = " << x << endl;
    		}
    		if(x > 100 ||y > 100)
    		{
    			cout << "Abbruch!" << endl;
    			break;
    		}
       }
    }
    


  • continue ist eigentlich nur eine seltsame Schreibweise für if bzw. if-else:

    for(int i=1; i<20; ++i)
    	{
    		if( i%2!=0 )
    			continue;
    
    		// Ich will nur mit geraden Zahlen arbeiten
    		// Mache dies
    		// Mache das
    		// ...
    	}
    

    Das Gleiche wie:

    for(int i=1; i<20; ++i)
    	{
    		if( i%2==0 )
    		{
    			// Ich will nur mit geraden Zahlen arbeiten
    			// Mache dies
    			// Mache das
    			// ...
    		}
    	}
    


  • Sorry, heute sehe ich gar nichts mehr.

    Genau - abgesehen von "return 0" - Deinen Code hatte ich, nachdem ich die Continue Anweisung rausgehauen habe und es kommt immer noch eine Endlosschleife.



  • int main()
    {
    	float x, y;
    	do
    	{
            cout << "Geben Sie zwei Zahlen zwischen 0 und 100 ein!" << endl;
            cout << "x:";
            cin  >> x;
            cout << "y:";
            cin  >> y;
    
    		if(x<y)
            {
                cout << "x = " << x << " ist kleiner als y = " << y << endl;
            }
            if(y<x)
            {
                cout << "y = " << y << " ist kleiner als x = " << x << endl;
            }
            if(x > 100 ||y > 100)
            {
                cout << "Abbruch!" << endl;
            }
    	}while( (x<=100) && (y<=100) );
    }
    

    Du suchst sowas. 😉 Das ist ein Anwendungsfall für do-while.



  • Beachte: Die Schleife umfasst auch die Eingabe der Zahlen.



  • Ok.

    Jetzt funktioniert es auch.

    Aber bei do...while Schleifen bin ich noch nicht angelangt in meinem Buch, kommt aber demnächst.

    Vielen Dank ersteinmal für Deine Tipps, habe mich sehr weitergebracht.

    Gruß Max



  • silent_max schrieb:

    Ok.

    Jetzt funktioniert es auch.

    Aber bei do...while Schleifen bin ich noch nicht angelangt in meinem Buch, kommt aber demnächst.

    Vielen Dank ersteinmal für Deine Tipps, habe mich sehr weitergebracht.

    Gruß Max

    Wenn es um Schleifen geht müssen dir die Begriffe fußgesteuert und kopfgesteuert bekannt sein und was man darunter versteht. 😉



  • Du kannst das auch mit der while-Schleife machen.
    Nur solltest du dabei beachten, das du den Variablen vorher auch Wert zuweist (initialisierst).

    float x=0, y=0;
    
       while((x<=100)&&(y<=100))
       {
            cout << "Geben Si...
    

    Wenn du es ohne Initialisierung machst, sollte der Compiler auch eine Warnung ausgeben.


Anmelden zum Antworten