Fallunterscheidungen sind ein mächtiges Werkzeug der Programmierung, um Programme zu erzeugen, die flexibel auf verschiedene Umstände reagieren können. Graphisch kann man Fallunterscheidungen gut mit Hilfe von Flussdiagrammen darstellen.
Beispiel 1: Idealgewicht (aus dem Projekt "Waage" in Folge 3)
Das Idealgewicht eines Mannes ist etwas höher als das einer Frau. Bei beiden Geschlechtern wird zunächst der Wert 100 von der Körpergröße in cm abgezogen. Die Differenz wird dann bei einem Mann mit dem Faktor 0,9 multipliziert, bei einer Frau mit dem Faktor 0,85. Ein Programm zur Berechnung des Idealgewichts muss diese beiden Fälle unterscheiden können.
Beispiel 2: Bewegen eines Kreises (aus dem Projekt "shapes" in Folge 2)
Wenn ein Kreis in der Zeichenfläche nach rechts bewegt werden soll, soll er nicht über den rechten Rand "hinausschießen". Also muss das Programm wissen, wo sich der Kreis gerade befindet, wenn der moveRight()-Befehl kommt. Hält sich der Kreis gerade ganz links oder in der Mitte auf, kann er um weitere 20 Pixel nach rechts bewegt werden. Ist er aber bereits in der Nähe des rechten Randes, darf er nicht mehr bewegt werden.
Realisierung einer Fallunterscheidung in Java
In der Programmiersprache Java gibt es zwei wichtige Schlüsselworte, um solche Fallunterscheidungen zu implementieren, nämlich if und else. Das Schlüsselwort "if" bedeutet so viel wie "falls", und das Schlüsselwort "else" kann mit "ansonsten" übersetzt werden.
Die Befehle, die hinter "if" stehen, werden ausgeführt, wenn die Bedingung, die mit "if" verknüpft ist, wahr ist. Ist diese Bedingung nicht wahr (also falsch), denn werden die Befehle ausgeführt, die hinter "else" stehen.
Das ist jetzt aber sehr theoretisch, daher erst mal zwei praktische Beispiele:
Beispiel 1: Idealgewicht
if (geschlecht == 'm') idealgewicht = (kg - 100) * 0.9; else idealgewicht = (kg - 100) * 0.85;
Die Variable geschlecht ist vom Datentyp char, in ihr können also einzelne Zeichen gespeichert werden. Handelt es sich bei diesem Zeichen um den Kleinbuchstaben 'm' (also für "männlich"), dann wird die Variable idealgewicht nach der ersten Formel mit dem Faktor 0.9 berechnet. Andernfalls - wenn das Geschlecht also nicht männlich ist - wird die zweite Formel mit dem Faktor 0.85 genommen. Die zweite Formel wird auch dann verwendet, wenn der Benutzer zum Beispiel den Buchstaben 's' für das Geschlecht eingegeben hat oder das Zeichen '#'. Das Schlüsselwort "else" bedeutet also nicht automatisch das Komplement (Gegenteil) von 'm' (in diesem Fall also 'w'), sondern "else" steht für die Negation (Verneinung); in diesem Fall also für alles, was NICHT 'm' ist.
Beispiel 2: Rechter Rand erreicht
if (xPosition > 250) rechterRandErreicht = true; else rechterRandErreicht = false;
Wenn die xPosition des Kreises den Wert von 250 überschritten hat, soll der rechte Rand der Zeichenfläche als "erreicht" gelten. Ist die xPosition NICHT größer als 250, so gilt der rechte Rand als NICHT erricht. Die Variable rechterRandErreicht (Datentyp boolean) erhält den Wert false.
Beispiel 3: Differenzierte Ausgabe
Angenommen, Sie wollen im Internet etwas kaufen, beispielsweise einen neuen Laptop. Sie geben in die Web-Anwendung (die höchstwahrscheinlich auch mit Java geschrieben wurde) ihren Wunschpreis ein, sagen wir mal 600 Euro. Die Anwendung durchsucht nun die verschiedenen Onlineshops nach geeigneten Objekten und soll dabei auch den Preis mit Ihrem Wunschpreis vergleichen. Betrachten Sie dazu folgenden Quelltext-Ausschnitt:
... if (kaufpreis <= wunschpreis * 0.8) System.out.println("Super Angebot!") else if (kaufpreis < wunschpreis) System.out.println("Kaufpreis liegt unterhalb des Wunschpreises!") else if (kaufpreis == wunschpreis) System.out.println("Kaufpreis entspricht dem Wunschpreises!") else if (kaufpreis > wunschpreis * 1.2) System.out.println("Kaufpreis ist viel zu hoch!") else System.out.println("Kaufpreis ist etwas hoeher als der Wunschpreis") ...
Bei dieser Fünffach-Auswahl kommt es stark auf die Reihenfolge der einzelnen Abfragen an. Ganz schnell kann man hier Fehler machen.
Als Erstes wird gefragt, ob der Kaufpreis deutlich niedriger ist als der Wunschpreis. Ist das der Fall, wird eine entsprechende Konsolen-Ausgabe gemacht. Ist das nicht der Fall, wird weiter gefragt, ob der Kaufpreis unter dem Wunschpreis liegt.
Angenommen, man würde die beiden ersten Abfragen in der Reihenfolge vertauschen:
... if (kaufpreis < wunschpreis) System.out.println("Kaufpreis liegt unterhalb des Wunschpreises!") else if (kaufpreis <= wunschpreis * 0.8) System.out.println("Super Angebot!") else if (kaufpreis == wunschpreis) System.out.println("Kaufpreis entspricht dem Wunschpreises!") else if (kaufpreis > wunschpreis * 1.2) System.out.println("Kaufpreis ist viel zu hoch!") else System.out.println("Kaufpreis ist etwas hoeher als der Wunschpreis") ...
Was würde dann passieren, wenn der Wunschpreis 600 Euro beträgt, der Kaufpreis aber 300 Euro. An sich sollte nun "Super Angebot" ausgegeben werden. Aber bereits die erste Bedingung trifft zu, denn 300 Euro ist ja kleiner als 600 Euro. Also wird "Kaufpreis liegt unterhalb des Wunschpreises!" ausgegeben, was ja auch nicht direkt falsch ist. Durch das Schlüsselwort else werden die nächsten Überprüfungen nicht mehr ausgeführt. Die erste Bedingung ist ja erfüllt, es besteht also keine Notwendigkeit mehr, die vielen else-Fälle zu überprüfen.