Verschachtelte For-Schleifen



  • Servus,
    bin gerade am üben von verschachtelten For-Schleifen und hänge gerade an der Aufgabe das kleine Einmaleins auszugeben.
    Aktuell sieht das Programm so aus:

    include <iostream>
    using namespace std;

    int main() {
    int i,j,zahl=i*j;

    for(i=1; i>=10; i++){

    for(j=1; j>=10; j++){}
    }
    cout << i*j << "=" << zahl << '\n' << endl;
    return 0;
    }

    Die Ausgabe ist aber immer 0.
    Weshalb ?

    Danke im Voraus.



  • Habe den Code etwas verändert , er sieht jetzt so aus :

    #include <iostream>
    using namespace std;

    int main() {
    int i,j,zahl=i*j;

    for(i=1; i>=10; i++){

    for(j=1; j>=10; j++){}
    }
    cout << i << "*" << j << "=" << zahl << '\n' << endl;
    return 0;
    }

    ausgabe ist immer noch 0.

    Gerchnet wird laut Debugger das hier = 1*-13202=0.
    Weshalb ?



  • 1. Nutze Code-Tags!

    2. Wenn man deinen Code anständig formatiert (benutze sowas wie z.B. clang-format!), dann sieht er so aus:

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int i, j, zahl = i * j;
    
        for (i = 1; i >= 10; i++) {
    
            for (j = 1; j >= 10; j++) {
            }
        }
        cout << i << "*" << j << "=" << zahl << '\n' << endl;
        return 0;
    }
    

    Offensichtlich sind die Schleifen leer.

    3. Beim Kompilieren Warnungen einschalten und alle Warnungen beheben!

    clang++-3.9 -Wall -Wextra blubb.cc
    blubb.cc:5:16: warning: variable 'j' is uninitialized when used here [-Wuninitialized]
    int i,j,zahl=i*j;
                   ^
    blubb.cc:5:8: note: initialize the variable 'j' to silence this warning
    int i,j,zahl=i*j;
           ^
            = 0
    blubb.cc:5:14: warning: variable 'i' is uninitialized when used here [-Wuninitialized]
    int i,j,zahl=i*j;
                 ^
    blubb.cc:5:6: note: initialize the variable 'i' to silence this warning
    int i,j,zahl=i*j;
         ^
          = 0
    2 warnings generated.
    

    4. Wenn du int i,j schreibst, haben die beiden noch unbekannte Werte. Bei der Berechnung von zahl=unbekannt*unbekannt kommt somit ebenfalls unbekannt heraus.

    5. Deine Schleifen sind falsch. Nicht nur, dass du innerhalb der Schleife gar nichts tust, sondern die Weiterlauf-Bedingung ist nicht erfüllt.
    Bei for (i = 1; i >= 10; i++) sagst du "setzte i auf 1 und dann führe folgenden Block solange aus, wie i >= 10. 1 >= 10 ist false. Daher wird nie etwas ausgeführt. Du musst INNERHALB der Schleife das Produkt berechnen. Die Variablen i und j solltest du INNERHALB der jeweiligen Schleife deklarieren. Also for (int i = 1; i <= 10; ++i) { ... } Und das cout musst du auch INNERHALB der Schleife machen.



  • #include <iostream>
    using namespace std;
    
    int main() {
        int zahl; 
    
        for(int i=1; i++;){
    
            for(int j=1; j++;){
                i>=10;  
                j>=10;
                zahl = i*j;
                    cout << i << "*" << j << "=" << zahl << '\n' << endl; }
        }
    
        return 0;
    }
    

    Es gibt zwar eine Ausgabe nun beim Programm aber diese ist unendlich.
    Und so wie ich es mir vorgestellt habe sieht sie auch nicht aus.
    So war die Ausgabe gedacht :

    1 x 1 = 1
    2 x 1 = 2
    3 x 1 = 3

    Ein simples Programm ,das dass kleine Einmaleins ausgibt.



  • Schalte die Compilerwarnungen an!

    Der sagt dir dann auch, was er von den Zeilen 10 und 11 hält.
    Irgendwas mit Zeilen ohne Effekt.

    Die Reihenfolge der Paramtere einer for-Schleife ist nicht Austauschbar:
    https://de.wikibooks.org/wiki/C-Programmierung:_Kontrollstrukturen#For-Schleife

    Die Schleife läuft solange die Bedingung wahr ist.
    Das ist demnach die Laufbedingung und nicht die Abbruchbedingung.
    Und die gehört in den Schleifenkopf, nicht irgendwo mittendrin.
    (im letzten Satz von wob steht es doch schon)



  • Probierst du solange rum, bis der Compiler nicht mehr meckert?
    Versuche die einzelnen Anweisungen zu verstehen...

    'wob' hat dir doch schon geschrieben, wie die Schleifen aussehen müssen:

    for (int i = 1; i <= 10; ++i) { ... }
    

    Die 3 durch Semikolon getrennten Bereiche sind

    Initialisierung; Schleifen-Bedingung; Zählerveränderung
    

Anmelden zum Antworten