zum Inhalt springen

Kontrollstrukturen

Stellen Sie sich vor, Sie stehen an einem einfachen Getränkeautomaten und wollen sich einen Kaffee kaufen. Sie drücken auf den "Kaffee"-Knopf und der Automat sagt Ihnen, dass der Kaffee 60 Cent kosten soll. Daraufhin werfen Sie so lange Geld in den Automaten, bis Sie 60 Cent oder mehr hineingeworfen haben - das kann beim ersten Geldstück der Fall sein, im schlimmsten Fall aber auch erst nach 60 1-Cent-Münzen. Dann bekommen Sie endlich Ihren Kaffee und ggf. auch noch Wechselgeld zurück.

Wie lässt sich dieser Vorgang so beschreiben, dass selbst ein Kaffeeautomat ihn verstehen kann? Mit anderen Worten: Wie sieht das Programm aus, das der Kaffeeautomat abarbeiten muss, damit er so funktioniert, wie er es sollte? Als UML-Diagramm könnte man das Programm folgendermaßen darstellen:

 

In diesem Aktivitätsdiagramm sind die wesentlichen Entscheidungen des Getränkeautomats abgebildet. Je nach dem was passiert, wechselt er von einem Zustand in den nächsten (nach der Initialisierung bspw. in den Zustand "warte auf Geld"), wobei die Zustandswechsel teilweise an Bedingungen geknüpft sind (wie "centBenoetigt == centBekommen").

Um dieses Diagramm nun in ein Java-Programm umzusetzen, scheinen mehrere Dinge notwendig zu sein:

  1. Es ist notwendig, Bedingungen überprüfen zu können. Idealerweise sollte die Überprüfung einer Bedingung entweder den Wert "wahr" oder den Wert "falsch" ergeben.
  2. Bedingungen sollten sich zu "wenn? dann? sonst..."-Konstruktionen zusammensetzen lassen, um bspw. die Ausgabe des Wechselgeldes zu veranlassen.
  3. Bedingungen sollten sich außerdem in Konstruktionen wie "solange nicht genug Geld eingeworfen, warte auf mehr Geld, anschließend mache Kaffee" einsetzen lassen.


Um dies mit Java zu realisieren, müssen einige Erweiterungen der Syntax eingeführt werden. Da diese jedoch alle "irgendwie" auf Bedingungen basieren werden, soll zunächst erläutert werden, was eine Bedingung in Java ist.

Bedingungen und Operatoren

Damit ein Computer mit Bedingungen umgehen kann, müssen diese relativ einfach zu überprüfen sein. Die einfachste Bedingung, die in der Programmiersprache Java geprüft werden kann, ist vermutlich die Prüfung auf Gleichheit. Dazu wurde der Operator "==" definiert, der prüft, ob zwei Objekte identisch sind. Bei komplexeren Objekten ist der Begriff der Identität etwas schwierig, deshalb beschränken wir uns zunächst einmal nur auf Zahlen-Objekte wie Integer, Float etc. Angenommen, zahl1 und zahl2 seien zwei Integer-Objekte, so lassen diese sich mit Hilfe des "=="-Operators vergleichen:

Das Ergebnis dieses Vergleichs ist ein boolescher Wahrheitswert - true oder false. Um das Ergebnis des Vergleiches in einer Variablen zu speichern, können Sie den Code um eine Zuweisung erweitern:

Dies sieht zunächst etwas verwirrend aus - zu viele Gleichheitszeichen in einer Zeile. Doch bei dem Zeichen "=" handelt es sich um den Zuweisungsoperator und dieser ist syntaktisch so definiert, dass links von ihm eine Variable stehen muss und rechts von ihm ein Ausdruck, der dem Typ der Variablen entspricht. Der Teil rechts vom "="-Zeichen ist, auch wenn es zunächst nicht so aussieht, ein Ausdruck, denn der Gleichheitsoperator "==" kombiniert die dort stehenden Objekte zu einem booleschen Wert. Um den Code trotzdem etwas übersichticher zu machen, empfielt es sich, mit runden Klammern zu kennzeichnen, was dort zusammengehört:

Klammern können Sie in Java ähnlich wie in der Mathematik einsetzen - sowohl, um dem Compiler vorzuschreiben, wie etwas zusammengehören soll (ähnlich wie Sie es aus der Regel "Punktrechnung geht vor Strichrechnung" aus dem Mathematikunterricht kennen), als auch, um - wie in obigem Beispiel - eine Zusammengehörigkeit zu verdeutlichen, die dem Compiler zwar sowieso klar wäre, dem menschlichen Leser jedoch nicht unbedingt. Die Codezeile liest sich also wie folgt: "Weise der Wahrheitswert-Variablen vergleich das Ergebnis des Vergleichs von zahl1 und zahl2 zu". Sobald diese Zeile, bei der es sich ja wieder um eine Anweisung handelt, ausgeführt wurde, enthält die Variable vergleich den Wert true oder false, je nachdem, ob die beiden Zahlen identisch waren oder nicht. Wenn Sie dieses Programm

laufen lassen, so werden Sie die Ausgabe

sehen, und wenn Sie der Variablen zahl1 den Wert 10 zuweisen, würde entsprechend

ausgegeben.

Neben dem Gleichheits-Operator "==" gibt es noch einige weitere Operatoren, die zwei Zahlen miteinander in Beziehung setzen und dadurch auf einen Wahrheitswert abbilden - Sie kennen sie alle aus dem Mathematikunterricht:

<Kleiner als
>Größer als
<=Kleiner oder gleich
>=Größer oder gleich
== Gleichheit
!=Ungleich

 
Die Syntax der Operatoren entspricht dabei der Syntax des "=="-Operators - Sie können in obigem Beispiel also alle Operatoren austauschen und sich von der Korrektheit der Ergebnisse überzeugen.

Bedingungen sind Wahrheitswerte, wobei diese auch aus Kombinationen von Anweisungen oder Ausdrücken bestehen dürfen - so lange die Auswertung dieser Kombinationen einen Wahrheitswert (true oder false) ergibt.

Weitere Operatoren

Es gibt in Java noch weitere Operatoren, die hier kurz vorgestellt werden sollen, da sie syntaktisch wie die Bedingungs-Operatoren funktionieren und für den Bau einer Kaffeemaschine nötig sind. Dabei handelt es sich um die "klassischen" Operatoren aus der Mathematik, von denen die wichtigsten hier kurz vorgestellt werden sollen.

 

+AdditionInteger x = 15 + 12;
-SubtraktionInteger x = 15 - 12;
*MultiplikationInteger x = 15 * 12;
/DivisionInteger x = 5 / 3;
%ModuloInteger x = 15 % 12;

Beim Divisions-Operator gibt es eine Besonderheit, die beachtet werden muss: Eine Division wie in Integer zahl = 5/3 ergibt kein ganzzahliges Ergebnis - was also soll der Integer-Variablen hier zugewiesen werden? Die Logik ist hier ganz brutal: Ein Integer ist eine Ganzzahl, d.h. alles nach dem Komma wird ignoriert. Es findet also keine Rundung statt - obwohl das Ergebnis von 5/3 mit 1,666? näher an 2 liegt als an 1, wird der Variablen zahl der Wert 1 zugewiesen.

Schließlich gibt es noch eine Besonderheit beim "+"-Operator, denn dieser hat in Java noch eine zweite Lesart: In Kombination mit mindestens einem String-Objekt (und nur dann!) kann er dazu benutzt werden, aus mehreren Objekten ein String-Objekt zu "komponieren":

Ausgabe des Programms:



Dies funktioniert jedoch nur mit Strings - eine Anweisung wie

ergibt



während die Kombination von Objekten anderer Klassen (bspw. Integer und Boolean) in Fehlermeldungen endet:



Die Sonderfunktion des "+"-Operators sollten Sie sich merken, denn insbesondere für Ausgaben auf der Konsole ist diese sehr praktisch.