Kapitel 2: Programmfluss

Lösungen

LÖSUNG AUFGABE 2.01

TASK 2.01 - Solution


LÖSUNG AUFGABE 2.02

TASK 2.02 - Solution


LÖSUNG AUFGABE 2.03

  1. Beschreiben Sie zuerst mit Worten, was die folgenden Codebeispiele bewirken.
    Nimmt ein Blatt weg, wenn es eines hat, legt ein Blatt hin, wenn keines dort ist (Invertieren).

  2. Skizzieren Sie es als Flussdiagramm.

TASK 2.03 - Solution


LÖSUNG AUFGABE 2.04

  1. Beschreiben Sie zuerst mit Worten, was die folgenden Codebeispiele bewirken.
    Wenn Kara auf einem Blatt ist, geht er einen Schritt vorwärts.

  2. Skizzieren Sie es als Flussdiagramm.

TASK 2.04 - Solution


LÖSUNG AUFGABE 2.05

  1. Beschreiben Sie zuerst mit Worten, was die folgenden Codebeispiele bewirken.
    Nimmt das Blatt auf, wenn links ein Baum steht.

  2. Skizzieren Sie es als Flussdiagramm.

TASK 2.05 - Solution


LÖSUNG AUFGABE 2.06

public void act() {
    if (treeFront()) {
        goAroundTree();
    } else {
        move();
    }

    if (onLeaf()) {
        removeLeaf();
        stop();
    }
}

public void goAroundTree() {
    turnLeft();
    move();
    turnRight();
    move();
    move();
    turnRight();
    move();
    turnLeft();
}

LÖSUNG AUFGABE 2.07

public void act() {
    if (treeLeft()) {
        move();
    } else {
        if (onLeaf()) {
            removeLeaf();
            move();
        } else {
            move();
        }
    }
}

LÖSUNG AUFGABE 2.08

public void act() {
    if (treeLeft() && treeRight()) {
        putLeaf();
        stop();
    } else {
        move();
    }
}

LÖSUNG AUFGABE 2.09

public void act() {
    if (treeLeft() || treeRight()) {
        putLeaf();
        move();
    } else {
        move();
    }

    if (onLeaf()) {
        stop();
    }
}

LÖSUNG AUFGABE 2.10

public void act() {
    if (!onLeaf()) {
        putLeaf();
    }

    if (!treeFront()) {
        move();
    } else {
        stop();
    }
}

LÖSUNG AUFGABE 2.11

public void act() {
    if (onLeaf()) {
        removeLeaf();
    } else {
        if (!treeFront()) {
            move();
        } else {
            if (!treeLeft()) {
                turnLeft();
                move();
            } else {
                turnRight();
                move();
            }
        }
    }
}

LÖSUNG AUFGABE 2.12

public void act() {
    if (!treeFront()) {
        removeLeaf();
        findNextLeaf();
    } else {
        removeLeaf();
        stop();
    }
}

public void findNextLeaf() {
    // Erst mal vorne schauen.
    move();
    if (!onLeaf()) {
        // Kein Blatt vorne, also zurueck und links schauen.
        turnAndGoBack();
        turnRight();
        move();
        if (!onLeaf()) {
            // Links ist auch kein Blatt; dann muss es rechts liegen.
            turnAndGoBack();
            move();
        }
    }
}

public void turnAndGoBack() {
    turnLeft();
    turnLeft();
    move();
}

LÖSUNG AUFGABE 2.13

<tr>
  <td>b.</td>
  <td><pre>while (treeRight()) {

move(); }

<tr>
  <td>c.</td>
  <td><pre>while (treeLeft() || treeRight()) {

move(); }

<tr>
  <td>d.</td>
  <td><pre>if (treeLeft()) {

move(); } while (treeLeft() && treeRight()) { move(); }

<tr>
  <td>e.</td>
  <td><pre>while (!treeFront) {

if (treeLeft()) { move(); } }

# Code Description Steps
a.
while (treeLeft()) {
  move();
}
Solange links ein Baum steht, mache einen Schritt. 4
Solange rechts ein Baum steht, mache einen Schritt. 0
Solange entweder links oder rechts ein Baum steht, mache einen Schritt. 5
Zuerst ein Schritt, wenn links ein Baum. Solange links und rechts ein Baum steht, ma-che einen Schritt. 4
Solange kein Baum vor Kara steht: Wenn links ein Baum, mache einen Schritt.

Achtung: Endlosschleife

4

LÖSUNG AUFGABE 2.14

public void act() {
    while (!onLeaf()) {
        if (treeFront()) {
            goAroundTree();
        } else {
            move();
        }
    }

    // Blatt gefunden --> essen.
    removeLeaf();

    stop();
}

public void goAroundTree() {
    turnLeft();
    move();
    turnRight();
    move();

    while (treeRight()) {
        move();
    }

    turnRight();
    move();
    turnLeft();
}

LÖSUNG AUFGABE 2.15

public void act() {
    while (treeFront()) {
        oneStepUp();
    }

    stop();
}

public void oneStepUp() {
    turnLeft();
    move();
    turnRight();
    move();
}

LÖSUNG AUFGABE 2.16

public void act() {
    makeOneStep();
}

public void makeOneStep() {
    if (!treeRight()) {
        // Kein Baum rechts --> gehe nach rechts.
        turnRight();
        move();
    } else {
        // Baum rechts.
        if (!treeFront()) {
            // Kein Baum vorne --> vorwärts gehen.
            move();
        } else {
            // Bäume rechts und vorne.
            if (!treeLeft()) {
                // Kien Baum links --> gehe nach links.
                turnLeft();
                move();
            } else {
                // Bäume rechts, vorne und links: Sackgasse.
                turnLeft();
                turnLeft();
                move();
            }
        }
    }
}