1.3 Verzweigungen
In diesem Kapitel beschäftigen wir uns mit Aufgabestellungen, bei denen der tatsächliche Programmablauf von bestimmten Bedingungen abhängt. Je nachdem, ob diese zur Laufzeit erfüllt sind oder nicht, werden Anweisungen ausgeführt oder ignoriert.
1.3.1 Bedingte Anweisung
Aufgabe 1-4: Szenario – „Ist der Weg frei?“
Ziel dieses Szenarios ist es, dass ein blauer Roboter von Feld (1; 2) startend mit einer Geschwindigkeit von 2 das Zielfeld (4; 1) erreicht. Allerdings ist unklar, ob der Weg durch eine Kiste auf Feld (3; 2) versperrt ist. Das Spielbrett 4 liegt deshalb in zwei Varianten vor: 4a ohne Kiste und 4b mit Kiste. Der Quellcode dieses Szenarios muss so verfasst werden, dass der Roboter das Ziel in beiden Varianten erreicht.
Lösen Sie die Aufgabe zunächst mit Hilfe der Sensor-Methode isBoxAhead() und testen Sie Ihren Quellcode mit beiden Spielbrettvarianten. Die Methode prüft, ob auf dem Feld direkt vor dem Sensor eine Kiste steht und gibt einen entsprechenden Wert vom Typ boolean zurück. Überlegen Sie anschließend, wie Sie Ihren Quellcode anpassen müssten, wenn Sie stattdessen die Methode isFieldAheadFree() verwenden würden.
Informationen zum Sensoreinsatz finden Sie im Abschnitt Hinweise zum Einsatz der Sensoren.


Ausgewählte Methoden der Klasse Sensor
Problem
Bestimmte Anweisungen sollen nur ausgeführt werden, wenn eine Bedingung erfüllt ist. Zum Beispiel: „Wenn auf Feld (3; 2) eine Kiste steht, dann soll sie aufgeladen werden!“ Im Quellcode wird dies mit Hilfe der Kontrollstruktur bedingte Anweisung umgesetzt.
Eine bedingte Anweisung (einseitige Alternative, einseitige Verzweigung) ist eine Kontrollstruktur, die einen Programmabschnitt nur ausführt, wenn eine Bedingung erfüllt ist.
Die Bedingung wird in Form eines booleschen Ausdrucks (logischer Ausdruck) formuliert. Dabei handelt es sich um einen Ausdruck, dessen Auswertung einen Wert des Typs boolean (Wahrheitswert) ergibt.
Hat der boolesche Ausdruck den Wert true, werden die Anweisungen im bedingten Abschnitt ausgeführt, bei false nicht.
Bedingte Anweisung (Struktogramm)
Bedingte Anweisung (Java-Quellcode)
Beispiele für boolesche Ausdrücke in Java
| Boolescher Ausdruck | Erläuterung |
|---|---|
buch.istAusleihbar() |
Methode, die als Antwort einen Wert des Typs boolean zurückgibt. |
ausleihbar |
Variable vom Typ boolean. |
!ausleihbar |
Verneint den Wert der booleschen Variable ausleihbar und kehrt ihn damit um. Umgangssprachlich beantwortet der Ausdruck die Frage „Ist nicht ausleihbar?“. |
!buch.istAusleihbar() |
Verneint den Rückgabewert des Methodenaufrufs buch.istAusleihbar() und kehrt ihn damit um. Umgangssprachlich beantwortet der Wert des Ausdrucks die Frage „Ist das Buch nicht ausleihbar?“. |
anzahl >= 100 |
„ist größer oder gleich“ |
alter == 18 |
„ist gleich“ |
rest != 0 |
„ist ungleich“ |
Der NOT-Operator verneint einen booleschen Ausdruck. Das bedeutet: Liefert dieser den Wert true, sorgt der NOT-Operator dafür, dass daraus „not true“, also false, wird. Liefert er den Wert false, wird daraus entsprechend „not false“, also true.
Der NOT-Operator kann zum Beispiel verwendet werden, wenn ein Programmabschnitt nur dann ausgeführt werden soll, wenn eine bestimmte Bedingung nicht erfüllt ist.
In vielen Programmiersprachen wird das Ausrufezeichen ! als NOT-Operator verwendet.
1.3.2 Zweiseitige Verzweigung
Aufgabe 1-5: Szenario – „Finde einen Weg!“
Ziel dieses Szenarios ist es, dass ein weißer Roboter von Feld (2; 6) startend mit einer Geschwindigkeit von 2, das Zielfeld (3; 1) erreicht. Auf dem Weg befindet sich ein Erdloch. Es ist jedoch unklar, ob es auf Feld (2; 4) oder auf Feld (4; 4) ist. Für beide Fälle gibt es eine entsprechende Variante des Spielbretts (5a und 5b).
Der Quellcode muss so verfasst werden, dass der Roboter das Ziel in beiden Fällen erreicht.


Ausgewählte Methoden der Klasse Sensor
Problem
Je nachdem, ob eine bestimmte Bedingung erfüllt ist oder nicht, sollen unterschiedliche Programmabschnitte ausgeführt werden. Zum Beispiel: „Wenn auf Feld (2; 4) ein Erdloch ist, dann nimm den rechten Weg, sonst den linken!“ Im Quellcode wird dies mit Hilfe der Kontrollstruktur zweiseitige Verzweigung umgesetzt.
Eine zweiseitige Verzweigung (zweiseitige Alternative) ist eine Kontrollstruktur, die dann zum Einsatz kommt, wenn es zwei unterschiedliche Programmabschnitte gibt. Welcher der beiden ausgeführt wird, hängt davon ab, ob eine vorgegebene Bedingung erfüllt ist oder nicht.
Zweiseitige Verzweigung (Struktogramm)
Zweiseitige Verzweigung (Java-Quellcode)
Aufgabe 1-6: Szenario – „Wege schaffen“
Ziel dieses Szenarios ist es, dass ein weißer Roboter von Feld (1; 3) startend mit einer Geschwindigkeit von 2 auf dem kürzest möglichen Weg das Zielfeld erreicht. Dabei ist unklar, ob das Feld (3; 3) passierbar ist oder sich dort ein Steinhaufen befindet.
Das Spielbrett 6 liegt deshalb in zwei Varianten vor: Bei Spielbrett 6a ist das Wegfeld (3; 3) frei, bei 6b lagert dort ein Steinhaufen. Der Quellcode dieses Szenarios muss so verfasst werden, dass der Roboter das Ziel in beiden Varianten erreicht.


Ausgewählte Methoden der Klasse Sensor
Aufgabe 1-7: Szenario – „Straßenschäden beseitigen“
Ziel dieses Szenarios ist es, dass ein Roboter von Feld (1; 2) startet und mit einer Geschwindigkeit von 3 die drei zufällig verteilten Erdlöcher der Tiefe 1 findet und sie jeweils mit einer Einheit Steinen auffüllt. Ein Erdloch der Tiefe 1 wird nach dem Auffüllen mit einer Einheit Steinen zu einem Wegfeld. Auf diesem soll anschließend eine Straße (schwarzes Feld) gebaut werden. Auf Feld (1; 3) liegen drei Einheiten Steine, die nacheinander aufgeladen werden können.
Die Spielbretter 7a und 7b sind lediglich zwei Beispiele. Die genaue Verteilung der Erdlöcher ist zur Entwicklungszeit nicht bekannt. Ihr Quellcode muss daher so gestaltet sein, dass er mit allen möglichen Verteilungen funktioniert.
Verwenden Sie die Methode buildRoad() der Klasse Robot, um auf dem Wegfeld direkt vor dem Roboter eine Straße zu bauen.


Ausgewählte Methoden der Klasse Robot
Wird ein Programmabschnitt im Quellcode mehrfach benötigt, ist es sinnvoll, diesen in eine separate Methode auszulagern. An jeder Stelle, an der der Programmabschnitt benötigt wird, wird dann nur noch diese Methode aufgerufen.
Vorteile:
- Der gesamte Quellcode verkürzt sich.
- Änderungen müssen nur noch einmal innerhalb der Methode durchgeführt werden. Dies reduziert den Arbeitsaufwand und das Fehlerrisiko. Werden Änderungen an mehreren Stellen des Quellcodes vorgenommen, können sich dabei Flüchtigkeitsfehler einschleichen oder einzelne Stellen übersehen und nicht geändert werden.
- Wird ein anschaulicher Methodenname gewählt, wird der Quellcode verständlicher.
Aufgabe 1-8: Szenario – Verzwickt
Ziel dieses Szenarios ist es, dass ein weißer Roboter von Feld (1; 2) startend mit einer Geschwindigkeit von 2 das Zielfeld erreicht. Dabei ist unklar, was ihn auf Feld (3; 2) erwartet. Möglich ist ein freier Weg, ein Steinhaufen oder ein Erdloch.
Das Spielbrett 8 liegt deshalb in drei Varianten vor: Bei Spielbrett 8a ist das Wegfeld (3; 2) frei, bei 8b lagert dort eine Einheit Steine und bei 8c befindet sich an dieser Stelle ein Erdloch (Tiefe 1).
Programmieren sie einen effizienten Algorithmus, der den Roboter in allen drei möglichen Varianten stets auf die kürzest mögliche Weise zum Ziel führt.



Verschachtelte Verzweigung (Struktogramm)

Verschachtelte Verzweigung (Quellcode)
Variante 1
if(menge >= 1000) {
preis = 7;
}
else {
if(menge >= 500) {
preis = 8;
}
else {
if(menge >= 250) {
preis = 9;
}
else {
preis = 10;
}
}
}Variante 2
if(menge >= 1000) {
preis = 7;
}
else if(menge >= 500) {
preis = 8;
}
else if(menge >= 250) {
preis = 9;
}
else {
preis = 10;
}