Kapitel 8
Kapitel 8: Schrittweise Verfeinerung
Je größer ein Programm wird, desto wichtiger wird die Art, wie du es aufteilst. Schrittweise Verfeinerung bedeutet: Du beginnst mit dem Problem als Ganzem und formulierst zuerst eine grobe Lösung.
Erst danach arbeitest du die einzelnen Teilprobleme aus. So bleibt der Code verständlich, und du kannst kleine Teile testen, bevor alles zusammenkommen muss.
Von oben anfangen
Bei der Turm-Aufgabe soll Karel alle Beeper einsammeln, rechts unten stapeln und dann nach Hause zurückkehren. Auf der höchsten Ebene sieht das Programm deshalb so aus:
def main():
collect_all_beepers()
drop_all_beepers()
return_home()Diese drei Zeilen lösen noch keine Details. Aber sie machen den Plan klar. Beim Lesen weiß man sofort, welche Phasen das Programm hat.
Iterativ testen
Schreibe bei schwierigen Schleifen nicht sofort alles auf einmal. Teste zuerst den Körper der Schleife. Für die Turm-Aufgabe kannst du zum Beispiel zunächst nur einen Turm einsammeln und dann ein Feld weitergehen:
def collect_all_beepers():
# vorläufige Version zum Testen
collect_one_tower()
move()Wenn dieser kleine Teil funktioniert, kannst du ihn später sicher in eine while-Schleife einbauen.
Einen Turm verfeinern
Ein einzelner Turm ist selbst wieder ein Teilproblem. Karel steht unten auf der ersten Reihe und schaut nach Osten. Danach soll Karel wieder genau dort stehen und wieder nach Osten schauen:
def collect_one_tower():
turn_left()
collect_line_of_beepers()
turn_around()
move_to_wall()
turn_left()Diese Funktion behandelt leere Spalten ohne Sonderfall. Eine Spalte mit Höhe 0 ist einfach ein Turm, bei dem collect_line_of_beepers() sofort fertig ist.
Vorbedingungen und Nachbedingungen
Eine Vorbedingung beschreibt, was vor dem Aufruf einer Funktion wahr sein muss. Eine Nachbedingung beschreibt, was danach garantiert wieder wahr sein soll.
Für collect_one_tower() lautet die Vorbedingung: Karel steht unten in einer Spalte und schaut nach Osten. Die Nachbedingung ist dieselbe. Genau deshalb kann collect_all_beepers() diese Funktion wiederholt aufrufen.
Alle Spalten bearbeiten
Für das Bearbeiten jeder Spalte taucht wieder das Muster aus Kapitel 6 auf: Solange vorne frei ist, bearbeite das aktuelle Feld und bewege dich weiter. Danach fehlt noch das letzte Feld.
def collect_all_beepers():
while front_is_clear():
collect_one_tower()
move()
collect_one_tower()Das ist dieselbe Strategie wie bei der Beeper-Linie: Eine Aktion wird auf jedem Feld ausgeführt, bis die Reihe an einer Wand endet.
Ausprobieren
Aufgabe
Beeper-Türme einsammeln
Karel startet unten links. Sammle alle Beeper aus den Türmen ein, lege sie gesammelt unten rechts ab und kehre anschließend zum Start zurück. Zerlege das Programm schrittweise in kleine Funktionen.
Ziel
- Karel soll am Ende in Spalte 1, Zeile 1 stehen.
- Karel soll nach Osten schauen.
- In der Welt sollen 10 Beeper liegen.
- Karel soll keine Beeper in der Tasche haben.
Karel-Welt
Aktuelle Welt
7 x 6
Blick nach Osten
3,4
3,3
6,3
1,2
3,2
6,2
1,1
3,1
5,1
6,1Karel-Welt
Zielwelt
7 x 6
Blick nach Osten
1,1
107,1Aktuell unterstützt der Runner Karel-Befehle, eigene Funktionen und einfache for- und while-Schleifen.
Feedback
Schritte: 0
Status: Noch nicht gelöst