Verschachtelte Schleifen.



  • Hallo zusammen,

    ich habe eine Frage zu verschachtelten Schleifen. Als Afänger verstehe ich zwar schon irgendwie, wie man sie anwendet.
    Allerdings verstehe ich nicht ganz, warum folgendes Beispiel funktioniert, wie es funktioniert.
    Und zwar sind hier zwei Schleifen ineinander verschachtelt.
    eine gibt die Zeilennummer aus und die andere malt in jede Zeile Sternchen, sodass am Schluss eine Dreiecksform entsteht.

    int i, j;
    
    // Schleife fuer die Zeilen
    for(i=0; i<10; i++) {
    	printf("\nZeile %2d: ", i+1);
    
    	// Schleife fuer die Spalten
    	for(j=0; j<=i; j++) {
    		printf("*");
    	}
    }
    

    Hier der Link:
    http://www.c-howto.de/tutorial-schleifen-for.html

    Was mir jetzt unklar ist, ist warum in jeder Zeile ein Sternchen mehr ausgegeben wird.
    Das Wort "Zeile" wird ja auch nur einmal pro Zeile ausgegeben. Müsste das mit dem Stern nicht genau so sein?
    Wahrscheinlich total einfach. Aber ich komme nicht drauf.
    Würde mich über etwas Hilfe freuen.

    Viele Grüße

    Maik



  • Betrachte mal nur folgenden Teil des Codes:

    BIOSzillator schrieb:

    printf("\nZeile %2d: ", i+1);
    
    	// Schleife fuer die Spalten
    	for(j=0; j<=i; j++) {
    		printf("*");
    	}
    

    Wie oft wird das obere printf aufgerufen? Wie oft das untere?



  • Hallo SG1

    puhh. Ich muss ehrlich gesagt etwas raten, da ich momentan auf dem Schlauch stehe.
    Kann es sein, dass die zweite Schleife auf jeden Durchlauf der ersten angewendet wird?
    Wenn ja, kann ich das nicht so richtig nachvollziehen.

    Denn für mich sieht es so aus wie:
    Schreibe Zeile %2d;
    schreibe *;

    inkrementiere;
    inkrementiere;


  • Mod

    Lös dich mal von deinem Problem! Betrachte nur die Aufgaben, die wir dir geben.

    Aufgabe 1: Was gibt folgender Code aus:

    printf("Blah\n");
    
        for(j=0; j<=10; j++) {
            printf("Blupp");
        }
    

    Aufgabe 2: Was gibt folgender Code aus:

    int i = 5;
        printf("Blah %d: ", i);
    
        for(j=0; j<=i; j++) {
            printf("#");
        }
    

    Bitte jedes Mal ganz genau nachdenken und auf jede Kleinigkeit achten. Nicht schummeln!



  • Hi SeppJ

    Na dann mal los.
    Hier die Ergebnisse, ohne sie kompiliert zu haben:

    Aufgabe 1:
    Blah
    BluppBluppBluppBluppBluppBluppBluppBluppBluppBluppBlupp

    Aufgabe 2:
    Blah 5######

    Also die Schleife läuft so lange durch, bis sie <= dem Wert der Variable entspricht und bricht dann ab, weil sie durch die Inkrementierung nicht mehr dem Vergleichswert entspricht.

    Was passiert denn eigentlich mit der J Variable, sobald sie nicht mehr richtig ist?
    Wird sie zurück auf 0 gesetzt?


  • Mod

    BIOSzillator schrieb:

    Was passiert denn eigentlich mit der J Variable, sobald sie nicht mehr richtig ist?
    Wird sie zurück auf 0 gesetzt?

    Nein, es passiert gar nichts. Beziehungsweise hier verlässt sie ihren Gültigkeitsbereich und existiert nach der Schleife gar nicht mehr. Wenn j von außerhalb der Schleife wäre, dann würde es seinen Endwert behalten.
    Das nächste Mal, wenn die Schleife wieder losgeht (zum Beispiel bei verschachtelten Schleifen *winkwink*), steht zu Anfang natürlich das j=0 da und das wird dann auch gemacht.

    Aufgabe 1:
    Blah
    BluppBluppBluppBluppBluppBluppBluppBluppBluppBluppBlupp

    Aufgabe 2:
    Blah 5######

    Ausgezeichnet. Und wenn der Code jeweils 3x nacheinander ausgeführt wird, was passiert dann? (Tipp: die letzte Frage ist nicht schwer) Wie würdest du den Code 3x ausführen, ohne ihn 3x untereinander zu schreiben?



  • Würde man den Code drei mal hintereinander ausführen, würde Blah 5###### drei mal untereinander stehen.
    Ich habe das jetzt so gemacht:
    [code="c"]
    int j, i=5, k;
    for (k=0;k<=2;k++) {
    printf("\nBlah %d: ", i);

    for(j=0; j<=i; j++) {
    printf("#");
    }
    }
    [code]

    Wenn ich das also jetzt richtig verstanden habe, sieht der Ablaufplan so aus.
    Die äußere Schleife wird einmal ausgeführt.
    Anschließend wird die innere Schleife so lange ausgeführt, bis die Bedingung der Zählvariable falsch ist.

    Anschließend kommt dann wieder ein durchlauf der äußeren Schleife und die Zählvariable der inneen Schleife wird wieder auf den Anfangswert gesetzt usw.
    Richtig?

    Ich glaube, dass mir der Ablaufplan nicht ganz schlüssig war.
    Ich dachte die ganze Zeit, dass beide Schleifen so lange ausgeführt werden, bis sie gleichzeitig falsch sind.


  • Mod

    Ich glaube, jetzt hast du es erfasst.



  • ...



  • Swordfish schrieb:

    Was spricht dagegen, den Codefetzen einfach auf dem Papier "auszuführen"?

    Vorstellungsvermögen.



  • ...



  • Ein dickes Danke an euch beide SeppJ und Swordfish.
    Ihr habt mir wirklich sehr geholfen.

    @ Swordfish

    Genau so, wie dein Beispiel aussieht, hatte ich es jetzt auch verstanden.
    Hab mich im vorigen Beitrag wohl etwas missverständlich ausgedrückt.
    Dein Code Beispiel kopier ich mir als Gedankenstütze auf jeden Fall in meine Notizen. Es zeigt wirklich sehr schön den Ablaufplan.

    Dann werde ich mich mal weiter ans Lesen machen.
    Danke nochmal!


Log in to reply