for, while oder do



  • Hallo,

    ich möchte gern das mein Menü mehr als einmal benutzt werden kann und frage
    mich welche Schleife die geeignetste ist. Ich tendiere zu while.
    Ist es mit einem switch sinnvoller oder mit if?

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main() {
        double zahl;
    
    
        cout << "Zahl: ";
        cin >> zahl;
        cout << "Q)uadrat" << endl
             << "W)urzel" << endl
             << "B)etrag" << endl
             << "E)nde" << endl
             << endl
             << "Ihre Wahl: ";
       
        char wahl;
        cin >> wahl;
    
        switch(wahl){
    
          case 'q' :
          case 'Q' :
                      cout << "Quadrat "
                           << pow(zahl,zahl);
                  break;
          case 'w' :
          case 'W' :
                    cout << "Die Wurzel aus "
                         << (zahl = abs(zahl)) << " beträgt : "
                         << abs(sqrt(zahl)) << endl;
                   break;
          case 'b' :
          case 'B' :
                    cout << "Betrag: "
                         << abs(zahl)
                         << ".";
                         break;
          case 'e':
          case 'E':
                   cout << "Programm beendet.";
                         break;
          default :
                   cout << "Die Eingabe haut nicht hin, "
                        << "Programm beendet."
                        << endl;
                          break;
                           }
        }
        return 0;
    }
    

    Ich frage mich auch wo ich die Schleife ansetzen soll, wenn ich die Möglichkeit einer neuen Zahleneingabe realisieren will.
    Funktionen sind noch nicht eingeführt.

    Hat ein wer ein paar Worte?

    Danke
    Lou



  • Vom Prinzip hab ich mir das so gedacht.

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main() {
        double zahl;
    
    
      do{  cout << "Zahl: ";           // soll Menu erst einmal aufrufen
        cin >> zahl;
        cout << "N)eue Eingabe " << endl
             << "Q)uadrat" << endl
             << "W)urzel" << endl
             << "B)etrag" << endl
             << "E)nde" << endl
             << endl
             << "Ihre Wahl: ";
    while(true){            // soll wiederholte Ausgabe ermöglichen.
        char wahl; 
        cin >> wahl;
    
        switch(wahl){
          case 'n' :
          case 'N' :
                      cout << "Zahl: ";
                      cin >> zahl;
    
          case 'q' :
          case 'Q' :
                      cout << "Quadrat "
                           << pow(zahl,zahl);
                  break;
          case 'w' :
          case 'W' :
                    cout << "Die Wurzel aus "
                         << (zahl = abs(zahl)) << " beträgt : "
                         << abs(sqrt(zahl)) << endl;
                   break;
          case 'b' :
          case 'B' :
                    cout << "Betrag: "
                         << abs(zahl)
                         << ".";
                         break;
          case 'e':
          case 'E':
                   cout << "Programm beendet.";
                         break;
          default :
                   cout << "Die Eingabe haut nicht hin, "
                        << "Programm beendet."
                        << endl;
                          break;
                           }
                           cout << "Zahl: ";
                  }
        }
        return 0;
    }
    

    gibt darüber hinaus den Fehler aus.

    58:12: error: expected ‘while’ before numeric constant
    return 0;
    ^
    

    Was hat es damit auf sich?



  • Rücke deinen Code anständig ein, dann siehst du den Fehler sofort. Du hast oben ein do, zu welchem vmtl. das while fehlt.

    Überlege, ob du nicht den Teil innerhalb der Schleife in eine Funktion auslagern könntest, um die Übersichtlichkeit zu erhöhen.



  • Dieser Beitrag wurde gelöscht!


  • okay, war ein Schusselfehler. Danke.

    Ich hab aber einen Bug drin.
    Und zwar wollte ich bei cin >> zahl das

    'e' || 'E' für den Abbruch implementieren. 
    
    ```cpp
                     cout << "Zahl: ";
                     cin >> zahl;
    
                       if(zahl){
                         (zahl == 'e' || 'E' == zahl);
                         cout << "Abbruch";
    
                       }
    

    Wenn ich das beim Zahl- Aufruf eingebe. Läuft das Programm ohne Pause gute 3-4 min. immer wieder durch. Was ist denn da los?
    Und wie breche ich das Programm entgültig beim betätigen von 'e' ab?



  • Irgendwo würde ich als Abbruchbedingung in der Schleife nehmen

    choice != 'e' && choice != 'E'
    

    Bzw. Du könntest auch die Wahl einer Funktion übergeben, und die Funktion entscheidet dann, ob das Programm weiterlaufen soll (so langsam kannst Du deine main() Funktion in einzelne Teilfunktionen aufteilen, z.B. 'print_menu()', 'read_choice()', ...). Schalte am besten mal alle Compilerwarnungen ein... Da sollt eigentlich etwas kommen.. manche IDEs zeigen sogar gleich im Editor eine Warnung an

                     cout << "Zahl: ";
                     cin >> zahl;
    
                       if(zahl){
                         (zahl == 'e' || 'E' == zahl);  // expression result unused
                         cout << "Abbruch";
    
                       }
    

    Edit:
    Kleines Beispiel:

    void print_menu() {
        cout << "N)eue Eingabe\n"
                "Q)uadrat\n"
                "W)urzel\n"
                "B)etrag\n"
                "E)nde\n\n"
                "Ihre Wahl: ";
    }
    
    bool process_choice(char choice) {
        static float zahl = 0;
        switch (choice) {
        case 'n':
        case 'N':
            cout << "Zahl: ";
            return (cin >> zahl).good();
            // ...
        case 'e':
        case 'E':
            return false;
        // ...
        }
    }
    // main:
        for (char choice = 'N'; process_choice(choice); ) {
            print_menu();
            std::cin >> choice;
        }
    

    Normal würde ich die Zahl nicht in der Funktion process_choice speichern, sondern z. B. als Argument übergeben, also das kannst Du gerne ändern...



  • @HarteWare
    Das mit den Funktionen ist ne gute Sache, würde ich auch sofort machen,
    aber die sind erst in den kommenden Lektionen Thema. Hier muss es noch ohne gehen. ( Aber trotzdem interessant, danke!)

    Was verursacht denn diese Entlosschleife bei

      cout << "Zahl: ";
                      cin >> zahl;
    
                        if(zahl){
                          (zahl == 'e' || 'E' == zahl);
                          cout << "Abbruch" << endl;
                          return false;
                        }
    


  • @Lou-Cyphr3 Ich habe Dir doch schon die entsprechende Zeile markiert. Die Bedingung zur If-Abfrage gehört in die unmittelbar darauf folgenden runden Klammern. Sobald die offene '{' kommt, bist Du schon im Körper der Abfrage und nicht mehr in der Bedingung. Die Warnung übersetzt sich mehr oder weniger als "Ergebnis des Ausdrucks wird nicht verwendet".

    Was verursacht denn diese Entlosschleife

    Das könnte z. B. durch folgende Zeile passieren;

    while (true) {
    

    Wie man das besser machen kann habe ich exemplarisch auch schon beschrieben, sogar mehrere Alternativen.



  • alles klar!

    ich war durch dein "choice" verwirrt.
    Läuft jetzt.

    Danke


Anmelden zum Antworten