Verschachtelte Schleifen
Eine Schleife darf im Rumpf einer anderen Schleife stehen. Man sagt dann, die Schleifen sind verschachtelt.
Aufgabe 1: Ein Flussdiagramm analysieren
Gegeben ist das folgende Flussdiagramm.
a) Analysiere das Diagramm und beschreibe, welche Zeichnung entsteht.
b) Implementiere ein entsprechendes Programm.
flowchart TD
S([Start]) --> P1[/Äußere Schleife: 3 mal/]
P1 --> P2[/Innere Schleife: 4 mal/]
P2 --> B1[forward 50]
B1 --> B2[right 90]
B2 --> P2
P2 -- fertig --> C1[penup]
C1 --> C2[forward 100]
C2 --> C3[pendown]
C3 --> P1
P1 -- fertig --> E([Ende])
Tipp 1: Was macht die innere Schleife?
Viermal forward(50) und right(90) – das kennst du schon. Es entsteht ein Quadrat mit der Seitenlänge 50.
Tipp 2: Und die äußere?
Die äußere Schleife führt dreimal aus: „Zeichne ein Quadrat, dann gehe mit angehobenem Stift 100 Pixel weiter."
Es entstehen also drei Quadrate nebeneinander.
Tipp 3: Die Einrückung
Bei verschachtelten Schleifen wird zweimal eingerückt:
for i in range(3):
for j in range(4):
forward(50)
right(90)
penup()
forward(100)
pendown()
Beachte: penup() ist nur einfach eingerückt. Es gehört zur äußeren, nicht zur inneren Schleife.
- Bei verschachtelten Schleifen brauchen innere und äußere Schleife verschiedene Zählvariablen (z. B.
iundj). - Die innere Schleife läuft bei jedem Durchlauf der äußeren komplett durch.
- Bei 3 äußeren und 4 inneren Durchläufen wird der innerste Block mal ausgeführt.
- Die Einrückungstiefe entscheidet, was zu welcher Schleife gehört. Zähle im Zweifel die Leerzeichen.
Aufgabe 2: Das Punktefeld
Entwickle ein Programm, das eine Zeichnung wie unten abgebildet erzeugt: 10 mal 10 Punkte.
Tipp 1: Erst eine Zeile
Fang klein an: Schreibe zuerst nur eine Schleife, die eine Reihe aus zehn Punkten zeichnet. Das kennst du schon aus Lektion 3.
Tipp 2: Von Zeile zu Zeile
Nach einer Reihe muss die Turtle zurück an den linken Rand und eine Zeile nach unten. Das ist am einfachsten mit Koordinaten:
x = xcor() # merken, wo die Zeile begann
# ... Reihe zeichnen ...
goto(x, ycor() - 25) # zurück nach links, 25 Pixel tiefer
from turtle import *
shape("turtle")
screensize(400, 400)
speed(0)
penup()
goto(-125, 125)
for zeile in range(10):
x = xcor()
for punkt in range(10):
dot(20)
forward(25)
goto(x, ycor() - 25)
Zusatzaufgabe 1: Punkte in verschiedenen Größen
Modifiziere dein Programm so, dass eine Zeichnung wie unten entsteht: Die Punkte werden nach rechts und nach unten hin größer.
Tipp: Die Zählvariablen nutzen
Bisher hast du zeile und punkt nur als Zähler verwendet. Jetzt kannst du mit ihnen rechnen: Beide werden von links oben nach rechts unten größer.
Probiere etwas wie:
dot(2 + (zeile + punkt) * 1.5)
Zusatzaufgabe 2: Ein Feld aus Quadraten
Entwickle ein Programm, in dem eine Zeichnung wie unten erstellt wird.
Tipp: Drei Schleifen?
Ja – hier brauchst du tatsächlich drei ineinander verschachtelte Schleifen:
- äußere Schleife: über die Zeilen,
- mittlere Schleife: über die Spalten,
- innere Schleife: die vier Seiten eines Quadrats.
Am einfachsten wird es, wenn du jedes Quadrat mit goto an seine Position setzt, statt die Turtle laufen zu lassen.
from turtle import *
shape("turtle")
screensize(450, 450)
speed(0)
for zeile in range(5):
for spalte in range(5):
penup()
goto(-150 + spalte * 60, 120 - zeile * 60)
setheading(0)
pendown()
for seite in range(4):
forward(40)
right(90)