Verzweigungen

Mit Verzweigungen legt man fest, ob das Programm als nächstes dies oder jenes tut – die Entscheidung hängt von der zugehörigen Bedingung ab.

MATERIALIEN

 

Programme erledigen Schritt für Schritt eine Code-Zeile nach der anderen. Man kann diese lineare Arbeitsweise aufbrechen mit Verzweigungen und Schleifen.

Bedingung

Betrachten wir die act()-Methode des Käfers aus dem Kara-Szenario:

Quelle: Oinf

Verstehen Sie diesen Code, wenn Sie ihn wortwörtlich übersetzen?

Falls der Käfer ein Kleeblatt gefunden hat, dann isst er es, ansonsten: falls er sich bewegen kann, dann bewegt er sich einen Schritt, sonst dreht er sich nach links.

1. Bedingungen: if-else

Mit Hilfe der Kontrollstruktur if() {} else {} können wir also zunächst überprüfen, ob etwas zutrifft (z.B. ob ein Blatt gefunden wurde) und je nach Ergebnis den einen oder anderen Code-Block (alles, was zwischen den geschweiften Klammern steht) ausführen lassen.
Eigentlich ist das ein ziemlich grosser Schritt: Wenn beispielsweise die «Act»-Schaltfläche gedrückt wird, passiert jetzt nicht mehr immer genau dasselbe. Welche der Anweisungen ausgeführt werden, können wir jetzt z.B. vom momentanen Wert einer Variablen abhängig machen.

Fügen wir nun in unserem Beispiel (Szenario ausgabe_in_konsole.zip) eine solche Verzweigung ein:

Quelle: Oinf

Klicken Sie nun mehrfach auf die «Act»-Schaltfläche. Können Sie sich die Ausgabe erklären?

Und was wird hier ausgegeben werden?

Quelle: Oinf

Vergleiche kann man durchführen mit (Achtung, doppeltes Gleichheitszeichen) == (ist gleich), != (ist ungleich), < (ist kleiner als), <= (ist kleiner oder gleich), > (ist grösser als) und mit >= (ist grösser oder gleich). Das funktioniert übrigens nicht nur mit Zahlen, sondern auch mit Strings.

Solche Vergleiche kann man sich vorstellen wie eine einfache Ja/Nein-Frage, z.B.:

meineZahl == 5; //ist meineZahl gleich 5?

Der Computer beantwortet solche Vergleiche mit true (wahr, ja, stimmt) oder false (falsch, nein, stimmt nicht). Genau genommen ist diese Antwort ein Wert eines bestimmten Variablentyps, nämlich boolean (Wahrheitswert). Das zu wissen ist praktisch, weil man damit die Antwort wieder in eine Variable speichern kann, wenn man möchte:

boolean antwort = meineZahl == 5;

Nachdem diese Zeile abgearbeitet wurde, enthält die Variable antwort also einen der beiden Werte true oder false – je nachdem, welches Ergebnis der Vergleich erbracht hat.

Was wird der folgende Code ausgeben?

int a=3;
if(a<4){
    a=a*2;
}
else {
    a=a+1;
}
if(a>5){
    a=a+2;
}
System.out.println(a);

Antwort

Die Zahl 8, denn:
Die erste Bedingung ist erfüllt, a wird also verdoppelt (hat jetzt den Wert 6), der else-Block wird übersprungen.
Die zweite Bedingung (a>5) wird überprüft. Sie ist erfüllt, und somit wird a um 2 erhöht.

Was würde jeweils ausgegeben, würde a zu Beginn der Wert 2, der Wert 4 bzw. der Wert 5 zugewiesen?

4, 5 bzw. 8.

Verzweigungen: Code lesen

Weitere solche Aufgaben finden Sie im Arbeitsblatt Greenfoot_Basisbeispiele_Verzweigungen.pdf.

2. Bedingungen verknüpfen: UND und ODER

Müssen gleichzeitig mehrere Bedingungen erfüllt sein, also z.B. Bedingung1 UND Bedingung2, so verknüpft man diese mit dem &&-Operator.

Beispiel:

int meineZahl = 1;

public void act()
{
    if(meineZahl > 4 && meineZahl < 20) {
        meineZahl = meineZahl * 2;
    }
    else {
        meineZahl = meineZahl + 1;
    }
    System.out.println(meineZahl);
}

Die Teil-Bedingungen müssen immer komplett notiert werden. Also z.B. 4<i && i<20.
Die in der Mathematik erlaubte Abkürzung 4<i<20 ist hier nicht zulässig.

Soll von zwei Bedingungen mindestens eine erfüllt sein, also Bedingung1 ODER Bedingung2, so verknüpft man diese mit dem ||-Operator (zwei senkrechte Striche, Tastatur: AltGr + 7).

Beispiel:

int meineZahl = 1;

public void act()
{
    if(meineZahl < 4 || meineZahl > 20) {
        meineZahl = meineZahl + 2;
    }
    else {
        meineZahl = meineZahl + 7;
    }
    System.out.println(meineZahl);
}

Das ODER ergibt auch dann true, wenn beide Bedingungen erfüllt sind – es ist also ein einfaches ODER, nicht ein entweder-oder.

Aufgabe

Bearbeiten Sie im Aufgabenblatt zu Verzweigungen Greenfoot_Verzweigungen.pdf die Aufgaben zur Konsolenausgabe.

3. Verzweigungen im Kara-Szenario

Öffnen Sie Ihr Kara-Szenario (oder erstellen Sie eine neue Kopie des originalen Kara-Szenarios Kara.zip). Ändern Sie die act()-Methode nach folgendem Vorbild ab:

Quelle: Oinf

Erklärung: Falls der Käfer sich geradeaus bewegen kann, so wird er dies in 3 von 4 Fällen tun (falls die Zufallszahl 0, 1 oder 2, aber nicht 3 ergibt). Ansonsten dreht er sich nach links (obwohl er auch geradeaus gehen könnte).

Wie Sie sehen, wird im obigen Code der Befehl Greenfoot.getRandomNumber(4) verwendet. Das ist ein Aufruf einer Methode – das erkennt man an den Klammern nach dem Namen. Diese Methode gehört zur Klasse Greenfoot – das erkennt man daran, dass vor dem Methodennamen „Greenfoot“ steht, abgetrennt durch einen Punkt. Falls Sie sich wundern, wie diese Methode funktioniert, oder woher man wissen sollte, dass es sie gibt, dann schauen Sie sich doch mal die Dokumentation der Klasse Greenfoot an (z.B. Help → Greenfoot Class Documentation oder in der online API auf auf Greenfoot.org ).

Setzen Sie eine grössere Anzahl Kleeblätter in die Welt, fügen Sie einen Käfer hinzu und und lassen Sie ihn herumrennen.

Ergänzung:

Der Käfer soll nun jeweils 3 Schritte in die gleiche Richtung machen.

Um diese Schritte zählen zu können, brauchen wir eine Variable. Ergänzen Sie daher die Instanzvariablen des Käfers um eine weitere Variable:

int anzSchritteInGleicheRichtung = 0;

Ändern Sie danach die act()-Methode nach folgendem Vorbild ab:

Quelle: Oinf

Auch hier wieder: Eine grössere Anzahl Kleeblätter sowie einen Käfer in die Welt setzen und laufen lassen.

Aufgabe

Lösen Sie im Aufgabenblatt zu Verzweigungen Greenfoot_Verzweigungen.pdf zunächst die Aufgaben zum Kara-Szenario und danach die weiteren Aufgaben mit Konsolenausgabe.