Lernziele heute
- Steuerung der Turtle per Tastatur
- mit anderen Worten: Wir schreiben ein Zeichen- oder Mal-Programm!
- “Bedingte Ausführung”. Was ist
if
-else
-Selektion?
if-Selektion (Auswahl, Selektion, if-then-else-Struktur, Verzweigung)
Oft muss man sich im Leben entscheiden (Welcher Weg bei Wanderung, welche Schule, welcher Beruf).
Motivation durch Pseudo-Code zwei Flussdiagramme:
- “Wenn die Sonne scheint, dann nimm den Sonnenhut. Geh raus.” Beispiel für
if
-Selektion. - “Wenn die Sonne scheint, dann nimm den Sonnenhut, sonst nimm den Regenschirm. Geh raus.”. Beispiel für
if
-else
-Selektion.
Aufgabe 1 (Verstehen der if-Selektion durch Ausführen eines Beispielprogramms im Einzelschrittmodus)
Gemeinsam mit kurzen Einzelarbeitsphasen, ca. 3 + 3 + 5 + 4 Minuten (mit Zwischenbesprechung), Teilaufgaben bitte genau lesen!
Das folgende Programm illustriert die zwei häufigsten Verwendungen der if-(-else)
-Selektion.
- Kopiere das Programm in deine Tigerjython-IDE und bringe es mit möglichst wenig Änderungen zum Funktionieren.
- Führe das Programm aus (eventuell im Debugging-Modus) und verstehe es auf diese Weise! Test etwa, was bei den fünf Eingaben 15, 130, 0, -23 und 2022 passiert.
- Ändere das Programm so, dass bei einer Altersangabe $<0$ oder $\geq 130$ nur
“Das glaube ich dir nicht.”
ausgegeben wird, aber nicht mehr“Du bist kein Baby.”
. Vielleicht ist es hilfreich, die Info-Boxen unten zu lesen. - Zeichne Flussdiagramme zum ursprünglichen und zum veränderten Programm. (Das Symbol für eine Selektion ist ein auf einer Ecke stehendes Quadrat.)
alter = input("Gib dein Alter ein!") # Erste Verwendung: if alter < 0 or alter >= 130 print("Das glaube ich dir nicht.") # Zweite Verwendung: if alter == 0: print("Du bist ein Baby.") else print("Du bist kein Baby.")
if
-Selektion: Der eingerückte Code-Block (der auch aus mehreren Zeilen bestehen kann) nach der if
-Zeile wird ausgeführt, falls die Bedingung zwischen if
und :
wahr ist (wenn man die aktuellen Werte der Variablen einsetzt). Wer mag, kann den Doppelpunkt :
als then
lesen: “Wenn … dann …”
if
-else
-Selektion: Der eingerückte Code-Block nach der if
-Zeile wird ausgeführt, falls die angegebene Bedingung wahr ist, sonst wird der eingerückte Code-Block nach der Zeile else:
ausgeführt. Diese gesamte Struktur bedeutet also: “Wenn … dann … sonst …”
Einrückungen und Doppelpunkte sind wichtig! Wie bei repeat
sind sie eine beliebte Fehlerquelle!
Im obigen Programm tauchen einige Vergleiche von Zahlen auf. Hier die wichtigsten Vergleichsmöglichkeiten:
==
für mathematisches “gleich” $=$. Achtung: Das einfache Gleichheitszeichen=
wird für die Zuweisung bei Variablen verwendet.!=
für “ungleich” $\not=$.<
für “echt kleiner” $>$.>
für “echt grösser” $>$.<=
für “kleiner-gleich” $\leq$ (also kleiner oder gleich).>=
für “grösser-gleich” $\geq$.
Aufgabe 2 (zufällige Bewegung der Schildkröte - Brownsche Bewegung, Bewegung kleiner Teilchen in Flüssigkeiten oder Gasen)
Einzelarbeit, ca. 15 Minuten.
Mit from random import *
am Programmanfang liefert der Befehl random()
Zufallszahlen zwischen 0 und 1 (alle Zahlen kommen “gleich oft” vor). Teste dies mit dem folgenden Code.
from random import * repeat 10: z = random() print(z)
Erweitere den folgenden Programmcode so, dass die Schildkröte zufällig durch die Gegend läuft: Sie soll n
Mal um s = 10
Pixel nach vorne laufen und nach jeder Vorwärtsbewegung entweder um $90^\circ$ nach links oder nach rechts abbiegen, jeweils mit Wahrscheinlichkeit $50 \%$.
from gturtle import * from random import * makeTurtle() speed(-1) # Das ist die schnellstmögliche Geschwindigkeit (abgesehen von hideTurtle()) s = 10 n = input("Wie oft soll sich die Schildkröte bewegen?") # Hier deinen Code ergänzen!
Hinweise:
- Wer will, kann zuerst ein Flussdiagramm entwerfen (im Kopf oder auf Papier).
- Verwende eine
repeat
-Schleife und eineif
-else
-Selektion.
(Mini-)Aufgabe 3 (Befehl ''getKeyWait()'' und ''elif''-Syntax verstehen)
“Gemeinsam im Gespräch”, ca. 5 Minuten.
- Wer versteht, was das linke Programm tut? Bitte ausprobieren!
- Was ist der Unterschied zwischen
getKeyWait()
undinput(“…”)
? - Ich erkläre rechtes Programm (
elif
=else
+if
; rechtes ist kurze Version des linken). - Bonusfrage: Geht dasselbe auch nur mit
if
?
from gturtle import * # Die ersten beiden Zeilen dienen nur dazu, dass der Befehl getKeyWait() bekannt ist. makeTurtle() # Ohne sie funktioniert das Programm leider nicht. taste = getKeyWait() print(taste) if taste == "a": print("a wie Anna") else: if taste == "b": print("b wie Berta") else: if taste == "c": print("c wie Caesar") else: if taste == "d": print("d wie Daniel") else: if taste == "e": print("E wie Emil") else: print("Du hast keine der Tasten a, b, c, d, e gedrückt.") dispose() # Schliesst das Turtle-Fenster.
from gturtle import * makeTurtle() taste = getKeyWait() print(taste) if taste == "a": print("a wie Anna") elif taste == "b": print("b wie Berta") elif taste == "c": print("c wie Caesar") elif taste == "d": print("d wie Daniel") elif taste == "e": print("E wie Emil") else: print("Du hast keine der Tasten a, b, c, d, e gedrückt.") dispose()
Aufgabe 4 (Zeichenprogramm / ferngesteuerte Turtle)
Einzelarbeit, ca. 15 Minuten.
Das folgende Programm nimmt so lange ein Einzelzeichen entgegen, bis die Taste “e” (für Exit oder Escape) gedrückt wird. Probiere es aus! Gerne auch im Debugging-Modus.
from gturtle import * makeTurtle("black") taste = " " # oder irgendetwas anderes ungleich "e" # Die folgende sogenannte "while"-Schleife funktioniert # ähnlich wie eine repeat-Schleife: Der # eingerückte Code-Block wird solange wiederholt # ausgeführt, wie die angegebene Bedingung gilt. # englisch WHILE = deutsch SOLANGE while taste != "e": taste = getKeyWait() # Hier ist dein Code zu ergänzen! dispose()
Erweitere diesen Code zu einem Zeichenprogramm mit den Tasten i, j, k, l als “Pfeil”-Tasten!
Die Schildkröte soll
- beim Tastendruck
i
10 Pixel vorwärts laufen; - beim Tastendruck
k
10 Pixel rückwärts laufen; - beim Tastendruck
j
sich um $60^\circ$ nach links drehen; - beim Tastendruck
l
sich um $60^\circ$ nach rechts drehen. - Taste
e
bricht das Programm ab. - Bei jeder anderen Eingabe soll der Befehl
print(“Taste ohne Funktion.”)
ausgeführt werden.
Die erwünschte Lösung verwendet die obige “elegante” if
-elif
-…-elif
-else
-Variante der Selektion.
Aufgabe 5 (Quiz)
Einzelarbeit, ca. 15 Minuten
Beachte die Hinweise unten und schreibe ein Programm, das dem Benutzer die folgenden oder mindestens drei Quizfragen deiner Wahl stellt:
- Wie viele Kantone hat die Schweiz? (richtige Antwort 26)
- Wie viele Einwohner hat die Schweiz ungefähr in Millionen? (akzeptiere 8 und 9 als richtige Antwort)
- In welcher Stadt sitzt die Schweizer Regierung? (Bern)
Der Benutzer soll jeweils erfahren, ob die Antwort gestimmt hat; wenn nicht, soll die richtige Antwort genannt werden.
Am Ende soll als Auswertung die Anzahl richtiger Antworten ausgegeben werden.
Hinweise:
- Verwende zur Abfrage jeweils den Befehl
s = input(“Hier steht die Frage”)
- dann musst du nicht unterscheiden, ob die Eingabe eine Zahl, Kommazahl oder Text ist. - Der Vergleich einer “Text-Variablen”
s
mit einer Zeichenkette geht mits == “St. Gallen”
bzw. mits != “St. Gallen”
. Statt Text-Variable sagt man auch “string”.
Hausaufgabe (kann eventuell während der Lektion begonnen werden)
Du hast die Wahl:
- Aufgabe 5 oder
- Aufgabe 4 mit mindestens drei der Bonusteilaufgaben (oder ähnlich schwierigen Sachen deiner Wahl)
- Aufgabe 2 mit mindestens drei der Bonusteilaufgaben (oder ähnlichen schwierigen Sachen deiner Wahl)
- eine der beiden nachfolgenden Bonusaufgaben, also Aufgabe 6 oder Aufgabe 7
Abgabe bis spätestens Sonntagabend 23:59 Uhr vor der nächsten Doppellektion über den folgenden Link:
Zusammenfassung
Bonusaufgabe, Aufgabe 6
Rasenmäher-Schildkröte
Lass die Schildkröte so lange geradeaus laufen, bis sie nahe am Rand des Fensters ist. Dann soll sie etwas zurück gehen und sich etwas drehen (dies können feste oder zufällige Werte sein); danach geht es wieder mit der Vorwärtsbewegung weiter etc.
Hinweis:
- Mit den Befehlen
getX()
undgetY()
bekommst du die $x$- und $y$-Koordinate der Schlidkröte. Die Koordinaten des Fensters gehen von -400 bis 400 in $x$-Richtung und $-300$ bis $300$ in $y$-Richtung. - Mit
while True:
oderrepeat:
kannst du den nachfolgenden eingerückten Code-Block unendlich oft ausführen lassen.
Bonusaufgabe, Aufgabe 7
Schildkröte als Billard-Ball
Wähle am Anfang einen zufälligen Startwinkel. Lass die Schildkröte geradeaus in diese Richtung laufen, bis sie auf den Rand des Fensters trifft. Dort soll sie wie ein Lichtstrahl bzw. wie eine idealisierte Billardkugel reflektiert werden.
Schaffst du es, dass die Billard-Schildkröte bei jeder Reflektion die Zeichenfarbe ändert? Die Farbe kann zufällig oder in einer festgelegten Reihenfolge - etwa rot-grün-blau - geändert werden.
Hinweise: Neben den Hinweisen bei der vorigen Aufgabe verwende:
- Mit
heading()
bekommst du die aktuelle Richtung der Schildkröte in Grad;0
bedeutet nach oben,90
nach rechts etc. Es sind aber auch Werte über 360 wie400
oder unter Null wie-35
möglich. - Mit
setHeading(…)
kannst du die Schildkröte in eine Richtung drehen.
Fragebox - auch zum Besprechen von Programmen während der Lektion (NICHT für Hausaufgaben)
Bitte einfach am Anfang des Programms oder der eingereichten Datei die Frage aufschreiben (mit oder ohne Hashtag #
als Kommentareinleitungszeichen am Zeilenanfang).