continue in verschachtelten schleifen



  • Hi
    wollte mal wissen wie man continue in verschachtelten Schleifen anwendet.

    while(true) {
    ... Code ...
         while(wasauchimmer) {
           ... Code ...
           continue;
          }
    }
    

    Das Problem ist das dieses continue nicht in das verschachtelte while springt sondern in das Anfangswhile. Wie kann man das umgehen?
    Es geht um ein Menü. Das Menü wird in einer Schleife aufgerufen, ein Untermenü ebenfalls in einer Schleife.
    Wenn man viele verschachtelte whiles hat sollte der doch immer in das "letzte" while reinspringen und nicht zum Anfang.

    Gruß



  • Vergessen den Code zu posten.

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    void menu();
    int rechnen(int);
    
    int main(int argc, char *argv[])
    {
    char taste;
    while(true) {
    menu();
    //cin.clear();
    cin.sync();
    cin.get(taste);
    if(taste == 'a') {
         cout << "\nErgebnis = Anzahl * Anzahl" << endl;
         continue;
    }
    
    else if(taste == 'b') {
    
        while(true) {
         int anzahl;
         cout << "Anzahl eingeben: ";
         cin >> anzahl;
              if(anzahl >= 1) {
                cout << "Gleich " << rechnen(anzahl) << endl;
         //Automatisch Rücksprung in Schleife, bei continue das selbe
         //Bei break sollte doch in Anfangsschleife zurück? Tut es aber nicht
         //es springt komplett raus! Lösungsansatz?
              }
              else cout << "Mehr als 1 eingeben" << endl;
              //Rücksprung in (innere) Schleife (OK)
                    }
    
    }
    
    break;
                 }
    
    }
    
    void menu() {
    cout << endl;
    cout << "****************************\n";
    cout << "Taste a zum Formel anzeigen" << endl;
    cout << "Taste b zum Berechnen" << endl;
    cout << "Sonst Beenden" << endl;
    cout << "****************************\n";
    cout << "\n$  ";
    }
    
    int rechnen(int anzahl) {
    int ergebnis = anzahl * anzahl;
    return ergebnis;
    }
    

    Wenn ich also in Programm b bin soll ein Eingabeprompt erscheinen. Bei Eingabe ab 1 soll Ergebnis berechnet werden, dann in die Menüschleife zurück. Bei Eingabe < 1 neuer Prompt.
    Statt in die Menüschleife springt der aber in seine eigene Schleife zurück, auch wenn ich break eingebe. Break springt doch aus der Schleife raus, dann muss er sich doch also wieder in der Anfangsschleife befinden. Nichts ist!
    Wo könnte der Fehler liegen?

    Danke



  • Himmelherrgott, man sollte Einrückung verwenden, um den Code übersichtlicher zu machen, nicht unübersichtlicher.

    continue sollte eigentlich schon an den Anfang der innersten Schleife springen und break nur aus der innersten heraus.

    EDIT: Ich sehe in der inneren Schleife auch weder break noch continue.



  • #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    void menu();
    int rechnen(int);
    
    int main(int argc, char *argv[])
    {
    char taste;
    while(true) {
    menu();
    cin.sync();
    cin.get(taste);
    if(taste == 'a') {
    cout << "\nErgebnis = Anzahl * Anzahl" << endl;
    continue;
    }
    
    else if(taste == 'b') {
    
    while(true) {
    int anzahl;
    cout << "Anzahl eingeben: ";
    cin >> anzahl;
    if(anzahl >= 1) {
    cout << "Gleich " << rechnen(anzahl) << endl;
    // ***
    }
    else cout << "Mehr als 1 eingeben" << endl;
    // ***
    }
    
    /* Sowohl break als auch continue funktionieren hier nicht */
    
    }
    
    break;
    }
    
    }
    
    void menu() {
    cout << endl;
    cout << "****************************\n";
    cout << "Taste a zum Formel anzeigen" << endl;
    cout << "Taste b zum Berechnen" << endl;
    cout << "Sonst Beenden" << endl;
    cout << "****************************\n";
    cout << "\n$  ";
    }
    
    int rechnen(int anzahl) {
    int ergebnis = anzahl * anzahl;
    return ergebnis;
    }
    

    Die Einrückung kann ich nicht ändern, jetzt komplett ohne. DevCpp hat seltsames Tabverhalten. Da kann ich nix für.



  • Sowohl break als auch continue funktionieren hier nicht

    Sowohl break als auch continue sind hier außerhalb von der inneren Schleife (was du bei vernünftiger Einrückung sofort sehen würdest).



  • while(true) {
    int anzahl;
    cout << "Anzahl eingeben: ";
    cin >> anzahl;
    if(anzahl >= 1) {
    cout << "Gleich " << rechnen(anzahl) << endl;
    break; // HIER soll in das Menü zurückgesprungen werden und zwar in das erste Menü
    // Nachdem die Aufgabe erledigt ist
    }
    else cout << "Mehr als 1 eingeben" << endl;
    continue;
    }
    
    }
    

    Ich glaube jetzt sollte es verständlich sein. Es funktioniert aber so nicht.
    Selbst mit richtiger Einrückung nicht !! 🙄



  • Stell dir die Tabulatorisierung richtig ein, dann klappt das auch.
    Ein continue am Ende der while Schleife bringt nix, dann kannst du es genauso gut weglassen. Und break springt in den Gültigkeitsbereich ausserhalb von while (true) {}. Keine Ahnung ob das das erste Menü ist.



  • Schleifen tiefer als 2 oder 3 mal zu schachteln ist generell eher eine schlechte Idee. Insbesondere, wenn man aus einer inneren Schleife öfters ganz rausspringen muss, sollte man das Ganze in einzelne Funktionen aufteilen um erstens die Übersicht zu bewahren und zweitens raus-returnen zu können.
    Und man hat auch weniger Probleme mit dem Einrücken. 🙄


Anmelden zum Antworten