Keylearnings:
- Was ist eine Kontrollstruktur?
- Fallunterscheidung mit der if..then.. else Anweisung.
- Was sind Bedingungen?
- Verknüpfung über den UND und ODER Operator.
- Fallunterscheidung mit der Switch Anweisung.
Nachdem wir bereits über Variablen gesprochen haben, werden wir uns jetzt den Kontrollstrukturen zu wenden. Erst diese ermöglichen es uns spannende Programme zu schreiben.
Denn erst durch Kontrollstrukturen können wir bei der Programmausführung auf die Eingabedaten und das Anwenderverhalten reagieren.
Was geht dir bei folgender Aussage durch den Kopf?
Ein Programm ist eine Aneinanderreihung von Anweisungen, die der Computer ohne Rücksicht auf Verluste der Reihe nach ausführt.
Korrekt?
JEIN!! Denn das wäre ziemlich langweilig! Sieh dir Franka an!!
Franka’s Bohrmaschine kostet 199Euro.
Leider ist Franka gegen Monatsende immer ziemlich pleite und hat nur noch 100Euro (keinen Dispokredit) auf ihrem Girokonto.
Da Franka aber einen gut bezahlten Job als JAVA Programmiererin hat, hat sie zu Monatsbeginn immer ein gut gefülltes Bankkonto.
Ein Einkauf am Monatsende würde also zu einer Überziehung ihres Girokontos führen, wohingegen sie sich am Monatsanfang locker eine neue Bohrmaschine gönnen kann.
Die Verarbeitung des Zahlungsvorgang würde am Monatsanfang also ein anderes Ergebnis liefern als am Monatsende. Der Kauf der Bohrmaschine ist nur möglich, wenn die Bedingung „Franka hat mehr als 199Euro auf Ihrem Konto“ erfüllt ist.
Die if..then..else Anweisung
Für diesen Zweck kann in jeder höheren Programmiersprachen eine „Wenn … dann tue …. ansonsten tue das…“ (if..then..else
) Abfrage formuliert werden. Bei unserer Franka wäre das:
Wenn Kontostand größer als 199Euro, dann „Franka freut sich über eine neue Bohrmaschine“ ansonsten „Franka ist sehr traurig, da sie so gerne eine neue Bohrmaschine haben möchte“.
Die Implementierung einer solchen Kontrollstruktur unterscheidet sich von Programmiersprache zu Programmiersprache ein wenig. In JAVA sieht das ganze folgendermaßen aus:
double ueberweisungsBetrag = 199; double aktuellerKontostand = 1500.99; if (aktuellerKontostand >= 199){ System.out.println("Franka freut sich über eine neue Bohrmaschine!"); }else{ System.out.println("Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt"); }
Na, kannst du erraten was das Programm macht?
Richtig! Das Programm gibt den Text „Franka freut sich über eine neue Bohrmaschine!“ auf dem Bildschirm aus.
In den ersten beiden Zeilen deklarieren wir zwei Variablen ueberweisungsBetrag
und aktuellerKontostand
, in denen wir den Preis der Bohrmaschine (199Euro) und den aktuellen Kontostand (1500,99Euro) speichern.
Erst in Zeile drei fängt der Spaß so richtig an!
Hier verwenden wir eine if..then..else
Anweisung um zu überprüfen, ob Franka’s Kontostand größer oder gleich dem Überweisungsbetrag ist.
Die Bedingung aktuellerKontostand >= 199
, die wir testen müssen, steht zwischen den runden Klammern direkt hinter dem if
.
Ist diese Bedingung erfüllt (was in unserem Beispiel der Fall ist) wird der Programmcode ausgeführt, der sich zwischen dem ersten Paar von geschweiften Klammern befindet. -Wir reden hier auch gerne vom sogenannten Anweisungsblock.- In unserem Beispiel ist dies die Anweisung System.out.println("Franka freut sich über eine neue Bohrmaschine!")
.
Hätte Franka nur noch 102Euro auf ihrem Konto, dann wäre die Bedingung hinter dem if nicht erfüllt, deshalb würde der Programmcode nach dem else
, zwischen dem zweiten Paar geschweifter Klammern, ausgeführt werden. Die Bildschirmausgabe wäre dann "Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt"
.
Der else
Zweig ist optional und kann auch weggelassen werden. Wir sind nicht dazu verpflichtet eine alternative Verarbeitung anzugeben, falls die Bedingung hinter dem if
nicht erfüllt ist.
Übung: Wie muss das Programm sinnvoll geändert werden, damit die Bildschirmausgabe "Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt."
lautet (Vorschläge können gerne im Kommentarbereich veröffentlicht werden).
Kim, aber was machen wir, wenn Franka ihre Bohrmaschine einfach deshalb nicht bekommt, weil der Händler keine mehr auf Lager hat?
Ja! Super, du denkst wirklich mit! Glücklicherweise haben auch die Erfinder von Java an diesen Fall gedacht.
In einer if..then..else
Anweisung können wir Bedingungen miteinander Verknüpfen und in Gesamtheit auswerten.
Okay, ich gebe zu das hört sich im ersten Moment schrecklich kompliziert an, deshalb lass uns konkret werden. Schau dir folgenden Java Code an:
1: boolean lagerBestand = false; 2: double ueberweisungsBetrag = 199; 3: double aktuellerKontostand = 1500.99; 4: if (aktuellerKontostand >= 199 && lagerBestand == true){ 5: System.out.println("Franka freut sich über eine neue Bohrmaschine!"); 6: }else{ 7: System.out.println("Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt."); 8: }
Wir verwenden gleich in der ersten Zeile einen Datentyp, der uns bisher noch nicht begegnet ist. Nämlich den Datentyp boolean
. Dieser Datentyp ist ein Wahrheitswert, der nur die Werte true
oder false
annehmen kann.
Um festzulegen, dass Franka’s Bohrmaschinendealer keine Ware mehr auf Lager hat, setzen wir gleich in der ersten Zeile den booleschen Wert lagerBestand
auf false
.
Welche Ausgabe erwartest du?
Nun, die Ausgabe hängt von der Gültigkeit der Bedingung in Zeile 4 ab. Hier verwenden wir den UND Verknüpfungsoperator &&
(keine Angst die Operatoren haben einen eigenen Artikel verdient).
Der UND Operator ist wahr, wenn alle durch diesen Operator verknüpften Teilbedingungen wahr sind. Okay zugegeben, auch das klingt wieder chinesisch.
Aber gemach gemach! Sehen wir uns Zeile vier mal genauer an. In der if..then..else
Anweisung kommen die beiden Teilbedingungen aktuellerKontostand >= 199
und lagerBestand == true
vor.
Da wir aktuellerKontostand
mit dem Wert 1500.99 initialisiert haben, ist die erste Bedingung offenbar wahr. Den Wahrheitswert lagerBestand
haben wir allerdings mit false
initialisiert, weshalb die zweite Bedingung unerfüllt ist.
Weil aber die &&
Verknüpfung nur dann wahr ist, wenn beide Teilbedingungen erfüllt sind, wird die Anweisung in dem else
Zweig ausgeführt. Die Ausgabe auf dem Bildschirm ist also "Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt."
.
Anmerkung: Lass dich bitte nicht verwirren! Das doppelte Gleichheitszeichen in Zeile 4 ist kein Druckfehler. In Java wird, der Exaktheit wegen, zwischen dem Vergleichsoperator ==
, mit dem wir überprüfen können, ob zwei Werte gleich sind, und dem Zuweisungsoperator =,
mit dem man einer Variablen einen Wert zuweisen kann unterschieden.
Übung: Wie muss obiges Programm geändert werden, damit die Ausgabe „Franka freut sich über eine neue Bohrmaschine!“ lautet?
Kim, gibt es neben dem UND auch noch andere Verknüpfungen?
Darauf kannst du wetten! Natürlich gibt es neben der UND auch eine ODER Verknüpfung und hier wird es richtig interessant. Schau dir mal folgenden Programmcode an:
1: boolean lagerBestand = false; 2: double ueberweisungsBetrag = 199; 3: double aktuellerKontostand = 1500.99; 4: if (aktuellerKontostand < 199 || lagerBestand == false){ 5: System.out.println("Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt."); 7:}else{ 8: System.out.println("Franka freut sich über eine neue Bohrmaschine!"); }
Das ist eine leicht abgewandelte Version unseres Ausgangsprogramms. Zum einen haben wir die Bildschirmausgaben in den Zeilen fünf und acht miteinander vertauscht.
Viel interessanter ist jedoch Zeile vier. Hier verwenden wir den ODER Verknüpfungsoperator ||
. Dieser ist wahr, wenn mindestens eine der Teilbedingungen aktuellerKontostand <= 199
und lagerBestand == false
erfüllt ist.
Kannst du die Ausgabe des Programms erraten?
Okay, gehen wir das Programm Schritt für Schritt durch.
Wir haben die Variable aktuellerKontostand
mit dem Wert 1500.99
initialisiert, weshalb die Bedingung aktuellerKontostand <= 199
nicht erfüllt ist.
Da aber bei der ODER Verknüpfung nur eine einzige Teilbedingung erfüllt sein muss, rettet uns die zweite Bedingung lagerBestand == false
. Diese ist nämlich erfüllt, da wir lagerBestand
mit dem Wert false
initialisiert haben.
Somit ist die Bedingung in der if..then..else
-Anweisung wahr und die Programmcode-Zeile fünf, die zu der Bildschirmausgabe "Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt."
wird ausgeführt.
Lass uns nochmal das übliche Spielchen spielen. Wie ist die Kontrollstruktur abzuändern, damit die Ausgabe "Franka freut sich über eine neue Bohrmaschine!"
lautet? Vorschläge kannst du gerne im Kommentarbereich veröffentlichen.
Natürlich können wir auch mehr als zwei Teilbedingungen verknüpfen.
Franka kauft Bohrmaschinen grundsätzlich nur im Sonderangebot!
Um dem gerecht zu werden müssen wir lediglich eine weitere Variable istSchnaeppchen
hinzufügen und die if..then..else
Anweisung in Zeile vier um eine weitere Bedingung erweitern. Und das geht so!
1: boolean lagerBestand = false; 2: boolean istSchnaeppchen = false; 3: double ueberweisungsBetrag = 199; 4: double aktuellerKontostand = 1500.99; 5: if (aktuellerKontostand <= 199 || lagerBestand == false || istSchnaeppchen == false){ 6: System.out.println("Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt."); 7:}else{ 8: System.out.println("Franka freut sich über eine neue Bohrmaschine!"); }
In den runden Klammern der if..then..else
-Anweisung in Zeile fünf müssen wir also einfach die Teilbedingung istSchnaeppchen == false
über den ODER Operator an die bereits vorhandenen Teilbedingungen dranhängen. Easy, oder?
Die Ausgabe des Programms ist "Franka ist sehr traurig, weil sie keine Bohrmaschine bekommt."
, wenn nicht genügend Geld auf Franka’s Konto ist, kein Lagerbestand vorhanden ist oder die Bohrmaschine nicht als Schnäppchen gekauft werden kann, d.h. mindestens eine der Bedingungen aktuellerKontostand <= 199
,lagerBestand == false
oder istSchnaeppchen == false
erfüllt ist.
Aufgrund unserer Initialisierung der Variablen wird Zeile sechs ausgeführt.
STOP! Bevor du weiterliest. Welche der Teilbedingungen müssen wahr sein bzw. dürfen nicht erfüllt sein, damit die Ausgabe „Franka freut sich über eine neue Bohrmaschine!“ lautet?
Jepp, das war gemein! Hier die Lösung:
Nur wenn Franka genug Geld auf dem Konto hat, das Lager des Händlers mit Bohrmaschinen gefüllt ist und diese im Sonderangebot verkauft werden, d.h. keine der Teilbedingung erfüllt ist, lautet die Programmausgabe „Franka freut sich über eine neue Bohrmaschine!“.
Es ist sogar möglich den UND und den ODER Operator in ein und derselben Bedingung zu verwenden, d.h. wir können eine Bedingung der Form (Teilbedingung 1||Teilbedingung 2 && Teilbedingung 3
) formulieren.
Hierbei gibt es allerdings einige Regeln bei der Abarbeitungsreihenfolge der Operatoren zu beachten (so wie die Punkt vor Strichrechnung in der Mathematik), deshalb werden wir dieser Thematik einen eigenen Artikel widmen.
Im Fall, dass die Sonne scheint, es regnet oder schneit…
Wir werden häufig in der Situation sein auf verschiedene Fälle unterschiedlich reagieren zu müssen.
Wenn es regnet braucht Franka einen Regenschirm, wenn die Sonne scheint einen Sonnenhut und wenn es schneit eine Tüte Streusalz.
Natürlich könnten wir jetzt mittels mehrerer if..then..else
Anweisungen jeden Fall einzeln behandeln.
//1:Regen 2: Sonne 3:Schnee int wetter = 1; if (wetter == 1){ System.out.println("Franka braucht einen Regenschirm!"); } if (wetter == 2){ System.out.println("Franka braucht einen Sonnenhut!"); } if (wetter == 3){ System.out.println("Franka braucht eine Tüte Streusalz!"); }
Die unterschiedlichen Wetterlagen repräsentieren wir der Einfachheit wegen durch den Integerwert wetter
. Die Variable wetter
hat den Wert 1, wenn es regnet, den Wert 2, wenn die Sonne scheint und den Wert 3, wenn es schneit.
In den drei if..then..else
-Anweisungen überprüfen wir, welchen Wert die Variable wetter
hat und geben in Abhängigkeit hiervon die Information darüber, welchen Gegenstand Franka benötigt auf dem Bildschirm aus.
Da wir die Variable wetter
mit dem Wert 1 initialisiert haben, regnet es und die Ausgabe des Programms ist Franka braucht einen Regenschirm!
.
Die switch Anweisung
Was würde passieren, wenn die Variable wetter
einen anderen Wert als 1,2 oder 3 annimmt?
In diesem Fall würde unser Programm einfach garnichts machen.
Um diesen Fall eleganter abzufangen könnten wir natürlich noch eine weitere if..then..else
Anweisung hinzufügen, die den Fall behandelt, dass die Variable wetter
einen Wert größer drei bzw. kleiner als eins annimmt. Das würde folgendermaßen aussehen:
if (wetter < 1 || wetter > 3){ System.out.println("Unbekanntes Wetter!"); }
Durch diese Ergänzung wird, wenn die Variable wetter
einen Wert kleiner als eins oder größer drei hat die Meldung "Unbekanntes Wetter!"
ausgegeben.
Allerdings bietet uns Java mit der switch Anweisung eine weitaus schönere Möglichkeit einen solchen Fall abzufangen. Das sollten wir uns unbedingt genauer ansehen.
//1:Regen 2: Sonne 3:Schnee 1: int wetter = 1; 2: switch(wetter){ 3: case 1: 4: System.out.println("Franka braucht einen Regenschirm!"); 5: break; 6: case 2: 7: System.out.println("Franka braucht einen Sonnenhut!"); 8: break; 9: case 3: 10: System.out.println("Franka braucht eine Tüte Streusalz"); 11: break; 12: default: 13: System.out.println("Unbekanntes Wetter!"); }
Das Ergebnis dieses Programmcode ist das gleiche wie bei unserem if..then..else
Konstrukt oben.
Da wir die Variable wetter
mit dem Wert 1 initialisert haben wird "Franka braucht einen Sonnenhut"
auf dem Bildschirm ausgegeben.
Bei einem Wert größer drei oder kleiner eins, ist die Ausgabe "Unbekanntes Wetter".
MAGIC!!!
Nein, mit Zauberei hat das nichts zu tun. In den runden Klammern hinter dem switch
in Zeile zwei, wird die Variable wetter
an die switch
Anweisung übergeben.
In den case
Blöcken in den Zeilen drei, sechs und neun, welche durch das Schlüsselwort break
abgeschlossen werden, werden die Fälle abgearbeitet, wenn der Wert von wetter
1,2 oder 3 ist.
Der Fall, dass die Variable wetter
einen Wert kleiner eins bzw. größer drei hat, wird in dem Block, der in Zeile zwölf mit dem Schlüsselwort default
anfängt abgehandelt.
Da wir wetter
mit eins initialisiert haben, wird die Anweisung im ersten case
-Block, der in Zeile drei beginnt ausgeführt.
Die Ausgabe ist also Franka braucht einen Regenschirm!
.
Puh, das war eine Menge Stoff!
Im nächsten Artikel, werden wir uns einer anderen wichtigen Kontrollstruktur zu wenden. Den sogenannten Schleifen, die es uns ermöglichen eine Anweisung bequem mehrfach auszuführen.
Wie immer freue ich mich über deine Fragen im Kommentarbereich!
Hat dir der Artikel gefallen?
Travna
12. September 2018 at 11:02Falsch:
if (aktuellerKontostand <= 199 || lagerBestand == false)
Richtig:
if (aktuellerKontostand < 199 || lagerBestand == false)
Kim Peter
16. September 2018 at 12:09Da hast du natürlich recht. Danke für den Hinweis! Ich habe es angepasst.
Sidney
7. Februar 2020 at 11:49Franka brauch einen sonnenhut? hä? Brauch Sie beim „int = 1“ nicht eigentlich einen Regenschirm?
Kim Peter
10. Februar 2020 at 21:18Hallo Sidney, ja, das ist korrekt wetter = 1 bedeutet Franka braucht einen Regenschirm.
Choose a style: