Entscheidungen treffen

  • Wie trifft man eine Entscheidung?
  • Den Programmablauf beeinflussen
  • Boolische Ausdrücke formulieren
  • Boolische Ausdrücke verknüpfen

Wie trifft man eine Entscheidung?

Um eine Entscheidung zu treffen, muss man einen Wert interpretieren und zwar in der Form, ob man ihn für passend oder unpassend hält. Ob man das eine tut oder das andere. Ja oder nein, Strom an oder aus, wahr oder falsch. Nur mit Aussagen zu arbeiten, die Wahr (true) oder Falsch (false) sind, nennt man Boolische Algebra. Ein Ausdruck, der sich damit beschäftigt, ob eine Aussage wahr oder falsch ist, nennt man boolischen Ausdruck.

In Java gibt es nur einen einzigen Datentyp der zum Treffen von Entscheidungen verwendet werden kann, nämlich boolean. Das ist aber nicht so schlimm wie es sich anhört, man kann nämlich aus anderen Datentypen und Vergleichsoperatoren einen Ausdruck vom Typ boolean bilden.

So trifft man eine Entscheidung: Ist der Wert true, dann tue etwas. Andernfalls tue etwas anderes oder möglicherweise auch gar nichts.

Den Programmablauf beeinflussen

Den Programmverlauf steuert man wie zuvor beschrieben. Das Schlüsselwort dafür heißt if, gefolgt von einem Ausdruck in runden Klammern:

public class ConditionalPrinter {
 
    public static void main(String[] args) {
        boolean decision = true;
        if(decision) {
            System.out.println("Wert ist true!");
        }
    }
 
}

Kompilieren wir das Programm und führen es aus, sehen wir den Text Wert ist true! auf dem Monitor. Ändern wir nun die Zeile

boolean decision = true;

auf

boolean decision = false;

so erscheint keine Ausgabe mehr: Das Programm führt die Befehle hinter dem Ausdruck, der die Bedingung beschreibt, nicht mehr aus.

Es gibt aber auch die Möglichkeit etwas zu tun, wenn der Wert von decision dem Wert false entspricht. Hierfür wird ein else hinter die Anweisungen geschrieben, wo genauso in geschweiften Klammern Anweisungen stehen können.

Den Programmabschnitt der durchgeführt wird, wenn der boolische Ausdruck true ergibt, nennt man Then-Part (der „Dann-Abschnitt“) und den Abschnitt, der ausgeführt wird, wenn der boolische Ausdruck false ergibt, nennt man Else-Part (der „Sonst-Abschnitt“). Im nachfolgenden Beispielquelltext habe ich die jeweiligen Parts durch einen Kommentar (Textpassagen zwischen /* und */ werden vom Compiler ignoriert) markiert.

Wir können somit jetzt den Programmablauf anhand einer Variablen verzweigen.

public class ConditionalPrinter {
 
    public static void main(String[] args) {
        boolean decision = true;
        if(decision) {            /* Then-Part */
            System.out.println("Wert ist true!");
        }
        else {                    /* Else-Part */
            System.out.println("Wert ist false!");
        }
    }
 
}

Der Else-Part ist optional, kann also weggelassen werden. Der Then-Part hingegen muss nach dem if geschrieben werden.

Boolische Ausdrücke formulieren

Wir wissen nun, dass wir Entscheidungen mit Variablen vom Typ boolean durchführen können. Da uns das bei komplexeren Programmen bei weitem nicht ausreicht, gibt es neben den mathematischen Operatoren auch boolische Operatoren, mit deren Hilfe man Werte vergleichen kann:

Operator Bedeutung
== wahr, wenn gleich
!= wahr, wenn ungleich
> wahr, wenn linke Seite größer als rechte Seite
>= wahr, wenn linke Seite größer oder gleich als rechte Seite
< wahr, wenn linke Seite kleiner als rechte Seite
<= wahr, wenn linke Seite kleiner oder gleich als rechte Seite
! wahr, wenn der Ausdruck an der rechten Seite falsch ist

Die Operatoren geben einen booleschen Wert zurück, nämlich true oder false. Also genau das, was wir benötigen, um eine Entscheidung zu treffen.

Nun wollen wir prüfen, ob eine int Variable den Wert 7 besitzt. Das können wir leicht mit den oben genannten Operatoren bewerkstelligen:

public class ConditionalPrinter {
 
    public static void main(String[] args) {
        int value = 7;
        if(value == 7) {
            System.out.println("value ist 7!");
        }
        else {
            System.out.println("value ist NICHT 7!");
        }
    }
 
}

Nehmen wir noch ein ein paar Vergleiche als Beispiel, damit man sie mal gesehen hat:

Beispiel Bedeutung
if(value > 7) Wenn value größer als 7 ist, dann…
if(value <= 7) Wenn value kleiner oder gleich 7 ist, dann…
if(!(value <= 7)) Wenn value nicht kleiner oder gleich 7 (also größer als 7) ist , dann…
if(!(value > 7)) Wenn value nicht größer als 7 (also kleiner oder gleich 7) ist , dann…

Schachteln von Abfragen

If-Abfragen kann man auch schachteln:

public class ConditionalPrinter {
 
    public static void main(String[] args) {
        int value = 7;
        if (value >= 0) {
            if (value < 10) {
                System.out.println("value ist eine positive, einstellige Zahl!");
            }
            else {
                System.out.println("value ist positiv, aber KEINE einstellige Zahl!");
            }
        } else {
            System.out.println("value ist KEINE positive Zahl!");
        }
    }
}

Die booleschen Vergleichsoperatoren (==, !=, > usw.) funktionieren genauso wie mathematische Operatoren: Es wird ein Ergebnis zurückgeliefert, das entweder false oder true ist.

Boolische Ausdrücke verknüpfen

Das vorherige Beispiel zeigt ein neues Problem auf, um das wir uns noch schnell kümmern wollen: Wir stellen zwei Fragen, die eigentlich zusammen gehören, um eine Entscheidung zu treffen. Weil wir zwei Fragen stellen, bekommen wir auch zwei Möglichkeiten, die Antwort false zu erhalten. Interessiert uns nur das positive Ergebnis, ist es unnötig beide negativen Fälle getrennt zu behandeln.

Um diese beiden Fragen zusammenzuführen, müssen wir sie zu einer großen Frage verknüpfen. Diese Verknüpfung von Ausdrücken nennt man Junktion.

In Java werden zwei Junktoren verwendet: das logische Und (auch logische Multiplikation) und das logische Oder (auch logische Addition genannt). Die Operatoren heißen hier && und || und sie geben wieder einen booleschen Wert zurück.

Im obenstehenden Beispiel muss ein Wert größer gleich 0 sein UND die der Wert muss kleiner als '9' sein oder der '9' entsprechen, dann ist es eine Ziffer, sonst nicht.

Der &&-Operator liefert nur dann true, wenn beide Ausdrücke links und rechts true ergeben, sonst false - einer reicht nicht. Der ||-Operator hingegen liefert true wenn mindestens einer der beiden Ausdrücke true ergibt - hier reicht eine Seite.

Formulieren wir das Programm in Java:

public class ConditionalPrinter {
 
    public static void main(String[] args) {
        int value = 7;
        if (value >= 0 && value < 10) {
            System.out.println("value ist eine positive, einstellige Zahl!");
        } else {
            System.out.println("value ist KEINE positive, einstellige Zahl!");
        }
    }
}

Da wir nur noch eine Frage haben, müssen wir uns auch nur noch um einen Then-Part und einen Else-Part kümmern, die Wiederholung fällt damit weg.

Wenn wir die Frage andersherum formulieren, drehen sich alle Operatoren um: Wenn der Wert kleiner als '0' ist ODER größer gleich 10, dann ist es keine Ziffer, sonst ist es eine Ziffer:

public class ConditionalPrinter {
 
    public static void main(String[] args) {
        int value = 7;
        if (value < 0 || value >= 10) {
            System.out.println("value ist KEINE positive, einstellige Zahl!");
        } else {
            System.out.println("value ist eine positive, einstellige Zahl!");
        }
    }
}

Man sollte Fragen so formulieren, dass sie leicht verständlich sind.

if(value >= 0 && value < 10)

entspricht

if(!(value < 0 || value >= 10))

aber die erste Variante ist für die meisten vermutlich leichter zu verstehen.

Ziel dieser Lektion

Du solltest nun wissen, wann ein Wert als true (wahr) interpretiert wird und wann als false (falsch) und Du kannst boolische Ausdrücke mit Vergleichen und Negationen formulieren. Du solltest Abfragen machen können und boolische Werte miteinander verknüpfen können, um aufwendigere Abfrage zusammen zu fassen.

Nimm Dir etwas Zeit, um einige kleine Programme mit Vergleichen zu schreiben, auszuprobieren und die Resultate nachzuvollziehen.

Danach schauen wir uns in der nächsten Lektion Wiederholungen an.