K103: verschachtelte Schleifen

In diesem Themenblock lernst du, wie man in Python einfache for Schleifen und damit beeindruckende Grafiken erstellen kann. Bei den nachfolgenden Aufgaben geht es auch darum, das grundsätzliche Konzept von Schleifen kennen zu lernen.

Inhaltsverzeichnis

Dieser Blog wird vom IAIP gratis zur Verfügung gestellt. Der Blog ist ein  Bestandteil des Kurses K103 «Programmieren mit Turtle Graphics» und gehört zur Lektion 7, Themenblock 2 (L7T2).

Der Kurs führt dich durch die einzelnen Blogs, enthält Zusatzmaterialien, Videos, viele Aufgaben mit Lösungen und Quizze zur Lernkontrolle. Der Kurs hat eine Kursgebühr von CHF 50.- Mit dem Einschreiben zum Kurs hilfst du mit, dass solche Blogs auch zukünftig noch gratis zur Verfügung gestellt werden können.

Einordnung

Im letzten Themenblock hast du die for Schleife etwas besser kennengelernt. Wir haben den Schleifenkopf genauer betrachtet und dabei gesehen, dass nach in ein sogenanntes Iterable kommt, also beispielsweise eine Liste oder ein range Objekt.

Nun werfen wir einen Blick auf verschachtelte Schleifen. Ziel dieses Themenblocks ist, dass du

  • verschachtelte Strukturen kennst.
  • in diesem Zusammenhang verstehst, wo welche Einschübe zu machen sind, bzw. weshalb wichtig ist, dass zusammengehörende Anweisungen immer gleich viel eingeschoben sind.

Schleifen in Schleifen

Wir wollen im Nachfolgenden zusammen ein Programm entwerfen, welches die unten abgebildete Figur zeichnet.

Die Figur besteht aus 6 gleichseitigen Dreiecken, welche nacheinander, jeweils etwas verdreht, gezeichnet werden. Zum zeichnen eines einzelnen Elements benötigen wir folgenden Codeteil:

penup()
forward(50)
pendown()

for j in range(3):    
    forward(100)
    left(120)

penup()
back(50)
pendown()

Der Code sollte aus den bisherigen Ausführungen heraus gut verständlich sein. Als erstes bewegen wir unsere Turtle, ausgehend vom Ursprung, 50 Schritte vorwärts, ohne dabei einen Strich zu ziehen (Zeilen 1-3). Anschliessend lassen wir die Schildkröte eine gleichseitiges Dreieck zeichnen, wobei wir eine for Schleife verwenden (Zeilen 5-7). Im letzten Block schliesslich fahren wir wieder zurück zur Mitte (9-11). Es ensteht folgende Figur:

Was wir nun wollen ist, dass dieser Teil 6 Mal wiederholt wird, und sich die Schildkröte nach jeder Wiederholung um 60 Grad nach links dreht.

Angenommen es wäre nicht dieses Element mit dem Dreieck, sondern ein einfacher Strick, dann würde unser Code wie folgt aussehen:

from turtle import *

for i in range(6):        # Schleife   
                          # hier kommt das Elemente, jetzt nur ein Strich
    forward(100)
    back(100)
           
    left(60)              # am Ende drehen

exitonclick()

Nun haben wir aber keinen einfachen Strich, sondern eine etwas kompliziertere Form mit einer Schleife. Nichtsdestotrotz, am grundsätzlichen Prinzip ändert sich nichts. Unsere Element besteht aus einzelnen Anweisungen, die der Reihe nach abgearbeitet werden sollen. Wir setzen also dieses Element einfach im Code ein:

from turtle import *

for i in range(6):        # äussere Schleife
    penup()
    forward(50)
    pendown()

    for j in range(3):    # innere Schleife
        forward(100)
        left(120)

    penup()
    back(50)
    pendown()

    left(60)

exitonclick()

Was ist speziell? Bei verschachtelten Strukturen müssen wir immer aufpassen, welche Anweisung zu welcher Wiederholung gehört. Zur Verdeutlichung haben wir nachfolgend die zwei Schlaufen mit den zugehörigen Zeilen markiert. Auf der linken Seite haben wir eine einfache Schlaufe, wie wir diese bereits aus den vorangehenden zwei Themenblöcken kennen. Rechts haben wir eine Schlaufe in einer Schlaufe. Die zur «inneren» Schlaufe gehörenden Anweisungen sind deutlich mehr eingerückt, so dass Python weiss, dass diese zur inneren Schleife gehören.

Total verschachtelt!

Du kannst natürlich immer weiter verschachteln. Irgendwann wird es etwas unübersichtlich, aber theoretisch kannst du beliebig viele Schleifen in Schleifen ausführen lassen. Im folgenden Beispiel sind 3 Schlaufen ineinander verschachtelt.

  • Die innerste Schlaufe macht ein Viereck
  • Die zweite Schlaufe wiederholt die innere Schlaufe 6 mal
  • Die äusserste Schlaufe wiederholt die ganze Form 5 mal

Studiere den Code und insbesondere die Struktur (Einschübe).

from turtle import *

speed(0)
for k in range(5):       # äusserste Schleife  
  penup()
  forward(150)
  pendown()
  for j in range(6):     # zweite Schleife  
    for i in range(4):   # innerste Schleife   
      forward(50)
      right(360/4)
    right(360/6)
    penup()
    forward(20)
    pendown()
  right(360/5)

exitonclick()

Es erfolgt folgendes Bild:

Übungsaufgaben

Nachfolgend findest Du ein paar Übungsaufgaben. 

Lösungen zu den Aufgaben findest du im Kurs K103 «Programmieren mit Turtle Graphics «: 
Lektion 7, Themenblock 1 (L7T1)

Aufgabe 1: ein sich wiederholendes Viereck

Studiere das abgebildete Programm. Hier sind 2 Schlaufen ineinander verschachtelt. Die Grundform ist ein Viereck.

for i in range(4):    
    forward(100)
    right(90)

Dieses Viereck wird dann 10 mal gezeichnet und am Ende jeweils um 36 Grad gedreht. BEACHTE SORGFÄLTIG DIE EINSCHÜBE.

Ändere nun das Viereck zu einem Sechseck. Lasse das Sechseck dann 6 mal wiederholen. Es sollte folgende Form entstehen:

from turtle import *

# äussere Schlaufe
for j in range (10):
  
  # innere Schlaufe
  for i in range(4):
    forward(100)
    right(90)
  
  # weiter in äusseren Schlaufe
  right(36)

Aufgabe 2: ein Viereck mit Punkten

Wir möchten, dass unsere Figur in roter Farbe gezeichnet wird. Die Liniendicke beträgt 3. Zudem soll beim Zeichnen des Vierecks in jeder Ecke noch ein blauer Punkt der Grösse 10 gesetzt werden.

Ergänze den Code entsprechend. Beim Punkt befindest dich in der innersten Schlaufe. Die rote Stiftfarbe kannst du am Anfang des Codes setzen. Beachte die Einschübe!

Aufgabe 3: veränderte Strichdicke

Verändere nun die Figur aus Aufgabe 2 so, dass die Strickdicke bei jedem Viereck etwas grösser wird. Sie beginnt bei 1 und hat die Dicke 6 beim letzten Viereck (1, 2, 3, 4, 5, 6).

Passe ebenfalls die Grösse des Punktes an. Dieser ist neu 10 Punkte + die aktuelle Strichdicke des jeweiligen Vierecks.

Hinweis: Du kannst die Zählvariable der äusseren Schleife nutzen.

Aufgabe 4: bunte Striche

Passe nun die innere Schleife so an, dass diese eine Liste mit den 4 Farben «red», «orange», «yellow» und «purple» durchläuft. Die 4 Seiten des Quadrats sind nun in jeweils einer der 4 Farben gezogen.

Am Anfang des Programms setzt du die Hintergrundfarbe auf «lightgrey», am Ende des Programms soll zusätzlich die Schildkröte versteckt werden.

Aufgabe 5: ein sich wiederholendes Viereck

Gehe nun mit der Schildkröte nach dem Zeichnen des Vierecks (innere Schlaufe) und der Drehung um 36 Grad zusätzlich noch 20 Schritte geradeaus. Hebe vorab den Stift hoch und stelle ihn danach wieder ab.

Es sollte die rechts abgebildete Figur entstehen.

Comments