Um den Ablauf eines Programmes zu steuern stehen uns verschieden Strukturen zur verfügung.
Sequenz
Die einfachste Struktur eines Programms: für einen Block auf der selben Ebenen (gleich weit eingerückt), führt Python die Befehle Zeile-um-Zeile von oben nach unten aus.
from turtle import *
forward(100)
left(90)
forward(100)
done()
2
3
4
5
6
7
Aufgabe: aufgabe1.py
Zeichne eine Treppe bestehend aus 5 Stufen
Lösung: aufgabe1.py
from turtle import *
left(90)
forward(30)
right(90)
forward(40)
left(90)
forward(30)
right(90)
forward(40)
left(90)
forward(30)
right(90)
forward(40)
left(90)
forward(30)
right(90)
forward(40)
left(90)
forward(30)
right(90)
forward(40)
left(90)
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Unterprogramm
Dinge die häufig oder immer wieder – auch an unterschiedlichen Stellen aufgerufen werden, können in ein Unterprogramm ausgelagert werden. So muss man nicht mehrmals denselben Code schreiben!
from turtle import *
def stufe():
forward(100)
left(90)
forward(100)
right(90)
stufe()
stufe()
stufe()
forward(100)
done()
2
3
4
5
6
7
8
9
10
11
12
13
Aufgabe: aufgabe2.py
Schreibe für jeden deiner Initialen ein Unterprogramm welches diesen zeichnet. Rufe dann die beiden Unterprogramme auf, so dass die Turtle deine Initialen auf den Bildschirm zeichnet.
Lösung: aufgabe2.py
from turtle import *
def s():
x = xcor()
y = ycor()
circle(50, -30)
circle(50, 200)
circle(-50, 180)
penup()
goto(x,y)
setheading(0)
forward(100)
pendown()
def f():
x = xcor()
y = ycor()
left(90)
forward(100)
right(90)
forward(40)
backward(40)
left(90)
forward(100)
right(90)
forward(80)
penup()
goto(x,y)
setheading(0)
forward(100)
pendown()
s()
f()
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Argumente
Unterprogramme können sogenannte Argumente entgegennehmen. Möchten wir z.B. ein Unterprogramm schreiben, das die Distanz der Turtle zu einem bestimmten Punkt berechnet, so müssen wir die Koordinaten dieses Punktes kennen. Wir übergeben diese
Werte dem Unterprogramm als Argumente:
from turtle import *
from math import sqrt
def distanz(x,y):
delta_x = xcor() - x
delta_y = ycor() - y
resultat = sqrt(delta_x**2 + delta_y**2)
print(resultat)
distanz(100, 200)
forward(100)
distanz(100, 200)
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
- Zeile 4
- Die Definition des Unterprogramms legt fest, dass zwei Argumente übergeben werden müssen. Diese stehen im Unterprogramm als
x
undy
zur Verfügung. - Zeile 5 & 6
- Wir könne die beiden Argumente wie Variablen verwenden um etwas zu berechnen
- Zeile 10
- Wir rufen unser Unterprogramm auf und übergeben als Argumente
x
den Wert100
und als Argumenty
den Wert200
- Zeile 11
- Wir bewegen die Turtle
- Zeile 12
- Wir rufen unser Unterprogramm nochmals mit den selben Argumenten auf
Aufgabe: aufgabe3.py
Programmiere ein Unterprogramm dreieck(s)
. Dieses soll ein gleichseitiges Dreieck mit der Seitenlänge s
zeichnen. Rufe dein Unterprogramm mehrere Male mit unterschiedlichen Seitenlängen auf.
Lösung: aufgabe3.py
from turtle import *
def dreieck(s):
forward(s)
left(120)
forward(s)
left(120)
forward(s)
left(120)
dreieck(400)
left(70)
dreieck(200)
left(70)
dreieck(100)
left(70)
dreieck(50)
left(70)
dreieck(25)
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Rückgabewerte
Oft möchte man den berechneten Wert des Unterprogramms weiterverwenden und nicht einfach ausgeben. Unterprogramme können mit dem Schlüsselwort return
einen Wert zurückgeben. return
ist die letzte Anweisung – das Unterprogramm wird damit abgebrochen!
Das obige Beispiel mit Rückgabewert sieht wie folgt aus:
from turtle import *
from math import sqrt
def distanz(x,y):
delta_x = xcor() - x
delta_y = ycor() - y
resultat = sqrt(delta_x**2 + delta_y**2)
return resultat
d1 = distanz(100, 200)
forward(100)
d2 = distanz(100, 200)
print(d1 - d2, "näher am Ziel")
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- Zeile 8
- Statt das berechnete Resultat auszugeben wird es zurückgegeben!
- Zeile 10
- Das Unterprogramm wird aufgerufen und der Rückgabewert in der Variablen
d1
abgespeichert - Zeile 11
- Wir bewegen die Turtle
- Zeile 10
- Das Unterprogramm wird nochmals aufgerufen, der Rückgabewert in der Variablen
d2
abgespeichert - Zeile 13
- Wir können nun die beiden Werte verwenden und z.B. berechnen wie viel näher die Turtle dem Punkt (100,200) gekommen ist.
Aufgabe: aufgabe4.py
Teste das obenstehende Programm aus und versuche zu verstehen was es macht.
Wiederholung
Wenn wir etwas mehrmals machen wollen, so verwenden wir beim Programmieren eine sogenannte «Schleife». Python kennt zwei dieser Schleifen:
while
Die while-Schleife wiederholt solange wie eine Bedingung wahr ist. Die Bedingung wird vor jeder Wiederholung erneut geprüft.
from turtle import *
speed(0)
i = 0
while i < 12:
forward(180)
left(150)
i = i + 1
done()
2
3
4
5
6
7
8
9
10
Aufgabe: aufgabe5.py
Zeichne eine Spirale (von innen nach aussen oder von aussen nach innen)
Lösung: aufgabe5.py
from turtle import *
speed(0)
i = 0
while i < 500:
forward(5)
left(i/30)
i = i + 1
done()
2
3
4
5
6
7
8
9
10
for-in
Entscheidung
Bedingte Ausführung von Code erreicht man, indem man eine Bedingung überprüft. Python kennt if
, if-else
und if-elif-else
if
Einen Code-Block nur ausführen, wenn eine Bedingung wahr ist
Wenn-dann
from turtle import *
speed(0)
while True:
if distance(40,30) > 400:
goto(0,0)
forward(8)
left(2)
done()
2
3
4
5
6
7
8
9
10
Aufgabe: aufgabe6.py
Versuche eine Blume zu zeichnen, gehe dabei wie folgt vor:
- nimm das obenstehende Beispiel als Ausgangsprogramm
- fülle die Blätter mit einer Farbe
Zusatz:
- Zeichne die Blätter natürlicher, indem du nicht einfach immer gleich viel drehst, sondern mit Zufallszahlen arbeitest
from random import randint
...
left(randint(-2,4)) # Ganze Zahl zufällig zwischen -2 und 4
2
3
- Variiere die Farben, indem du die Farbe mit einer Variablen berechnest und diese in der Schleife änderst
green = 1
...
green = green-0.01
fillcolor((0,green,0))
2
3
4
Lösung: aufgabe6.py
from turtle import *
from random import randint
bgcolor("black")
speed(0)
hideturtle()
begin_fill()
green = 1
fillcolor((0,1-green,0))
while True:
if distance(40,30) > 400:
end_fill()
goto(0,0)
fillcolor((0,1-green,0))
green = green*0.99
begin_fill()
forward(12)
left(randint(-2,4))
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if-else
Einen Code-Block nur ausführen, wenn eine Bedingung wahr ist, sonst einen anderen Code-Block ausführen
Wenn-dann, Sonst
from turtle import *
groesse = 20
def quadrat():
i = 0
while i<4:
forward(groesse)
left(90)
i = i+1
x = 0
while x < 8:
y = 0
while y < 8:
schwarz = (x+y) % 2
if schwarz == 0:
begin_fill()
quadrat()
end_fill()
else:
quadrat()
forward(groesse)
y = y+1
x = x+1
penup()
goto(0,0)
left(90)
forward(groesse*x)
right(90)
pendown()
hideturtle()
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Aufgabe: aufgabe7.py
Verwende das Schachbrett-Beispiel als Vorlage:
- baue zu Beginn eine Hintergrundfarbe ein, z.B.
bgcolor("orange")
Damit es nun immer noch ein Schachbrett (weiss/schwarz) zeichnet, müssen wir im if Anpassungen vornehmen:
- Jedes Quadrat soll gefüllt werden (nicht nur jedes Zweite)
- Dafür setzen wir die Füllfarbe abwechslungsweise bei jedem Quadrat
fillcolor("white")
...
fillcolor("black")
2
3
Lösung: aufgabe7.py
from turtle import *
groesse = 20
bgcolor("orange")
def quadrat():
i = 0
while i<4:
forward(groesse)
left(90)
i = i+1
x = 0
while x < 8:
y = 0
while y < 8:
schwarz = (x+y) % 2
if schwarz == 0:
fillcolor("black")
else:
fillcolor("white")
begin_fill()
quadrat()
end_fill()
forward(groesse)
y = y+1
x = x+1
penup()
goto(0,0)
left(90)
forward(groesse*x)
right(90)
pendown()
hideturtle()
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
if-elif-else
Mehrere Bedingungen nacheinander checken, also
Wenn-dann, Sonst-wenn-dann, Sonst
if x < 12:
# if-Block
elif x > 10:
# elif-Block
else:
# else-Block
2
3
4
5
6
7
8
Es sind beliebig viele elif
-Blöcke denkbar. Der else
-Block am Schluss ist optional.
Aufgabe: aufgabe8.py
Nimm das Schachbrett-Programm und baue eine dritte Farbe ein, so dass zwischen drei Farben hin- und her gewechselt wird.
Lösung: aufgabe8.py
from turtle import *
groesse = 20
def quadrat():
i = 0
while i<4:
forward(groesse)
left(90)
i = i+1
x = 0
while x < 8:
y = 0
while y < 8:
if (x+y) % 3 == 0:
fillcolor("black")
elif (x+y) % 3 == 1:
fillcolor("grey")
else:
fillcolor("white")
begin_fill()
quadrat()
end_fill()
forward(groesse)
y = y+1
x = x+1
penup()
goto(0,0)
left(90)
forward(groesse*x)
right(90)
pendown()
hideturtle()
done()
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
rekursiv (Zusatz)
Beim rekursiven Programmieren ruft ein Unterprogramm sich selbst auf.