Kapitel-Fortschritt: 0/1 Aufgaben gelöst

Kapitel 4

Kapitel 4: Zerlegung

Eigene Funktionen sind nicht nur praktisch, weil sie wiederholte Befehlsfolgen kürzer machen. Sie helfen dir vor allem dabei, ein größeres Problem in kleinere, verständliche Teile zu zerlegen.

In diesem Kapitel soll Karel ein Schlagloch in einer Straße füllen. Karel steht links neben dem Loch, legt einen Beeper hinein und geht anschließend zum nächsten Feld weiter.

Alles in main() schreiben

Mit den Befehlen aus den letzten Kapiteln lässt sich die Aufgabe schon lösen. Wenn der gesamte Plan direkt in main() steht, sieht das aber schnell nach einer bloßen Befehlsliste aus:

def main():
    move()
    turn_right()
    move()
    put_beeper()
    turn_around()
    move()
    turn_right()
    move()

Dieser Code kann funktionieren, aber die Absicht ist nicht sofort sichtbar. Man muss jede einzelne Zeile innerlich mitlaufen lassen, um zu erkennen, dass Karel gerade ein Schlagloch füllt.

Teilprobleme erkennen

Zerlegung bedeutet: Du teilst eine Aufgabe in kleinere Teilprobleme auf. Für das Schlagloch kann der Plan so aussehen:

  1. Bis zum Schlagloch gehen.
  2. Das Schlagloch mit einem Beeper füllen.
  3. Zum nächsten Feld auf der Straße weitergehen.

Wenn main() genau diesen Plan ausdrückt, wird das Programm auf menschlicher Ebene lesbar:

def main():
    move()
    fill_pothole()
    move()

fill_pothole() definieren

Jetzt braucht Karel nur noch eine Erklärung, was fill_pothole() bedeutet. Die Details wandern in eine eigene Funktion:

def fill_pothole():
    turn_right()
    move()
    put_beeper()
    turn_around()
    move()
    turn_right()

Der Vorteil ist nicht, dass weniger Befehle ausgeführt werden. Der Computer arbeitet immer noch Schritt für Schritt. Der Vorteil ist, dass du das Programm auf zwei Ebenen lesen kannst: oben den Plan, darunter die Details.

Das vollständige Programm

Zusammengesetzt entsteht ein Programm, dessen main() sehr kurz bleibt. Mit dem Einzelschritt-Modus kannst du trotzdem beobachten, wie Karel zwischen Hauptprogramm und Hilfsfunktionen wechselt.

from karel import *


def main():
    move()
    fill_pothole()
    move()


def fill_pothole():
    turn_right()
    move()
    put_beeper()
    turn_around()
    move()
    turn_right()


def turn_right():
    turn_left()
    turn_left()
    turn_left()


def turn_around():
    turn_left()
    turn_left()

Ausprobieren

Aufgabe

Schlagloch füllen

easy

Karel steht links neben einem Schlagloch in der Straße. Lege einen Beeper in das Loch und gehe danach zum nächsten Feld weiter. Strukturiere dein Programm mit einer Funktion fill_pothole().

Ziel

  • Karel soll am Ende in Spalte 3, Zeile 2 stehen.
  • Karel soll nach Osten schauen.
  • In der Welt sollen 1 Beeper liegen.
  • Karel soll keine Beeper in der Tasche haben.

Karel-Welt

Aktuelle Welt

4 x 3
Blick nach Osten

1,3
2,3
3,3
4,3
1,2
2,2
3,2
4,2
1,1
2,1
3,1
4,1

Karel-Welt

Zielwelt

4 x 3
Blick nach Osten

1,3
2,3
3,3
4,3
1,2
2,2
3,2
4,2
1,1
2,1
3,1
4,1

Aktuell unterstützt der Runner Karel-Befehle, eigene Funktionen und einfache for- und while-Schleifen.

Feedback

Schritte: 0

Status: Noch nicht gelöst