# Geschachtelte For schleife



## Rallenaldo (3. Feb 2013)

Hallo.

Ich habe mal eine Frage zum "Geschachtelte Schleifen" Beispiel aus dem Java ist auch eine Insel Buch.


```
for ( int i = 1; i<=5; i++)
	{
		for (int j=1; j<=i; j++)
			System.out.print("*");
		System.out.println();
```

Es werden jetzt Sternen ausgegeben. In der ersten Zeile 1 und dann je Zeile ein Sternchen mehr. Meine Frage ist nur, wieso?

Ich steig nicht so ganz durch, wieso sich die Anzahl der Sternchen pro Zeile um 1 erhöhrt. Ist es denn generell so, dass die Anweisung nach dem Schleifenkopf (System.out.print("*") sich auf die Variable bezieht, die im Schleifenkopf angegeben wird?

In diesem Fall würde "*" der Variablen "J" zugewiesen. Scheint mir auch die einzige logische Erklärung. Würde darin aber gerne bestätigt werden, nicht dass ich falsch liege und ich es mir dann falsch merke


----------



## JRussian (3. Feb 2013)

Die innere Schleife iteriert von 1 bis i, was bedeutet, dass sie von dem Wert von i aus der äußeren Schleife abhängt. Die Schleife außen iteriert von 1-5, d.h. bei jedem Inkrement von i in der äußeren Schleife wird i auf j referenziert und die innere Schleife läuft j mal (i mal durch).

Was dann entsprechend folgendes gebilde ergibt


```
*

**

***

****

*****
```


----------



## Fab1 (3. Feb 2013)

Grundsätzlich sollte man bei If-Anweisungen und Schleifen immer mit den Klammern arbeiten 
	
	
	
	





```
{}
```
 ich hab das nun mal ergänzt evtl. wird es dadurch bereits klarer.


```
for ( int i = 1; i<=5; i++)
        {
            for (int j=1; j<=i; j++){
            	System.out.print("*");
            }
            System.out.println();
            
        }
```

Es ist so, dass die innere Schleife von der äußeren abhängt, also hängt j von i ab. Der * wird nirgendwo zugewiesen, der wird nur ausgegeben. 

Wenn sich die äußere Schleife erhöht, erhöht sich auch automatisch die Anzahl der ausgegebenen * wenn die innere Schleife dann wieder "fertig ist" wird ein Zeilenumbruch gemacht und man macht wieder bei der äußeren weiter, solange die Bedingung wahr ist natürlich.


----------



## Rallenaldo (3. Feb 2013)

Also heißt das quasi ungefähr so:

Beim 1. Durchlauf sind i und j "1" --> 1x  "*" ausgeben
Beim 2. Durchlauf sind i und j "2" --> 2x  "*" ausgeben
Beim 3. Durchlauf sind i und j "3" --> 3x  "*" ausgeben
Beim 4. Durchlauf sind i und j "4" --> 4x  "*" ausgeben
Beim 5. Durchlauf sind i und j "5" --> 5x  "*" ausgeben


----------



## Marcinek (3. Feb 2013)

Ziemlich ungenau beschrieben.

Deine Schlussfolgerung ist richtig. Der Stern wird unterschiedlich oft geschreiben.

Aber die Ursache ist nicht, dass i und j "4" sind.

Du hast eine Schleife, die von 1...5 geht.

und eine zweite, die von 1...j geht.

Die äßere schleife sagt der innteren, wie oft sie laufen soll.

GGF. würde ich mir mal eine Tabelle machen und den Code zeile für Zeile durchgehen und mir aufschreiben welche Variable wann welchen wert hat.

Gruß,

Martin


----------



## Rallenaldo (3. Feb 2013)

Jetzt verwirrst du mich 

durch i++ und j++ wird i und j doch immer um eins erhöht. Da beide bei 1 starten, haben sie doch den gleichen Wert.

Das heißt doch in diesem beispiel, dass die Anzahl der Sterne der Anzahl der Durchläufe entspricht?


----------



## Marcinek (3. Feb 2013)

Viel zu ungenau.

Natürlich entspicht die Anzahl der Sterne der Anzahl der Durchläufe. Aber welche Schleife meinst du? Die innere oder äußere?

und i und j haben prinzipiell nix gemeinsam.

i steigt um 1

und j von 0 ... i!

Wenn i = 2;

dann war j = 0, 1 und nochmal 0,1,2 ....


----------



## IMartin (3. Feb 2013)

Ja, i und j werden immer um 1 erhöht, aber - wie Marcinek erklärt hat - nicht gleichzeitig und j wird bei Beginn jedes Durchlaufs der äußeren Schleife auf 1 gesetzt:


```
i=1, j=1: System.out.print("*") --> "*" ausgeben
          System.out.println() --> neue Zeile
i=2, j=1: System.out.print("*") --> "*" ausgeben
i=2, j=2: System.out.print("*") --> "*" ausgeben
	  System.out.println() --> neue Zeile
i=3, j=1: System.out.print("*") --> "*" ausgeben
i=3, j=2: System.out.print("*") --> "*" ausgeben
i=3, j=3: System.out.print("*") --> "*" ausgeben
	  System.out.println() --> neue Zeile
i=4, j=1: System.out.print("*") --> "*" ausgeben
i=4, j=2: System.out.print("*") --> "*" ausgeben
i=4, j=3: System.out.print("*") --> "*" ausgeben
i=4, j=4: System.out.print("*") --> "*" ausgeben
	  System.out.println() --> neue Zeile
i=5, j=1: System.out.print("*") --> "*" ausgeben
i=5, j=2: System.out.print("*") --> "*" ausgeben
i=5, j=3: System.out.print("*") --> "*" ausgeben
i=5, j=4: System.out.print("*") --> "*" ausgeben
i=5, j=5: System.out.print("*") --> "*" ausgeben
	  System.out.println() --> neue Zeile
```


----------



## Rallenaldo (3. Feb 2013)

Ich glaub jetzt hab ichs verstanden.

Die äußere Schleife hat insgesamt 5 Durchgänge.

Beim 1. Durchgang wird die innere Schleife so lange ausgegeben bis "j" gleich "i" ist. Das heißt in diesem Fall, dass einmal ein "*" ausgegeben wird.

Beim 2. Durchlauf startet es vom neuen und die innere Schleife läuft nun bis 2, da i ja 2 ist.

Also folgendes:

*
**

Beim dritten durchlauf sieht das dann so aus:

*
**
***

So richtig?


----------



## Marcinek (3. Feb 2013)

ja:shock:


----------

