Schleifen

In einer Schleife wird ein Anweisungsblock (genannt Schleifenrumpf) so lange wiederholt, wie eine gegebene Bedingung − z.B. vornFrei() − erfüllt ist.

Sobald die Bedingung nicht mehr erfüllt ist, wird die Schleife verlassen und das Programm in der nächsten Zeile fortgeführt.

Mehr Erklärungen zu Schleifen findest du hier.

while (vornFrei())
{
    // Rumpf
}

Gegeben ist ein Territorium mit einem beliebig langen Gang, an dessen Ende sich drei Körner befinden. Untenstehend sind zwei Beispiel-Territorien angegeben.

Der Hamster soll nun bis zum Ende des Ganges laufen und die drei Körner einsammeln.

Es ist von vornherin nicht klar, wie viele Schritte getan werden müssen (in obigen Beispielen einmal 7 und einmal 2 Schritte). Mit Hilfe einer while-Schleife kann dieses Problem jedoch leicht gelöst werden: So lange der Weg nach vorne frei ist, geht der Hamster nach vorne.

void main() 
{
    while (vornFrei())
    {
        vor();
    }
    nimm();
    nimm();
    nimm();
}

Aufgabe: Entwirf zunächst ein paar Territorien mit unterschiedlich langen Gängen. Tippe dann das Programm ab und speichere es. Kompiliere anschließend und führe dann das Programm aus.

Guten Morgen! Der Hamster muss sich für den Tag stärken und will alle Körner frühstücken. Seine Speisekammer besteht aus drei Kacheln, die Anzahl an Körnern auf jeder Kachel ist jedoch unbekannt.

Schreibe ein Programm, welches den Hamster alle drei Kacheln abräumen lässt. Definiere dafür zunächst eine Prozedur nimmAlle, welche alle Körner auf der aktuellen Kachel aufnehmen lässt.

Vorher
Nachher

Tipp: Der Hamster kann mit dem Testbefehl kornDa() testen, ob sich auf der aktuellen Kachel mindestens noch ein Korn befindet.

Fortgeschritten: Die Speisekammer ist beliebig lang. Ändere dein Programm so ab, dass der Hamster alle Kacheln abräumt, statt wie bisher nur drei Kacheln. Tipp: Verwende eine weitere while-Schleife, diesmal in der main-Prozedur.

Im Folgenden ist die main-Prozedur bereits gegeben. Füge nun noch die passenden Programmzeilen bei TODO ein.

void main()
{
    vor();
    nimmAlle();
    vor();
    nimmAlle();
    vor();
    nimmAlle();
}

void nimmAlle()
{
    // TODO
}
void main()
{
    vor();
    nimmAlle();
    vor();
    nimmAlle();
    vor();
    nimmAlle();
}

void nimmAlle()
{
    while (kornDa())
    {
        nimm();
    }
}
void main()
{
    while (vornFrei())
    {
        vor();
        nimmAlle();
    }
}

void nimmAlle()
{
    while (kornDa())
    {
        nimm();
    }
}