Bedingungen
Kurz gesagt: Mit einer Bedingung wählt das Programm aus, was es tut: if führt einen Block nur aus, wenn der Vergleich wahr ist, else gibt den anderen Weg vor, und switch wählt zwischen vielen Werten.
Problem
Die Lieferung, die es nicht geben sollte
Ein Onlineshop verspricht kostenlose Lieferung für Bestellungen ab 50 €. Unter 50 € kostet die Lieferung 4,99 €. Die Bestellung liegt bei 62 €, und das Programm rechnet trotzdem die Lieferung dazu:
double total = 62.0;double shipping = 4.99;System.out.println("Zu zahlen: " + (total + shipping) + " €");Zu zahlen: 66.99 €Das Programm führt jede Zeile aus, eine nach der anderen. Hier muss es aber auswählen: in einem Fall die eine Zeile, im anderen Fall eine andere.
Die Idee
Ein Vergleich antwortet mit ja oder nein
Zuerst muss das Programm fragen: Ist die Summe 50 € oder mehr? Dafür gibt es Vergleichsoperatoren. Ihre Antwort ist keine Zahl, sondern true (wahr) oder false (falsch): ein Wert vom Typ boolean.
double total = 62.0;System.out.println(total >= 50);System.out.println(total == 50);System.out.println(total != 50);truefalsetrue| Du schreibst | Es fragt |
|---|---|
a > b, a < b |
größer, kleiner |
a >= b, a <= b |
größer oder gleich, kleiner oder gleich |
a == b |
sind sie gleich |
a != b |
sind sie verschieden |
Pass auf: == vergleicht, und = speichert einen Wert. total == 50 fragt, ob die Summe 50 ist, und total = 50 setzt sie auf 50.
Text wird in Java nicht mit == verglichen, sondern mit .equals:
String answer = "ja";boolean yes = answer.equals("ja");System.out.println(yes);true== funktioniert bei Text manchmal und manchmal nicht. Warum, erfährst du in der Lektion über Text. Bis dahin gilt: Text immer mit .equals.
Genauer, für Neugierige
Kommazahlen sind selten genau gleich. Der Computer speichert 0.1 und 0.2 nur ungefähr, deshalb ist ihre Summe nicht genau 0.3:
System.out.println(0.1 + 0.2 == 0.3);System.out.println(0.1 + 0.2);false0.30000000000000004Bei Kommazahlen fragst du besser, ob sie nah genug beieinander liegen: Math.abs(a - b) < 0.000001. Vergleiche mit > und < haben dieses Problem nicht.
Die Idee
if und else: einer von zwei Wegen
Jetzt kann das Programm auswählen. if prüft die Bedingung in den Klammern. Ist sie wahr, führt es den Block danach aus. Ist sie es nicht, führt es den Block nach else aus:
double total = 62.0;double shipping;if (total >= 50) { shipping = 0;} else { shipping = 4.99;}System.out.println("Lieferung: " + shipping + " €");Lieferung: 0.0 €Bei einer Bestellung von 18,50 € gibt dasselbe Programm Lieferung: 4.99 € aus. Es wird nur einer der Blöcke ausgeführt, nie beide.
else ist nicht Pflicht. Ohne else wird der Block übersprungen, wenn die Bedingung nicht wahr ist, und das Programm macht danach weiter.
Genauer, für Neugierige
- Wenn der Block nur eine Zeile hat, kannst du die Klammern
{ }weglassen. Tu es nicht: Sobald du eine zweite Zeile hinzufügst, steht sie außerhalb desif, und die Einrückung täuscht dich, als wäre sie drinnen. - Die Bedingung muss ein
booleansein. Deshalb lässt sichif (total)nicht kompilieren, undif (total = 50)auch nicht:=speichert einen Wert und liefert eine Zahl, kein Ja oder Nein.
Probier es aus
Eine Bestellung über dem Lagerbestand
Im Lager sind 3 Stück, und der Kunde bestellt 5.
Was gibt das Programm aus?
int stock = 3;int ordered = 5;if (ordered > stock) { System.out.println("Nicht genug auf Lager"); ordered = stock;}System.out.println("Wir versenden " + ordered + " Stück");5 > 3 ist wahr, also wird der Block ausgeführt: Er gibt die Meldung aus und senkt die Bestellung auf 3. Die letzte Zeile steht nach dem Block und wird immer ausgeführt.
Die Idee
else if: mehr als zwei Wege
Eine Lehrerin macht aus den Punkten eines Tests eine Note. Es gibt vier Möglichkeiten. Du setzt ein if hinter das else:
int points = 76;if (points >= 90) { System.out.println("Ausgezeichnet");} else if (points >= 75) { System.out.println("Sehr gut");} else if (points >= 50) { System.out.println("Gut");} else { System.out.println("Ungenügend");}Sehr gutDie Prüfungen laufen von oben nach unten. Ausgeführt wird der erste Zweig mit einer wahren Bedingung, die anderen werden übersprungen. 76 ist nicht >= 90, aber >= 75, also ist es „Sehr gut“. Bis zu >= 50 kommt das Programm nie, obwohl auch das wahr ist.
Deshalb ist die Reihenfolge wichtig: Die strengste Bedingung kommt zuerst. Stünde points >= 50 ganz oben, bekäme jeder mit 50 Punkten oder mehr „Gut“.
int points = 76;if (points >= 90) { System.out.println("Ausgezeichnet");} else if (points >= 75) { System.out.println("Sehr gut");} else if (points >= 50) { System.out.println("Gut");} else { System.out.println("Ungenügend");}Schritt für Schritt, in Worten
- points ist 76.
- 76 >= 90? Nein. Der Zweig „Ausgezeichnet“ wird übersprungen.
- 76 >= 75? Ja. Wir gehen in den Zweig „Sehr gut“.
- Ausgegeben wird „Sehr gut“.
- Auch 76 >= 50 ist wahr, wird aber nicht geprüft. Die Kette endet beim ersten wahren Zweig.
Probier es aus
Finde den Fehler
Jeder mit 90 Punkten oder mehr bekommt „Ausgezeichnet“. Ein Schüler mit genau 90 Punkten bekommt „Sehr gut“. In welcher Zeile ist der Fehler?
Wähle die Zeile mit dem Fehler.
points > 90 lässt genau die 90 aus. Richtig ist points >= 90. Solche Fehler „um eins daneben“ sind häufig: Wenn die Bedingung „ab … aufwärts“ lautet, prüf, was genau an der Grenze passiert.
Die Idee
Und, oder, nicht
Das Kino gibt Kindern und Studierenden ein ermäßigtes Ticket. Es gibt zwei Bedingungen, und eine reicht. Du verbindest sie mit logischen Operatoren:
int age = 16;boolean student = false;if (age < 18 || student) { System.out.println("Ermäßigtes Ticket: 6 €");} else { System.out.println("Ticket: 10 €");}Ermäßigtes Ticket: 6 €a && bist wahr, wenn beide wahr sind („und“).a || bist wahr, wenn mindestens eine wahr ist („oder“).!aist wahr, wennanicht wahr ist („nicht“):!student.
Kostenlose Lieferung ab 50 € und nur in der Stadt ist total >= 50 && inCity. Eine Zahl liegt zwischen 1 und 12, wenn month >= 1 && month <= 12. Die Schreibweise 1 <= month <= 12 aus der Mathematik funktioniert hier nicht.
Genauer, für Neugierige
- Wenn der linke Operand die Antwort schon entscheidet, wird der rechte nicht geprüft: bei
false && …und beitrue || …. Das heißt Kurzschlussauswertung und schützt manchmal vor einem Fehler:count != 0 && total / count > 10teilt nie durch 0. &&kommt vor||, so wie*vor+. Wenn du sie mischst, setz Klammern, damit es klar lesbar ist:(a && b) || c.- Eine Bedingung kann auch in einem anderen
ifstehen. Das ist ein verschachteltesif. Dieser Code ist dasselbe wieif (total >= 50 && inCity):
if (total >= 50) { if (inCity) { shipping = 0; }}Probier es aus
Durch 5 und durch 7
Was gehört in die Lücke, damit die Bedingung nur für Zahlen wahr ist, die sowohl durch 5 als auch durch 7 teilbar sind?
int number = 35;
if (number % 5 == 0 number % 7 == 0) {
System.out.println("Durch 5 und durch 7 teilbar");
}&&: Beide Prüfungen müssen wahr sein. Mit || würde eine reichen, und 10 käme auch durch.Die Idee
Der ternäre Operator ? :
Manchmal ist das ganze if nur dazu da, einen von zwei Werten auszuwählen. Dafür gibt es eine Kurzform, den ternären Operator (er hat drei Teile):
int points = 76;String message = points >= 50 ? "Du hast bestanden!" : "Leider nicht bestanden.";System.out.println(message);Du hast bestanden!Du liest ihn so: Bedingung ? Wert, wenn sie wahr ist, : Wert, wenn nicht. Dasselbe mit if und else braucht mehrere Zeilen, hier ist es eine.
Nimm ihn, um einen Wert auszuwählen. Wenn das Programm in den beiden Fällen verschiedene Dinge tun soll, schreib if.
Genauer, für Neugierige
- Die beiden Werte müssen von verträglichem Typ sein: Der eine kann nicht Text und der andere eine Zahl sein.
- Ternäre Operatoren lassen sich ineinander verschachteln, aber solcher Code ist schwer zu lesen. Für drei oder mehr Möglichkeiten schreib
else if.
Die Idee
switch: Auswahl nach Wert
Der Shop hat werktags von 9:00 bis 18:00 geöffnet, am Samstag bis 14:00, und am Sonntag ist er geschlossen. Wenn der Tag eine Zahl ist (1 ist Montag, 7 ist Sonntag), vergleichst du sie mit mehreren genauen Werten. Dafür gibt es switch:
int day = 6;switch (day) { case 6: System.out.println("10:00–14:00"); break; case 7: System.out.println("Geschlossen"); break; default: System.out.println("9:00–18:00");}10:00–14:00switchnimmt den Wert in den Klammern und springt zumcasemit demselben Wert.breakbeendet dasswitch. Ohnebreakläuft die Ausführung im nächstencaseweiter.defaultist für alle anderen Werte da, wie das letzteelse.- Mehrere Werte mit derselben Aktion schreibst du untereinander:
case 6:und direkt danachcase 7:.
switch funktioniert mit ganzen Zahlen, Zeichen und Text. Für Prüfungen wie „ab 50 aufwärts“ schreib if.
Genauer, für Neugierige
- Wenn du
breakvergisst, „fällt“ die Ausführung ohne Prüfung in den nächstencase„durch“. Bei Tag 6 werden zwei Zeilen ausgegeben:
int day = 6;switch (day) { case 6: System.out.println("10:00–14:00"); case 7: System.out.println("Geschlossen"); break; default: System.out.println("9:00–18:00");}10:00–14:00Geschlossen- Seit Java 14 gibt es auch eine Schreibweise mit Pfeil. Damit fällt nichts durch, und du brauchst kein
break. Außerdem kannswitchdann einen Wert liefern, wie der ternäre Operator. Mehrere Werte schreibst du mit Komma:case 6, 7 ->.
int day = 6;String hours = switch (day) { case 6 -> "10:00–14:00"; case 7 -> "Geschlossen"; default -> "9:00–18:00";};System.out.println(hours);10:00–14:00Übung
Programme, die auswählen
Löse die Aufgaben in deinem Editor. Jede Zahl der Eingabe steht in einer eigenen Zeile. Probier jede Lösung auch mit einer Eingabe aus, die durch die anderen Zweige läuft.
1. Eine Kinokarte. Lies das Alter ein. Bis 6 Jahre ist der Eintritt frei, bis 17 kostet das Ticket 6 €, bis 64 kostet es 10 €, ab 65 kostet es 5 €. Ein negatives Alter ist ein Fehler.
15Das Ticket kostet 6 €2. Ein Mini-Taschenrechner. Lies eine Zahl, eine Operation (+, -, * oder /) und eine zweite Zahl ein. Wähle die Rechnung mit switch nach dem Text der Operation aus. Durch 0 darf nicht geteilt werden.
12/5Ergebnis: 2.43. Eine quadratische Gleichung. Lies a, b und c aus ax² + bx + c = 0 ein. Die Diskriminante ist D = b² − 4ac. Ist D positiv, gibt es zwei Lösungen: (−b ± √D) / 2a. Ist D gleich 0, gibt es eine Lösung: −b / 2a. Ist D negativ, gibt es keine reellen Lösungen. Ist a = 0, ist die Gleichung nicht quadratisch.
1-32x1 = 2.00, x2 = 1.004. Ein gültiges Datum. Lies einen Tag, einen Monat und ein Jahr ein und sag, ob es das Datum gibt. Die Anzahl der Tage im Monat findest du mit switch heraus. Der Februar hat in einem Schaltjahr 29 Tage: Das Jahr ist durch 4 teilbar, aber nicht durch 100, oder es ist durch 400 teilbar.
2922023Ungültiges DatumFür 29, 2, 2024 lautet die Ausgabe Gültiges Datum.
Weitere Aufgaben
- Gerade oder ungerade. Für 7:
Ungerade. - Positiv, negativ oder null. Für −5:
Negativ. - Größer als 10. Für 15:
Größer als 10. - Sind sie gleich. Lies zwei Zahlen ein. Für 5 und 5:
Gleich. - Die größere von zwei. Lies zwei Zahlen ein und gib die größere aus. Mach es einmal mit
ifund einmal mit? :. - Betrag. Ohne
Math.abs: Wenn die Zahl negativ ist, kehr ihr Vorzeichen um. - Ja oder nein. Lies einen Text ein. Gib
truefür „ja“ aus,falsefür „nein“ undAntwort nicht verstandenfür alles andere. - Durch 5 und durch 7. Sag, ob die Zahl sowohl durch 5 als auch durch 7 teilbar ist. Für 35: ja, für 10: nein.
- Drei Zahlen aufsteigend. Lies drei Zahlen ein und gib sie von der kleinsten bis zur größten aus. Für 7, 2, 5:
2 5 7. - Die kleinste und die größte von fünf. Lies fünf Zahlen in fünf Variablen ein. Merk dir die erste als kleinste und als größte und vergleiche dann jede weitere damit.
- Wochentag. Lies eine Zahl von 1 bis 7 ein und gib den Tag aus:
1istMontag. Für eine andere Zahl:Diesen Tag gibt es nicht. Probier es mitswitch. - Altersgruppe. Bis 12 Jahre ist man ein Kind, bis 19 ein Teenager, sonst erwachsen.
- Jahreszeit nach Monat. Dezember, Januar und Februar sind Winter, März bis Mai ist Frühling und so weiter. Für 4:
Frühling. Mit switch schreibst du mehrere case untereinander. - Ist es ein Dreieck. Drei Seiten bilden ein Dreieck, wenn die Summe von je zwei größer ist als die dritte. Für 3, 4, 5: ja, für 1, 2, 3: nein.
- Eine Note in Worten. Lies eine Note von 2 bis 6 ein und gib
Ungenügend,Ausreichend,Gut,Sehr gutoderAusgezeichnetaus. - Errate das Tier. Das Programm stellt Fragen, die man mit „ja“ oder „nein“ beantwortet, und errät, an welches Tier du denkst. Beginne mit einer Begrüßung und einer kurzen Erklärung des Spiels. Du kannst alle Fragen stellen und dann mit
else ifentscheiden, oder du fragst mit verschachteltenifnur, was du brauchst. Die Fragen:
| Frage | Bei „ja“ | Bei „nein“ |
|---|---|---|
| Fliegt es? | ein Vogel oder ein Insekt | weiter |
| Hat es Federn? | ein Vogel | wenn es fliegt, ein Insekt |
| Schwimmt es? | wenn es nicht fliegt: ein Fisch oder ein kleines Wassersäugetier | weiter |
| Miaut es? | eine Katze | keine Katze |
| Hat es Fell? | ein Hund, eine Katze oder ein anderes Säugetier | eine Eidechse oder ein anderes Reptil |
| Ist es grün? | wenn es weder fliegt noch schwimmt: ein Frosch oder eine Eidechse | weiter |
| Brüllt es? | eine Kuh oder ein Löwe | weiter |
| Hat es einen Rüssel? | ein Elefant | weiter |
Ein Beispiel (die Eingabe ist die Antwort auf jede Frage, der Reihe nach):
neinneinneinjajaneinneinneinDenk dir ein Tier aus. Ich stelle dir 8 Fragen. Antworte mit ja oder nein.Fliegt es?Hat es Federn?Schwimmt es?Miaut es?Hat es Fell?Ist es grün?Brüllt es?Hat es einen Rüssel?Ich glaube, es ist eine Katze.Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Dein erstes Programm · Variablen und Typen · Eingabe und Ausgabe · Operatoren und Arithmetik
- Geht weiter in: Schleifen · Arrays · Zweidimensionale Arrays · Strings: mit Text arbeiten
- Aufgaben zum Thema: Sprachgrundlagen