1Fallunterscheidungen
Bis jetzt haben wir in den Beispielaufgaben nur Code verwendet, der immer gleich, der Reihe nach und komplett ausgeführt wird.
Es gibt mehrere Möglichkeiten, zwischen verschiedenen Fällen zu differenzieren, die if()-Abfrage ist eine der am häufigsten verwendeten.
Der Syntax lautet:
if(boolscher Wert) {
Anweisungen
}else {
Anweisungen
}
In der Klammer hinter dem if muss ein boolscher Wert stehen, das könnte eine Variable oder ein Vergleich sein. Die Anweisungen im Block nach dem if werden also nur ausgeführt, wenn der boolsche Wert true ergibt.
Beispiel:
Der else-Bereich könnte natürlich leer sein, dann kann man ihn auch einfach weglassen und schreibt
if(boolscher Wert) {
Anweisungen
}
Die Einrückung, die ich oben im if- und im else-Block gemacht habe, dient der Übersichtlichkeit.
Wir haben zwei Strings definiert und in Abhängigkeit davon, ob magKuchen true oder false ist, wird der eine oder der andere ausgegeben.
In der if Abfrage können auch Werte verglichen werden:
<, > kleiner oder größer
<=, >= kleiner-gleich, größer-gleich
== ist gleich (Wichtig: wenn man nur ein = verwendet, denkt Java, es wäre eine Variablenzuweisung !!! Fehlergefahr)
!= ungleich
Aufgabe 1:
Du hast drei Zahlen, a,b und c gegeben.
Erziele folgende Ausgabe:
Die größte Zahl ist: + Buchstabe + Wert: + Wert
Wenn zwei Zahlen gleich groß sind, ist es egal welche ausgegeben wird.
Tipp: teste deinen Code mit verschiedenen Werten.
Ineinander verschachtelte if-Abfragen müssen jedoch nicht immer dann verwendet werden, wenn man mehrere Dinge überprüfen will, die logischen Operatoren, die in Kurzeinführung in die Informatik erklärt werden, können hier verwendet werden:
&& Logisches Und
|| Logisches Oder Hinweis: dieses Zeichen lässt sich mit rechts-alt + < erzeugen
! Logisches Nicht
Beispiel:
if(b1 && !(!b2 || !b3)) {
System.exit(0);
}
System.exit(0); sorgt übrigens dafür, dass das Programm beendet wird.
Wer sich mit logischen Vergleichen etwas genauer auskennt weiß, dass
(b1 && !(!b2 || !b3)) = (b1 && b2 && b3).
Es kann sich also durchaus lohnen sich mit diesem Thema zu befassen.
Aufgabe 2:
Schreibe ein kurzes Programm, das die Zahlen a und b enthält. Wenn a größer als 4 ist, soll a / b ausgegeben werden.
Tipp: Darf b alle Werte annehmen?
Die beiden Dinge, die überprüft werden müssen, können je geklammert sein, müssen es aber nicht. Java wertet die Operatoren in folgender Reihenfolge aus:
Operatorenpriorität:
(absteigende Priorität)
Klammern | () |
---|---|
Einstellige Operationen | - (als Vorzeichen), ++, --, !, (cast) |
Multiplikative Operationen | *, /, % |
Additive Operationen | +, - |
Vergleichsoperationen | ==, !=, <, >, <=, >= |
Konjunktion | && |
Disjunktion | Zwei senkrechte Striche |
Zuweisungsoperationen | =, +=, -=, *=, /=, %= |
In dieser Tabelle kommen einige Dinge vor, die den meisten Lesern unbekannt sein dürften:
++, -- diese Operatoren (Inkrement und Dekrement) verändern den Wert einer Variable um 1, beispiel einInt++; würde den Wert von einInt um 1 erhöhen.
% Berechnet den Rest einer Division, also z.B. 12 % 5 = 2.
+=, -=, *=, /=, %= Da man recht oft auf Variablen herumrechnet, kann man statt a = a + b; auch a += b; schreiben, analoges gilt auch für die anderen Rechenarten, wichtig ist hierbei, dass die Variable, die geändert wird, an vorderer Stelle steht.
Alles in allem ist es im Zweifelsfall oder der Übersichtlichkeit halber nie verkehrt, Klammern zu verwenden.
Aufgabe 3:
Gegeben:
int a = 0;
int b = 0;
Erhöhe den Wert von a um 5, indem du lediglich den Inkrement-Operator verwendest. Erhöhe den Wert von b um 5, indem du lediglich den +=-Operator verwendest.
Man kann den Inkrement, bzw Dekrement Operator auch in einer Rechnung verwenden:
int a = 3;
int b = a++ + 10;
int c = ++a + 10;
System.out.println("b: " + b + ", c: " + c);
erzeugt die Ausgabe:
b: 13, c: 15
Wenn der Operator also vor der Variable steht, so wird er ausgeführt, bevor die Variable in der Rechnung verwertet wird, wenn er dahinter steht, erst danach.
Um verwirrenden Code zu vermeiden, empfiehlt es sich daher, die Änderungen an Operatoren immer in eine eigene Zeile/Anweisung zu packen:
int a = 3;
int b = a + 10;
a++;
a++;
int c = a + 10;
Das ist deutlich übersichtlicher als das vorherige Beispiel.
Dieser Artikel handelt von Fallunterscheidungen, nehmen wir uns also ein etwas komplexeres Beispiel:
Aufgabe 4:
gegeben:
int hausPreis = x;
erreiche abhängig vom Wert von x folgende Ausgabe:
< 150.000: Das Haus ist geschenkt
< 250.000: Das Haus ist günstig
< 450.000: Das Haus hat einen durchschnittlichen Preis
< 600.000: Das Haus ist anspruchsvoll
>= 600.000: Das Haus ist teuer
Um nur eine Ausgabe zu erreichen wäre eine geschachtelte if-Abfrage nötig. Um diesen Mehraufwand zu verhindern gibt es die else if Konstruktion:
if(b1) {
Anweisungsblock;
}else if(b2) {
Anweisungsblock;
}else {
Anweisungsblock;
}
Hierbei können beliebig viele else-if Abfragen verwendet werden, es wird also nur ein Anweisungsblock insgesamt ausgeführt. Selbstverständlich ist auch hier die else-Anweisung optional.
Da die Bedingungen der Reihe nach überprüft werden, ist z.B. beim Erreichen der (hausPreis Bedingung schon klar, dass der Preis größer als 250k sein muss.
Die Unterstriche in den Zahlen erhöhen die Übersichtlichkeit zusätzlich. Wenn bei IntelliJ hierbei jedoch ein Fehler angezeigt wird, so muss das language-level des Projekts erhöht werden:
File - Project Structure - Project
dort auf mindestens 7.0 setzen.
switch-case
Es gibt eine weitere Möglichkeit für Fallunterscheidungen:
switch(zahl) {
case 500:
Anweisungen
break;
case 100:
Anweisungen
break;
default:
Anweisungen
break;
}
Der default-Block entspricht dem else-Block. Da bei einer switch-case Abfrage nur feste Werte überprüft werden können, ist es für einige Fälle, wie z.B. unsere Hauspreis-Analyse ungeeignet.
Die break-Anweisungen bewirken, dass die Befehlsausführung erst nach dem switch-Block forgesetzt wird, ihre Verwendung ist notwendig, da sonst alle folgenden Anweisungen ausgeführt werden würden.
Zur Auswertung können byte, short, char, int und Strings herangezogen werden.