Das Flussdiagramm
Um schwierige Aufgaben beim Programmieren zu lösen, ist es oft hilfreich, den Programmablauf in einem Flussdiagramm darzustellen. Folgende Symbole werden in einem Flussdiagramm verwendet:
Start / Stopp | |
Aktivität | |
Entscheidung / Bedingung |
AUFGABE 2.01
Ergänzen Sie das Flussdiagramm so, dass Kara das Kleeblatt in allen Welten mit den folgenden Eigenschaften erreicht:
- Das Kleeblatt liegt immer gerade vor ihm – er muss nur um die Bäume herumlaufen.
- Es stehen nie zwei Bäume nebeneinander.
AUFGABE 2.02
Zeichnen Sie ein erweitertes Diagramm, so dass Kara das Kleeblatt am Schluss auch aufliest, wenn er es findet. Hier finden Sie nochmals die verfügbaren Methoden von Kara als Hilfe:
Bedingte Anweisungen in Java
if (treeFront()) { // Bedingung. turnLeft(); // Block 1 wird ausgeführt, wenn Bedingung true ist. } else { move(); // Block 2 wird ausgeführt, wenn Bedingung false ist. }
Hinweis: Der else
-Teil (Block 2) kann weggelassen werden, wenn er nicht benötigt wird.
AUFGABE 2.03
- Beschreiben Sie zuerst mit Worten, was die folgenden Codebeispiele bewirken.
- Skizzieren Sie es als Flussdiagramm.
if (onLeaf()) { removeLeaf(); } else { putLeaf(); } move();
AUFGABE 2.04
- Beschreiben Sie zuerst mit Worten, was die folgenden Codebeispiele bewirken.
- Skizzieren Sie es als Flussdiagramm.
if (onLeaf()) { move(); }
AUFGABE 2.05
Bedingte Anweisungen können auch ineinander verschachtelt werden.
- Beschreiben Sie zuerst mit Worten, was die folgenden Codebeispiele bewirken.
- Skizzieren Sie es als Flussdiagramm.
if (treeLeft()) { if (onLeaf()) { removeLeaf(); move(); } else { move(); } } else { move(); }
Implementieren
AUFGABE 2.06: Um Baum Herum II
- Öffnen Sie das Szenario Kara 206… aus dem Ordner scenarios-chapter-2. In diesem Szenario ist die Methode
goAroundTree()
bereits programmiert und ein Teil deract()
-Methode ist vorbereitet. - Programmieren Sie nun den Ablauf, welchen Sie unter Aufgabe 2 als Flussdiagram gezeichnet haben in der
act()
-Methode. - In diesem Szenario haben Sie verschiedene Welten zur Verfügung (a, b und c).
- Ihr Programm sollte in jeder Welt ohne Fehlermeldungen funktionieren.
AUFGABE 2.07: Verschachtelte Bedingungen
- Laden Sie das Szenario Kara 207… in Greenfoot und programmieren Sie das unter Aufgabe 5 skizzierte Programm.
- Formen Sie das Programm so um, dass Kara die Kleeblätter nur dann aufliest, wenn kein Baum neben ihm ist.
Logische Operatoren
Unser Kara kann nun schon mehr als einfach nur simple Befehle abzuarbeiten. Er kann durch die Benutzung von Bedingungen auf die jeweiligen Ergebnisse eines Sensors unterschiedlich reagieren. Es sollte Kara aber natürlich auch möglich sein, auf zwei oder mehrere Sensoren gleichzeitig zu reagieren.
Die folgende Tabelle zeigt die drei wichtigsten logischen Operatoren in Java:
Operator | Beschreibung | Beispiel | |
---|---|---|---|
`&&` | und | `treeFront() && onLeaf()` | Ist erfüllt (true), wenn beide Aussagen erfüllt sind, d.h. wenn Kara vor einem Baum **und** auf einem Blatt steht. |
`||` | oder | `treeFront() || onLeaf()` | Ist dann erfüllt (true), wenn entweder die eine **oder** die andere Aussage oder beide erfüllt sind. |
`!` | nicht | `!treeFront()` | Ändert einen Ausdruck von true in false und umgekehrt. Diese Aussage wäre also dann erfüllt (true), wenn Kara **nicht** vor einem Baum steht. |
Ein Beispiel in Java würde wie folgt aussehen:
if (treeLeft() && onLeaf()) { // Mache etwas ... }
oder auch kombiniert:
if (treeLeft() && !treeRight()) { // Mache etwas ... }
AUFGABE 2.08: Angst vor Tunnel
Kara hat etwas Angst vor Tunneln. Er soll auf jedem Feld überprüfen, ob es ein Tunneleingang ist (d.h. ob es auf beiden Seiten Bäume hat). Ist dies der Fall, so lässt er vor Schreck gleich ein Kleeblatt fallen.
Laden Sie das Szenario Kara 208…, schreiben Sie das Programm und testen Sie es mit allen drei Welten.
AUFGABE 2.09: Blatt beim Baum
Nun soll Kara geradeaus gehen und überall dort ein Blatt legen, wo entweder links oder rechts oder auf beiden Seiten ein Baum steht.
Laden Sie das Szenario Kara 209… und schreiben Sie das Programm dazu.
AUFGABE 2.10: Blätter legen bis zum Baum
Kara soll vorwärts laufen und dabei überall ein Blatt legen, wo keines ist. Wenn er beim Baum angelangt ist, soll er nichts mehr machen (auch wenn der Act- oder der Run-Knopf nochmals gedrückt wird).
Laden Sie das Szenario Kara 210… und schreiben Sie das Programm dazu.
AUFGABE 2.11: Rundgang
Kara geht in einem Rundgang auf die Suche nach einem Kleeblatt (und liest es auf). Jedes Feld im Rundgang hat genau zwei freie benachbarte Felder. Eines liegt immer hinter Kara, von diesem Feld aus ist er auf das aktuelle Feld gekommen.
Laden Sie das Szenario Kara 211… und schreiben Sie das Programm dazu. Testen Sie das Programm in allen drei Welten.
Tipp: Stellen Sie sich vor, was nach jedem Drücken des Act-Knopfes geschehen muss. Zeichnen Sie dafür als Hilfe ein Flussdiagramm.
AUFGABE 2.12 (schwierig): Kara spielt Pacman
Kara spielt Pacman: Er steht auf dem ersten Kleeblatt einer langen Spur von Kleeblättern, die vor einem Baum endet. Er soll alle Kleeblätter auffressen und vor den Bäumen stoppen.
Schreiben Sie zur besseren Übersicht für gewisse Programmteile eigene Methoden.
Schleifen
Kara kann jetzt nach von uns festgelegten Regeln auf verschiedene Situationen reagieren. Er ist allerdings noch nicht in der Lage, Anweisungen bis zum Eintreten eines bestimmten Ereignisses zu wiederholen. Zum mehrfachen Ausführen von Anweisungsblöcken werden Schleifen verwendet.
Als Beispiel möchten wir folgendes tun:
Kara soll sich solange vorwärts bewegen, bis er auf einen Baum trifft.
Im Flussdiagramm sieht man, dass move()
immer wieder ausgeführt wird,
solange kein Baum vor Kara steht.
Dies ist die Schreibweise in Java:
while (!treeFront()) { move(); }
AUFGABE 2.13
Kara steht vor einem Tunnel.
Beschreiben Sie, was die folgenden Schleifen bewirken und wie viele Schritte Kara macht.
# | Code | Beischreibung | Anzahl Schritte |
---|---|---|---|
a. | while (treeLeft()) { move(); } |
Solange links ein Baum steht, mache einen Schritt. | 4 |
b. | while (treeRight()) { move(); } |
? | ? |
c. | while (treeLeft() || treeRight()) { move(); } |
? | ? |
d. | if (treeLeft()) { move(); } while (treeLeft() && treeRight()) { move(); } |
? | ? |
e. | while (!treeFront) { if (treeLeft()) { move(); } } |
? | ? |
AUFGABE 2.14: Um Baum herum III
Dies ist die ähnliche Übung, wie in Aufgabe 6: Kara soll ein Kleeblatt finden, das geradeaus vor ihm liegt. Nun können aber eine beliebige Anzahl Bäume hintereinander stehen.
- Laden Sie das Szenario Kara 214.. und verbessern Sie die Methode
goAroundTree()
so, dass Kara um mehrere Bäume herumgehen kann. Testen Sie Ihr Programm in allen vorgegebenen Welten. - Ändern Sie die
act()
-Methode so ab, dass man nur noch einmal auf den Act-Knopf drücken muss. Kara soll dann automatisch um die Bäume laufen, bis er das Kleeblatt erreicht. Am Schluss soll er es dann wie-der auffressen.
AUFGABE 2.15: Treppensteigen
Kara soll eine beliebig lange Treppe hochlaufen.
Schreiben Sie eine Methode oneStepUp()
, wo Sie Kara eine einzelne Stufe hochsteigen lassen. Überlegen Sie Sich, wie Kara erkennen kann, ob er noch eine Stufe steigen muss.
AUFGABE 2.16 (difficult): Kara als Wächter
Kara will einen Wald bewachen. Er soll endlos aussen am Waldrand entlang laufen.
Als Hilfe können Sie Sich ein Flussdiagramm zeichnen.
Hinweis: Für eine Endlosschleife können wir auf den Run-Knopf drücken.
Credits: Ideen und Konzepte von Kara wurden entwickelt von Jürg Nievergelt, Werner Hartmann, Raimond Reichert et al. Einige Kara-Übungen basieren auf Unterlagen von Horst Gierhardt.
Wie weiter?
Fahren Sie weiter mit Kapitel 3: Variablen