Kapitel-Fortschritt: 0/2 Aufgaben gelöst

Kapitel 6

Kapitel 6: While-Schleifen

Funktionen und for-Schleifen machen Programme kürzer und klarer. Aber sie führen bei jedem Start immer dieselbe feste Anzahl von Schritten aus.

Interessanter wird ein Programm, wenn es auf die Welt reagieren kann. Karel soll zum Beispiel so lange laufen, bis direkt vor ihm eine Wand ist. Dafür muss das Programm nicht wissen, wie breit die Welt ist.

Die Grundform

Eine while-Schleife wiederholt ihren Codeblock, solange eine Bedingung wahr ist:

while bedingung():
    befehl()
    noch_ein_befehl()

Bei jedem Durchlauf wird die Bedingung neu geprüft. Ist sie wahr, läuft der eingerückte Block. Ist sie falsch, endet die Schleife und das Programm macht hinter dem Block weiter.

front_is_clear()

Die erste Bedingung, die wir verwenden, ist front_is_clear(). Sie ist wahr, wenn Karel einen Schritt nach vorne gehen kann. Damit kann Karel bis zur Wand laufen:

def main():
    while front_is_clear():
        move()

Anders als bei einer for-Schleife muss die Anzahl der Wiederholungen nicht vorher feststehen. Sie ergibt sich aus der aktuellen Welt.

Eine Linie aus Beepern

Wenn Karel auf jedem Feld bis zur Wand einen Beeper ablegen soll, liegt eine kleine Falle im Programm:

def main():
    while front_is_clear():
        put_beeper()
        move()

Dieses Programm legt auf vielen Feldern Beeper ab, aber nicht auf dem letzten Feld. Dort steht Karel direkt vor der Wand, also ist front_is_clear() falsch und der Schleifenkörper läuft nicht mehr.

Der Zaunpfahlfehler

Dieses Muster heißt Zaunpfahlfehler, auf Englisch fencepost error. Es ist ein typischer Off-by-one-Fehler: Zwischen sieben Feldern liegen nur sechs Schritte. Der Befehl move() muss also einmal weniger ausgeführt werden als put_beeper().

Die einfache Lösung ist, die wiederholbaren Paare in die Schleife zu schreiben und danach den letzten Beeper separat abzulegen:

11 Pfosten bilden 10 Zaunfelder
Maschendrahtzaun mit elf Pfosten und zehn Zaunfeldern
def main():
    while front_is_clear():
        put_beeper()
        move()
    put_beeper()

Ausprobieren

Aufgabe

Beeper bis zur Wand

medium

Karel soll auf jedem Feld der Straße einen Beeper ablegen und erst anhalten, wenn direkt vor ihm eine Wand ist. Vergiss das letzte Feld nicht.

Ziel

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

Karel-Welt

Aktuelle Welt

7 x 1
Blick nach Osten

1,1
2,1
3,1
4,1
5,1
6,1
7,1

Karel-Welt

Zielwelt

7 x 1
Blick nach Osten

1,1
2,1
3,1
4,1
5,1
6,1
7,1

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

Feedback

Schritte: 0

Status: Noch nicht gelöst

Aufgabe

Beeper in gegenüberliegenden Feldern

medium

Karel startet in Feld 1,1 und schaut nach Osten. In Feld 8,1 und Feld 1,8 liegt jeweils ein Beeper. Sammle beide Beeper ein und kehre anschließend wieder zum Start zurück. Dein Programm soll auch für 10x10- und 12x12-Welten funktionieren.

Ziel

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

Karel-Welt

Aktuelle Welt

8 x 8
Blick nach Osten

1,8
2,8
3,8
4,8
5,8
6,8
7,8
8,8
1,7
2,7
3,7
4,7
5,7
6,7
7,7
8,7
1,6
2,6
3,6
4,6
5,6
6,6
7,6
8,6
1,5
2,5
3,5
4,5
5,5
6,5
7,5
8,5
1,4
2,4
3,4
4,4
5,4
6,4
7,4
8,4
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
1,2
2,2
3,2
4,2
5,2
6,2
7,2
8,2
1,1
2,1
3,1
4,1
5,1
6,1
7,1
8,1

Karel-Welt

Zielwelt

8 x 8
Blick nach Osten

1,8
2,8
3,8
4,8
5,8
6,8
7,8
8,8
1,7
2,7
3,7
4,7
5,7
6,7
7,7
8,7
1,6
2,6
3,6
4,6
5,6
6,6
7,6
8,6
1,5
2,5
3,5
4,5
5,5
6,5
7,5
8,5
1,4
2,4
3,4
4,4
5,4
6,4
7,4
8,4
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
1,2
2,2
3,2
4,2
5,2
6,2
7,2
8,2
1,1
2,1
3,1
4,1
5,1
6,1
7,1
8,1

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

Feedback

Schritte: 0

Status: Noch nicht gelöst