Verzweigung
Sie sind bereits vertraut mit der while
-Schleife: Sie wiederholt ihren Körper so lange, bis die gegebene Bedingung nicht mehr zutrifft. Hier nochmal ein Beispiel dazu:
from random import *
n = randint(0, 10)
counter = 0
summe = 0
while counter <= n:
summe = summe + counter
counter = counter + 1
print('Summe der Zahlen von 0 bis und mit ' + str(n) + ': ' + str(summe))
Hier berechnen wir mal wieder die Summer aller Zahlen von 0 bis und mit n
, wobei wir n
zufällig generieren lassen. Die Zeilen 8 und 9 werden dabei so lange wiederholt, bis die Bedingung counter <= n
nicht mehr gilt.
Wenn...
Nun wollen wir stattdessen mal ein einfaches Würfelspiel programmieren. Die Regeln sind simpel: Man wirft einen normalen Würfel. Wenn man weniger als eine 4 würfelt, soll der Text Du hast gewonnen!
ausgegeben werden.
Fangen wir mit dem an, was wir bereits kennen:
from random import *
wurf = randint(1, 6)
print('Gewürfelt: ' + str(wurf))
Damit wir beim Ausführen etwas sehen, geben wir die "gewürfelte" Zahl aus.
Es liegt nun auf der Hand, das wir irgendwie eine Bedingung der Form wurf < 4
brauchen. So etwas hier würde aber nicht funktionieren:
from random import *
wurf = randint(1, 6)
print('Gewürfelt: ' + str(wurf))
while wurf < 4:
print('Du hast gewonnen!')
Mit einem while
wird der Körper (also das print('Du hast gewonnen!')
) ja so lange wiederholt, wie die Bedingung wurf < 4
gültig ist. Wenn wir nun also eine 4, 5 oder 6 würfen, dann ist diese Bedingung nie gültig – der Text Du hast gewonnen!
wird also korrekterweise nie ausgegeben. Wenn wir aber eine 1, 2 oder 3 würfeln, dann ist diese Bedingung für immer gültig – wir hätten damit eine Endlosschleife.
Wir brachen also ein neues Konstrukt, bei dem der Körper entweder 0x oder 1x ausgeführt wird: Wenn die Bedingung zutrifft, soll er (genau 1x) ausgeführt werden. Trifft sie nicht zu, soll er nicht (also 0x) ausgeführt werden. Das Stichwort hier lautet if
.
Die gute Nachricht: Wir können unseren vorherigen Versuch einfach kopieren und auf Zeile 5 das Wort while
mit if
ersetzen:
from random import *
wurf = randint(1, 6)
print('Gewürfelt: ' + str(wurf))
if wurf < 4:
print('Du hast gewonnen!')
- while
- Schleife (Wiederholung)
- Körper wird null- bis unendlich-mal wiederholt
- if
- Verzweigung (bedingte Ausführung)
- Körper wird entweder null- oder einmal ausgeführt
Sonst...
Damit haben wir den wenn-Fall unseres Spiels abgedeckt: Wenn wurf < 4
, dann soll der Text Du hast gewonnen!
ausgegeben werden. Schön wäre es nun, wenn das Programm auch noch den sonst-Fall abdecken würde: Sonst soll der Text Du hast verloren...
ausgegeben werden. Dazu brauchen wir lediglich das Wort else
:
from random import *
wurf = randint(1, 6)
print('Gewürfelt: ' + str(wurf))
if wurf < 4:
print('Du hast gewonnen!')
else:
print('Du hast verloren...')
- Das
if
...- ...darf mit oder ohne
else
verwendet werden, je nachdem, was mit dem Programm erreicht werden soll. - ...trägt eine Bedingung (z.B.
wurf < 4
).
- ...darf mit oder ohne
- Das
else
...- ...darf nie ohne
if
verwendet werden. Es ist immer der "Gegenpol" zu einemif
. - ...trägt keine Bedingung.
- ...darf nie ohne
Übungen
In dieser Tabelle finden Sie die wichtigsten Vergleichsoperatoren zum Ausdrücken von Bedingungen.
Operator | Bedeutung |
---|---|
< | kleiner als |
<= | kleiner oder gleich |
> | grösser als |
>= | grösser oder gleich |
== | gleich |
!= | nicht gleich (ungleich) |
Merke: Die ersten vier Operatoren werden vor allem zum Vergleich zweier Zahlen (Integer, Float) verwendet. Die Operatoren =
und !=
können für alle Datentypen verwendet werden.
Entwickeln Sie eine leicht veränderte Version des obigen Würfelspiels: Diesmal gewinnt man, wenn man genau eine 5 würfelt.
Ein solches Programm haben Sie auch bereits entwickelt: Es zeichnet ein beliebiges n-Eck mit einer Benutzereingabe für die Anzahl Ecken.
Verändern Sie das Programm nun folgendermassen: Wird ein n-Eck mit höchstens 5 Ecken gezeichnet, soll es mit einem roten Stift gezeichnet werden. Bei mehr als 5 Ecken soll die Stiftfarbe grün gewählt werden.
from turtle import *
n = int(input('Anzahl Ecken eingeben: '))
for i in range(n):
forward(100)
right(360 / n)
done()
Gleiche Ausgangslage, andere Idee: Jetzt soll die Farbe nicht mehr anhand der Anzahl Ecken definiert werden. Stattdessen wird sie für jeden Strich zufällig festgelegt.
Erzeugen Sie für jeden Strich (also für jede Seite des n-Ecks) eine Zufallszahl, mit der Sie dann entscheiden, ob Sie die Stiftfarbe auf rot setzen (z.B. wenn die Zufallszahl 0 ist) oder auf grün (z.B. wenn die Zufallszahl 1 ist).
from turtle import *
n = int(input('Anzahl Ecken eingeben: '))
for i in range(n):
forward(100)
right(360 / n)
done()
Und jetzt nochmal ein wenig anders: Das Programm hat nämlich ein Problem. Ein Achteck hat gerade noch so Platz im Turtle-Feld, aber ab einem Neuneck wird ein Teil der Form ausserhalb des Feldes gezeichnet.
Passen Sie das Programm deshalb wie folgt an: Wenn n
höchstens 8 ist, dann soll mit einer Seitenlänge von 100 gezeichnet werden (so wie das aktuell bereits der Fall ist). Falls n
aber grösser als 8 ist, dann soll nur noch mit einer Seitenlänge von 50 gezeichnet werden.
from turtle import *
n = int(input('Anzahl Ecken eingeben: '))
for i in range(n):
forward(100)
right(360 / n)
done()