Logische Ausdrücke
Die Schaltjahrregel war umständlich, weil du drei verschachtelte Fälle brauchtest. Mit logischen Operatoren verknüpfst du mehrere Bedingungen zu einer einzigen.
Wahrheitswerte sind Werte
Eine Bedingung ist nichts Besonderes – sie ist ein Ausdruck vom Typ boolean. Man kann sie in einer Variablen speichern.
alter >= 18 ist ein Ausdruck, der zu true oder false ausgewertet wird – genau wie 3 + 4 zu 7 ausgewertet wird.
Deshalb schreibt man nicht if (volljaehrig == true). Das ist zwar richtig, aber überflüssig: if (volljaehrig) sagt dasselbe.
Und, oder, nicht
Aus dem Unterricht kennst du vielleicht schon die Logikgatter UND, ODER und NICHT. In Java heißen sie so:
| Operator | Name | wahr, wenn … |
|---|---|---|
&& |
UND (Konjunktion) | beide Bedingungen wahr sind |
|| |
ODER (Disjunktion) | mindestens eine Bedingung wahr ist |
! |
NICHT (Negation) | die Bedingung falsch ist |
Das ODER in der Informatik ist immer ein einschließendes Oder: „a oder b oder beides“.
Wahrheitstafel
Fülle die Tabelle auf Papier aus, bevor du sie mit dem Programm überprüfst.
| a | b | a && b | a || b | !a |
|---|---|---|---|---|
| falsch | falsch | ? | ? | ? |
| falsch | wahr | ? | ? | ? |
| wahr | falsch | ? | ? | ? |
| wahr | wahr | ? | ? | ? |
Auflösung
| a | b | a && b | a || b | !a |
|---|---|---|---|---|
| falsch | falsch | falsch | falsch | wahr |
| falsch | wahr | falsch | wahr | wahr |
| wahr | falsch | falsch | wahr | falsch |
| wahr | wahr | wahr | wahr | falsch |
Und vor Oder
Wie bei Punkt vor Strich gibt es auch hier eine Rangfolge:
!(Negation)&&(Und)||(Oder)
Also bindet a || b && c wie a || (b && c).
Setze im Zweifel Klammern. Sie kosten nichts und machen die Absicht eindeutig – auch für den Menschen, der deinen Code später liest.
Ein Informatiker geht donnerstags ins Kino oder joggen – aber nur, wenn er nicht krank ist.
a) Formuliere die Bedingung mit &&, || und !.
b) An welcher Stelle brauchst du Klammern? Was ginge sonst schief?
Auflösung
a) (kino || joggen) && !krank
b) Ohne Klammern würde kino || joggen && !krank als kino || (joggen && !krank) gelesen. Dann ginge er auch krank ins Kino – die Bedingung „nicht krank“ würde sich nur auf das Joggen beziehen.
Die Schaltjahrregel in einer Zeile
Prüfe die Bedingung an den vier Testfällen 2024, 1900, 2000 und 2023 durch – auf Papier, indem du die Teilbedingungen einzeln auswertest. Erst danach ausprobieren.
Beurteile anschließend: Ist diese Fassung besser als die verschachtelte aus der letzten Lektion? Begründe.
Auflösung
| Jahr | % 4 == 0 |
% 100 != 0 |
linker Teil | % 400 == 0 |
gesamt |
|---|---|---|---|---|---|
| 2024 | wahr | wahr | wahr | falsch | wahr |
| 1900 | wahr | falsch | falsch | falsch | falsch |
| 2000 | wahr | falsch | falsch | wahr | wahr |
| 2023 | falsch | wahr | falsch | falsch | falsch |
Zur Beurteilung lässt sich beides vertreten:
- Für die kurze Fassung: Die Regel steht an einer Stelle, die Variable
schaltjahrbenennt genau das, worum es geht, und die Verzweigung darunter ist trivial. - Für die verschachtelte Fassung: Sie bildet die drei Ausnahmeregeln so ab, wie sie sprachlich formuliert sind, und ist beim ersten Lesen leichter zu verstehen.
Solche Abwägungen zu begründen ist genau das, was der Kompetenzbereich Argumentieren meint.
Ein Bereich, zwei Bedingungen
Ein häufiger Fehler: Man will prüfen, ob eine Zahl zwischen 1 und 6 liegt, und schreibt 1 <= wurf <= 6.
Probiere es aus. Was meldet die IDE? Erkläre, warum die Schreibweise aus dem Matheunterricht hier nicht funktioniert.
Auflösung
Die IDE meldet einen Fehler. Java wertet von links nach rechts aus:
1 <= wurfergibt einen Wahrheitswert, hiertrue.- Dann müsste
true <= 6ausgewertet werden – und ein Wahrheitswert lässt sich nicht mit einer Zahl vergleichen.
Richtig ist:
if (wurf >= 1 && wurf <= 6) {
Aufgabe: Eintrittspreis
Ein Museum verlangt:
- freier Eintritt für Kinder unter 6 und für Personen ab 65
- ermäßigt (5 €) für alle unter 18 sowie für Personen mit Schülerausweis
- sonst 12 €
Schreibe ein Programm, das Alter und Schülerausweis abfragt und den Preis ausgibt.
Formuliere die Bedingungen mit logischen Operatoren.
Tipp: Reihenfolge
Prüfe zuerst den freien Eintritt, dann die Ermäßigung, dann den vollen Preis. Sonst bekämen die Unter-Sechsjährigen den ermäßigten Tarif, weil sie ja auch unter 18 sind.
Zusatzaufgabe
Zeige mit einer Wahrheitstafel, dass die beiden folgenden Ausdrücke für alle Belegungen dasselbe Ergebnis liefern:
!(a && b)!a || !b
Diese Regel heißt Gesetz von De Morgan. Formuliere sie in Worten und überlege, wofür sie beim Programmieren nützlich sein könnte.