C++ do while schleife Erklärung für Abbruch



  • Hallo alle zusammen,

    wir haben folgenden code geschrieben, der auch läuft:

    ----------------------------------------------------------------
    #include <iostream>

    using namespace std;

    int main ()
    {
    double laenge;
    double breite;
    double hoehe;

    cout << "Wir berechnen das Volumen eines Schukartons. Bitte gebe dazu folgende Daten ein: \n";

    do{

    cout << "Länge: ";
    cin >> laenge;
    }
    while ((laenge <= 21) || (laenge >= 29));

    /*Folgender Befehl soll beim zweiten Durchlauf der Schleife mit ausgegeben werden
    cout << "Länge nicht im Normbereich, bitte erneut eingeben: \n";
    */

    do{
    cout << "Breite: ";
    cin >> breite;
    }
    while ((breite<= 17) || (breite >= 23));

    do{
    cout << "Höhe: ";
    cin >> hoehe;
    }
    while ((hoehe <= 10) || (hoehe >= 13));

    double volumen = laenge * breite + hoehe;
    cout << "Das Volumen beträgt: " << volumen << "cc" << endl;

    cout << "Umgerechnet sind das: ";

    double liter = volumen / 1000;
    cout << liter << " Liter"<< endl;

    return 0;
    }
    ---------------------------------------------------------------------

    Unsere Frage bezieht sich auf die do-while Schleifen:
    Wenn bei der ersten Schleife das Ergebnis false ist, läuft die Schleife ja noch einmal durch. Für einen user der das Programm nicht geschrieben hat ist jetzt aber nicht klar, warum wieder die Eingabe Länge gefordert wird.
    Wir würden also gerne beim zweiten Durchlauf der Schleife zusätzlich einen cout-Befehl mit einfügen.
    Wie ist das möglich?



  • int laenge;
    cout << "Länge";
    cin >> laenge;
    while(! (/* euer erlaubter Intervall */) ) 
    {
        cout <<"Nochmal:" ;
        cin >> laenge;
    }
    


  • Hallo,

    das klappt für die erste Schleife 🙂 , aber bei der zweiten muss ich dann einmal einen Wert außerhalb des Intervalls eingeben, damit er dann bei Eingabe innerhalb des Wertes den nächsten Wert abfragt.

    Was muss hier noch beachtet werden
    einen continue Befehl kann ich ja nicht innerhalb der Schleife geben.



  • Erst mal vielen Dank für die schnelle Antwort.
    Mir ist aber noch aufgefallen, dass die Schleife nun nur einmal wiederholt wird. Gibt man also zweimal einen nicht gültigen Wert ein, wird trotzdem der nächste Wert abgefragt.
    Kann man diese Schleife auch so oft durchlaufen lassen bis ein zulässiger Wert eingegeben wurde?



  • Auch wenn man beim ersten mal einen richtigen Wert eingibt, fragt er erneut nach der Länge ....

    es sieht jetzt folgendermaßen aus bei uns:
    ------------------------------------------------
    do{

    cout << "Länge: ";
    cin >> laenge;
    }
    while (!(laenge <= 21) || (laenge >= 29));
    {cout << "Länge nicht im Normbereich, bitte erneut eingeben: \n";
    cin >> laenge;}
    -----------------------------------------------



  • Eigentlich hättest du es mit Hlymur's Code hinbekommen sollen.

    Ein Vorschlag meinerseits:

    bool valid = true;
    double laenge;
    
    do
    {
       if(!valid)
          cout << "Länge nicht im Normbereich, bitte erneut eingeben:" << endl;
       else
          cout << "Länge:" << endl;
    
       cin >> laenge;
    
       valid = laenge > 21 && laenge < 29;
    }while(!valid);
    

    Das wäre jetzt eine Straight-Forward Lösung wie ich sie mir "einfach" vorstellen würde.



  • Könnt ihr euch den Krampf mit do-while nicht sparen und das einfach so machen:

    cout << "Laenge: ";
    laenge_lesen:
        cin >> laenge;
    
        if (laenge <= 21 || laenge >= 29)
        {
            cout << "Laenge nicht im Normbereich, bitte erneut eingeben: \n";
            goto laenge_lesen;
        }
    


  • DM 4000 schrieb:

    ...

    Das war hoffentlich nicht erst gemeint!



  • inflames2k schrieb:

    DM 4000 schrieb:

    ...

    Das war hoffentlich nicht erst gemeint!

    Wieso? Hat sogar Vorteile gegenüber den anderen Lösungen hier, weil keine code duplication und keine zusätzlichen Variablen. Einfach nachzuvollziehen ist es obendrein auch noch.



  • Hallo inflames2k,

    Deine Lösung haben wir gerade getestet und sie funktioniert wunderbar.
    Und es war eigentlich mal wieder viel einfacher als man selbst erst dachte.

    Vielen Dank Euch allen für die schnellen Antworten! 🙂



  • Komisch, ich finde meine Schleife nicht schwerer zu verstehen als dein Goto-Gedöns.

    Sollen sie jetzt 4 mal goto verwenden? - Wenn du das wirklich meinst wünsche ich den beiden später viel erfolg.

    @Kirsten und Sandra

    Für dich / euch eventuell noch ein kleiner Vorschlag. Setzt das Eingabe lesen / die Ausgabe in eine eigene Funktion:

    int main()
    {
      double laenge = ReadValue("Länge", 21, 29);
      double breite = ReadValue("Breite", 17, 23);
    
      //...
      return 0;
    }
    
    double ReadValue(std::string valueName, double min, double max)
    {
       bool valid = true;
       double value;
    
       do
       {
          if(!valid)
             cout << valueName << " nicht im Normbereich, bitte erneut eingeben:" << endl;
          else
          cout << valueName << ":" << endl;
    
          cin >> value;
    
          valid = value > min && value< max;
       }while(!valid);
    }
    

    Der Code ist allerdings ungetestet und bedarf gegebenenfalls Anpassungen damit er läuft.



  • Wir sind zur Zeit noch ganz am Anfang bei C++. Somit war die erste Lösung von inflames2k für uns tatsächlich am einfachsten zu verstehen. Aber auch die anderen Lösungen werden wir uns noch mal genauer anschauen, erst recht wenn wir die entsprechenden Befehle / Variablen gelernt haben. Wir kommen dann bestimmt gerne noch mal bei Fragen auf Euch zurück. 🙂

    Vielen Dank noch mal für die viele Unterstützung!



  • inflames2k schrieb:

    Komisch, ich finde meine Schleife nicht schwerer zu verstehen als dein Goto-Gedöns.

    D.h. die goto-Variante ist mindestens gleich gut und, wenn man bedenkt, dass eigener Code in der Regel sowieso einfacher zu verstehen ist, potentiell besser.

    Sollen sie jetzt 4 mal goto verwenden?

    Oder halt 4 Schleifen. Oder wie du selbst vorgeschlagen hast, einfach in eine extra Funktion auslagern.



  • DM 4000 schrieb:

    inflames2k schrieb:

    ...

    D.h. die goto-Variante ist mindestens gleich gut und, wenn man bedenkt, dass eigener Code in der Regel sowieso einfacher zu verstehen ist, potentiell besser.

    goto mag in einfachen Sachen gut sein. Es wäre aber nichts dass ich einem Anfänger empfehle. Gründe sind dir hoffentlich klar?



  • Ich übernehme mal die Rolle von Wutz...

    Goto benutzen nur deppen.



  • snwFlake schrieb:

    Goto benutzen nur deppen.

    Absolute Verallgemeinerungen auch.


  • Mod

    snwFlake schrieb:

    Goto benutzen nur deppen.

    Blödsinn.
    Hast aber die Rolle von Wutz übernommen, passt also.


Log in to reply