Um was geht es?
Verzweigungen machen es möglich, dass der Ablauf eines Programms verschiedene Wege gehen kann. Verzweigungen gehören (neben den Schleifen) zu den Kontrollstrukturen, ohne die komplexere Programme überhaupt nicht möglich wären.
// Schnelles Code-Beispiel
$preis = 500;
if ($preis <= 1000) {
echo "gekauft!";
}
else{
echo "zu teuer!!";
}
Die einfache if-Anweisung ist der erste Verzweigungstyp, den wir uns anschauen werden. Sie können sich das Prinzip dahinter mit der WENN-DANN-Logik merken:
Konkret sieht das so aus:
$akku = 21;
if($akku < 25){ //Prüfe den Ausruck
echo "ROT (niedrige Akkuladung)"; // wenn wahr: Führe das aus!
}
Wenn der Wert der Variablen $akku kleiner (<) ist als 25 (Prozent), dann führe folgende Anweisung aus: echo "ROT (niedrige Akkuladung)";
Eine if-Anweisung hat demnach folgende Struktur:
In unserem Beispiel handelt es sich beim Ausdruck $akku < 25 um eine wahre Aussage (true). Deshalb wird dann auch der Programmteil innerhalb der geschweiften Klammern ausgeführt.
Was würde dagegen geschehen, wenn $akku einen Wert von z.B. 30 hätte? Ganz genau: Garnichts!
Wenn wir nicht gerade einen booleschen Variable auf true oder false prüfen, benötigen wir Vergleichsoperatoren. Die Operatoren vergleichen zwei Operanden miteinander und liefern als Ergebnis einen booleschen Wert (true oder false). In einer if-Verzweigung entscheidet dieser Wert, welchen Weg das Programm gehen wird.
Eine Übersicht über die Vergleichsoperatoren erhalten Sie hier.
Stellen Sie sich ein Computerprogramm ruhig als einen Fluss mit Anfang und Ende vor. Wie in jedem Fluss, so gibt es auch in Computerprogrammen unterschiedliche Wege, auf dem der "Programmfluss" fließen kann. Welcher Weg das ist, hängt eben vom Ergebnis der Prüfung ab, die an der Verzweigung durchgeführt wird.
Der Programmfluss unseres Beispiels lässt sich in einem Aktivitätsdiagramm so darstellen:
In unserem Beispiel erhält der Benutzer eine Meldung, wenn der Akkustand geringer als 25 Prozent ist. Wenn das nicht der Fall ist, überspringt das Programm den if-Block einfach. Was aber ist, wenn die Akkuladung 25 Prozent oder mehr beträgt? Warum gibt es dann keine Anzeige?
Richtig ist: Wir haben bereits einen Code-Block für den Fall, dass die if-Prüfung true ist. Jetzt wollen wir auch eine Code-Alternative für den Fall, dass die Prüfung false ist.
Was wir jetzt brauchen ist eine if/else-Kontrollstruktur. Diese läuft nach folgender Logik ab:
Im konkreten Code sieht das so aus:
$akku = 21;
if($akku < 25){ //Prüfe den Ausruck
echo "ROT (niedrige Akkuladung)"; // wenn wahr: Führe das aus!
}
else{
echo "GRÜN (Akkuladung in Ordnung)"; // wenn false: Führe stattdessen das aus!
}
Direkt nach dem if-Code-Block setzen wir das Schlüsselwort else, gefolgt von einem Paar geschweifter Klammern { }. Der else-Block wird ausgeführt, wenn die Prüfung des Ausdrucks $akku < 25 false ergibt.
Das angepasste Aktivitätsdiagramm stellt sich wie folgt dar:
Wir können einzelne if/else-Anweisungen inneinander verschachteln. Das ist in der Praxis oftmals notwendig. Sehen Sie einmal hier:
$akku = 18;
$stromsparmodus = false;
if($akku < 25){ // Erstes if
echo "ROT (niedrige Akkuladung) ";
if($stromsparmodus){ // Zweites if
// Displayhellgkeit reduzieren
// bestimmte Apps deaktivieren
}
else{
echo "Ihr Akkuverauch ist hoch. Wechseln Sie in den Stromparmodus.";
}
}
else{
echo "GRÜN (Akkuladung in Ordnung)";
}
Innerhalb des ersten if-Blocks gibt es noch einmal ein separates (verschachteltes) if/else. Dahin kommen wir aber nur, wenn $akku < 25 ist. Es wird also nun in der zweiten if/else-Kontrollstruktur geprüft, ob die Variable $stromsparmodus auf true gesetzt ist. Ist das der Fall, werden bestimmte Stromsparmaßnahmen eingeleitet (Displayhelligkeit runter, Apps deaktivieren). Andernfalls (else) wird die echo-Anweisung ("Ihr Akkuverbrauch ist hoch...") ausgeführt.
Was glauben Sie wird im Browser angezeigt, wenn wir das Programm mit den Variablenwerten $akku = 18 und $stromsparmodus = false starten? Hier die Lösung:
ROT (niedrige Akkuladung)
Ihr Akkuverauch ist hoch. Wechseln Sie in den Stromparmodus.
Das nun deutlich komplizierter gewordene Flussdiagramm mahnt Sie bereits daran, es mit der Verschachtelung nicht zu übertreiben:
Jaja, schön und gut, Meister! Wir können jetzt mit Verzweigungen in zwei "Richtungen" arbeiten. Was aber, wenn wir mehr als zwei Alternativen benötigen?
Das ist überhaupt kein Problem mit der Merhfachverzweigung. Alles, was wir dazu benötigen, ist das Schlüsselwort-Paar else if. Dieses setzen wir nach dem ersten if-Block ein. Das Beste dabei ist: Wir können es mehrmals hintereinander einbauen:
$akku = 48;
if($akku < 25){
echo "ROT (niedrige Akkuladung)";
}
else if($akku < 50){
echo "GELB (mittlere Akkuladung)";
}
else if($akku < 99){
echo "GRÜN (gute Akkuladung)";
}
else{
echo "Akku 100% geladen.";
}
Es gibt nun insgesamt vier Möglichkeiten, wie der Code "fließen" kann. Genau wie beim "normalen" if am Anfang, so wird bei jedem else if ein Ausdruck in Klammern geprüft. Ergibt die Prüfung true, wird der dazugehörende Code innerhalb der geschweiften Klammern { } ausgeführt.
Da in unserem Beispiel die Variable $akku den Wert von 48 speichert, ergibt die die Prüfung $akku < 50 true. Somit wird der dritte Codeblock unserer Konstrollstruktur ausgeführt.
Die gesamte Kontrollstruktur wird übrigens sofort beendet, sobald eine der Prüfungen erstmals true ist. Das heißt: Wie in einer "normalen" if/else-Verzweigung gibt es auch in einer else if-Konstruktion immer nur einen Weg, den der Programmfluss gehen kann. Sobald eine Prüfung erstmals true ist, gibt es für die folgenden Codeblöcke keine Chance mehr, da es garnicht mehr zu einer weiteren Prüfung kommt.
Das Aktivitätsdiagramm sieht nun so aus:
Mit einigen else if können wir ganz gut arbeiten. Bei einer hohen Anzahl an Verzweigungen wird das aber schnell zu umständlich.
Verwenden Sie bei einer höheren Anzahl an Verzweigungen stattdessen den switch/ case-Kontrollmechanismus.
Damit können wir auf übersichtliche Weise eine Variable auf bestimmte Werte hin prüfen. So gehts:
//Beispieltablets aus dem Jahr 2017
$tablet = "iPad Pro";
switch($tablet){
case "iPad Pro":
echo "14 Stunden Akkulaufzeit beim Surfen";
break;
case "Amazon Fire HD":
echo "12 Stunden Akkulaufzeit beim Surfen";
break;
case "Lenovo Yoga Book":
echo "9,5 Stunden Akkulaufzeit beim Surfen";
break;
case "Huawei MediaPad":
echo "9 Stunden Akkulaufzeit beim Surfen";
break;
case "Asus ZenPad":
echo "8 Stunden Akkulaufzeit beim Surfen";
break;
default:
echo "Bitte gültiges Tablet eingeben";
}
Die switch-Anweisung besteht aus dem Schlüsselwort switch und einem Paar runder Klammern, in der die Variable ($tablet) steht, deren Wert wir überprüfen wollen.
Es folgt der Körper, der innerhalb geweifter Klammern { } steht. In diesem Bereich stehen nun alle möglichen Fälle aufgelistet. Je nach Fall (engl. case) wird eine bestimmte Anweisung ausgeführt. In unserem Fall (weil $tablet = "iPad Pro") ist das diese hier: echo "14 Stunden Akkulaufzeit beim Surfen";
Achten Sie auf die Syntax: Nach dem Schlüsselwort case folgt ein Doppelpunkt und dann die Anweisung.
Und was soll das komische break am Ende jedes cases bedeuten? Ganz einfach: Wenn ein case eingetroffen ist, bewirkt das anschließende break, dass die gesamte switch/ case-Kontrollstruktur sofort beendet wird. So sollte es in den meisten Fällen auch sein. Lassen Sie das break aber weg, werden alle folgenden cases zusätzlich ausgeführt, was hier natürlich gar keinen Sinn macht.
Am Ende sehen Sie noch die default-Anweisung. Sie wird nur dann ausgeführt, wenn keiner der cases ein "Treffer" war. Die Anweisung ist praktisch, kann aber auch ganz weggelassen werden kann.
Das allgemeine Diagramm für einen switch case-Kontrollmechanismus sehen Sie hier:
Java Basics
[Java einrichten] [Variablen] [Primitive Datentypen] [Operatoren] [if else] [switch-case] [Arrays] [Schleifen]
Objektorientierung
[Einstieg] [Variablen ] [Konstruktor] [Methoden] [Rekursion] [Statische Member] [Initializer] [Pass-by-value] [Objektsammlungen] [Objektinteraktion] [Objekte löschen]
Klassenbibliothek
[Allgemeines] [String ] [Math] [Wrapper] [Scanner] [java.util.Arrays] [Date-Time-API]
Vererbung
[Einstieg Vererbung] [Konstruktoren bei Vererbung ] [Der protected Zugriffsmodifikator] [Abstrakte Klassen und Methoden] [Polymorphie in Java] [Typumwandlung] [Die Klasse Object] [Die toString()-Methode] [Objekte vergleichen] [Was ist ein Interface?]