Programmierkurs Java Kontrollstrukturen Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer
Kontrollstrukturen Wichtig: bedingte Ausführung und Wiederholungsanweisung Java bietet mehrere Variante an Sind äquivalent und ineinander überführbar Sind jeweils eine Anweisung Bedingte Ausführung if switch Wiederholungsanweisung while do... while for #2
Bedingte Ausführung: if Syntax: if (boolescher-ausdruck) anweisung; boolescher-ausdruck: Ausdruck, der zu boolean Wert evaluiert (true/false) Anweisung: Einzelne Anweisung (kann auch eine Blockanweisung sein) Beispiel für boolesche Ausdrücke true 1 > 2 i!= 12 u 2 > z - 3 Beispiele für if-anweisung if (true) System.out.println( Tautologie ); int i = 3; if (2 * i > 1000) i = i / 2; #3
Fallstrick Beispiel: int i=3; if(2*i > 1000) i = i / 2; i = 3 * i; Auch wenn es optisch nicht so aussieht, aber: i = 3 * i ist nicht mehr Teil der if-anweisung Wird also IMMER ausgeführt, unabhängig vom Wert von boolescher-ausdruck Wichtig: Formatierung hat nichts mit Syntax zu tun Dennoch sollte man es optisch besser formatieren Besser: int i = 3; if(2 * i > 1000) i = i / 2; i = 3 * i; Aber: was wenn das gar nicht so gewollt ist? #4
#5 Fallstrick: Lösung: Blockanweisung Wenn i = 3 * i Teil der if-anweisung werden soll, hilft eine Blockanweisung int i = 3; if(2 * i > 1000) { i = i / 2; i = 3 * i; } Besser formatiert (Java Coding Style) int i = 3; if(2 * i > 1000) { i = i / 2; i = 3 * i; } Generell sinnvoll, Blockanweisungen zu benutzen z.b. falls man später noch eine Anweisung hinzufügt
#6 Variante der if-anweisung (if...then...else) Oft soll entweder das eine oder das andere gemacht werden if (a > 100) a = a 100; if (a <= 100) System.out.println( a zu klein ); Probleme Gleiche Bedingung muss zweimal formuliert werden (1 x positiv, 1x negativ) Wenn die erste Anweisung a modifiziert (wie hier geschehen), dann kommt es ggf. zu ungewolltem Verhalten Daher Variante if (boolescher-ausdruck) anweisung1; else anweisung2; Wenn boolescher-ausdruck true ist, dann wird anweisung1 ausgeführt, ansonsten anweisung2 if (a>100) a=a 100; else System.out.println( a zu klein );
#7 Variante der if-anweisung (if...then...else) if (boolescher-ausdruck) anweisung1; else anweisung2; Beide Anweisungen können wieder beliebige Ausdrücke sein Also z.b. auch wieder if-anweisungen Beispiel: if(a>100) if(b>100) b=b+a; else a=a*2; Aber: zu welchem if gehört das else?
Variante der if-anweisung (if...then...else) Lösung if (a > 100) if (b > 100) b = b + a; else a = a * 2; Wichtig: explizit machen, was gemeint ist Platzsparen muss nicht sein Lieber den Code besser lesbar machen Variante 1 if (a > 100) { if (b > 100) { b = b + a; } else { a = a * 2; } } Variante 2 if (a > 100) { if (b > 100) { b = b + a; } } else { a = a * 2; } #8
#9 if-anweisung: Weitere Beispiele Beispiel: if if (i > 12 ) { System.out.println("i ist größer als 12"); i = 123 * i 345; } Beispiel: if-then-else if (i > 12 ) { System.out.println("i ist größer als 12"); i = 0; } else { System.out.println("i ist kleiner oder gleich 12"); i++; }
#10 Alternative zu if: switch-anweisung Nach case kann nur eine Konstante stehen, keine Variable Vorsicht: nicht das break vergessen Kann z.b. anstelle von langen if-else- Anweisungen verwendet werden Code wird dadurch kürzer und (evtl.) verständlicher
Kontrollstrukturen: Wiederholung While-Schleife Wiederhole, solange Ausdruck wahr Syntax: while (boolescher-ausdruck) anweisung1; Beispiele while (i > 10) i--; while (i > 10) { System.out.println(i); i--; } #11
#12 Kontrollstrukturen: Wiederholung Do-While-Schleife Wie while, jedoch mindestens einmal ausgeführt Syntax: do anweisung1; while(boolescher-ausdruck); Beispiele do i--; while (i > 10); do { System.out.println(i); i--; } while (i > 10);
Beispiel: while und do...while #13
Kontrollstrukturen: Wiederholungen Abseits von while und do...while gibt es eine weitere Wiederholungsanweisung: for Ist wahrscheinlich die am meisten benutzte Variante while, do...while und for lassen sich ineinander überführen Welche Variante man nutzt ist daher egal Allerdings ist for expliziter als while/do-while und prägnanter Syntax for(<initialization>; <termination>; <increment>) statement; <initialization> Einmal zu Beginn der Schleife ausgeführt <termination> Abbruchbedingung (boolescher Ausdruck) <increment> Nach jedem Durchlauf ausgeführt #14
Kontrollstrukturen: Wiederholungen Beispiel: Wertebereich durchlaufen <initialization> int i = 0 Deklariert und Initialisiert Variable i <termination> i < 10 Abbruchbedingung <increment> i++ Erhöht Wert von i nach jedem Durchlauf Ablauf <initialization>(i: 0), <termination> (false), <statement>, <increment> (i: 1), <termination> (false), <statement>, <increment> (i: 2),..., <increment> (i: 10), <termination> (true) Ende Initialisierung Bedingung Modifikation for (int i = 0; i < 10; i++){ System.out.println(i); } #15
Kontrollstrukturen: Wiederholungen Beispiele: for-anweisung for (int i = 0; i < 100; i = i * i) System.out.println("i=" + i); for ( ; i < 10; --i); for (;;;); Endlosschleife #16
Beispielprogramm Ziel: Einlesen einer max. 20 Zeichen langen Zeichenfolge und Ausgabe in umgekehrter Reihenfolge Algorithmus Erzeuge einen Puffer für max. 20 Zeichen Lese ein Zeichen vom Keyboard ein Solange noch Platz im Puffer ist und nicht Enter gedrückt wurde Speichere Zeichen in nächsten freien Platz im Puffer Lese nächstes Zeichen vom Keyboard Setze Variable i auf Index des letzten Zeichens Solange i >= 0 ist Gebe Zeichen an Index i aus Dekrementiere i #17
Quellcode #18
#19