Verschachtelte Schleifen
Eine Schleife darf im Rumpf einer anderen Schleife stehen. Das klingt harmlos, ist aber der Schritt von Linien zu Flächen – und der Punkt, an dem die Anzahl der Durchläufe plötzlich explodiert.
Das Grundmuster
Sage vor dem Ausführen voraus:
a) Wie viele Ausgaben von Zahlenpaaren erscheinen insgesamt?
b) In welcher Reihenfolge?
Auflösung
1/1 1/2 1/3 1/4
2/1 2/2 2/3 2/4
3/1 3/2 3/3 3/4
Es sind 3 · 4 = 12 Paare.
Die äußere Schleife läuft langsam: Sie geht erst zur nächsten Zeile, wenn die innere Schleife komplett durchgelaufen ist. Die innere läuft bei jedem einzelnen Durchlauf der äußeren wieder von vorne los.
Das IO.println() ohne Argument macht nur einen Zeilenumbruch. Es steht im Rumpf der äußeren Schleife – deshalb gibt es einen Umbruch pro Zeile, nicht pro Zahl.
Bei zwei verschachtelten Schleifen mit n und m Durchläufen wird der innere Rumpf n · m mal ausgeführt.
Aus 10 und 10 werden 100. Aus 1000 und 1000 werden eine Million. Diese Multiplikation ist der Grund, warum verschachtelte Schleifen bei großen Datenmengen schnell zu langsam werden – dazu mehr in Kapitel 7.
Ein Punktegitter
a) Zähle ohne Rechner aus, wie viele Punkte gezeichnet werden.
b) Färbe jede Zeile anders ein. Wo im Programm gehört die Farbänderung hin?
Auflösung
a) In x-Richtung: von -200 bis 200 in Schritten von 50 – das sind 9 Werte. In y-Richtung: von -120 bis 120 in Schritten von 60 – das sind 5 Werte. Zusammen 45 Punkte.
b) Die Farbe gehört in den Rumpf der äußeren Schleife, vor die innere Schleife. Dort wird sie einmal pro Zeile gesetzt.
Ein Schachbrettmuster
Ändere das Punktegitter so, dass abwechselnd rote und blaue Punkte entstehen – wie auf einem Schachbrett.
Erst denken: Woran erkennst du, ob ein Feld rot oder blau sein muss?
Tipp 1: Die Idee
Zähle die Zeilen und Spalten mit Nummern (0, 1, 2, …) statt mit Koordinaten. Dann entscheidet die Summe aus Zeilennummer und Spaltennummer über die Farbe.
Tipp 2: Gerade oder ungerade
Ist (zeile + spalte) % 2 == 0, nimm die eine Farbe, sonst die andere.
Aufgabe 1: Das kleine Einmaleins
Gib das kleine Einmaleins als Tabelle aus:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
...
Tipp 1: Zwei Schleifen
Die äußere Schleife zählt die Zeilen (den ersten Faktor), die innere die Spalten (den zweiten Faktor).
Tipp 2: Ausgabe ohne Umbruch
IO.print(...) gibt aus, ohne eine neue Zeile zu beginnen. IO.println() ohne Argument macht nur den Umbruch. Damit baust du zeilenweise auf.
Aufgabe 2: Dreieck aus Sternen
Gib folgendes Muster aus:
*
**
***
****
*****
Anschließend: Wie musst du das Programm ändern, damit das Dreieck rechtsbündig steht?
Tipp
In der ersten Zeile steht ein Stern, in der zweiten zwei, … Die innere Schleife läuft also nicht immer gleich oft, sondern abhängig von der Zeilennummer.
Zusatzaufgabe
Zeichne mit dem Stift Quadrate ineinander: acht Quadrate mit gemeinsamem Mittelpunkt und wachsender Seitenlänge.
Überlege zuerst: Welche Schleife ist die äußere, welche die innere? Und wo liegt die linke untere Ecke eines Quadrats mit der Seitenlänge s, wenn der Mittelpunkt bei (0, 0) sein soll?