Verständnisproblem bei geschachtelter for-Schleife
-
Hallo zusammen,
ich schreibe morgen mein Klausur in Programmieren und habe grad irgendwie einen Hänger bei einem gewissen Programmablaufes.
Und zwar habe ich folgenden Programmfragment:for (i=0;i<5;i++) { for (j=0;j<i;j++) { printf("x"); } printf("%i\n", i+1); }
Das Programm gibt folgendes aus:
1
x2
xx3
xxx4
xxxx5Mein Verständnisproblem:
Ich verstehe ja das die äussere Schleife 5x durchläuft und die innere Schleife 4x durchläuft.
Ich blicke es nur einfach nicht wieso das x ab dem zweiten Durchlauf immer hinter dem vorhergehenden x geschrieben wird.
Ich habe mal so eine Programmablaufplan mir aufgemalt, demnach müssten die x untereinander stehen.Irgendwo habe ich anscheinend ein Denkfehler, vielleicht kann mir jemand mal so Schritt-für-Schritt den Ablauf der Schleifen auschreiben, ich bekomms einfach nicht gebacken.
Ich hoffe da kann mir jemand nen Denkanstoss geben
Gruss,
Michael
-
lalas schrieb:
Ich verstehe ja das die äussere Schleife 5x durchläuft und die innere Schleife 4x durchläuft.
die innere schleife wird 5i* durchlaufen.
-
lalas schrieb:
Ich blicke es nur einfach nicht wieso das x ab dem zweiten Durchlauf immer hinter dem vorhergehenden x geschrieben wird.
Ich blicke auch nicht ganz durch was du meinst!!!
-
Du hast es scheinbar nicht korrekt aufgemalt, deshalb male ich mal fuer dich
for (i=0;i<5;i++) { for (j=0;j<i;j++) { printf("x"); } printf("%i\n", i+1); }
i=0, 0<5
aeussere schleife: laeuft
j=0, 0<i == 0<0
innere schleife: laeuft nicht
i+1 == 1
print 1\ni=1, 1<5
auessere schleife: laeuft
j=0, 0<i == 0<1
innere schleife: laeuft
print x
j=1, 1<i == 1<1
innere schleife: laeuft nicht
i+1 == 2
print 2\ngesamt = x2\n
i=2, 2<5
aeussere schleife: laeuft
j=0, 0<i == 0<2
innere schleife: laeuft
print x
j=1, 1<i == 1<2
innere schleife: laeuft
print x
j=2, 2<i == 2<2
innere schleife: laeuft nicht
i+1==3
print 3\ngesamt = xx3\n
...
-
hallo und erstmal VIELEN DANK an euch
Shade Of Mine schrieb:
Du hast es scheinbar nicht korrekt aufgemalt, deshalb male ich mal fuer dich
i=0, 0<5
aeussere schleife: laeuft
j=0, 0<i == 0<0
innere schleife: laeuft nicht
i+1 == 1
print 1\nsoweit klar, habe ich auch
Shade Of Mine schrieb:
i=1, 1<5
auessere schleife: laeuft
j=0, 0<i == 0<1
innere schleife: laeuft
print x
j=1, 1<i == 1<1
innere schleife: laeuft nicht
i+1 == 2
print 2\ngesamt = x2\n
nachdem die innere schleife durchgelaufen ist wird j um 1 erhöht und läuft danach nicht nochmal, soweit klar.
Shade Of Mine schrieb:
i=2, 2<5
aeussere schleife: laeuft
j=0, 0<i == 0<2
innere schleife: laeuft
print x
j=1, 1<i == 1<2
innere schleife: laeuft
print x
j=2, 2<i == 2<2
innere schleife: laeuft nicht
i+1==3
print 3\ngesamt = xx3\n
da scheint mein denkfehler zu sein. es wird also bei for-schleifen der "startwert" (hier j) immer wieder neu initialisiert.
hier konkret wird j jedesmal auf null gesetzt, wenn die schleife nicht durchlaufen wird.
ist das so korrekt ?gruss,
michael
-
lalas schrieb:
da scheint mein denkfehler zu sein. es wird also bei for-schleifen der "startwert" (hier j) immer wieder neu initialisiert.
hier konkret wird j jedesmal auf null gesetzt, wenn die schleife nicht durchlaufen wird.
ist das so korrekt ?for(j=0;j<i;j++) { ... }
Das ist eine einfachere Schreibweise fuer:
j=0; while(j<i) { ... j++; }
j wird also jedesmal auf 0 gesetzt wenn die aeussere Schleife durchlaeuft. j=0 ist die Initialisierung der inneren Schleife und die innere Schleife wird nur dann neu initialisiert wenn sie sich einmal beendet hat.
Da mir gerade die Worte fehlen, machen wir das ganze mal mit goto
i=0; //initialisierung auessere schleife auessere_schleife: //sprungmarke if(i<5) { //schleife laeuft solange das da true ist j=0; //initialiserung innere schleife innere_schleife: //sprungmarke if(j<i) { //schleife laeuft solange das da true ist printf("x"); //code ++j; //erhoehe goto innere_schleife; //und lauf nochmal durch } printf("%i\n", i+1); //code ++i; //erhoehe goto auessere_schleife; //und lauf nochmal durch }
oder mit while:
i=0; while(i<5) { j=0; while(j<i) { printf("x"); ++j; } printf("%i\n", i+1); ++i; }
-
super erklärung. hab es verstanden...vielen dank nochmals