Python Script
Python Script
Tobias Kohn
Copyright c 2016, Tobias Kohn
[Link]
Version vom 19. August 2016
Dieses Script darf für den Unterricht frei kopiert und verwendet wer-
den. Jegliche kommerzielle Nutzung ist untersagt. Alle Rechte vorbe-
halten.
INHALTSVERZEICHNIS
1 Einführung 7
4 Koordinatengrafik 67
4.1 Wiederholungen der Turtle . . . . . . . . . . . . . . . . 68
4.2 Farben mischen . . . . . . . . . . . . . . . . . . . . . . . 70
4.3 Mit dem Zufall spielen . . . . . . . . . . . . . . . . . . . 72
4.4 Turtle mit Koordinaten . . . . . . . . . . . . . . . . . . . 74
4.5 Koordinaten abfragen . . . . . . . . . . . . . . . . . . . 76
4.6 Schleifen in Schleifen . . . . . . . . . . . . . . . . . . . . 78
4.7 Die Maus jagen . . . . . . . . . . . . . . . . . . . . . . . 80
4.8 Globale Variablen . . . . . . . . . . . . . . . . . . . . . . 82
4.9 Mehrere Alternativen . . . . . . . . . . . . . . . . . . . . 84
4.10 Vier Gewinnt . . . . . . . . . . . . . . . . . . . . . . . . 86
4.11 Mausbewegungen* . . . . . . . . . . . . . . . . . . . . . 88
4.12 Die Turtle im Labyrinth . . . . . . . . . . . . . . . . . . . 90
6 Listen 121
6.1 Listen erzeugen . . . . . . . . . . . . . . . . . . . . . . . 122
6.2 Listen durchlaufen . . . . . . . . . . . . . . . . . . . . . 124
6.3 Bilder aus Listen und Schleifen . . . . . . . . . . . . . . 126
6.4 Polygone zeichnen . . . . . . . . . . . . . . . . . . . . . 128
6.5 Minimum und Maximum . . . . . . . . . . . . . . . . . . 130
6.6 Einfache Zahlenlisten . . . . . . . . . . . . . . . . . . . . 132
6.7 Elemente zählen . . . . . . . . . . . . . . . . . . . . . . 134
6.8 Sortieren . . . . . . . . . . . . . . . . . . . . . . . . . . 136
6.9 Listen in Listen* . . . . . . . . . . . . . . . . . . . . . . . 138
6.10 Histogramme zeichnen . . . . . . . . . . . . . . . . . . . 140
6.11 Datenbanken* . . . . . . . . . . . . . . . . . . . . . . . . 142
7 Animation 145
7.1 Tastatursteuerung . . . . . . . . . . . . . . . . . . . . . . 146
7.2 Ping Pong . . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.3 Alles fällt: Gravitation . . . . . . . . . . . . . . . . . . . 150
7.4 Mehrere Objekte bewegen . . . . . . . . . . . . . . . . . 152
7.5 Plattformen und Schattenwurf* . . . . . . . . . . . . . . 154
7.6 Objekte mit Variablen . . . . . . . . . . . . . . . . . . . 156
8 Strings 171
8.1 Bruchterme ausgeben . . . . . . . . . . . . . . . . . . . 172
8.2 Buchstaben und Wörter . . . . . . . . . . . . . . . . . . 174
8.3 Gross und Klein . . . . . . . . . . . . . . . . . . . . . . . 176
8.4 Alles ist Zahl . . . . . . . . . . . . . . . . . . . . . . . . 178
A Lösungen 181
A.1 Kapiteltest 2 . . . . . . . . . . . . . . . . . . . . . . . . . 182
EINFÜHRUNG
Dein erstes Programm Tauchen wir doch gleich in die Welt des
Programmierens ein! In der Abbildung 1.1 steht im Editorfenster bereits
ein kleines Programm und zwar das folgende:
Gib das Programm nun selber einmal ein (achte darauf, alles exakt so
einzugeben wie im Code hier) und klicke dann auf die grüne Schaltflä-
che oben, um das Programm zu starten. Bevor TigerJython dein Pro-
gramm ausführt, fragt es dich zuerst, ob du das Programm vorher spei-
chern möchtest. Im Moment ist das nicht nötig und du kannst getrost
auf «Nicht speichern» klicken.
Wenn dich der Computer jetzt nach deinem Namen fragt und dich dann
begrüsst, dann hast du erfolgreich dein erstes Programm geschrieben:
Gratulation!
Übrigens: Es ist ganz normal, dass du noch nicht alles hier verstehst.
Wichtig ist im Moment nur, dass du weisst, wie du ein Programm ein-
gibst und ausführst. Alles andere werden wir dir im Verlaufe dieses
Kurses erklären.
Die Turtle ist eine kleine Schildkröte, die eine Spur zeichnet, wenn sie
sich bewegt. Du kannst ihr sagen, sie soll vorwärts gehen oder sich nach
links oder rechts abdrehen. Indem du diese Anweisungen geschickt
kombinierst, entstehen Zeichnungen und Bilder.
Für das Programmieren wesentlich und zentral ist, dass du dabei lernst,
dieser Turtle neue Figuren beizubringen. Indem du z. B. einmal defi-
nierst, was ein Quadrat ist, kann die Turtle beliebig viele Quadrate in
allen Grössen und Farben zeichnen. Mit der Zeit kannst du so immer
komplexere Bilder und Programme aufbauen.
Die Turtle kann sich innerhalb ihres Fensters bewegen und dabei eine
Spur zeichnen. Bevor die Turtle aber loslegt, musst du den Compu-
ter anweisen, dir eine solche Turtle zu erzeugen. Das machst du mit
makeTurtle(). Um die Turtle zu bewegen verwendest du die drei Be-
fehle forward(länge), left(winkel) und right(winkel).
Das Programm So sieht dein erstes Programm mit der Turtle aus.
Schreib es ab und führe es aus, indem du auf den grünen Start-Knopf
klickst. Die Turtle sollte dir dann ein rechtwinkliges Dreieck zeichnen.
1 from gturtle import *
2
3 makeTurtle()
4
5 forward(141)
6 left(135)
7 forward(100)
8 left(90)
9 forward(100)
Die Turtle ist in einer Datei (einem sogenannten Modul) «gturtle» ge-
speichert. In der ersten Zeile sagst du dem Computer, dass er alles
aus dieser Datei laden soll. Die Anweisung makeTurtle() in der drit-
ten Zeile erzeugt eine neue Turtle mit Fenster, die du programmieren
kannst. Ab Zeile 5 stehen dann die Anweisungen für die Turtle selber.
AUFGABEN
Abbildung 2.1: In der Mitte das «Haus von Nikolaus» und rechts eine ein-
fache Schneeflocke.
3. Das «Haus vom Nikolaus» ist ein Zeichenspiel für Kinder. Ziel ist
es, das besagte Haus (vgl. Abbildung 2.1(b)) in einem Linienzug aus
genau 8 Strecken zu zeichnen, ohne dabei eine Strecke zweimal zu
durchlaufen. Zeichne das Haus vom Nikolaus mithilfe der Turtle. Wähle
dabei für die Seitenlänge des Quadrats 120 Pixel und nimm an, dass die
beiden Dachflächen rechtwinklig aufeinander treffen.
4.∗ Lass die Turtle eine einfache Schneeflocke zeichnen wie in der Ab-
bildung 2.1(c).
Solange der Farbstift «unten» ist, zeichnet die Turtle eine Spur. Mit
penUp() nimmt sie den Farbstift nach oben und bewegt sich nun, ohne
eine Spur zu zeichnen. Mit penDown() wird der Farbstift wieder nach
unten auf die Zeichenfläche gebracht, so dass eine Spur gezeichnet
wird.
7 forward(50)
8
9 penUp()
10 left(90)
11 forward(30)
12 left(90)
13 penDown()
14
15 setPenColor("light blue")
16 forward(50)
Die wichtigsten Punkte Der Zeichenstift (pen) der Turtle kann mit
setPenColor(Farbe) die Farbe wechseln. Indem du den Stift mit penUp()
«hochhebst», hört die Turtle auf, eine Spur zu zeichnen. Mit penDown()
wird der Stift wieder gesenkt und die Turtle zeichnet weiter.
AUFGABEN
18 left(60)
19 forward(50)
20 penDown()
21 setPenColor("blue")
22 quadrat()
Ab der Zeile 14 weiss die Turtle, was ein Quadrat ist (sie hat aber noch
keines gezeichnet). Du kannst quadrat() genauso brauchen wie die
anderen Befehle: Die Turtle zeichnet dann immer an der aktuellen Po-
sition ein Quadrat mit der Seitenlänge 100. Hier zeichnen wir damit ein
rotes und ein blaues Quadrat.
Tipp: Wenn die Turtle eine Figur (z. B. ein Quadrat) zeichnet, dann
achte darauf, dass die Turtle am Schluss wieder gleich dasteht wie am
Anfang. Das macht es viel einfacher, mehrere Figuren zusammenzu-
hängen. Im Programm oben wird die Turtle in Zeile 12 deshalb auch
nochmals um 90◦ gedreht (was ja nicht nötig wäre).
Vergiss die Klammern und den Doppelpunkt nach dem Namen nicht!
AUFGABEN
7. Definiere einen Befehl für ein Quadrat, das auf der Spitze steht und
zeichne damit die Figur in der Abbildung 2.3. Die fünf Quadrate berüh-
ren sich nicht, sondern haben einen kleinen Abstand und die Farben
blau, schwarz, rot (oben) und gelb, grün (unten).
4 Parameter
In Zeile 15 zeichnet die Turtle ein rotes Quadrat mit der Seitenlänge
von 80 Pixeln, in Zeile 18 ein blaues mit der Seitenlänge von 50 Pixeln.
Weil hinter quadrat in Klammern die Zahlen 80 bzw. 50 stehen, setzt
der Computer bei der Definition von Quadrat für seite überall 80 bzw.
50 ein.
Die wichtigsten Punkte Parameter sind Platzhalter für Werte, die je-
des Mal anders sein können. Du gibst den Parameter bei der Definition
eines Befehls hinter den Befehlsnamen in Klammern an.
def Befehlsname(Parameter):
Anweisungen mit
dem Parameter
AUFGABEN
8. Definiere einen Befehl jump(Distanz), mit dem die Turtle die ange-
gebene Distanz überspringt. Der Befehl funktioniert also wie forward(),
allerdings zeichnet die Turtle hier keine Spur.
10.∗ Definiere einen Befehl, der ein offenes Quadrat u zeichnet und
verwende deinen Befehl, um ein Kreuz zu zeichnen, wobei du mit dem
offenen Quadrat die vier Arme zeichnest.
5 Flächen füllen
Um eine Figur mit Farbe zu füllen, muss die Turtle ingendwo im Innern
der Figur stehen. Bei fill() schüttet sie dann Farbe aus, bis die ganze
Figur mit Farbe gefüllt ist. Aber Vorsicht: Wenn die Turtle dabei auf
einer Linie steht, dann glaubt sie, dieses Linienstück alleine mache die
ganze Figur aus! Du brauchst also sicher penUp(), um die Turtle ins
Innere einer Figur zu bewegen ohne eine Linie zu zeichnen.
Das Programm In den Zeilen 4 bis 9 zeichnet die Turtle ein gleich-
seitiges Dreieck, das auf der Spitze steht. In den Zeilen 10 bis 12 neh-
men wir den Stift hoch und setzen die Turtle ins Innere des Dreiecks
(das muss nicht die Mitte sein). Schliesslich setzen wir die Füllfarbe in
Zeile 13 auf «Himmelblau» und füllen das Dreieck dann in Zeile 14 aus.
1 from gturtle import *
2 makeTurtle()
3
4 right(30)
5 forward(100)
6 left(120)
7 forward(100)
8 left(120)
9 forward(100)
10 penUp()
11 left(150)
12 forward(50)
13 setFillColor("sky blue")
14 fill()
AUFGABEN
11. Die Abbildung 2.4 zeigt vier Figuren mit farbigen Flächen. Lass dei-
ne Turtle diese vier Figuren zeichnen (in vier verschiedenen Program-
men). Die Farben kannst du dabei selbst wählen.
6 Repetitionen
In den Zeilen 8 bis 11 füllen wir das Neuneck auch gleich noch aus.
Weil diese Befehle nicht mehr eingerückt sind, werden sie auch nicht
wiederholt, sondern nur noch einmal ausgeführt.
1 from gturtle import *
2 makeTurtle()
3
4 repeat 9:
5 forward(50)
6 left(40)
7
8 penUp()
9 left(80)
10 forward(60)
11 fill()
def neuneck():
repeat 9:
forward(50)
left(40)
AUFGABEN
13. Zeichne mit der Turtle die Treppenfigur (a) aus der Abbildung 2.5.
Verwende dazu repeat.
14. Zeichne den fünfzackigen Stern aus der Abbildung 2.5(b) oder (c).
Dazu musst du zuerst die entsprechenden Winkel berechnen. Verwende
wiederum repeat für alles, was sich wiederholen lässt.
16.∗ Ein gewöhnliches n-Eck erhältst du immer dann, wenn sich die
◦
Turtle an jeder Ecke um den Winkel 360n dreht (insgesamt hat sie sich
◦
nach dem Zeichnen also um 360 gedreht). Für einen regelmässigen
Stern muss sich die Turtle an jeder Ecke um einen doppelt so grossen
Winkel drehen.
Schreibe damit einen Befehl stern(n), der einen regelmässigen n-
zackigen Stern zeichnet.
Nach einem ganzen Kreis hat sich die Turtle immer um 360◦ gedreht.
Bei z. B. 36 Ecken bedeutet das, dass sich die Turtle an jeder Ecke um
360◦ : 36 = 10◦ drehen muss.
Radius und Umfang Wenn die Turtle einen Kreis zeichnet, dann
kennst du den Umfang des Kreises sehr genau. Im Beispiel oben ging
die Turtle 72 mal 6 Pixel vorwärts. Der Kreis hat also einen Umfang von
u = 72 · 6 = 432 Pixeln.
Für den Umfang u und Radius
Bei einem Kreis entspricht ein Umfang von 432 Pixeln einem Radius r eines Kreises gilt:
von 68.75 Pixeln. Das lässt sich über die Formel u = 2π · r berechnen. u = 2πr.
Weil wir die Kreise aber durch Polygone (Vielecke) annähern, stimmt
diese Rechnung nicht ganz und wird einiges komplizierter. Die Turtle
kann jedoch den exakten Umfang für einen bestimmten Radius aus-
rechnen. Das sieht dann so aus:
umfang = polyCircumference(72, radius)
repeat 72:
forward(umfang / 72)
left(360 / 72)
Die wichtigsten Punkte Die Turtle kann keine echten Kreise zeich-
nen. Bei einem regelmässigen Vieleck mit sehr vielen Ecken ist der Un-
terschied zu einem Kreis aber nicht mehr sichtbar.
Für einen ganzen Kreis muss sich die Turtle insgesamt um 360◦ drehen.
Indem du die Anzahl der Wiederholungen kleiner machst, dreht sich
die Turtle nur um 180◦ oder 90◦ und zeichnet damit einen Halb- oder
Viertelkreis.
AUFGABEN
17. Zeichne mit der Turtle einen Kreis mit einem Radius von r = 20
Pixeln.
19. Lass deine Turtle den PacMan (a), das Yin-Yang-Symbol (b) und ein
beliebiges Smiley (c) zeichnen wie in der Abbildung 2.6. Bei den klei-
nen Punkten genügt es meist, ein kurzes, breites Linienstück zu zeich-
nen.
20. Die «Blume» in der Abbildung 2.6(d) setzt sich aus sieben gleich
grossen Kreisen zusammen. Verwende einen eigenen Befehl circle()
und zeichne damit diese Blume.
8 Kuchenstücke
Einführung Der Computer kann keine Kreise zeichnen. Aber ein Po-
lygon (Vieleck) mit genügend Ecken sieht auf dem Bildschirm aus wie
ein Kreis. Nur gibt es dabei ein Problem: Sobald du nur einen Teil des
Kreisbogens zeichnest oder den Radius brauchst, wird das Bild unge-
nau und fehlerhaft (das hast du sicher selbst bei der Aufgabe (2.19)
zum «PacMan» bemerkt): Der Mittelpunkt des Kreises ist am falschen
Ort.
Die Abweichung ϕ ist gerade der halbe Winkel, um den sich die Turtle
bei jedem Schritt drehen muss. In unserem Fall also die Hälfte von 45◦
und damit ist ϕ = 22.5◦ . Wenn wir im Programm oben die Zeilen 5 bis 9
entsprechend anpassen, dann ergibt sich auch ein viel besseres Bild.
Abbildung 2.7: Beim Kreis steht der Radius senkrecht zur Kreislinie (links).
Bei einem Polygon ist der Winkel zwischen Radius und Umfangslinie nicht
ganz rechtwinklig (rechts).
left(90 + 22.5)
repeat 4:
forward(40)
left(45)
left(90 - 22.5)
AUFGABEN
9 Parameter strecken
Abbildung 2.8: Mit dem Satz des Pythagoras ergibt sich, dass die Hypote-
√
nuse des Dreiecks 2 mal so lang sein muss wie die Katheten x.
Dieses Wissen nutzen wir jetzt aus, um ein allgemeines Vieleck zu de-
finieren. Der Parameter gibt dabei an, wie viele Ecken bzw. Seiten das
Vieleck haben soll. Danach wird damit ein Fünfeck gezeichnet.
1 from gturtle import *
2 makeTurtle()
3
4 def vieleck(n):
5 repeat n:
6 forward(70)
7 left(360 / n)
8 vieleck(5)
AUFGABEN
23. Schreibe einen Befehl, der ein Quadrat mit einem Kreuz darin zeich-
net (vgl. Abbildung 2.9 (a)). Dabei wird die Seitenlänge des Quadrats
mit einem Parameter angegeben und kann beliebig gewählt werden.
24. Definiere einen Befehl treppe(stufen), der die Treppe aus Ab-
bildung 2.9(b) zeichnet. Die Treppe hat dabei immer eine Breite und
eine Höhe von 120 Pixeln. Die Anzahl der Stufen kann man über den
Parameter steuern.
25. Definiere einen Befehl kreis(umfang), der einen Kreis mit dem
angegebenen Umfang zeichnet. Schwierigere Variante: Definiere den
Kreis so, dass der Parameter den Radius angibt.
10 Mehrere Parameter
Die Reihenfolge der Parameter spielt eine Rolle. Weil wir in der Defini-
tion zuerst die Breite und dann die Höhe haben, wird in Zeile 15 auch
für die Breite der Wert 150 und für die Höhe der Wert 120 eingesetzt.
AUFGABEN
26. Definiere einen Befehl vieleck(n, seite), bei dem du die Anzahl
der Ecken n und die Seitenlänge angeben kannst.
27. Der Rhombus (Abb. 2.10(a)) hat vier gleich lange Seiten, im Ge-
gensatz zum Quadrat sind die Winkel allerdings in der Regel keine
rechten Winkel. Definiere einen Befehl rhombus(seite, winkel), bei
dem man die Seitenlänge und den Winkel angeben kann, und der dann
einen Rhombus zeichnet.
29. Definiere einen Befehl gitter(breite, hoehe), der ein Gitter wie
in Abbildung 2.10(b) zeichnet. Jedes Quadrätchen soll eine Seitenlän-
ge von 10 Pixeln haben. Die beiden Parameter geben die Anzahl dieser
Häuschen an (in der Abbildung wäre also breite = 6 und hoehe = 4).
Abbildung 2.11: Der Debugger zeigt sich rechts im Fenster, sobald du auf
den Käfer klickst. Solange das Debuggerfenster offen ist, kannst du den
Programmablauf beobachten.
Ist dir aufgefallen, dass der Computer von der Zeile 4 direkt zur Zei-
le 11 springt? Bei der Definition von dreieck(seite): merkt er sich
nämlich nur, dass ab der Zeile 4 steht, wie die Turtle das Dreieck zeich-
nen soll. Aber: Gezeichnet wird das Dreieck hier noch nicht! Erst in
Zeile 12 sagst du der Turtle, sie soll ein Dreieck zeichnen. Und weil
sich der Computer gemerkt hat, dass in Zeile 4 steht, was ein Dreieck
ist, springt er wieder hoch und arbeitet jetzt die Schritte ab, um das
Dreieck wirklich zu zeichnen.
AUFGABEN
31. Schreibe das Programm unten ab und beobachte mit dem Debug-
ger, wie das Programm ausgeführt wird.
from gturtle import *
makeTurtle()
repeat 4:
forward(100)
left(90)
penUp()
left(45)
forward(10)
setFillColor("sky blue")
fill()
32. Verändere das Programm oben so, dass du einen Befehl quadrat
definierst, um das Quadrat zu zeichnen. Betrachte auch dann den Pro-
grammablauf mit dem Debugger. Was ist gegenüber der ersten Version
grundlegend anders?
def quadrat(seite):
repeat 4:
forward(seite)
left(90)
Versuche einmal selbst, alle Fehler zu finden! Arbeite dazu zuerst ohne
Computer und teste dein Wissen über die Schreibweise von Python. Auf
der nächsten Seite findest du die Auflösung.
AUFGABEN
33. Auch dieses Programm ist voller Fehler. Finde und korrigiere sie!
from gturtle import
def fünfeck(seite):
repeat5:
forwart(seite)
left(72)
fünfeck(100)
Tipp: Auch wenn wieder grundsätzlich jede Zeile einen Fehler enthält,
kommen die gleichen Fehler oft mehrfach vor.
Für all diese Fälle gibt es die interaktive Konsole (manchmal auch eng-
lisch als «Console» geschrieben). Die interaktive Konsole ist dazu da,
einzelne Anweisungen auszuführen und direkt das Resultat zu sehen.
Wichtig: Die Konsole ist nicht dazu gedacht, ein ganzes Programm am
Stück auszuführen! Gib hier also immer nur einzelne Anweisungen ein
und führe sie aus.
Die Turtle und die Konsole Auch wenn wir von der Konsole aus mit
der Turtle arbeiten müssen wir die Turtle zuerst laden und ein Fenster
öffnen. Das machst du wie bisher mit den Anweisungen:
>>> from gturtle import *
>>> makeTurtle()
< Turtle(Position=(0,0), Heading=0)
>>>
Abbildung 2.13: Ordne die Fenster so an, dass das Turtlefenster neben
der Konsole zu liegen kommt. Du darfst das Turtlefenster natürlich nicht
schliessen, solange du damit arbeitest.
AUFGABEN
35. Verwende die Konsole, um herauszufinden, was die Turtle bei den
Befehlen dot(100), heading(45) und leftArc(60, 100) macht. Än-
dere auch die Zahlen ab und beobachte, welchen Einfluss sie haben.
Einführung Die Turtle kann natürlich noch viel mehr als das, was
Du in diesem Kapitel gelernt hast. Zum Abschluss geben wir dir daher
noch einen kleinen Ausblick.
Das Programm: PacMan Die Turtle kann nicht nur Flächen mit ei-
ner Farbe füllen, sondern auch direkt gefüllte Flächen zeichnen. Nach
dem Befehl fillToPoint() verbindet die Turtle alle weiteren Punkte,
die sie zeichnet mit dem ersten Punkt. Dadurch entsteht eine farbige
Fläche. Mit fillOff() wird das wieder ausgeschaltet. Damit können
wir unseren PacMan hier sehr einfach und schnell zeichnen.
1 from gturtle import *
2 makeTurtle()
3 fillToPoint()
4 right(45)
5 forward(100)
6 left(90 + 2.5)
7 s = polyCircumference(72, 100)
8 repeat 54:
9 forward(s / 72)
10 left(5)
11 fillOff()
AUFGABEN
37. Zeichne mit dot() einen Ring mit dem Innenradius von 120 Pixeln
und einer Dicke von 30 Pixeln.
42.∗ Für Profis: Zeichne mit der Turtle ein dreidimensionales Haus. Ei-
ne besondere Herausforderung besteht darin, das Haus perspektivisch
korrekt zu zeichnen wie in Abbildung 2.14(c).
Hinweis: Mit setHeading(towards(-400, 0)) wird die Turtle auf die
Mitte des linken Fensterrands ausgerichtet. Für den rechten Fenster-
rand verwendest du +400.
Quiz
1. Nach welcher Anweisung zeichnet die Turtle ihre Linien in
grün?
2 a. setColor("green")
2 b. setFillColor("green")
2 c. setLineColor("green")
2 d. setPenColor("green")
2. Die Turtle soll bei einem Dreieck einen Winkel von 45◦ nach
links zeichnen. Mit welchen Drehungen entsteht der richtige
Winkel?
2 a. left(45) 2 c. right(225)
2 b. left(135) 2 d. right(-45)
2 a. Ein Sechseck,
2 b. Ein Neuneck,
2 c. Eine Schneeflocke,
2 d. Gar nichts, weil left und forward vertauscht sind.
Für das Programmieren zentral ist dabei der Umgang mit Variablen. Da-
mit kannst du Formeln einprogrammieren und mit Werten rechnen, die
du während des Programmierens noch gar nicht kennst (z. B. die Resul-
tate von komplizierten Berechnungen oder Eingaben des Benutzers).
Stell dir zum Beispiel vor, dein Programm soll herausfinden, ob ein be-
stimmtes Jahr ein Schaltjahr ist oder nicht. Dann weisst du während du
das Programm schreibst noch nicht, für welches Jahr oder welche Jahre
der Computer rechnen soll. Das wird erst dann entschieden, wenn das
Programm läuft und ausgeführt wird. Und weil der Computer zwischen
einfachen Fällen unterscheiden kann, findet er tatsächlich auch heraus,
welches Jahr nun ein Schaltjahr ist. Aber dazu später mehr.
Ausgaben mit print Damit dir der Computer überhaupt etwas aus-
gibt, musst du ihn anweisen, das zu tun. Die Anweisung dafür heisst
print. Es genügt also nicht, einfach die Rechnung einzugeben. Du
musst dem Computer mit einem print auch sagen, dass er das Resul-
tat der Rechnung ausgeben muss, etwa print 13/3, um das Resultat
4.3333333333 zu erhalten.
1 print 1234567890123456789
2 print 1234567890123456789.0
3
4 print (1/2 + 1/3 + 1/6) - 1
5 print (1/6 + 1/3 + 1/2) - (1/2 + 1/3 + 1/6)
1
1. Du kannst 3 auch als Dezimalzahl eingeben: 0.333 . . .. Wie viele
Dreien musst du eingeben, bis die folgenden Rechnungen das richti-
ge Resultat liefern?
(a) print 3 * 0.333, (b) print (3 * 0.333) - 1
2. Die Entfernung der Erde von der Sonne beträgt rund 1.496 · 108 km.
Die Lichtgeschwindigkeit beträgt ca. 300 000 000 m/s. Berechne mit Py-
thon, wie lange das Sonnenlicht braucht, um die Erde zu erreichen und
gib das Resultat in Minuten an.
Natürlich kannst du den Wert einer Variablen auch berechnen oder di-
Namen von Variablen dürfen rekt setzen:
in Python nur aus den lateini-
VARIABLE = RECHNUNG
schen Buchstaben (ohne Um-
laute äöü), den Ziffern und
Achtung: Bei der Zuweisung muss die Variable immer links stehen!
Unterstrichen _ bestehen. Be-
achte, dass Python streng zwi-
schen Gross- und Kleinschrei-
bung unterscheidet:
x 6= X!
AUFGABEN
7. Schreibe ein Programm, das Längenangaben von Zoll (z. B. 2700 für
die Diagonale eines Displays) in cm umrechnet. Dabei gilt: 100 = 2.54 cm.
8.∗ Schreibe ein Programm, bei dem man eine Prozentzahl eingeben
kann. Die Turtle zeichnet dann ein «Kuchenstück», das der eingegebe-
nen Prozentzahl entspricht. Bei 100 % wird der ganze Kreis eingefärbt,
bei 45 % nicht ganz die Hälfte.
Nach dem gleichen Prinzip wird in den Zeilen 6 und 7 die Anzahl Stun-
den und die Anzahl der übrigbleibenden Minuten ermittelt und in ent-
sprechenden Variablen abgelegt. Am Ende wird die Zeit mit print im
gemischten Format «Stunden Minuten Sekunden» ausgegeben.
1 sekunden = 15322
2
3 minuten = sekunden // 60
4 rest_Sekunden = sekunden % 60
5
6 stunden = minuten // 60
7 rest_Minuten = minuten % 60
8
9 print stunden, rest_Minuten, rest_Sekunden
1 Weil es auf der Tastatur kein eigentliches Zeichen für den Rest der Division gibt,
verwendet man einfach etwas «ähnliches» – und das Prozentzeichen hat ja auch einen
Schrägstrich wie bei der Division.
Beachte, dass der print-Befehl hier am Ende die Werte von drei Varia-
blen ausgibt. Die Variablen müssen dabei durch ein Komma getrennt
werden. Im Ausgabefenster erscheint bei unserem Beisiel wie erwartet
4 15 22. Wir haben also mit Python berechnet, dass 15 322 Sekunden
umgerechnet 4 Stunden, 15 Minuten und 22 Sekunden entsprechen.
Mit dem Befehl print kannst du beliebig viele Zahlen, Resultate von
Rechnungen und eben auch den Inhalt von mehreren Variablen ausge-
ben. Die einzelnen Ausgaben müssen dabei durch ein Komma getrennt
werden.
AUFGABEN
10. Bei Geldautomaten gibst du einen Betrag ein. Der Automat muss
dann ausrechnen, wie viele Noten von jedem Typ er dazu ausgeben soll.
Der Automat in unserer Aufgabe kennt die Notentypen «200», «100»
und «20». Schreibe ein Programm, das für den Gesamtgeldbetrag aus-
rechnet, wie viele Noten von jedem Typ ausgegeben werden sollen – da-
bei sollen möglichst grosse Noten verwendet werden. Das funktioniert
natürlich nur für Beträge, die auch aufgehen, z. B. 480 → 2 · 200 + 4 · 20.
13.∗ Schreibe ein Programm, das natürliche Zahlen bis 255 ins Binär-
system umrechnet. Für 202 soll also beispielsweise 1 1 0 0 1 0 1 0
ausgegeben werden.
4 Text ausgeben
Einführung Für ein gutes Programm ist eine einfache und verständ-
liche Ausgabe zentral. Das Programm gibt nicht nur einfach die Zah-
lenwerte aus, sondern schreibt auch hin, was sie bedeuten. Damit der
Computer zwischen der Variablen minuten und dem Wort «Minuten»
unterscheiden kann, musst du alles, was keine Variable ist in Gänsefüss-
chen setzen. Probiere es selbst aus:
minuten = 10
print minuten, "Minuten"
Der Text in den Gänsefüsschen darf auch länger sein, Leerschläge und
Umlaute (äöü) enthalten. Text, der in Gänsefüsschen
eingeschlossen ist heisst in
1 print "Wenn einer, der mit Mühe kaum,"
der Fachsprache «string» oder
2 print "Gekrochen ist auf einen Baum,"
«Zeichenkette».
3 print "Schon meint, dass er ein",
4 print "Vogel wär,\nSo irrt sich der."
5 print "\tWilhelm Busch"
In diesem kurzen Gedicht von Wilhelm Busch haben wir auch gleich
noch zwei Sonderzeichen verwendet. In einem Text zwischen den Gän-
sefüsschen steht die Kombination «\n» für einen Zeilenumbruch (new
line) und «\t» für den Tabulator (Einrückung). Dafür verhindet ein
Komma am Ende der Zeile bei print den Zeilenumbruch (Zeile 3).
Das Programm Das Programm ist hier sehr kurz gehalten. Dafür
verwenden wir einen hübschen Trick, um die Nachkommastellen einer
Zahl zu «berechnen». Du kennst bereits die Ganzzahldivision // und
den Operator für den Rest %. Diese funktionieren in Python auch für
gebrochene Zahlen. Und wenn du eine Zahl durch 1 teilst, dann sind
genau die Nachkommastellen der Rest dieser Division. Wenn du ganz am Ende der
Zeile bei print noch ein Kom-
1 zahl = 12.345
ma setzst, dann wird die Zeile
2 nachkommastellen = zahl % 1
nicht umgebrochen.
3 print "Die Nachkommastellen von", zahl,
4 print "sind:", nachkommastellen
Bei print siehst du sehr schön, wie wir zwischen Textstücken unter-
scheiden, die der Computer direkt ausgeben soll, und Variablen, die
der Computer durch den entsprechenden Wert ersetzen soll. Du siehst
AUFGABEN
14. Mit print 3+4 gibt dir Python einfach das Resultat 7 aus. Schrei-
be ein Programm, das nicht nur das Resultat berechnet und ausgibt,
sondern auch die Rechnung auf den Bildschirm schreibt: 3+4 = 7
15. Du hast bereits ein Programm gesehen, um eine Zeitangabe von Se-
kunden in Stunden, Minuten und Sekunden umzurechnen (z. B. 17200 →
20 5200 ). Diese erste Version hat aber einfach drei Zahlen ausgegeben. Er-
gänze das Programm jetzt so, dass die Ausgabe mit Einheiten erfolgt:
4 Stunden, 15 Minuten, 22 Sekunden
17.∗ Ascii-Art ist die Kunst, nur mit den Buchstaben und Zeichen des
Computers Bilder darzustellen2 . Verwende print, um solche Ascii-Art-
Bilder zu «zeichnen», z. B. die Eule:
______ __ __ __ ______
.___. / ___/ / / / / / / / ___/
{o,o} / __/ / / / / / / / __/
/)__) / /__ / /__/ / / /___ / /__
-’-’- /_____/ /______/ /_____/ /_____/
2 vgl. [Link]
Auch das Gegenstück zu den Potenzen, die Wurzel, lässt sich mit Py-
thon berechnen. Für die Quadratwurzel gibt es dafür die Funktion sqrt
(engl. square root). Die Funktion sqrt ist in einem «Erweiterungspack»,
einem sogenannten Modul definiert, und zwar im «math»-Modul. Bevor
du also mit sqrt eine Wurzel berechnen kannst, musst du sie aus dem
math-Modul laden:
from math import *
Auf der Zeile 1 wird wie oben angekündigt das Modul math geladen.
Damit lässt sich auf Zeile 4 das Kugelvolumen berechnen, das schliess-
lich auf Zeile 6 ausgegeben wird. Bei der Ausgabe wird das Volumen
mit dem Befehl round(Zahl, Anzahl_Stellen) auf zwei Nachkom-
mastellen gerundet.
AUFGABEN
18. Die Kreiszahl π lässt sich zwar nicht genau angeben. Es gibt aber
eine Reihe von Brüchen und Wurzelausdrücken, um π anzunähern. Ei-
nige davon sind:
r √
√ √ √ 63 17 + 15 5
q
22 355
π≈ , , 2 + 3, 7 + 6 + 5, √
7 113 25 7 + 15 5
19. Der goldene Schnitt ist ein Verhältnis, das in der Kunst und Ar-
chitektur gerne√verwendet wird. Zeige numerisch, dass der goldene
5+1
Schnitt a : b = die Eigenschaft b : a = a : b − 1 erfüllt.
2
20. Nach dem Satz des Pythagoras gilt für die drei Seiten a, b und c
eines rechtwinkligen Dreiecks a2 + b2 = c2 . Berechne mit Python für
die zwei Katheten a = 48 und b = 55 die Hypotenuse c.
21.∗ Schreibe ein Programm, mit dem du Winkel aus dem Gradmass ins
Bogenmass umrechnen kannst. (Genauigkeit: 3 Nachkommastellen)
Zur Erinnerung: Das Bogenmass entspricht der Bogenlänge des entspre-
chenden Sektors auf dem Einheitskreis.
6 Variablenwerte ändern
Einführung Eine Variable steht für einen Wert bzw. eine Zahl. Mit
der Zuweisung x = 3 sagst du dem Computer, dass die Variable x für
den Wert 3 steht. Aber: Variablen können ihren Wert im Laufe des Pro-
gramms ändern! Damit kannst du die gleiche Rechnung für verschiede-
ne Zahlen durchführen.
Es lohnt sich, den Ablauf dieses Programms mit dem Debugger zu beob-
achten. Klicke dazu auf den Käfer oben im Editorfenster. Wenn du jetzt
das Programm startest, dann kannst du im Debugfenster beobachten,
wie sich der Wert von x ändert.
AUFGABEN
22. Verwende *=, um den Wert einer Variablen bei jedem Schritt zu ver-
doppeln und lass dir damit alle Zweierpotenzen (2, 4, 8, . . .) bis 210 =
1024 ausgeben.
23. Lass dir vom Computer die ersten 20 (a) geraden, (b) ungeraden
Zahlen ausgeben.
24. Lass dir vom Computer alle natürlichen Zahlen von 1 bis 100 zu-
sammenzählen und bestätige, dass das Resultat 5050 ist.
25. Schreibe ein Programm, das alle natürlichen Zahlen von 1 bis 10
multipliziert und das Resultat 3 628 800 auf den Bildschirm schreibt.
26. Bilde mit dem Computer die Summe der ersten n Stammbrüche:
1 1 1 1 1
1+ + + + + ··· +
2 3 4 5 n
Probiere aus: Wie gross muss das n sein, damit die Summe grösser ist
als 5?
27.∗ Berechne die Summe der ersten 10 000 Stammbrüche einmal von
1
«vorne» und einmal von «hinten» (also 1+ 21 +. . . bzw. 10000 1
+ 9999 +. . .).
Wie gross ist der Unterschied zwischen den beiden Summen?
AUFGABEN
28. Ändere das Programm so ab, dass die Turtle 20 Punkte horizon-
tal (waagrecht) zeichnet. Die Variable i soll also nacheinander 20 ver-
schiedene Werte zwischen 0.0 und 1.0 annehmen.
30. Lass die Turtle eine Kette von immer kleiner werdenden Punkten
zeichnen, die sich alle berühren.
31. Zeichne mit der Turtle eine «sechseckige» Spirale. Dazu zeichnest
du ein Sechseck und vergrösserst bei jedem Durchgang der Schleife die
Länge der Seite um 2 Pixel (Abbildung 3.1(a)).
32.∗ Lass die Turtle eine Zick-Zack-Linie bzw. Treppe zeichnen. Dazu
dreht sich die Turtle in jedem Schleifendurchgang entweder nach links
oder rechts. Hinweis: Die Turtle dreht sich auch dann nach rechts, wenn
der Winkel in left negativ ist (Abbildung 3.1(b)).
8 Fallunterscheidung
Einführung Ein Programm soll nicht immer alle Befehle der Rei-
he nach durcharbeiten, sondern manchmal eine Auswahl treffen und
gewisse Befehle nur ausführen, wenn auch die Voraussetzungen dafür
gegeben sind. In anderen Worten: Das Programm muss verschiedene
Fälle unterscheiden können und dabei auch Spezialfälle berücksichti-
gen.
Stell dir z. B. vor, dein Programm soll die Wurzel einer Zahl x ziehen.
Das geht nur, wenn die Zahl x nicht negativ ist! Es hat also Sinn, vor
dem Wurzelziehen den Wert von x mit if zu überprüfen:
if x >= 0:
Wurzel ziehen
Der ganze Trick funktioniert aber nur, wenn die Zahl nicht-negativ ist.
Von negativen Zahlen können wir keine Wurzeln ziehen und das Pro-
gramm würde abstürzen.
1 from math import *
2 zahl = 74
3 if zahl >= 0:
4 wurzel = sqrt(zahl)
5 kommateil = wurzel % 1
6 if kommateil == 0.0:
7 print "Zahl ist eine Quadratzahl."
8 if kommateil != 0.0:
AUFGABEN
34. Schreibe ein Programm, das überprüft, ob eine Zahl gerade ist und
entsprechend «gerade» oder «ungerade» auf den Bildschirm schreibt.
35. Schreibe ein Programm, das überprüft, ob ein gegebenes Jahr ein
Schaltjahr ist. Achte darauf, dass dein Programm auch mit vollen Jahr-
hunderten (1600, 1700, etc.) richtig umgehen kann. Mit der Einfüh-
rung des gregorianischen Kalenders 1582 wurde die Schaltjahrregelung
nämlich so ergänzt, dass von den vollen Jahrhunderten nur diejenigen
Schaltjahre sind, deren erste zwei Ziffern durch 4 teilbar sind.
36. Schreibe ein Programm, das zu einer Zahl alle Teiler sucht und
ausgibt. Verwende dazu eine Schleife. In dieser Schleife prüfst du mit
der «Division mit Rest» alle möglichen Teiler durch und schreibst diese
möglichen Teiler auf den Bildschirm, wenn der Rest Null ist.
9 Alternativen
else heisst übersetzt «andernfalls» und ersetzt das zweite if. Die bei-
den Codebeispiele hier sind absolut gleichwertig:
Allerdings hat das else natürlich nur deshalb Sinn, weil sich die beiden
if links ergänzen: Entweder ist zahl >= 0 erfüllt oder dann zahl < 0.
Das Programm Das Osterdatum ändert sich jedes Jahr und muss
daher immer neu berechnet werden. Carl Fiedrich Gauss hat für diese
Berechnung ein Verfahren (Algorithmus) vorgestellt. Weil Ostern im-
mer im März oder April sind, gibt seine Formel den Tag ab dem 1. März
an. Der Tag «32» entspricht dann einfach dem 1. April.
AUFGABEN
37. Bei der Collatz-Vermutung startest du mit einer Zahl x und erzeugst
dann eine Zahlenfolge noch dem folgenden Prinzip: Wenn x gerade ist,
dann teile durch 2. Andernfalls multipliziere x mit 3 und zähle 1 dazu:
17 52 26 13 40 20 10 5 16 8 4 2 1
k = Jahr // 100, p = k // 3, q = k // 4,
M = (15 + k - p - q) % 30, N = (4 + k - q) % 7
a = Jahr % 19, b = Jahr % 4, c = Jahr % 7,
d = (19a + M) % 30, e = (2b + 4c + 6d + N) % 7
Ostertag = 22 + d + e
Wäre dieses Programm aber nicht noch besser, wenn auch die Ausgabe
in einem kleinen Fensterchen erfolgen würde? Dafür gibt es msgDlg().
Es funktioniert (fast) genau gleich wie print, allerdings mit einem
wichtigen Unterschied: Bei print setzst du nie Klammern, bei msgDlg
dafür immer.
name = inputString("Wie heisst du?")
msgDlg("Hallo", name)
Das Programm Mit den neuen Ein- und Ausgaben können wir ein
kleines Quiz schreiben, das auch gleich zählt, wie viele richtige und
falsche Antworten gegeben wurden. Beachte, wie wir in Zeile 11 auch
die Zahl 169 in Gänsefüsschen setzen müssen. inputString gibt uns
nämlich auch dann einen String/Text zurück, wenn die Eingabe eigent-
lich eine Zahl wäre.
1 richtig = 0 # Anzahl richtige Antworten
2 falsch = 0 # Anzahl falsche Antworten
3
4 eingabe1 = inputString("Hauptstadt von Frankreich?")
5 if eingabe1 == "Paris":
6 richtig += 1
7 else:
8 falsch += 1
9
10 eingabe2 = inputString("Quadrat von 13?")
11 if eingabe2 == "169":
12 richtig += 1
13 else:
14 falsch += 1
15
16 msgDlg("Du hattest", richtig, "richtige und",
17 falsch, "falsche Antworten.")
AUFGABEN
40. Wenn jemand eine falsche Antwort gibt, dann lass dein Programm
die korrekte Antwort ausgeben: Falsch. Richtig wäre «Paris».
11 Schleifen abbrechen
Nehmen wir als Beispiel an, der Computer soll überprüfen, ob 91 ei-
ne Primzahl ist. Dazu muss er grundsätzlich alle Zahlen von 2 bis 90
durchgehen und ausrechnen, ob sich 91 ohne Rest durch eine kleinere
Zahl teilen lässt. Nachdem der Computer aber festgestellt hat, dass 91
durch 7 teilbar ist, muss er die anderen Zahlen nicht mehr überprüfen.
Er hat die Antwort auf unsere Frage und kann daher mit der Berech-
nung aufhören.
In den Zeilen 2 bis 8 prüft das Programm der Reihe nach alle möglichen
Teiler durch. Wenn die eingegebene Zahl durch einen Teiler wirklich
teilbar ist, dann wird die Schleife in Zeile 7 abgebrochen. Die Variable
teiler enthält jetzt den kleinsten Teiler der eingegebenen Zahl (ausser
1 natürlich).
Am Schluss prüfen wir, ob der gefundene Teiler kleiner ist als die Zahl
und geben entsprechend aus, dass es eine Primzahl ist oder nicht.
1 zahl = inputInt("Bitte gib eine ganze Zahl ein:")
2 teiler = 2
3 repeat zahl-1:
4 rest = zahl % teiler
5 if rest == 0:
6 break
7 teiler += 1
8
9 if teiler < zahl:
10 msgDlg(zahl, "ist durch", teiler, "teilbar!")
11 if teiler == zahl:
12 msgDlg(zahl, "ist eine Primzahl!")
AUFGABEN
44. Wie oft musst du 1.5 mit sich selbst multiplizieren, bis das Ergebnis
grösser ist als 100? Wie sieht es auf mit 1.05 . . . ?
Schreibe ein Programm, das die Antwort mit einer Schleife sucht. So-
bald 1.5n grösser ist als 100, bricht die Schleife ab und das Programm
gibt das Ergebnis aus. Mit anzahl += 1 kannst du z. B. zählen, wie oft
die Schleife tatsächlich wiederholt wird.
12 Korrekte Programme
Wie stellst du sicher, dass dein Programm korrekt ist und wirklich im-
mer das richtige Resultat liefert? Diese Frage ist gar nicht so einfach
zu beantworten und wird immernoch erforscht. Was du aber sicher tun
kannst: Teste deine Programme und zwar in möglichst verschiedenen
Situationen bzw. mit verschiedenen Eingabewerten.
Das Programm läuft soweit einwandfrei, nur: Das Ergebnis stimmt nicht!
Es sollte 23 sein und nicht −2. Findest du heraus, wo der Fehler liegt?
Nimm vielleicht auch den Debugger zu Hilfe oder spiele mit der An-
zahl der Wiederholungen, um ein besseres Gefühl zu bekommen (die
Lösung erfährst du auf der nächsten Seite).
Und hier die Auflösung: Der Fehler liegt in der Zeile 4. Der Computer berechnet
bei -1/2 ** i zuerst 2**i aus und dann den Rest. Um also wirklich − 21 zu
potenzieren, braucht es Klammern: (-1/2) ** i.
AUFGABEN
48. Was passiert, wenn du bei deinem Programm für den Wert von
a Null eingibst? Stelle sicher, dass dein Programm auch dann korrekt
funktioniert!
Quiz
5. Du möchtest die Rechnung 1 + 2 = 3 auf den Bildschirm aus-
geben. Welche Anweisung ist dazu die richtige?
2 a. print 1 + 2 = 3
2 b. print 1 + 2 == 3
2 c. print "1 + 2 = 3"
2 d. print "1"+"2"="3"
2 a. if x // 2:
2 b. if x // 2 == 0:
2 c. if x % 2:
2 d. if x % 2 == 0:
2 a. #A 2 b. #B 2 c. #C 2 d. #D
4. Mit welchen Codesequenzen wird die positive Zahl x auf 0.5 genau
gerundet ausgegeben? Die Zahl 2.3 würde also auf 2.5 gerundet.
1 1 1 1 1 1 1
1+ + + + + + + ··· +
2 4 8 16 32 64 1024
Dazu hat er das folgende Programm geschrieben. In jeder Zeile hat
es aber einen Fehler. Finde die Fehler und korrigiere sie, so dass das
Programm richtig funktioniert.
summe == 1
1 = x
repeat 10
x //= 2
summe + x
print "summe"
KOORDINATENGRAFIK
Zuerst werden wir in diesem Kapitel die Turtlegrafik und das Rechnen
mit Variablen zusammenführen. Das ist ein wichtiger Schritt, um kom-
plexere Bilder zeichnen zu können. Der Schwerpunkt dieses Kapitels
liegt dann aber auf der Grafik mit einem Koordinatensystem bis hin zu
einfachen Spielen.
Zusätzlich kommt hinzu, dass du das Verhalten der Turtle auch mit Va-
riablen steuerst. In unserem Beispiel lassen wir die Turtle abwechselnd
nach links oder nach rechts gehen, indem wir den Wert einer Variablen
bei jedem Schleifendurchgang wieder ändern. In den Übungen wirst du
mit dieser Technik auch eine Spirale zeichnen.
Das Programm Das Programm beginnt damit, dass wir das Turtle-
Modul laden (importieren) und eine neue Turtle mit Fenster erzeugen.
Danach definieren wir in den Zeilen 4 bis 9 einen neuen Befehl treppe
für die Turtle. Zur Erinnerung: Mit dieser Definition macht die Turtle
noch nichts! Damit wird erst der Befehl definiert. Ganz am Schluss in
Zeile 11 sagen wir dann der Turtle, sie soll eine Treppe zeichnen, und
zwar mit einer Stufenlänge von 25 Pixeln.
1 from gturtle import *
2 makeTurtle()
3
4 def treppe(stufe):
5 winkel = 90
6 repeat 10:
7 forward(stufe)
8 right(winkel)
9 winkel *= -1
10
11 treppe(25)
Das hier ist übrigens ein Fall, bei dem du das else nicht durch ein
if winkel != 90: ersetzen kannst. Warum das nicht geht, ist eine
Frage in den Übungenen.
Die wichtigsten Punkte Die Turtle selber kennt zwar keine Varia-
blen. Aber du kannst beim Programmieren trotzdem geschickt Varia-
blen einsetzen, um das Verhalten der Turtle zu steuern.
AUFGABEN
1. Lass die Turtle in einer Schleife eine Spirale zeichnen, die auf einem
Rechteck beruht. Dazu dreht sich die Turtle jedes Mal um 90◦ . Dafür
geht sie bei jedem Mal etwas weiter geradeaus (z. B. 5 Pixel mehr),
bevor sie sich wieder dreht.
4. Lass die Turtle mit der Technik aus diesem Abschnitt eine gestrichel-
te Linie zeichnen:
5.∗ Zeichne mit der Turtle eine drei- oder vierfarbige Linie nach dem
Prinzip der gestrichelten Linie. Die Farben wechseln sich also immer ab:
Gelb, rot, blau, gelb, rot, blau, . . .
2 Farben mischen
Ein Rechteck ausfüllen, das konntest du aber auch schon vorher. Jetzt
variieren wir das Programm aber leicht, indem die Turtle jede Zeile mit
einer anderen Farbe zeichnen soll. Mit dieser Technik kannst du sehr
einfach schöne Farbverläufe erzeugen. Allerdings reichen dafür wieder-
um die üblichen Farben nicht aus: Du musst deine Farben schon selber
mischen. Das machst du mit der Funktion makeColor(R, G, B). Hier
stehen R für rot, G für grün und B für blau. Jeder dieser Anteile ist ein
Wert zwischen 0.0 und 1.0, zum Beispiel:
9 i += 0.01
10 setPenColor( makeColor(0.0, 0.0, i) )
11 forward(150)
12 left(winkel)
13 forward(1)
14 left(winkel)
15 winkel *= -1
AUFGABEN
6. Das Rechteck im Beispielprogramm ist 150 Pixel breit und 100 Pixel
hoch. Ändere das so ab, dass es neu 240 Pixel breit und 50 Pixel hoch
ist. Die oberste Linie sollte immer noch ein kräftiges Blau sein.
8. Links oben hat das Rechteck einen «Zipfel»: Die Turtle zeichnet da
einen einzelnen Pixel auf das Rechteck drauf. Warum macht sie das
(welche Zeilen im Programm sind dafür verantwortlich)? Und wie kannst
du das beheben bzw. verhindern?
11.∗ Zeichne mit der Turtle einen Farbkreis mit den drei Grundfarben
rot, grün und blau. Zwischen diesen Grundfarben gibt es einen flies-
senden Übergang. Verwende setPenWidth(5), damit man die Farben
auch gut sieht.
13.∗ Wenn du die Turtle bei einem runden Farbverlauf langsam nach
links oben wandern lässt, dann entsteht der Eindruck einer Kugel. Zeich-
ne eine solche Kugel.
In den Zeilen 8 und 10 verwenden wir einen Trick, um die Grafik et-
was schneller zu machen: Bevor wir die Turtle jeweils drehen, machen
wir sie unsichtbar mit hideTurtle und nach der Drehung wird sie mit
showTurtle wieder sichtbar. Damit dreht sich die Turtle ohne die übli-
che Animation und ist dadurch viel schneller.
1 from gturtle import *
2 from random import randint
3
4 makeTurtle()
5 repeat 100:
6 forward(35)
7 winkel = randint(1, 360)
8 hideTurtle()
9 left(winkel)
10 showTurtle()
Bevor wir die Funktion randint verwenden können, müssen wir sie
aus dem Modul random laden (importieren).
AUFGABEN
14. Ändere das Programm aus dem Text so ab, dass auch die Länge der
Strecke, die die Turtle geht, zufällig ist. Die Turtle soll also nicht immer
35 Pixel, sondern einen zufälligen Wert zwischen 25 und 50 vorwärts
gehen.
15. Mit dem Befehl dot(durchmesser) zeichnet die Turtle an der aktu-
ellen Position einen (runden) Punkt mit dem angegebenen Durchmes-
ser. Das funktioniert auch, wenn der Farbstift «oben» ist und die Turtle
eigentlich keine Spur zeichnet.
Ergänze das Programm aus dem Text damit so, dass die Turtle bei jeder
Drehung noch einen Punkt mit Radius 5 zeichnet.
16. Definiere einen Befehl zufallsfarbe, der eine zufällige Farbe setzt.
Dazu ziehst du zuerst eine Zufallszahl zwischen z. B. 1 und 4. Danach
schreibst du eine Reihe von if-Bedingungen, nach dem Muster:
if zahl == 1:
setPenColor("red")
Zeichne dann damit ein Quadrat, bei dem jede Seite eine (andere) zu-
fällige Farbe hat.
17. Schreibe mit dot ein Programm, das zufällige Punkte auf den Bild-
schirm zeichnet. Natürlich kannst du auch den Radius der Punkte zu-
fällig ziehen lassen. Verwende deinen Befehl zufallsfarbe aus der
letzten Aufgabe, damit die Punkte auch verschiedene Farben haben.
Einführung Bis jetzt hast du die Turtle immer relativ zu ihrer aktu-
ellen Position gesteuert, indem du Winkel und Längen angegeben hast.
Je nach Grafik ist es aber praktischer, die Turtle direkt an eine bestimm-
te, absolute Stelle im Grafikfenster zu setzen, ohne dass du dafür zuerst
ausrechnen musst, in welchem Winkel und wie weit sie gehen soll.
Für diese absolute Steuerung (d. h. unabhängig von der aktuellen Posi-
tion und Richtung der Turtle) verwenden wir ein Koordinatensystem,
wie du es auch aus der Mathematik kennst. Du gibst also die Positionen
innerhalb des Fensters mit einer x- und einer y-Koordinate an (siehe
Abb. 4.1). Die Fenstermitte hat dabei immer die Koordinaten (0, 0).
Du kannst die relative und die absolute Steuerung nach Belieben mi-
schen. Dazu gibt es noch einen weiteren Befehl, der nützlich sein dürf-
te: Mit heading(winkel) kannst du die Turtle ausrichten. Ein Winkel
von 0 entspricht «gerade nach oben», 90 «direkt nach rechts», etc.
AUFGABEN
19. Definiere zwei neue Befehle xline(y) und yline(x). Bei yline
zeichnet die Turtle eine vertikale (senkrechte) Linie über die ganze
Fensterhöhe an der angegebnen x-Position. Bei xline(y) zeichnet die
eine horizontale (waagrechte) Linie über die ganze Fensterbreite.
20. Nutze die beiden Befehle xline und yline aus der letzten Aufga-
be, um ein Gitter über das ganze Fenster zu zeichnen und zwar sollen
die einzelnen Linien 50 Pixel voneinander entfernt sein.
21. Zeichne mit der Turtle noch einmal die Figuren aus der Abbildung
2.1 auf Seite 11. Verwende dieses Mal aber nur absolute Koordinaten,
d. h. setPos(x, y) und moveTo(x, y).
22. Definiere einen Befehl rectangle(x1, y1, x2, y2), mit dem die
Turtle ein Rechteck mit den Eckpunkten A(x1 , y1 ), B(x1 , y2 ), C(x2 , y2 )
und D(x2 , y1 ) zeichnet.
5 Koordinaten abfragen
Das Programm (I) Das Grundprogramm hier füllt den mittleren Teil
des Bildschirms mit Punkten: Dazu zieht es für die x- und die y-Koordinate
Zufallszahlen im Bereich zwischen −200 und 200.
1 from gturtle import *
2 from random import randint
3
4 def zufallsPunkt():
5 radius = randint(4, 7)
6 dot(radius * 2)
7
8 makeTurtle()
9 setColor("black")
10 setFillColor("black")
11 fill()
12 repeat 1000:
13 x = randint(-200, 200)
14 y = randint(-200, 200)
15 setPos(x, y)
16 zufallsPunkt()
Die Koordinaten liegen alle im Bereich zwischen −200 und 200, weil
wir die Zufallszahlen im Hauptprogramm oben aus diesem Bereich zie-
[Link] der Radius nicht negativ sein kann, addieren wir 200 und
teilen das Ergebnis dann durch 40. Damit liegt der Radius immer im
Bereich von 0 bis 10.
AUFGABEN
23. Ändere die Version (II) so ab, dass (a) die Radien der Punkte im
Bereich zwischen 2 und 18 liegen, (b) die grossen Punkte unten liegen
und die kleinen Punkte oben.
25.∗ Ändere die Version (III) so ab, dass die Regenbogenfarben nicht
mehr horizontal (waagrecht) verteilt sind, sondern diagonal: Links un-
ten ist violet und rechts oben rot.
27.∗ In dieser Aufgabe geht es darum, die relative und absolute Turt-
lesteuerung zu kombinieren, um ein Pentagramm zu zeichnen (vgl.
p. 66). Zeichne mit der Turtle zunächst ein Fünfeck und lass dir bei
jedem Punkt die aktuellen Koordinaten ausgeben. Verwende danach
moveTo, um das Fünfeck mit dem Stern zu ergänzen.
28. Schreibe einen Befehl dotXY(x, y, r), der an der Stelle (x, y)
einen Punkt mit Radius r zeichnet und danach die Turtle dahin zu-
rücksetzt, wo sie vor dem Befehl war.
6 Schleifen in Schleifen
AUFGABEN
30. Füge in Zeile 5 eine if-Bedingung ein, so dass die Paare nur aus-
gegeben werden, wenn die zweite Zahl grösser ist als die erste.
AUFGABEN
33. Ändere die Farben und die Grösse der Punkte im Programm (II).
34. Schreibe ein Programm, das ein Quadrat aus 12×12 Punkten zeich-
net, die sich alle berühren und alle eine zufällige Farbe haben.
35. Schreibe das Programm so, dass die Punkte von links nach rechts
immer kleiner und von unten nach oben immer heller (d. h. farbiger)
werden.
Wenn die Maus geklickt wird, soll die Turtle eine Linie an die entspre-
chende Stelle zeichnen. Aber nur innerhalb des Quadrats in der Mitte
des Fensters. Dazu prüfen wir, ob die Koordinaten x und y im entspre-
chenden Bereich liegen.
1 from gturtle import *
2
3 @onMouseHit
4 def onClick(x, y):
5 if (-200 < x < 200) and (-200 < y < 200):
6 moveTo(x, y)
7 else:
8 setPenColor("red")
9
10 makeTurtle()
11 hideTurtle()
12 setPos(-200, -200)
13 repeat 4:
14 forward(400)
15 right(90)
16 setPos(0, 0)
17 showTurtle()
AUFGABEN
(a) Dass es bei einem Klick ausserhalb des Quadrats eine Zufallsfarbe
für die Stiftfarbe wählt.
(b) Dass der Zeichenbereich in der Mitte kein Quadrat, sondern ein
Rechteck mit unterschiedlicher Höhe und Breite ist.
(c) Dass die Maus im Zeichenbereich keine Linie zeichnet, sondern
nur Punkte an der Stelle, an der du geklickt hast.
(d) Der Zeichenbereich in der Mitte ein Kreis ist.
8 Globale Variablen
x = 5
twelve()
print x
Der Befehl twelve setzt den Wert von x auf 12 und weil Python diesen
Code nach dem x = 5 ausführt, sollte die Variable x den Wert 12 haben.
Tut sie aber nicht. Warum? === Lokale Variablen ===
x = 12 [int]
Um dem auf den Grund zu gehen ist es sinnvoll, dass du den Debugger === Globale Variablen ===
verwendest und das Programm langsam Schritt für Schritt ausführst. x = 5 [int]
Sieh dir dabei im Debuggerfester an, welchen Wert die Variable x hat.
Während das Programm den Befehl twelve ausführt, wirst du im De-
buggerfenster zwei verschiedene x finden.
In Python hat jeder Befehl seine eigenen lokalen Variablen! Aus Sicht von
Python hat das x im Befehl twelve also grundsätzlich nichts mit dem
x unten zu tun: Das sind zwei verschiedene Variablen, die nur zufäl-
lig gleich heissen. Falls du möchtest, dass der Befehl twelve mit der Eine Variable, die innerhalb ei-
globalen Variable arbeitet, dann musst du das mit global x angeben: ner Befehlsdefinition verwen-
det wird, heisst lokale Varia-
def twelve(): ble. Eine Variable, die aus-
global x serhalb einer Definition steht
x = 12 heisst hingegen globale Varia-
ble.
Schau dir auch dieses Programm schrittweise an. Du wirst feststellen,
dass Python jetzt keine lokale Variable x mehr verwendet: Beide x sind
jetzt ein und dieselbe Variable!
Die Variable lampe enthält den aktuellen Farbwert der Lampe, am An-
fang also schwarz. In der Definition des Befehls von onClick müssen
wir angeben, dass wir diese globale Variable innerhalb der Definition
verwenden (und verändern) wollen (Zeile 5).
1 from gturtle import *
2 lampe = "black"
3
4 @onMouseHit
5 def onClick(x, y):
6 global lampe
7 if lampe == "black":
8 lampe = "yellow"
9 else:
10 lampe = "black"
11 setPenColor(lampe)
12 dot(20)
13
14 makeTurtle()
15 clear("black")
AUFGABEN
40. Schreibe ein Programm, das die Anzahl der Mausklicks zählt und
ausgibt.
41. Schreibe ein Programm, das bei jedem Mausklick die Hintergrund-
farbe wechselt, z. B. mit makeRainbowColor().
9 Mehrere Alternativen
Das Problem: Bei einem roten Pixel schreibt das Programm nicht nur,
dass der Pixel rot ist, sondern auch «Der Pixel ist weder rot
noch blau.» Warum? Weil sich das else nur auf den Test mit blau
bezieht und nicht auch auf das rot!
Wir können die beiden if-Bedingungen aber mit einem elif zusam-
menhängen, so dass das Programm richtig funktioniert, sogar wenn wir
noch weitere Tests hinzufügen:
if getPixelColorStr() == "red":
print "Der Pixel ist rot."
elif getPixelColorStr() == "blue":
print "Der Pixel ist blau."
elif getPixelColorStr() == "green":
print "Der Pixel ist grün."
else:
print "Der Pixel ist weder rot, blau noch grün."
elif steht für else if. Wenn du eine Bedingung mit elif an die vor-
hergehende anhängst, dann wird sie nur dann ausgeführt, wenn keine
der vorausgehenden Bedingungen erfüllt war. Python wählt aus einer
solchen Kette von if, elif und else also nur genau eine Alternative
aus!
Das Programm Das Programm ist ein kleines Farbenspiel. Die Turtle
springt von Punkt zu Punkt. Je nach Farbe des Punkts ändert die Turtle
ihre Richtung und ändert die Farbe des Punkts, auf dem sie sitzt. Wenn
du die «Farbregeln» änderst, entstehen je nachdem andere Muster.
In unserem Fall macht die Turtle 100 Schritte (Zeile 22) und zeichnet
dabei gelbe, rote und blaue Punkte.
1 from gturtle import *
2 from time import sleep
3
4 def doStep():
5 hideTurtle()
6 forward(24)
7 if getPixelColorStr() == "white":
8 setPenColor("yellow")
9 dot(24)
10 right(60)
11 elif getPixelColorStr() == "yellow":
12 setPenColor("red")
13 dot(24)
14 left(60)
15 else:
16 setPenColor("blue")
17 dot(24)
18 showTurtle()
19
20 makeTurtle()
21 penUp()
22 repeat 100:
23 doStep()
24 sleep(0.1)
AUFGABEN
42. Ergänze das Programm durch weitere Regeln und Farben. Füge
auch eine Regel hinzu, bei der die Turtle ein Feld überspringt (verwen-
de forward) oder sich um 180◦ dreht.
43. In diesem Programm könntest du die elif auch dann nicht durch
if ersetzen, wenn du das else weglässt. Warum nicht? Finde heraus,
was passieren würde und erkläre, warum die elif hier wichtig sind.
45.∗ Lass die Turtle z. B. bei grünen Punkten zufällig eine Farbe aus-
wählen oder entscheiden, ob sie nach links oder rechts gehen soll.
10 Vier Gewinnt
18
19 def putChip(spalte):
20 x = -90 + spalte * 30
21 y = 60
22 repeat 5:
23 dotXY(x, y, "yellow")
24 sleep(0.25)
25 setPos(x, y - 30)
26 if getPixelColorStr() != "white":
27 break
28 dotXY(x, y, "white")
29 y -= 30
30
31 @onMouseHitX
32 def onClick(x, y):
33 spalte = (x + 105) // 30
34 if 0 <= spalte <= 6:
35 putChip(spalte)
36
37 makeTurtle()
38 hideTurtle()
39 penUp() # Keine Spur zeichnen
40 clear("blue") # Blauer Hintergrund
41 drawGrid()
Wie die Chips fallen Wie machen wir das, dass ein Chip nach unten
fällt? Zuerst einmal rechnen wir die Koordinaten (x, y) des obersten
Punkts aus. Danach gehen wir der Reihe nach von oben nach unten
und versuchen, den Chip «fallen zu lassen»:
Zuerst setzen wir einen gelben Punkt (den Chip). Danach schauen wir,
ob der Punkt darunter frei (d. h. weiss) ist. Wenn nicht, dann sind wir
fertig und wir brechen die Schleife ab (Zeile 27). Ansonsten löschen wir
den gelben Punkt von vorhin wieder, weil er ja nach unten fallen kann.
Zwischen dem Zeichnen und dem Löschen des gelben Punkts fügen
wir eine Pause von einer Viertelsekunde ein, damit man den Chip auch
fallen sieht.
AUFGABEN
46. Definiere eine globale Variable farbe und wechsele bei jedem Maus-
klick (d. h. im Befehl onClick) den Wert zwischen "yellow" und "red"
ab. Baue das anschliessend so in das Programm ein, dass die Chips ab-
wechselnd rot und gelb sind und du mit einer Freundin spielen kannst.
47.∗ Spiele gegen den Computer. Ergänze dazu den Befehl onClick so,
dass nach jedem Chip, den du hineinwirfst der Computer eine Zufalls-
zahl zieht und in die entsprechende Spalte einen Chip einwirft.
11 Mausbewegungen*
Mit setCursor() ändern wir zudem die Form des Mauszeigers wäh-
rend des Zeichnens. Dazu fangen wir auch die Callbacks für das Drücken
und Loslassen der Maustaste ab. Sobald die Maus gedrückt wird, setzen
wir die Turtle an die entsprechende Stelle, noch ohne etwas zu zeich-
nen.
1 from gturtle import *
2
3 @onMouseDragged
4 def mouseDragged(x, y):
5 moveTo(x, y)
6
7 @onMousePressed
8 def mouseDown(x, y):
9 setCursor(Cursor.CROSSHAIR_CURSOR)
10 setPos(x, y)
11
12 @onMouseReleased
13 def mouseUp(x, y):
14 setCursor(Cursor.DEFAULT_CURSOR)
15
16 @onMouseClicked
17 def mouseClick(x, y):
18 setPos(x, y)
19 dot(10)
20
21 makeTurtle()
22 hideTurtle()
AUFGABEN
Das Programm Wir geben dir hier erst einmal nur die Grundstruk-
tur für das Spiel an. Die Turtle bewegt sich hier auf einer Art von
«Schachbrett». Mit Klicken kannst du ein Feld schwarz färben.
Nachdem wir zuerst alle Befehl definiert haben, beginnt das Hauptpro-
gramm erst in Zeile 51. Das machen wir deutlich mit ### MAIN ###
(eine Kurzform für main program, also Hauptprogramm). Auch das hat
für Python keine Bedeutung, hilft uns aber, die Übersicht zu behalten.
1 from gturtle import *
2 from time import sleep
3
4 CELLSIZE = 40 # Wähle zwischen: 10, 20, 40, 50
5
6 # Zeichnet das Grundgitter:
7 def drawGrid():
8 global CELLSIZE
9 hideTurtle()
10 setPenColor("gray")
11 x = -400
12 repeat (800 // CELLSIZE) + 1:
13 setPos(x, -300)
14 moveTo(x, +300)
15 x += CELLSIZE
16 y = -300
17 repeat (600 // CELLSIZE) + 1:
18 setPos(-400, y)
19 moveTo(+400, y)
20 y += CELLSIZE
21 setPos(0, 0)
22 showTurtle()
23
24 # Bei Mausklick eine Zelle schwarz färben.
25 @onMouseHit
26 def onClick(x, y):
27 # Die Position der Turtle speichern
28 turtle_x = getX()
29 turtle_y = getY()
30 # Zelle schwarz färben
31 hideTurtle()
32 setPos(x, y)
33 if getPixelColorStr() == "white":
34 setFillColor("black")
35 fill()
36 # Die Turtle wieder dahin zurücksetzen,
37 # wo sie am Anfang war.
38 setPos(turtle_x, turtle_y)
39 showTurtle()
40
41 def doStep():
42 hideTurtle()
43 # Einen Schritt nach vorne machen.
44 forward(CELLSIZE)
45 # Falls die Turtle auf einem schwarzen Feld landet,
46 # setzen wir sie wieder zurück und drehen sie dafür.
47 if getPixelColorStr() == "black":
48 back(CELLSIZE)
49 right(90)
50 showTurtle()
51
52 ### MAIN ###
53 makeTurtle()
54 drawGrid()
55 # An dieser Stelle könntest du ein Feld als Ziel färben.
56 # Die Turtle auf ein Anfangsfeld setzen:
57 setPos(-400 + 5*CELLSIZE // 2, -300 + 5*CELLSIZE // 2)
58 penUp()
59
60 repeat 1000:
61 doStep()
62 sleep(0.5)
Bevor wir die Turtle an eine bestimmte Stelle bewegen, machen wir
sie mit hideTurtle() unsichtbar und zeigen sich danach wieder mit
showTurtle(). Das hat zwei Gründe. Zum einen wäre es z. B. merk-
würdig, wenn die Turtle bei einem Mausklick kurz zum Mauscursor
springt und danach wieder zurückgeht. Zum anderen wäre das Pro-
gramm zu langsam, wenn die Turtle bei all ihren Bewegungen sichtbar
wäre.
AUFGABEN
50. Ergänze das Programm so, dass du mit der Maus schwarze Felder
auch wieder wegklicken kannst. Wenn du also auf ein schwarzes Feld
klickst, dann wird es wieder weiss.
51. Ergänze das Programm zu einem Spiel, indem du ein Feld rot ein-
färbst (Zeile 54). Wenn die Turtle dieses rote Feld erreicht hat, ist das
Spiel fertig und man hat «gewonnen». Im Modul sys gibt es übrigens
einen Befehl exit(), um das Programm sofort zu beenden:
from sys import exit
52. Im Moment kann es passieren, dass die Turtle aus dem Bild her-
ausfällt. Ergänze das Programm also so, dass du alle Felder am Rand
zuerst schwarz färbst.
53. Das Spiel wird erst dann interessant, wenn du gewisse Hindernisse
oder Punkte einbaust. Du könntest z. B. die Anzahl der schwarzen Blö-
cke zählen, die man braucht, um das Spiel zu lösen. Je weniger Blöcke,
umso höher die Punktzahl. Oder du zählst die Schritte, die die Turtle
braucht. Überlege dir selber, wie du die Punktzahl berechnen möchtest
und gib am Ende diese Punktzahl mit msgDlg aus!
54.∗ Baue ein Level, in dem du bereits gewisse Wände vorgibst, die der
Turtle im Weg stehen. Damit wird das Spiel etwas schwieriger.
55.∗ Neben den schwarzen Blöcken könntest du noch graue Blöcke ein-
führen, die der Turtle ebenfalls im Weg stehen. Im Unterschied zu den
schwarzen Blöcken lassen sich die grauen Blöcke aber nicht mehr ent-
fernen.
56.∗ Die Turtle könnte beim Gehen eine gelbe Spur hinterlassen und
sich so weigern, ein zweites Mal auf ein Feld zu gehen.
57.∗ Mach das Spiel schwieriger, indem sich die Turtle zufällig nach
links oder rechts abdreht. Du kannst die Turtle auch schneller machen,
indem du den Wert in sleep() veränderst. Sie sollte aber nicht zu
schnell sein, weil sonst das Erzeugen und Entfernen der Blocks nicht
mehr richtig funktioniert.
58.∗ Für Profis: Programmiere das Spielfeld so, dass wenn die Turtle
rechts hinausläuft, dass sie dann von links wieder hineinkommt. Natür-
lich funktioniert das dann auch in die entgegengesetzte Richtung und
genauso für oben/unten.
Quiz
9. Wie kannst du eine Turtlegrafik mit absoluten Koordinaten so
an der Mitte spiegeln, dass links und rechts danach vertauscht
sind?
10. Wie viele «x» scheibt das folgende Programm auf den Bild-
schirm?
k = 1
repeat 20:
repeat k:
print "x",
k += 1
2 a. 20 2 b. 21 2 c. 210 2 d. 400
11. Welchen Wert schreibt das folgende Programm auf den Bild-
schirm?
x = 2
def egg():
global x
x = 3
def spam(x):
x = 5
x = 4
egg()
spam(x)
print x
2 a. 2 2 b. 3 2 c. 4 2 d. 5
Neben den Funktionen lernst du auch eine Reihe von Algorithmen ken-
nen. Ein Algorithmus ist ein Berechnungsverfahren. Zum Beispiel wird
die «Berechnung von Wurzeln» das ganze Kapitel hindurch eine grosse
Rolle spielen und du lernst verschiedene Algorithmen (also Verfahren)
kennen, um die Wurzel einer Zahl zu berechnen.
1 Distanz berechnen
Bei der Turtle wäre left() ein Befehl, der etwas tut, getX() hingegen
eine Funktion, die einen Wert ermittelt und zurückgibt. Wenn du selbst
eine Funktion definierst, dann verwendest du immer die Anweisung
return, um anzugeben, was das Resultat ist.
Das Programm Das Programm lässt die Turtle 50 000 zufällige Punk-
te zeichnen. Punkte, die weniger als 75 Pixel von der Bildmitte entfernt
sind zeichnen wir rot, alle anderen blau.
Neu ist hier die Funktion distance in den Zeilen 5 bis 7. Du weisst
bereits, dass mit def hier ein neuer Befehl definiert wird, der dann in
Zeile 14 ausgeführt wird. Das return d in Zeile 7 bewirkt danach, dass
der berechnete Wert d in der Zeile 14 für distance eingesetzt wird.
Eine zweite Funktion ist zufall in Zeilen 9 bis 11. Sie zieht eine ge-
rade Zufallszahl zwischen −200 und 200 und gibt diese – wiederum
mit return – zurück. In den Zeilen 16 und 17 verwenden wir diese
Funktion dann, um zwei Zufallszahlen zu ziehen. Die Distanz eines Punktes
(x, y) zur Bildmitte (0, 0) be-
1 from gturtle import *
rechnest
p du über die Formel:
2 from math import sqrt
d = x2 + y 2 .
3 from random import randint
4
5 def distance(x, y):
6 dist = sqrt(x**2 + y**2)
7 return dist
8
9 def zufall():
10 z = randint(-100, 100) * 2
11 return z
12
13 makeTurtle()
14 hideTurtle()
15 repeat 25000:
16 x = zufall()
17 y = zufall()
18 if distance(x, y) < 75:
19 setPenColor("red")
20 else:
21 setPenColor("blue")
22 setPos(x, y)
23 dot(5)
AUFGABEN
2 Mathematische Funktionen
Eine Funktion definierst du wie eigene Befehle mit einem def. Im Un-
terschied zu den Befehlen braucht eine Funktion immer ein return.
Nach dem return gibst du an, was das Resultat der Funktion sein soll.
So sieht dann also die Quadratfunktion aus:
def sq(zahl):
ergebnis = zahl * zahl
return ergebnis
10 wurzel = my_sqrt(eingabe)
11 msgDlg("Die Wurzel von", eingabe, "ist ca.", wurzel)
def Name(Parameter):
Code/Berechnung
return Resultat
AUFGABEN
8. Schreibe eine Funktion minimum(a, b), die von den beiden Zahlen
a und b die kleinere zurückgibt. Natürlich machst du das ohne Pythons
Funktion min zu verwenden.
10.∗ Schreibe eine Funktion invert(z), die die Ziffern einer zweistel-
ligen Zahl z vertauscht und z. B. aus 47 die Zahl 74 macht. Wenn dir
das zu einfach ist, dann schreibe die Funktion so, dass sie alle Zahlen
von 1 bis 999 richtig behandelt.
3 Verzweigte Funktionen
x 1 4 9 16 25 36 49 64
y 1 2 3 4 5 6 7 8
Das Programm (I) Die Wurzelfunktion hier gibt nur für Werte bis
20 das «richtige» Resultat an (natürlich gerundet). Weil eine Funktion Zugegeben: Für die Wurzelbe-
aber immer mit return ein Ergebnis haben muss, geben wir für alle rechnung hat das Schema der
anderen x-Werte die falsche Lösung 0 zurück (Zeilen 10 und 11). verzweigten Funktion relativ
wenig Sinn. Es soll uns hier
1 def wurzel(x): aber genügen, um das Prinzip
2 if 0 < x <= 3: darzustellen.
3 return 1
4 elif 3 < x <= 7:
5 return 2
6 elif 7 < x <= 13:
7 return 3
8 elif 13 < x <= 20:
9 return 4
10 else:
11 return 0
Das Programm (II) Das ist die selbe Funktion wie oben. Hier sind die
if-Verzweigungen allerdings binär (d. h. nach einem Ja-Nein-Schema)
aufgebaut. Dieser binäre Aufbau ist in der Informatik ziemlich wichtig
und spielt später eine grosse Rolle.
1 def wurzel(x):
2 if 0 < x <= 20:
3 if x <= 7:
4 if x <= 3:
5 return 1
6 else:
7 return 2
8 else:
9 if x <= 13:
10 return 3
11 else:
12 return 4
13 else:
14 return 0
AUFGABEN
13. Schreibe eine Funktion stellen(n), die für eine beliebige natürli-
che Zahl n zwischen 1 und 99 999 angibt, wie viele Stellen die Zahl hat.
Beispiel: stellen(416) ergäbe dann 3.
1
= 0.142857 142857 142857 . . .
7
Schreibe eine Funktion siebtel(index) die für eine beliebige Nach-
kommastelle die Ziffer angibt. siebtel(3) wäre z. B. 2. Tipp: Verwen-
de den Divisionsrest x % 6.
4 Graphen zeichnen
Damit die Graphen nicht zu klein werden, skalieren wir sie beim Zeich-
nen. Unser Turtlefenster hat x-Koordinaten von −400 bis +400. Wir
legen nun also unser Koordinatensystem so, dass die Funktion von −40
bis +40 gezeichnet werden. Eine Einheit entspricht also 10 Pixeln. Im
Programm erkennst du diese Skalierung daran, dass statt moveTo(x, y)
steht: moveTo(x*10, y*10).
x2
f (x) = − 12
25
Diese Funktion definieren wir in den Zeilen 4 und 5. In Zeilen 7 bis 9
setzen wir die Turtle auf die Startposition. Danach gehen wir in einer
Schleife die x-Werte von −40 bis +40 durch, berechnen zu jedem x-Wert
den y-Wert und setzen die Turtle entsprechend. Wenn du nach dem
makeTurtle() noch
1 from gturtle import *
ein speed(-1) einfügst,
2 makeTurtle()
dann arbeitet die Turt-
3
le etwas schneller. Mit
4 def f(x): setPenWidth(2) wird die
5 wert = x**2 / 25 - 12 Linie des Graphen ein wenig
6 return wert deutlicher.
7
8 setPenColor("red")
9 x = -40
10 y = f(-40)
11 setPos(x*10, y*10)
12
13 repeat 80:
14 x += 1
15 y = f(x)
16 moveTo(x*10, y*10)
def f(x):
return (x**2 / 25 - 12)
AUFGABEN
16. Baue das Programm so aus, dass zuerst das Koordinatensystem ge-
zeichnet wird, am besten sogar mit Einheiten oder einem Gitter. Du
kannst mit label("1") etc. auch Zahlen oder Text hinschreiben.
17. Ändere die Skalierung so, dass der Graph von −80 bis +80 gezeich-
net wird.
18. Lasse dir von der Turtle auch die folgenden Funktionen zeichnen.
x 3
(15 + x)(21 − x)
(a) f1 (x) = (b) f2 (x) = −x
20 9
19. Bei diesen zwei Funktionen musst du den Bereich, den die Turtle
zeichnet anpassen, weil die Funktionen nicht für alle x-Werte definiert
sind.
√ p
(a) f3 (x) = x (b) f4 (x) = 900 − x2
20. Um was für eine mathematische Funktion handelt es sich hier? Wie
sieht ihr Graph aus?
def f(x):
if x >= 0:
return x
else:
return -x
21. Schreibe ein Programm, dass beide Funktionen f (x) und g(x) in
das gleiche Bild zeichnet.
x 2 x
f (x) = − + x + 16, g(x) = −3
5 4
Eine Stelle, an der die Funktion wegen einer Division durch Null «un-
endlich» gross oder klein (oder beides) wird heisst eine «Polstelle». Un-
sere Aufgabe wird sein, diese Polstellen richtig darzustellen. Dazu brau-
chen wir zwei Techniken: Erstens müssen wir verhindern, dass Python
durch Null Dividiert und das Programm abbricht. Zweitens müssen wir
trotzdem etwas sinnvolles zeichnen.
Ein Funktionsgraph mit einer
Die Division durch Null verhindern wir mit einer einfachen if-Verzwei- Polstelle.
gung. Neu ist hier vor allem das «NaN». Es steht für «not a number» und
bedeutet, dass sich die Funktion hier nicht berechnen lässt.
def f(x):
if x == 0:
return NaN
else:
return 1 / x
Leider lässt sich NaN bei einem Vergleich nicht wie üblich mit if x==NaN
abfragen. Du brauchst vielmehr die Funktion isnan aus dem math-
Modul:
y = f(x)
if isnan(y):
# POLSTELLE
else:
# NORMAL ZEICHNEN
Beim Zeichnen der Polstelle entsteht immer eine kleine Lücke. Wir dür-
fen also die Punkte links nicht mit den Punkten rechts verbinden. Die
Lücke sollte aber auch nicht zu gross sein. Anstelle des Punkts (x, f (x))
zeichnen wir den Graphen deshalb bis zum Punkt (x − 0.1, f (x − 0.1))
und fahren bei (x + 0.1, f (x + 0.1)) wieder weiter – bei einer Polstelle
zeichnen wir also zwei Punkte, beide möglichst nahe am undefinierten
Wert x.
AUFGABEN
25.∗ Zeichne auch den Graphen des Tangens y = tan(x). Der Tangens
hat Nullstellen bei ±90◦ , ±270◦ , ±450◦ , . . .
Python arbeitet mit dem Bogenmass (Radian). Du musst also die Win-
kelangabe in Grad zuerst mit der Funktion radian umrechnen. Zudem
ist es sinnvoll, x mit 10 zu multiplizieren: y = tan(radian(x*10)).
Beide Funktionen tan und radian sind im math-Modul definiert.
6 Wurzeln suchen
Hast du gesehen, dass in der Zeile 3 hinter dem repeat die Zahl fehlt?
Dadurch entsteht eine sogenannte Endlos-Schleife. Diese Schleife wird
so lange wiederholt, bis sie mit break abgebrochen wird.
Dieser Ansatz ist bereits besser, aber noch nicht perfekt. Vor allem ist
das Verfahren so auch nur auf zwei Nachkommastellen beschränkt. Na-
türlich kannst du Zeile 6 zu x += 0.001 ändern, wenn du drei Nach-
kommastellen brauchst. Aber je kleiner die Schrittweite wird, umso län-
ger braucht die Funktion, um die Wurzel zu finden. Versuche es einmal
mit my_sqrt(100000) – das dauert bereits seine Zeit!
Lass uns das am Beispiel mit zahl=30 durchgehen. Am Anfang ist die
Schrittweite 1. Python probiert also die Zahlen 0, 1, 2, 3, 4, 5 und 6 durch.
Bei 6 stellt es fest, dass 62 > 30 und geht darum zurück zu 5. Gleichzei-
tig wird die Schrittweite durch 10 geteilt, so dass sie jetzt 0.1 ist. Jetzt
probiert Python die Zahlen 5.0, 5.1, 5.2, 5.3, 5.4 und 5.5 durch. Bei 5.5
stellt es wiederum fest, dass 5.52 > 30. Entsprechend geht es zurück zu
5.4 und dividiert die Schrittweite durch 10, so dass sie jetzt 0.01 ist.
Dieser Algorithmus (hier ist es mehr ein «Such-» als ein «Berechnungs-
verfahren») ist jetzt auch viel schneller als vorher. Das siehst du, wenn
du die Wurzel einer grossen Zahl wie 100 000 berechnest.
AUFGABEN
26. Warum braucht es die Zeilen 10 und 11? Was würde passieren,
wenn du diese Zeilen mit dem if schritt < 0.00001? weglässt?
Nach if muss immer etwas stehen, das True oder False ist. Wie in die-
sem kurzen Beispiel muss das aber kein Vergleich sein; hier haben wir
eine Variable mit dem Wert True definiert und weil die Variable hinter
if durch ihren Wert ersetzt wird, ist das hier dasselbe wie if True:.
Richtig praktisch wird das mit den beiden Werten True und False,
wenn du eine komplexere Bedingung hast, die du prüfen musst. Dann
kannst du die Bedingung nämlich in einer Funktion prüfen und am
Ende mit return True oder return False angeben, ob die Bedingung
erfüllt ist oder nicht.
5 return True
6 wurzel += 1
7 return False
8
9 n = inputInt("Gib eine natürliche Zahl ein:")
10 if isSquare(n):
11 print n, "ist eine Quadratzahl."
12 else:
13 print n, "ist keine Quadratzahl."
Die wichtigsten Punkte Python drückt «wahr» und «falsch» mit den
beiden boolschen Werten True und False aus. Damit kannst du Funk-
tionen programmieren, die eine komplexe Bedingung überprüfen und
dann einen dieser beiden Werte mit return zurückgeben.
AUFGABEN
29. Schreibe eine Funktion isCubic(x), die prüft, ob die Zahl x eine
Kubikzahl ist, d. h. eine Zahl von der Form n3 (z. B. 8 = 23 oder 125 =
53 ). Deine Funktion gibt also bei Zahlen wie 8 und 125 True zurück
und ansonsten False.
30. Verwende die Funktion isCubic(x) aus der letzten Aufgabe und
schreibe ein Programm, das mithilfe von isCubic alle Kubikzahlen zwi-
schen 1 und 999 sucht und auf den Bildschirm schreibt.
31. Schreibe eine Funktion isPrime(n), die für eine natürliche Zahl n
prüft, ob es eine Primzahl ist. Gehe dabei einfach alle theoretisch mög-
lichen Teiler von n durch und prüfe, ob sich n teilen lässt. Achte darauf,
dass deine Funktion auch bei n = 1 die richtige Antwort zurückgibt.
33.∗ Eine perfekte Zahl ist eine Zahl x, deren Teiler (ausser x) zusam-
mengezählt gerade x ergeben. Bsp: Die Teiler von 6 sind: 1, 2, 3, 6 und
1 + 2 + 3 = 6. 6 ist also eine perfekte Zahl. Schreibe eine Funktion
isPerfect(x), die prüft ob x eine perfekte Zahl ist.
Neben 6 gibt es eine weitere perfekte Zahl, die kleiner ist als 100 und
eine dritte, die kleiner ist als 1000. Finde sie!
8 Primzahlen testen
In diesem Abschnitt schauen wir uns an, wie wir das Verfahren (den
Algorithmus) zum Testen von Primzahlen schneller machen können.
Der erste Ansatz So sieht der erste Algorithmus aus, der prüft, ob
n eine Primzahl ist. Der Algorithmus geht alle Zahlen t von 2 bis n
durch und prüft, ob sich n durch t teilen lässt. Wenn der Algorithmus
den kleinsten (!) Primfaktor einer Zahl gefunden hat, hört er auf und
gibt zurück, dass die Zahl keine Primzahl ist. Findet er keinen kleinsten
Primfaktor, ist n selber offenbar eine Primzahl. Auch hier verwenden wir
repeat ohne eine Anzahl
1 def isPrime(n):
(vgl. 106) und nutzen aus,
2 t = 1
dass die ganze Funktion
3 repeat:
(also auch die Schleife) mit
4 t += 1
return sofort beendet wird.
5 if t >= n:
6 return True
7 if n % t == 0:
8 return False
Wenn der Teiler t so gross ist, dass t · t grösser ist als n, dann können
wir bereits aufhören, weiter zu suchen. Bei der Primzahl 919 können
wir also bei t = 31 aufhören, weil 312 = 961 > 919. Wäre 919 nämlich
durch eine grösse Primzahl wie 37 teilbar, dann wäre der zweite Fak-
tor kleiner als 37 (919 : 37 ≈ 25) und wir hätten ihn deshalb bereits
gefunden! Die Schleife in der Funktion isPrime(n) sieht dann so aus:
1 t = 1
2 repeat:
3 t += 2
4 if t**2 == n:
5 return False
6 elif t**2 > n:
7 return True
8 if n % t == 0:
9 return False
Und wie prüfst du, ob von mehreren Bedingungen mindestens eine zu-
trifft? Mit or (oder)!
if x == 2 or x == 3 or x == 5 or x == 7:
print "x ist eine einstellige Primzahl"
Weil nicht alle Vergleiche auf eine Zeile passen, schreiben wir sie auf
zwei Zeilen (3 und 4). Damit Python aber weiss, dass es auf der nächs-
ten Zeile weitergeht, musst du das mit einem Backslash «\» ganz am
Ende der ersten Zeile anzeigen.
1 zahl = 1
2 repeat 50:
3 if (zahl % 7 == 0) or (zahl == 17) or \
4 (zahl == 27) or (zahl == 37) or (zahl == 47):
5 print "Bingo"
6 else:
7 print zahl
8 zahl += 1
AUFGABEN
(a) Die Zahl x ist durch 5 teilbar aber nicht durch 10.
(b) Die Zahl x ist durch 11, durch 13 oder durch beide teilbar.
(c) Die Zahlen x und y sind entweder beide positiv oder beide negativ.
(d) Die Zahl z ist durch 2 oder durch 3 teilbar, aber nicht beides.
35. Prüfe mit einem einzigen if, ob von den drei Zahlen a, b und c eine
die Summe der beiden anderen Zahlen ist (z. B. 3 + 4 = 7).
36. Schreibe eine Funktion, die prüft, ob von drei Zahlen a, b und c
genau zwei Zahlen gleich sind, aber nicht alle drei. Der Rückgabewert
für (1, 2, 2) wäre dann True und für (1, 2, 3) oder (4, 4, 4) False.
k
37. Fermatsche Primzahlen sind Primzahlen von der Form n = 2(2 ) +1.
Bis heute kennt man genau fünf solche Fermatschen Primzahlen:
3, 5, 17, 257, 65537.
Schreibe eine Funktion isFermatPrime(n), die prüft, ob die Zahl n
eine der fünf Fermatschen Primzahlen ist. Hinweis: Das ist eine sehr
k
einfache Aufgabe, die du lösen kannst, ohne die Form 2(2 ) + 1 zu be-
rücksichtigen.
k
38.∗ Allgemein ist eine Fermatzahl eine Zahl von der Form n = 2(2 ) +1.
Schreibe eine Funktion isFermatNumber(n), die für eine Zahl n prüft,
ob es eine Fermat-Zahl ist. Verwende dann diese Funktion zusammen
mit isPrime(n) aus dem letzten Abschnitt, um eine neue Funktion
isFermatPrime(n) zu schreiben, die mithilfe von isFermatNumber(n)
und isPrime(n) prüft, ob n eine Fermatsche Primzahl ist.
Teste deine neue Funktion mit den fünf Fermatschen Primzahlen.
Beim Programmieren lassen wir das «alt» und «neu» gleich ganz weg
und schreiben:
x = (x + n / x) / 2
AUFGABEN
40. Ersetze im Programm oben die Zeile 4 durch folgende zwei (gleich-
wertige) Zeilen:
x_neu = (x + n / x) / 2
x = x_neu
Baue das Programm nun so aus, dass es die Schleife abbricht, wenn die
Änderung zwischen x und xneu kleiner ist als 0.001.
41. Programmiere folgenden Algorithmus: Starte mit einer beliebigen
natürlichen Zahl x und prüfe bei jedem Schritt: Wenn x gerade ist,
dann teile x durch 2, ansonsten rechne xneu = 3 · xalt + 1. Lass alle
diese Zahlen ausgeben.
Die Frage dazu lautet dann: Wie lange dauert es jeweils, bis der Algo-
rithmus zu x = 1 kommt? Es ist auch noch unbekannt, ob der Algorith-
mus tatsächlich für jeden Startwert zu 1 kommt.
Für den Startwert x = 7 ergibt sich z. B. folgende Ausgabe:
7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 -> 17
Was ist die längste solche Zahlenfolge, die du findest?
Kennst du die Fibonacci-Folge: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, . . .
Du siehst sicher sofort, wie diese Zahlen gebildet werden. Die nächste
Zahl ist immer die Summe der beiden letzten: 13 + 21 = 34. Weil wir
aber immer die zwei letzten Zahlen brauchen, reicht es nicht mehr, mit
x y x+y
nur einer Variablen zu arbeiten.
1 1 2
Wenn x und y jeweils die zwei letzten Zahlen der Finbonacci-Folge sind, . .
1 2 3
dann können wir den Algorithmus so darstellen:
. .
2 3 5
xneu = yalt
. .
yneu = xalt + yalt
··· ··· ···
Was nicht funktioniert ist eine der folgenden Lösungen. Warum funk-
tionieren sie nicht? Finde selber heraus, wo das Problem liegt!
x = y y = x + y
y = x + y x = y
Das Problem wird sofort ersichtlich, wenn du ein «alt» bzw. «neu» rich-
tig hinzusetzst.
Erinnerst du dich, dass die Variablen links immer die «neuen» Werte
enthalten und rechts immer die «alten»? In der Schreibweise mit «alt»
und «neu» ist das also: xneu , yneu = yalt , xalt + yalt .
Du kannst also gleichzeitig die Differenz und die Summe zweier Zahlen
a und b berechnen mit:
a, b = a+b, a-b
AUFGABEN
43. Der Algorithmus von Euklid ist ein Verfahren, um den ggT (grösster
gemeinsamer Teiler) zweier Zahlen a und b zu berechnen. Programmiere
diesen Algorithmus in Python.
a b a%b
490 252 238
aneu = balt . .
bneu = aalt % balt 252 238 14
. .
238 14 0
Prüfe dein Programm mit ggT (252, 490) = 14 und ggT (342, 408) = 6.
Quiz
12. Die folgenden vier Ausdrücke sollen eine zufällige Quadratzahl
zwischen 1 und 36 ziehen, wobei sq(x) die «Quadratfunktion»
ist. Welche dieser Ausdrücke ergibt tatsächlich auf jeden Fall
eine Quadratzahl zwischen 1 und 36?
2 a. randint(1, 6) * randint(1, 6)
2 b. randint(1, 6) ** 2
2 c. sq( randint(1, 6) )
2 d. randint(1, 36)
13. Welche dieser Funktionen quadriert eine Zahl x und liefert den
Rückgabewert x2 .
2 a. if x % 2 and x % 3 == 0:
2 b. if x % 2 == x % 3:
2 c. if x % 3 == 0 or x % 2 == 0:
2 d. if x % 3 == 0 and x % 2 == 0:
7. Wenn sich an einer Party n Gäste die Hände schütteln, dann gibt
es eine einfache Formel, um auszurechnen, wie oft Hände geschüttelt
werden:
n(n − 1)
h(n) =
2
Schreibe die Funktion handshake(n), die damit den entsprechenden
Wert berechnet und zurückgibt.
p
8. Der Graph der Funktion f (x) = r2 − x2 zeichnet einen Halbkreis
mit dem Radius r.
1 2
9. Die Brücke im folgenden Bild basiert auf einer Parabel y = − x .
200
Zeichne mit der Turtle die Brücke, so dass der Bogen unten tatsächlich
eine Parabel ist. Je nach Grösse und Position der Brücke musst du die
Parabel natürlich anpassen.
10. Mit dem Algorithmus von Heron lassen sich Wurzeln sehr schnell
und genau berechnen. Der Algorithmus lässt sich auch einfach
√ abän-
3
dern, um die dritte Wurzel einer Zahl a zu berechnen, z. B. 64 = 4.
x + xa2
x0 =
2
Schreibe damit eine Funktion cbrt(a), die die dritte Wurzel einer Zahl
a berechnet und zurückgibt.
11. Zwei Zahlen a und b lassen sich auch alleine mit Addition, Subtrak-
tion und Schleifen dividieren: Ziehe die Zahl b so oft von a ab, bis das
nicht mehr möglich ist.
(a) Schreibe eine Funktion intDiv(a, b), die zwei natürliche Zahlen
a und b teilt und das Ergebnis der Ganzzahl-Division zurückgibt.
(b) Schreibe eine zweite Funktion intRest(a, b), die zwei natürli-
che Zahlen a und b teilt und den Rest der Ganzzahl-Division zu-
rückgibt.
(c) * Schreibe eine dritte Funktion numDiv(a, b), die zwei beliebige
Zahlen a und b durcheinander teilt und das Ergebnis als wissen-
schaftliche Zahl (mit Nachkommastellen) zurückgibt.
Hinweis: Hierzu brauchst du natürlich die Multiplikation bzw. Di-
vision durch 10. Weil dabei nur der Dezimalpunkt verschoben wird,
lässt sich diese Multiplikation/Division im Prinzip ohne Rechnen
durchführen und darf deshalb hier verwendet werden.
12.∗ Schreibe eine Zählerfunktion nextInt(), die der Reihe nach alle
natürlichen Zahlen zurückgibt. Beim ersten Aufruf von nextInt() ist
der Rückgabewert also 1, beim zweiten Aufruf 2, etc. Hinweis: Dazu
brauchst du globale Variablen.
LISTEN
Listen enthalten nicht nur einen einzelnen Wert, sondern beliebig viele.
Sie sind wie Funktionen und Schleifen ein Kernaspekt der Programmie-
rung. Mit Listen kannst du nämlich grosse Datenmengen verwalten:
Zum Beispiel sind Musikstücke Listen von Tönen, Texte sind Listen von
Buchstaben, Bilder sind Listen von Farben und Filme sind wiederum
Listen von Bildern.
1 Listen erzeugen
Eine Liste darf eine Zahl auch mehrfach enthalten. Du darfst sogar eine
Liste machen, die nur aus Einsen besteht: [1, 1, 1]. Wenn du möch-
test, dass jeder Wert nur einmal vorkommt, dann kombinierst du in mit
append:
In Zeilen 2 und 3 beginnt die Funktion mit einer leeren Liste und dem
ersten Teiler 2. In der Schleife prüfen wir, ob n durch teiler teilbar
ist. Wenn ja, dann fügen wir diesen Teiler in Zeile 6 zur Liste hinzu und
teilen n. Ansonsten probieren wir den nächsten Teiler.
1 def factorize(n):
2 result = []
3 teiler = 2
4 repeat:
5 if n % teiler == 0:
6 [Link](teiler)
7 n //= teiler
8 else:
9 teiler += 1
10 if n == 1:
11 break
12 return result
13
14 print factorize(60)
Listen lassen sich beliebig erweitern, indem du mit append neue Werte
hinzufügst:
[Link](8)
Du prüfst mit in, ob ein Wert in einer Liste vorkommt oder nicht.
AUFGABEN
2. Du weisst bereits, wie du prüfst, ob eine Zahl eine Primzahl ist (vgl.
isPrime, p. 109). Schreibe damit ein Programm, das alle Primzahlen
bis 101 sucht und in eine Liste schreibt.
3.∗ Ändere das Programm aus der letzten Aufgabe so ab, dass es die
ersten hundert Primzahlen in einer Liste sammelt.
4. Mit randint aus dem Modul random kannst eine Zufallszahl ziehen
(vgl. p. 72). Schreibe ein Programm, das drei voneinander verschiedene
Zufallszahlen zwischen 1 und 9 zieht und in einer Liste sammelt. Wenn
also eine Zahl bereits in der Liste enthalten ist, dann musst du eine
neue Zufallszahl ziehen, bis du drei verschiedene Zufallszahlen hast.
5. Erweitere das Programm aus der letzten Aufgabe und schreibe ein
Programm, das eine zufällige Permutation (d. h. eine Anordnung) der
Zahlen von 1 bis 9 erzeugt. Eine solche Permutation könnte sein:
[5, 9, 1, 4, 2, 3, 8, 6, 7]
2 Listen durchlaufen
Dieses Grundschema kommt so oft vor, dass es dafür eine andere Schreib-
weise mit Listen gibt: Die sogenannte for-Schleife.
summe = 0
for zahl in [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]:
summe += zahl
Zugegeben: Bei dieser Form mit Listen musst du die Quadratzahlen von
Hand eingeben, was mühsam sein kann. Der grosse Vorteil ist aber, dass
in der Liste keine Quadratzahlen sein müssen. Du kannst mit der for-
Schleife beliebige Zahlen durchgehen!
Die wichtigsten Punkte Bei einer for-Schleife setzt Python für eine
Variable der Reihe nach alle Werte in der Liste ein und führt damit die
Schleife aus. Hier wird für x zuerst der Wert 1 eingesetzt, dann 3, 6 und
schliesslich 10. Jedes Mal wird damit der «Code» ausgeführt.
for x in [1, 3, 6, 10]:
Code
AUFGABEN
8. Schreibe eine Funktion anzahl, die die Elemente zählt, die in einer
Liste sind. Auch hier verwendest du die gleiche Struktur wie bei der
Summenfunktion oben.
10. Ergänze die Funktion isPrime zu einem Programm, das alle Prim-
zahlen sucht, die kleiner sind als 1000. Beginne dafür mit der Liste
primzahlen = [2, 3]. Das Programm geht dann alle Zahlen bis 999
durch (verwende dazu die klassische repeat-Schleife). Wenn eine Zahl
eine Primzahl ist, wird sie mit append zur Liste der Primzahlen hinzu-
gefügt.
Die for-Schleife ist flexibler als die repeat-Schleife, weil wir jetzt sehr
einfach die Strecken- bzw. Seitenlängen variieren können. Die Turtle
muss also nicht jedes Mal 100 Pixel vorwärts gehen. Damit lassen sich
sehr einfach auch Figuren zeichnen, die nicht regelmässig sind.
Das Programm (I) Das Programm hier zeichnet ein einfaches Häus-
chen. Dazu geht Python jede Zahl in der Liste durch: Zuerst bewegt sich
die Turtle um die angegebene Seitenlänge vorwärts, dann dreht sich die
Turtle um 45◦ nach links.
1 from gturtle import *
2 makeTurtle()
3 for seite in [100, 71, 0, 71, 100, 0, 100]:
4 forward(seite)
5 left(45)
Das Programm (II) Hier haben wir einen ganz anderen Ansatz ge-
wählt und lassen die Turtle ein Bild aus einzelnen Pixeln zeichnen. In
den Listen steht 1 für schwarz und 0 für weiss.
1 from gturtle import *
2
3 def drawLine(yPos, pixelListe):
4 setPos(0, yPos)
5 for pix in pixelListe:
6 if pix == 1:
7 dot(3)
8 forward(2)
9
10 makeTurtle()
11 setPenColor("black")
12 penUp()
13 right(90)
14 drawLine(12, [0, 0, 1, 1, 1, 0, 0])
15 drawLine(10, [0, 1, 0, 0, 0, 1, 0])
16 drawLine( 8, [1, 0, 1, 0, 1, 0, 1])
17 drawLine( 6, [1, 0, 0, 0, 0, 0, 1])
18 drawLine( 4, [1, 0, 1, 1, 1, 0, 1])
19 drawLine( 2, [0, 1, 0, 0, 0, 1, 0])
20 drawLine( 0, [0, 0, 1, 1, 1, 0, 0])
21 hideTurtle()
AUFGABEN
11. Ergänze das Programm mit dem Häuschen so, dass es das vollstän-
dige Haus des Nikolaus zeichnet (siehe p. 11).
14. Baue das Pixel-Programm so aus, dass du neben schwarz und weiss
noch grau und einige Farben zur Verfügung hast. Dann könnte z. B. 1
für blau, 2 für rot, 3 für grün stehen, usw. Zeichne damit eigene kleine
Bilder!
4 Polygone zeichnen
Das erste Element einer Liste (der sogenannte «Kopf») lässt sich mit der
Funktion head ermitteln. head(dreieck) ergäbe hier also (30, 20).
Wie beim Dreieck oben müssen wir die Turtle zuerst mit setPos auf den
Anfangspunkt setzen. Die Funktion head(liste) gibt immer das erste
Element in der Liste an – hier also (40, −40). Danach gehen wir alle
Punkte in der Liste durch und zeichnen eine Linie zum neuen Punkt.
Weil das for wirklich alle Punkte durchgeht, zeichnet die Turtle zuerst
eine Linie von (40, −40) nach (40, −40), was eigentlich sinnlos ist, aber
nicht stört.
1 from gturtle import *
2
3 def drawPolygon(shape):
4 setPos(head(shape))
5 for point in shape:
6 moveTo(point)
7 moveTo(head(shape))
8
9 haus = [(40, -40), (40, 40), (0, 80),
10 (-40, 40), (-40, -40)]
11 makeTurtle()
12 drawPolygon(haus)
Übrigens lassen sich aus einem Punkt wie A(30, 20) auch die beiden Ko-
ordinaten zurückgewinnen, und zwar mit x, y = A – hier wäre jetzt
x = 30 und y = 20. Damit könntest du die for-Schleife auch so schrei-
ben und damit die Figur um 10 Pixel nach rechts verschieben:
for (x, y) in shape:
moveTo(x + 10, y)
Die wichtigsten Punkte Bei jeder Liste gibt head(liste) das erste
Element zurück.
AUFGABEN
17. Verwende die Technik mit «for (x, y) in shape», um die Figur
zu skalieren und z. B. doppelt so gross zu zeichnen.
18.∗ Ein Tupel muss nicht aus Koordinaten bestehen, sondern kann be-
liebige Zahlen zusammenfassen, z. B. auch einen Winkel und eine Sei-
tenlänge. Nutze das aus, um eine Figur durch die Winkel und Seiten-
längen zu charakterisieren und dann mit for zu zeichnen.
Das Programm Wieviel Platz braucht ein Bild bzw. eine Grafik? Stell
dir vor, du möchtest einen Rahmen um deine Grafik zeichnen. Wie gross
muss der Rahmen sicher sein?
Im letzten Abschnitt hast du ein Bild aus Punkten gezeichnet. Das kann
eine beliebige Figur sein und dazu bestimmen wir in diesem Programm
die linke untere Ecke, die der kleinste Rahmen um die Figur haben
müsste (dieser Rahmen heisst auch «Bounding Box»).
1 def lowerLeft(shape):
2 minX, minY = head(shape)
3 for (x, y) in shape:
4 if x < minX:
5 minX = x
6 if y < minY:
7 minY = y
8 return (minX, minY)
9
10 haus = [(40, -40), (40, 40), (0, 80),
11 (-40, 40), (-40, -40)]
12 print lowerLeft(haus)
Bei diesem Haus ist die linke untere Ecke natürlich (−40, −40). Versu-
che andere Figuren aus und vergleiche die Ergebnisse dann.
AUFGABEN
20. Schreibe noch eine Funktion, die die linke obere Ecke der Figur
ermittelt.
22. Schreibe eine Funktion getWidth(shape), die die Breite der ge-
samten Figur ermittelt.
6 Einfache Zahlenlisten
Python hat für die einfachste Art von Listen eine Funktion parat, die dir
die Liste direkt erzeugt: range(n). Der Parameter n gibt die Anzahl der
Elemente an.
>>> range(7)
[0, 1, 2, 3, 4, 5, 6]
>>> range(12)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Die range-Liste beginnt immer mit 0 und hört bei n − 1 auf. Dass
range(12) von 0 bis 11 geht und nicht von 1 bis 12 führt leider im-
mer wieder zu Fehlern.
Die wichtigsten Punkte Die Funktion range(n) gibt dir direkt die
Liste mit den n Zahlen von 0 bis n − 1 zurück. Das ist in for-Schleifen
oft sehr hilfreich.
AUFGABEN
7 Elemente zählen
[0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0] → [3, 5, 1, 3, 5, 2, 3]
Gehen wir in Gedanken einmal die Liste [0, 0, 0, 1, 1, 0] durch. Weil wir
sowieso mit Null beginnen, zählen wir bei den ersten drei Nullen ein-
fach eins zur Variable laufLaenge dazu. Wenn wir zur ersten 1 kom-
men, dann sind letzteZahl und zahl nicht mehr gleich. Die Variable
laufLaenge enthält den Wert 3, den wir jetzt an die Resultat-Liste an-
fügen. Dann setzen wir laufLaenge auf Null, um wieder von vorne zu
beginnen.
AUFGABEN
28. Was für einen Unterschied macht es, wenn du in der Zeile 4 schreibst:
letzteZahl = head(binaryList)
29. Schreibe eine Funktion get(liste, index), die aus einer Liste
das n-te Element heraussucht und zurückgibt. Zum Beispiel würde dann
get([2, 3, 5, 7, 11], 4) den Wert 7 zurückgeben.
[4, 4, 4, 6, 3, 3, 3, 3, 3, 1, 1, 4] → [(4, 3), (6, 1), (3, 5), (1, 2), (4, 1)]
8 Sortieren
Für das Sortieren gibt es sehr gute und schnelle Algorithmen. In diesem
Abschnitt schauen wir uns allerdings einen etwas langsameren Algo-
rithmus an, der dafür gut verständlich ist.
Neben min gibt es noch andere Listenfunktionen. len gibt zum Beispiel
die Anzahl der Elemente in der Liste an. Damit hätten wir die Funktion
auch so programmieren können:
1 def sortList(liste):
2 result = []
3 repeat len(liste):
4 x = min(liste)
5 [Link](x)
6 [Link](x)
7 return result
AUFGABEN
34. Ändere die Funktion sortList so ab, dass die Liste absteigend sor-
tiert wird, d. h. mit dem grössten Element beginnt.
35. Verwende die eingebauten Funktionen und schreibe damit eine Funk-
tion average(liste) (vgl. p. 125), die den Durchschnitt einer Liste
berechnet und zurückgibt, ohne eine Schleife zu verwenden.
37. Schreibe eine Funktion rotate(liste), die das erste Element der
Liste wegnimmt und am Ende wieder anhängt. Aus [2, 4, 7, 3] wird
also [4, 7, 3, 2].
9 Listen in Listen*
9 makeTurtle()
10 speed(-1)
11 heading(90)
12 penUp()
13
14 y = 10
15 for line in picture:
16 setPos(-10, y)
17 for pixel in line:
18 setPenColor(makeColor(pixel))
19 dot(5)
20 forward(5)
21 y -= 5
22 hideTurtle()
Die Bilddaten, die wir hier in den Zeilen 2 bis 8 eingegeben haben,
kannst du auch direkt aus einer Bilddatei laden. Dazu gibt es die Funk-
tion loadImageData im Modul «tjaddons»:
from tjaddons import loadImageData
picture = loadImageData("[Link]")
AUFGABEN
39. Lade mit loadImageData wie oben beschrieben ein Bild aus einer
Grafikdatei und lass es von der Turtle zeichnen. Verwende ein Bild, das
nicht zu gross ist!
41. Du hast im Abschnitt 6.3 gesehen, wie du auch Grafiken bzw. Figu-
ren in einer Liste darstellen kannst. Entsprechend kannst du eine Folge
von Figuren als Liste von Listen darstellen. Verwende diese Technik, um
einen kurzen Text (z. B. deinen Namen) zu codieren und von der Turtle
zeichnen zu lassen.
10 Histogramme zeichnen
In den Zeilen 8 und 9 zeichnen wir über den eigentlichen Balken noch
einen weissen Balken bis ganz nach oben. Wenn du nämlich in den
Aufgaben nachher ein Histogramm mit einem neuen übermalst, dann
sollen die alten Balken entfernt werden.
AUFGABEN
42. Das Programm oben kann nur positive Zahlenwerte darstellen. Än-
dere das Programm so ab, dass es auch negative Zahlenwerte darstellen
kann. Die Balken gehen dann natürlich nach unten. Zeichne dazu auch
eine dünne horizontale Grundlinie.
Tipp: Der Grund, warum drawBar nur positive Zahlen darstellen kann,
liegt beim weissen Übermalen.
46.∗ Schreibe eine Programm, das den Wurf zweier Würfel simuliert
(verwende dazu randInt(), vgl. p. 72). Das Programm würfelt also
zehnmal mit zwei Würfeln und schreibt die geworfenen Zahlen nach-
einander in eine Liste wuerfe. Nach zehn Würfen wird die Liste aus-
gezählt: Wie viele Einsen, Zweien, Dreier etc. wurden geworfen? Das
ergibt eine neue Liste anzahlen, die genau sechs Elemente enthält.
[4, 6, 1, 1, 3, 1, 4, 4, 3, 2, 1, 6, 1, 3] → [5, 1, 3, 3, 0, 2]
11 Datenbanken*
Einführung Eine Liste kann weit mehr als nur Zahlen enthalten. In
diesem Abschnitt enthält unsere Liste eine kleine Datenbank.
Jeder Eintrag in der Liste ist ein Tupel mit genau den gleichen vier
Angaben. Natürlich kannst du genausogut eine Datenbank aufbauen,
in der jeder Eintrag nur zwei oder aber mehr als vier Angaben enthält.
Zum Beispiel könntest du die Datenbank in unserem Beispiel mit der
Bevölkerungszahl ergänzen.
Das Programm: Quiz Dieses dritte Programm ist ein kleines Quiz,
das dich nach den Hauptstädten der Länder fragt. Achte beim Einge-
ben der Antworten darauf, dass auch die Gross- und Kleinschreibung
stimmen muss.
1 for (land, stadt, flaeche, kontinent) in geoDatenbank:
2 frage = "Wie heisst die Hauptstadt von " + land + "?"
3 antwort = input(frage)
4 if antwort == stadt:
5 print "Richtig!"
6 else:
7 print "Falsch! Richtig wäre " + stadt + "."
AUFGABEN
50. Ergänze das Quiz so, dass es die Anzahl der richtigen Antworten
mitzählt und am Ende ausgibt.
51. Schreibe ein Programm, das die obige «geoDatenbank» nach der
Landesgrösse (Fläche) sortiert und dann die Länder so sortiert ausgibt,
angefangen bei der Schweiz bis hin zu Kanada.
ANIMATION
Die meisten Beispiele und Aufgaben sind hier mit einem «roten Ball»
geschrieben, den wir animieren und herumspringen lassen. Natürlich
kannst du aber jederzeit deine eigenen Figuren zeichnen und program-
mieren.
Besonders gegen Ende des Kapitels werden die Programme immer grös-
ser. Damit wirst du immer mehr selber programmieren und ausarbeiten
müssen. Achte dabei darauf, dass du deine Programme sauber struktu-
rierst und dokumentierst (aus Platzgründen mussten wir die Kommen-
tare oft weglassen).
1 Tastatursteuerung
Falls du die Codes weiterer Tasten wissen möchtest, dann füge nach
Zeile 11 ein print key ein. Damit wird dir bei jeder gedrückten Taste
der Code ausgegeben.
AUFGABEN
1. Ergänze das Programm oben so, dass du mit den Tasten «Y», «R»,
«B», «G» eine der Farben gelb, rot, blau oder grün auswählen kannst
(natürlich kannst du auch andere oder weitere Farben verwenden).
4.∗ Wenn du die Leertaste drückst, soll die Turtle in die gleiche Rich-
tung weitergehen wie im Schritt zuvor. Mit heading und forward ist es
sehr einfach, das einzuprogrammieren. Verwende aber getX(), getY()
und moveTo, um dieses Verhalten zu programmieren.
5.∗ Verwende den Zahlenblock rechts auf der Tastatur, um die Turtle
zu steuern, und zwar so, dass die Turtle auch schräg gehen kann. Achte
darauf, dass sie trotzdem im Gitter bleibt.
2 Ping Pong
Damit du die Animation siehst, darf sie aber auch nicht zu schnell sein.
Computer können im Prinzip das Bild mehrere Tausend Male pro Se-
kunde neu zeichnen. Das ist aber nicht sinnvoll. Deshalb verlangsamen
wir den Computer mit sleep(0.01) so, dass das Bild «nur» 100 Mal in
der Sekunde neu gezeichnet wird.
Das Programm In diesem Programm «rollt» ein roter Ball hin und
her. Links und rechts haben wir bei ±150 eine unsichtbare Wand ge-
setzt: Sobald der Ball dorthin kommt, kehren wir die Richtung um,
indem wir das Vorzeichen von speedX wechseln.
10 dot(21)
11
12 def update():
13 global posX, speedX
14 if posX >= 150:
15 speedX *= -1
16 if posX <= -150:
17 speedX *= -1
18 paintBall("white")
19 posX += speedX
20 paintBall("red")
21
22 makeTurtle()
23 hideTurtle()
24 repeat:
25 key = getKeyCode()
26 if key != 0:
27 break
28 update()
29 sleep(0.01)
30 dispose()
Die wichtigsten Punkte Das Kernstück jeder Animation ist eine Schlei-
fe, die unendlich lange wiederholt wird, in jedem Durchgang update()
aufruft, um alles zu bewegen und dann eine kurze Zeit wartet. Natür-
lich musst du den Befehl update() entsprechend definieren.
repeat:
update()
sleep(0.01)
AUFGABEN
6. Schreibe das Programm oben so um, dass sich der Ball nicht hori-
zontal sondern vertikal (nach oben und unten) bewegt.
7. Ergänze das Programm so, dass sich der Ball sowohl horizontal als
auch vertikal bewegt und in jeder Richtung (oben, unten, links, rechts)
eine unsichtbare Wand hat, an der er abprallt. Wähle als Anfangsrich-
tung z. B. speedX = 2 und speedY = 0.5.
8. Ergänze das Programm um eine globale Variable color mit der Far-
be des Balls und wechsle jedes Mal, wenn der Ball seine Richtung än-
dert die Farbe (verwende mehr als zwei Farben).
9. Schreibe ein Programm, in dem die Turtle die Rolle des Balls über-
nimmt und hin- und herläuft.
Ein Ball, der sich im Fenster bewegt hat zwei Variablen posX und posY
für seine aktuelle Position und zwei Variablen speedX und speedY für
seine Geschwindigkeit. Wenn du hier in jedem Schritt von speedY eins
abziehst, dann entsteht bereits der Eindruck von Schwerkraft, die den
Ball nach unten zieht:
def update():
global posX, posY, speedY
# Hier den Ball löschen
speedY -= 1
posX += speedX
posY += speedY
# Hier den Ball neu zeichnen
Der tatsächliche Wert bei speedY -= 1 hängt davon ab, wie stark die
Gravitation sein soll. Meistens nimmst du hier einen viel kleineren Wert,
z. B. speedY -= 0.1. Eine wichtige Rolle spielt hier auch der Wert in
sleep(0.01): Je schneller die Animation läuft, umso kleiner musst du
die Schwerkraft machen!
12 def update():
13 global posX, posY, speedY
14 paintBall("white")
15 speedY -= 0.05
16 posX += speedX
17 posY += speedY
18 paintBall("red")
19
20 makeTurtle()
21 hideTurtle()
22 repeat:
23 if posY < -300:
24 break
25 update()
26 sleep(0.01)
27 dispose()
Übrigens beenden wir hier das Programm nicht, wenn du eine Taste
drückst, sondern wenn der Ball aus dem Fenster fliegt (Zeilen 23/24).
AUFGABEN
10. Lass den Ball vom Boden abspringen wie ein elastischer Gummi-
ball. Die Technik dazu kennst du bereits: Sobald die y-Koordinate klei-
ner ist als −200 kehrst du die y-Richtung um (vgl. p. 148). Schau, dass
der Ball auch links und rechts abprallt und nicht aus dem Fenster fliegt.
Und natürlich musst du die Abbruchbedingung wieder so ändern, dass
das Programm aufhört, wenn du eine Taste drückst.
13.∗ Setze den Boden auf den genauen Wert von y = −200. Dabei tritt
folgendes Problem auf: Je nach Geschwindigkeit kann es sein, dass der
Ball von der y-Position −198 direkt zu −205 geht, ohne −200 selber
zu erreichen. Damit der Ball nicht durch den Boden fällt, setzst du in
diesem Fall natürlich einfach posY = -200. Aber: Wenn jetzt der Ball
wieder nach oben springt, dann ist seine nächste Position −193 – er
springt dann also höher als vorher und hat irgendwie mehr Energie
erhalten. Löse dieses Problem und sorge dafür, dass der Ball nie höher
springt als am Anfang!
Jeder Ball wird durch vier Werte repräsentiert: Zwei für die Position
und zwei für die Richtung und Geschwindigkeit. (30, 52, 1, -3)
steht für einen Ball an der Position (30, 52), der sich in Richtung (1, −3)
bewegt und daher als nächstes die Koordinaten (31, 49) haben wird.
Weil wir nicht einfach einzelne Werte in einer Liste verändern können,
sammeln wir alle bewegten Bälle zuerst in einer neuen Liste balls2
und ersetzen erst ganz am Schluss der Berechnungen die alte Liste
balls durch die neue Liste balls2 mit den neuen Koordinaten der
Bälle (Zeilen 18 bis 27). Im Befehl paintBalls brau-
chen wir die Angaben speedX
1 from gturtle import *
und speedY eigentlich nicht.
2 from time import sleep
In Zeile 11 müssen wir sie aber
3
trotzdem dazu nehmen, weil
4 # Format: (posX, posY, speedX, speedY) sie fest zu den Werten in der
5 balls = [(-50, 100, 1.5, -1), Liste gehören.
6 (80, -40, -2, 3)]
7
8 def paintBalls(color):
9 global balls
10 setPenColor(color)
11 for (posX, posY, speedX, speedY) in balls:
12 setPos(posX, posY)
13 dot(21)
14
15 def update():
16 global balls
17 paintBalls("white")
18 balls2 = []
19 for (posX, posY, speedX, speedY) in balls:
20 posX += speedX
21 posY += speedY
22 if posX < -250 or posX > 250:
23 speedX *= -1
24 if posY < -250 or posY > 250:
25 speedY *= -1
26 [Link]((posX, posY, speedX, speedY))
27 balls = balls2
28 paintBalls("red")
29
30 makeTurtle()
31 hideTurtle()
32 repeat:
33 if getKeyCode() != 0:
34 break
35 update()
36 sleep(0.01)
37 dispose()
AUFGABEN
14. Baue auch hier die Gravitation noch ein, so dass die Bälle nach
unten fallen und am Boden wieder hochspringen.
15. Zeichne zuerst eine Box, in der sich die Bälle bewegen und so dass
die Wände sichtbar sind, an denen die Bälle abprallen. Dazu musst du
aber auch sicherstellen, dass die Bälle nicht über die Wand hinausgehen
(z. B. mit if posX > 250: posX = 250). Beachte auch, dass die Bälle
selber eine Dicke haben und die Wand hier bei x = 260 sein müsste.
16. Schreibe das Programm so um, dass die Bälle links und rechts nicht
mehr an den Wänden anprallen. Wenn ein Ball rechts aus dem Bild
geht, soll er einfach von links her wieder hineinkommen.
17.∗ Im Programm oben besteht jeder Ball aus vier Werten für seine
Position und Geschwindigkeit. Ergänze die Liste mit einem fünften Wert
für die Ballfarbe und zeichne damit die Bälle in verschiedenen Farben.
Das ist eine grössere Änderung am Programm, weil du jetzt z. B. für
das Löschen (d. h. weiss übermalen) der Bälle einen eigenen Befehl
eraseBalls schreiben musst. Vergiss auch nicht, dass du die Farbe
auch in update() drin jeweils von der alten in die neue Liste über-
nehmen musst.
Das Bild auf der Seite zeigt eine typische Situation. In diesem Fall spie-
len die Plattformen A und B keine Rolle. A ist zu hoch (über dem Ball)
und B ist auf der Seite (neben dem Ball). Von den Plattformen C und
D, die direkt unter dem Ball sind ist C die höher gelegene und damit
die gesuchte.
Das Programm In diesem Programm lassen wir den Ball noch nicht
an den Plattformen abprallen, sondern zeichnen jeweils einen Schatten
unter dem Ball. Die zentrale Funktion hier ist getGroundLevel(x, y).
Sie berechnet für jeden Punkt, auf welcher Höhe die nächste Plattform
darunter liegt. Das Programm hier ist so um-
fangreich, dass wir einige Zei-
1 from gturtle import *
len kürzen mussten. Du weisst
2 from time import sleep
aber aus den vorhergehenden
3
Programm bereits, wie du den
4 # Ball: Position und Geschwindigkeit: Ball zeichnest, wie die Schleife
5 posX, posY = 0, 100 am Ende aussieht, etc.
6 speedX, speedY = 2, 1
7
8 # Plattformen im Format (left, right, height):
9 platforms = [(-210, -150, -100), (-40, 160, -20)]
10
11 # Den Boden und die Platformen zeichnen:
12 def drawGround():
13 setPenColor("chocolate")
14 setPenWidth(10)
15 setPos(-250, -270)
16 moveTo(250, -270)
17 for left, right, height in platforms:
18 setPos(left, height)
19 moveTo(right, height)
20
21 # Die Höhe des Bodens unter (x, y) angeben.
22 def getGroundLevel(x, y):
23 result = -270
24 for left, right, height in platforms:
25 if (left < x < right) and (height < y):
26 if height > result:
27 result = height
28 return result
29
30 def drawBall(color):
31 ...
32
33 def drawShadow(color):
34 y = getGroundLevel(posX, posY)
35 setPenColor(color)
36 setPos(posX-10, y)
37 moveTo(posX+10, y)
38
39 def update():
40 global posX, posY, speedX, speedY
41 drawBall("white")
42 drawShadow("chocolate")
43 posX += speedX
44 ...
45 drawBall("red")
46 drawShadow("brown")
47
48 makeTurtle()
49 hideTurtle()
50 drawGround()
51 repeat:
52 ...
Übrigens: Wenn der Ball gerade über dem «Rand» einer Plattform ist,
dann wird der Schatten etwas über die Plattform hinausgezeichnet und
die Plattformen verlängern sich dadurch ein wenig. Wir nehmen das
hier in Kauf, damit das Programm nicht zu kompliziert wird.
AUFGABEN
18. Schreibe das Programm so um, dass der rote Ball an den einzelnen
Plattformen abprallt, anstatt einen Schatten zu zeichnen.
Ein Objekt ist wie eine Variable, die selber wiederum Variablen enthält.
Objekte sind also Container, die andere Variablen enthalten, aber sel-
ber keinen festen Wert haben. Mit makeObject erzeugst du ein neues
Objekt und gibst dabei die Variablen an, die es enthalten soll:
roterBall = makeObject( posX = -50, posY = 100 )
Das Programm In den Zeilen 4 bis 7 definieren wir zwei Bälle als
Objekte. Jedes Objekt hat fünf Variablen für die Position, Geschwin-
digkeit und die Farbe. Das restliche Programm kennst du bereits von
früher: Wie bewegen die beiden Bälle über den Bildschirm. Neu ist viel-
leicht, dass wir in Zeile 12 das ganze Fenster löschen anstatt die Bälle
einzeln weiss zu übermalen.
1 from gturtle import *
2 from time import sleep
3
4 ball_1 = makeObject( posX = -50, posY = 100,
5 speedX = 1.5, speedY = -1,
6 color = makeColor("red") )
7 ball_2 = makeObject( posX = 50, posY = 120,
8 speedX = -1.2, speedY = -0.5,
9 color = makeColor("blue") )
10
11 def update():
12 clear()
13 ball_1.posX += ball_1.speedX
14 ball_1.posY += ball_1.speedY
15 setPos(ball_1.posX, ball_1.posY)
16 setPenColor(ball_1.color)
17 dot(21)
18 ball_2.posX += ball_2.speedX
19 ball_2.posY += ball_2.speedY
20 setPos(ball_2.posX, ball_2.posY)
21 setPenColor(ball_2.color)
22 dot(21)
23
24 makeTurtle()
25 hideTurtle()
26 repeat:
27 if getKeyCode() != 0:
28 break
29 update()
30 sleep(0.01)
31 dispose()
AUFGABEN
20. Füge den beiden Ball-Objekten eine sechste Variable radius hin-
zu, die die Grösse des Balls angibt und zeichne die Bälle dann auch
entsprechend.
21.∗ Ergänze update() so, dass sich die beiden Bälle gegenseitig an-
ziehen. Dazu berechnest du zuerst die Distanz in x- und y-Richtung
zwischen den beiden Bällen und änderst dann die Geschwindigkeit ent-
sprechend, z. B. so:
ball_1.speedX += distX / 100
ball_2.speedX -= distX / 100
AUFGABEN
24. Ändere das Programm so ab, dass die Bälle unterschiedliche Radien
haben. Zudem sollen sie liegen bleiben und sich nicht mehr bewegen,
wenn sie den unteren Bildschirmrand erreicht haben.
25. Ergänze das Programm so, dass auf Tastendruck neue Bälle erzeugt
werden, die ganz oben am Fenster beginnen, nach unten zu fallen. Je-
der Ball soll eine eigene zufällige Farbe und einen zufällig Radius ha-
ben.
Hier musst du mit einer Liste wie in der Aufgabe 7.23 arbeiten. Dann
kannst du neue Bälle mit append(makeObject(...)) hinzufügen.
26.∗ Baue das Programm schliesslich so aus, dass Bälle auch von den
Seitenwänden abprallen und die Gravitation sie nach unten zieht.
27.∗ Schreibe ein Programm mit mehreren Bällen, die sich beliebig be-
wegen. Berechne in jedem Schritt die Koordinaten des Schwerpunkts
und zeichne ihn mit einem Kreuz auf dem Bildschirm ein.
x1 + x2 + x3 + · · · + xn y1 + y2 + y3 + · · · + yn
sX = sY =
n n
8 Punkte fangen
Dazu nutzen wir aus, dass Farben im Computer aus den drei Kanälen
«Rot», «Grün» und «Blau» bestehen. Jeder Farbkanal hat einen Wert
zwischen 0.0 (dunkel) und 1.0 (hell). Wir setzen also am Anfang die
Farbe z. B. auf (1.0, 1.0, 0.0) für «Gelb» und ziehen dann immer
1
100 ab. Dadurch wird die Farbe immer dunkler, bis wir mit (0, 0, 0)
Schwarz haben.
In Zeile 8 ziehen wir vom Farbindex eins ab, damit die Farbe immer
dunkler wird. Wenn der Farbindex 0 erreicht hat, dann setzen wir ihn
zurück auf 100 % und wählen eine neue zufällige Position.
1 from gturtle import *
2 from time import sleep
3 from random import randint
4
5 ball_1 = makeObject(posX = 0, posY = 0, index = 100)
6
7 def updateBall(ball):
8 [Link] -= 1
9 if [Link] <= 0:
10 [Link] = 100
11 [Link] = randint(-300, 300)
12 [Link] = randint(-200, 200)
13 setPos([Link], [Link])
14 setPenColor(makeColor(0.0, [Link] / 100, 0.0))
15 dot(21)
16
17 def update():
18 updateBall(ball_1)
19
20 @onMouseClicked
21 def mouseClick(x, y):
22 print x, y
23
24 makeTurtle()
25 hideTurtle()
26 clear("black")
27 repeat:
28 update()
29 sleep(0.01)
AUFGABEN
29. Ergänze das Programm so, dass es mit drei Punkten arbeitet, die
verschiedene Farben haben.
Damit nicht alle drei Punkte gleichzeitig verblassen und neu gesetzt
werden setzst du den Index auf unterschiedliche Anfangswerte.
30.∗ Schreibe das Programm so um, dass es mit einem weissen Hinter-
grund funktioniert und die Punkte immer heller/weisser werden.
33.∗ Baue das Spiel mit dem Punkte-Fangen so aus, dass die Punkte zu
Beginn langsam sind und immer schneller werden. Dazu verwendest
du am besten eine neue Variable ball_1.speed.
Für das Programm zentral sind die Zeilen 12 bis 18. In Zeile 12 prüfen
wir, ob der Ball soweit nach unten gefallen ist, dass er jetzt auf der
Höhe des Schlägers oder darunter ist (der Schläger hat eine Breite von
6 Pixeln und der Ball einen Radius von 5 Pixeln; daher berührt der
Ball den Schläger bereits, wenn der Mittelpunkt des Balls bei −142 ist).
In der Zeile 13 testen wir, ob der Ball genau über dem Schläger (mit
Länge 40) liegt und damit wieder nach oben abprallt. Wenn nicht, dann
beenden wir das Programm in Zeile 18 mit dem exit.
1 from gturtle import *
2 from time import sleep
3 from sys import exit
4
5 shuttle_X = 0
6 ball = makeObject( posX = -50, posY = 200,
7 speedX = 0.5, speedY = -1.2 )
8
9 def updateBall():
10 [Link] += [Link]
11 [Link] += [Link]
12 if [Link] <= -142:
13 if shuttle_X - 20 <= [Link] <= shuttle_X + 20:
14 [Link] = -142
15 [Link] *= -1
16 else:
17 msgDlg("Ball verloren!")
18 exit()
19 setPos([Link], [Link])
20 dot(10)
21
22 def paintShuttle():
23 heading(90)
24 setPenWidth(6)
25 setPos(shuttle_X - 20, -150)
26 forward(40)
27
28 def update():
29 clear()
30 updateBall()
31 paintShuttle()
32
33 @onMouseMoved
34 def mouseMoved(x, y):
35 global shuttle_X
36 shuttle_X = x
37
38 makeTurtle()
39 hideTurtle()
40 repeat:
41 update()
42 sleep(0.01)
43 dispose()
AUFGABEN
34. Baue das Programm so aus, dass es bei einem Tastendruck been-
det wird und der Ball an den Seitenwänden und der Decke ebenfalls
abprallt. So kannst du länger spielen und denn Ball mit dem Schläger
mehrmals auffangen. Gib dem Ball und dem Schläger auch andere Far-
ben. Mit clear("black") (Zeile 29) kannst du auch die Hintergrund-
farbe ändern.
35. Ändere das Programm so ab, dass der Schläger nicht unten, son-
dern auf der rechten Seite ist und sich mit der Maus nach oben und
unten bewegt.
36. Schreibe das Programm so um, dass du den Schläger nicht mit der
Maus, sondern mit der Tastatur (Pfeiltasten) bewegst.
Füge dann einen zweiten Schläger hinzu, der sich z. B. mit den Tasten
«X» und «E» nach oben und unten bewegen lässt. Dann kannst du mit
einer Kollegin oder einem Kollegen zusammen Ping-Pong spielen.
37.∗ Füge zum Ball eine Gravitationskraft hinzu wie im Abschnitt 7.3.
38.∗ Spiele mit mehreren Bällen, wovon keiner nach unten fallen darf.
10 Steine entfernen*
Die Steine sind hier alle rechteckig, haben eine Höhe von 10 Pixeln und
drei Koordinaten: Den linken und den rechten Rand sowie die Höhe der
Mitte. Als Objekt sieht ein solcher Stein also z. B. so aus:
Beim Prüfen, ob der Ball den
brick_1 = makeObject(left=-75, right=-42, height=120)
Stein berührt müssen wir den
Für unser Programm müssen wir prüfen, ob ein Ball mit den Koordina- Radius des Balls mit berück-
sichtigen.
ten posX und posY und einem Radius von 4 Pixeln diesen Stein gerade
berührt. Dazu müssen wir bei der x-Richtung den Radius des Balls und
bei der y-Richtung auch noch die Dicke des Steins berücksichtigen: Vergiss nicht, am Ende der
ersten Zeile einen Backslash
if (brick_1.left-4 <= posX <= brick_1.right+4) and \
«\» zu schreiben, damit Py-
(brick_1.height-9 <= posY <= brick_1.height+9):
thon weiss, dass das if auf
print "Stein berührt!" der nächsten Zeile noch weiter-
geht.
Das Kernstück ist dann in Zeilen 22 bis 26. Dort gehen wir alle Stei-
ne durch und prüfen, ob unser Ball gerade einen Stein berührt. Wenn
ja, dann wird dieser Stein aus der Liste entfernt und wir brechen die
Kollisionsprüfung ab (unser Ball kann nur einen Stein auf einmal be-
rühren/entfernen).
1 from gturtle import *
2 from time import sleep
3
4 ball = makeObject( posX = -50, posY = 200,
5 speedX = 1, speedY = -2.5 )
6 bricks = []
7 for i in range(-5, 6):
8 for j in range(1, 5):
AUFGABEN
Tatsächlich sind der Sinus und der Cosinus wie geschaffen für diese
Aufgabe. In Bezug auf das Kreiszentrum sind die x- und y-Koordinaten
des Balls auf dem Kreis (vgl. Abbildung nebenan):
x = r · cos(α) y = r · sin(α)
16 def update():
17 global angle
18 paintBall("white")
19 angle += angleSpeed
20 paintBall("red")
21
22 makeTurtle()
23 hideTurtle()
24 setPos(centerX, centerY)
25 dot(10)
26 repeat:
27 if getKeyCode() != 0:
28 break
29 update()
30 sleep(0.01)
31 dispose()
AUFGABEN
40. Programmiere eine Simulation von Erde, Mond und Sonne aus der
«Astronautenperspektive». Die Erde kreist um die Sonne in der Bildmit-
te und der Mond kreist um die Erde. Beachte dabei auch, dass sich der
Mond etwa zwölf Mal so schnell um die Erde dreht wie die Erde um die
Sonne.
12 Figuren drehen*
Wenn das Zentrum der Drehung nicht im Ursprung (0, 0) liegt, dann
nimmst du nicht direkt die Koordinaten (xP , yP ) des Punkts, sondern
die Differenz zum Zentrum (xZ , yZ ):
yP − yZ p
ϕ = arctan r = (xP − xZ )2 + (yP − yZ )2
xP − xZ
Das Programm Für die beiden Polygone (ein Dreieck und ein Qua-
drat) brauchen wir drei Funktionen. drawPolygon zeichnet ein Poly-
gon mit der angegebenen Farbe, getCenter berechnet den Mittelpunkt
(Schwerpunkt) des Polygons und turnPolygon dreht alle Punkte des
Polygons um dessen Mittelpunkt.
1 from gturtle import *
2 from math import *
3 from time import sleep
4
5 polygon1 = [(-100, -20), (-140, -20), (-120, 20)]
6 polygon2 = [(100, -20), (140, -20), (140, 20), (100, 20)]
7
8 def drawPolygon(polygon, color):
9 setPenColor(color)
10 setPos(head(polygon))
11 for x, y in polygon:
12 moveTo(x, y)
13 moveTo(head(polygon))
14
15 def getCenter(polygon):
16 cX, cY = 0, 0
17 for x, y in polygon:
18 cX += x
19 cY += y
20 return (cX / len(polygon), cY / len(polygon))
21
22 def turnPolygon(polygon, angleSpeed):
23 cX, cY = getCenter(polygon)
24 result = []
25 for x, y in polygon:
26 radius = sqrt((x - cX)**2 + (y - cY)**2)
27 angle = atan2(y - cY, x - cX)
28 angle += radians(angleSpeed)
29 [Link]((cX + radius * cos(angle),
30 cY + radius * sin(angle)))
31 return result
32
33 def update():
34 global polygon1, polygon2
35 clear()
36 polygon1 = turnPolygon(polygon1, -2)
37 polygon2 = turnPolygon(polygon2, 4)
38 drawPolygon(polygon1, "blue")
39 drawPolygon(polygon2, "red")
40
41 makeTurtle()
42 hideTurtle()
43 repeat:
44 update()
45 sleep(0.05)
46 dispose()
AUFGABEN
44. Programmiere einen Pfeil, der immer in die Richtung der Maus
zeigt. Dazu verwendest du das @onMouseMoved von Seite 163.
Quiz
16. Ein Animations-Programm enthält den folgenden Code, um
einen Ball über den Bildschirm zu bewegen.
repeat:
posX += 20
paint() # Alles zeichnen
sleep(0.02)
Wie kann die Geschwindigkeit des Ball verdoppelt werden?
2 a. posX += 40
2 b. sleep(0.04)
2 c. posX += 40 und sleep(0.04)
2 d. sleep(0.01)
17. Welchen Effekt haben die beiden Codezeilen für einen Ball, der
mit speedX und speedY bewegt wird?
speedX *= -1
speedY = -speedY
STRINGS
Ein wichtiges Ziel ist aber auch die Kryptographie – die Ver- und Ent-
schlüsselung von Texten. So kannst du einen Text relativ einfach ver-
schlüsseln, wenn du alle Buchstaben veränderst. Das Zählen von Buch-
staben hingegen hilft dir, einen verschlüsselten Text zu knacken.
1 Bruchterme ausgeben
Eine kurze Quizfrage: Was ist der Unterschied zwischen str(18 + 19)
einerseits und str(18) + str(19) andererseits? Was ist das Resultat
dieser beiden Ausdrücke?
AUFGABEN
4.∗ Eine etwas schwierigere Aufgabe: Schreibe ein Programm, das ei-
ne vollständige Addition mit Brüchen ausgibt, z. B. 21 + 56 = 43 . Hier
gibt man dem Programm die beiden ersten Brüche 12 und 56 vor (na-
türlich als die vier Zahlen 1, 2, 5, 6). Dein Programm berechnet dann
selbständig das Resultat und gibt die ganze Rechnung aus wie im Bei-
spielprogramm (das Resultat muss nicht gekürzt sein).
Einführung Aus der Sicht von Python sind Strings einfach Listen
von Buchstaben und Zeichen. Deshalb kannst du die for-Schleifen auch
mit Strings verwenden und damit jedes Zeichen in einem String einzeln
durchgehen: Der englische Begriff für ein
Zeichen (Buchstaben, Satzzei-
for zeichen in "Ein Beispiel":
chen etc.) ist «character». Du
print zeichen
wirst daher oft auch auf die
Bezeichnung «char» für ein
Das ist aber nicht immer, was du auch wirklich möchtest. Oft unter-
einzelnes Zeichen stossen.
teilen wir Texte ja nicht in Buchstaben, sondern in Wörter. Auch das
beherrscht Python:
wortliste = "Ein Beispiel".split()
for wort in wortliste:
print wort
AUFGABEN
7. Schreibe ein Programm, das zwischen alle Zeichen einen Punkt setzt
und aus «Kamel» ein «K.a.m.e.l» macht. Achte darauf, dass es nicht ganz
am Anfang oder am Ende einen überflüssigen Punkt hat.
9. Schreibe eine Funktion countE, die alle «e» in einem String zählt
und diese Anzahl zurückgibt.
10.∗ Eine kleine Herausforderung: Schreibe ein Programm, das die Kom-
bination «en» zählt.
11. Schreibe ein Programm, bei dem du eine ganze Summe als String
eingeben kannst, z. B. «12+3+5+39». Dein Programm rechnet dann
diese Summe aus und gibt das Resultat aus. Verwende dazu split.
Hinweis: Zur Funktion str gibt es auch die Umkehrungen int und
float, die einen String in eine Zahl umwandeln: int("123")→123.
12.∗ Baue das Summenprogramm so aus, dass es auch mit Minus um-
gehen kann, z. B. «3 + 4 − 6». Tipp: Ersetze zuerst alle Minuszeichen
durch die Kombination «+-».
Das Alphabet der Computer ist historisch gewachsen (dazu später mehr).
Ursprünglich gab es nur Grossbuchstaben. Die Kleinbuchstaben kamen
erst später dazu und die Umlaute noch viel später. Daher erklärt sich,
dass die Computer beim Alphabet folgende Reihenfolge haben:
A < B < . . . < Z < a < b < . . . < z < Ä < Ö < Ü < ä < ö < ü
Die Idee, einen String Zeichen für Zeichen durchzugehen und so das
Resultat zusammenzusetzen hast du bereits einige Male gesehen. Neu
hinzu kommt eine zweite Variable lastChar, die immer den Wert des
vorhergehenden Zeichens hat. Damit können wir nämlich alle Buchsta-
ben gross schreiben, die gleich nach einem Leerzeichen kommen.
1 def titleCase(text):
2 result = ""
3 lastChar = " "
4 for char in text:
5 if lastChar == " ":
6 result += [Link]()
7 else:
8 result += [Link]()
9 lastChar = char
10 return result
11
12 print titleCase("jedes WORT gross!")
AUFGABEN
14. Schreibe eine Funktion, die zählt, wie viele Grossbuchstaben in ei-
nem Text vorkommen.
16. Ein häufiger Tippfehler ist, dass in einem Wort nicht nur der erste,
sondern die ersten zwei Buchstaben gross geschrieben sind (z. B. «KA-
mel»). Schreibe eine Funktion, die einen String auf solche doppelten
Grossbuchstaben hin überprüft und True zurückgibt, wenn der String
tatsächlich zwei Grossbuchstaben zusammen enthält.
17.∗ Nicht immer sind zwei Grossbuchstaben auch wirklich ein Fehler.
Es gibt auch Wörter, die ganz bewusst nur aus Grossbuchstaben beste-
hen, etwa «EU» oder «USA». Berücksichtige diese Fälle in deiner Funk-
tion, indem du zwei Grossbuchstaben nur dann als Fehler anschaust,
wenn danach noch ein Kleinbuchstabe kommt bzw. wenn nicht das gan-
ze Wort aus Grossbuchstaben besteht.
Weil aber «A» eigentlich den Code 65 hat und nicht 1, «B» den Code
66 anstatt 2, etc. müssen wir in Zeile 9 immer noch 64 zu unseren
eigenen Zahlen dazurechnen, bevor wir mit chr das eigentliche Zeichen
bestimmen.
1 msgList = [16, 25, 20, 8, 15, 14, 0,
2 9, 19, 0, 6, 21, 14]
3
4 message = ""
5 for code in msgList:
6 if code == 0:
7 message += " "
8 else:
9 message += chr(code + 64)
10 print message
AUFGABEN
19. Baue dein Programm so aus, dass du auch Texte mit Kleinbuchsta-
ben und Umlauten codieren kannst. Dazu soll dein Programm den Text
allerdings in Grossbuchstaben umwandeln und alle Umlaute nach dem
Schema ersetzen: «Ä»→«AE».
Quiz
18. Welche dieser Ausdrücke geben das Ergebnis "15" zurück?
2 a. str(3 * 5)
2 b. str(3) * str(5)
2 c. str(3) * 5
2 d. str(1) + str(5)
LÖSUNGEN
1. d 7. b 13. c, d
2. b, c 8. a 14. d
3. b 9. a 15. a
4. a 10. c 16. a, d
5. c 11. b 17. c
6. d 12. b, c 18. a, d
1 Kapiteltest 2
7. def handshake(n):
h = n * (n-1) // 2
return h
x = -r
setPos(mx-r, my)
# Oberen Kreisbogen zeichnen:
repeat 2*r:
x += 1
y = f(x)
moveTo(mx + x, my + y)
# Unteren Kreisbogen zeichnen:
repeat 2*r:
x -= 1
y = -f(x)
moveTo(mx + x, my + y)
def f(x):
return -x**2/200
makeTurtle()
setPenColor("black")
# Das gerade Stück zeichnen:
setPos(-125, 10)
moveTo(125, 10)
# Den Bogen zeichnen:
x = -120
setPos(x, f(x))
repeat 241:
moveTo(x, f(x))
x += 1
# Die vertikalen Verstrebungen zeichnen:
x = -120
repeat 13:
setPos(x, 10)
moveTo(x, f(x))
x += 20
12. zaehler = 0
def nextInt():
global zaehler
zaehler += 1
return zaehler
Distanz, 99 fill, 18
dividieren, 26 fillOff, 36
Division fillToPoint, 36, 129
ganzzahlige, 44 filtern, 142
Division durch Null, 104 Fläche, 18, 129
Divisionsrest, 44 Flächen, 36
dot, 36, 52, 71, 73 float, 40, 175
Drehung, 168 foo, 65
Dreieck for, 124, 132, 138, 174
rechtwinkliges, 26 forward, 10
Durchschnitt, 125 Funktion, 96, 98, 100
Graph, 102, 104
Effizienz, 110 trigonometrische, 166
Eingabe, 42, 58
Einrückung, 14 Gänsefüsschen, 46
Einzelschritt, 31 getKeyCode, 148
Element, 122 getKeyCodeWait, 146
erstes, 128 getPixelColorStr, 84
grösstes, 130 getX, 76
kleinstes, 130 getY, 76
elif, 84, 100 ggT, 117
else, 56, 68, 84, 100 Gleichung
Endlos-Schleife, 106 quadratische, 63
Erde, 167 global, 82
Euklid, 117 Grad, 105
exit, 92 Gradmass, 166
Graph, 102, 104
Exponent, 40
grau, 52
füllen, 18, 36, 129 Graustufen, 52, 127
Fallunterscheidung, 54, 56 Gravitation, 150
falsch, 108, 112 Gross-/Kleinschreibung, 176
False, 108, 112 gturtle, 10
Farbe, 12, 18, 70, 73
Haus
Regenbogen, 77
Nikolaus, 11
Regenbogen-, 97
head, 128, 136
Spektrum, 77 heading, 75
Farben Heron, 114
Graustufen, 52 hideTurtle, 72
Regenbogen-, 52 Histogramm, 140
Farbnamen, 12
Farbstift, 12 if, 54, 56, 68, 84, 100
Farbverlauf, 70, 79 import, 10
Feder, 166 in, 122, 124
Fehler, 32 input, 42, 58
fehlerfrei, 62 inputFloat, 42, 58
Fermat, 113 inputInt, 42, 58
Fibonacci, 116 inputString, 58
Wörter, 174
Würfel, 73
wahr, 108, 112
warten, 148
Werte
boolsche, 108
undefinierte, 104
Wiederholung, 20, 52, 78
Winkel, 24, 166
Winkelmass, 166
wissenschaftliche Schreibweise, 40
Wurzel, 48, 54, 106, 114
Zahlen
Fermat-, 113
ganze, 40
gebrochene, 40
perfekte, 109
wissenschaftliche, 40
zufällige, 72