3. Kontrollstrukturen Anweisungen und Blöcke 3. Anweisungen und Kontrollstrukturen • Mit Kontrollstrukturen können wir den Ablauf eines Programmes beeinflussen, • z.B. ob oder in welcher Reihenfolge Anweisungen unseres Programms ausgeführt werden. • Kontrollstrukturen entsprechen algorithmischen Elementen: – Selektion, – Mehrfachselektion, – Zählschleifen, – kopf- bzw. fußgesteuerte Schleife Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 61 3. Kontrollstrukturen Anweisungen und Blöcke Anweisungen Einige einfache Anweisungen kennen wir bereits: • die Deklarationsanweisung zur Vereinbarung von Variablen, • die Zuweisung und • den Methodenaufruf. Zuweisungen und Methodenaufrufe sind Ausdrucksanweisungen, d.h. es handelt sich um Ausdrücke, die durch Anhängen eines Semikolons zu Anweisungen werden. Die leere Anweisung besteht aus einem einzelnen Semikolon: ; Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 62 3. Kontrollstrukturen Anweisungen und Blöcke Blöcke • Ein Block ist eine Folge von Anweisungen, die durch { und } geklammert sind. • Solch ein Block stellt eine Anweisung dar, nämlich eine zusammengesetzte Anweisung. • Variablen sind stets nur bis zum Ende des Blockes, in dem sie deklariert wurden, gültig. Wir sprechen in diesem Zusammenhang auch vom Gültigkeitsbereich der Variablen. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 63 3. Kontrollstrukturen Anweisungen und Blöcke { int x = 5; x++; { long y; y = x + 123456789; System.out.println(y); } System.out.println(x); { double d; d = x + 1.5; System.out.println(d); } • ein äußerer mit zwei inneren Blöcken • Die Variable x des äußeren Blocks ist in den inneren gültig. • Auf die Variablen y könnte im äußeren und im zweiten inneren Block nicht zugegriffen werden. • Mehrfachverwendung von Variablennamen in unterschiedlichen Blöcken ist möglich. } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 64 3. Kontrollstrukturen Selektionsanweisungen if-Anweisung Syntax: if ( boolscher Ausdruck ) Anweisung1 else Anweisung2 • Zunächst wird der Ausdruck zwischen ( und ) ausgewertet. Dieser Ausdruck muß vom Ergebnistyp boolean sein. • Liefert der Ausdruck true, wird Anweisung1 ausgeführt, bei false die Anweisung2. • Der else-Teil ist optional. Fehlt der else-Teil, wird bei false keine Anweisung ausgeführt. • Zur Erinnerung: Statt einer Anweisung kann auch ein Block (von Anweisungen) verwendet werden. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 65 3. Kontrollstrukturen Selektionsanweisungen Zu welchem if gehört das else? Syntaktisch wären zwei Interpretationen möglich. if ( boolscher Ausdruck1 ) if ( boolscher Ausdruck2 ) Anweisung1 else Anweisung2 Ein else gehört stets zum innersten if! if ( boolscher Ausdruck1 ) if ( boolscher Ausdruck2 ) Anweisung1 else Anweisung2 Und wenn wir eine Zuordnung zum äußeren if benötigen? ☞ Verwendung eines Blocks mit { und }. if ( boolscher Ausdruck1 ) { if ( boolscher Ausdruck2 ) Anweisung1 } else Anweisung2 Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 66 3. Kontrollstrukturen Selektionsanweisungen switch-Anweisung switch (ganzzahliger Ausdruck) { • Die switch-Anweisung entspricht einer Mehrfachselektion. case Konstante1: Anweisung • Der ganzzahlige Ausdruck muß vom ... Typ byte, short, int oder char Anweisung sein. break; ... • Die hinter case angegebenen Koncase KonstanteN : Anweisung stanten legen Einsprungmarken für ... den Programmablauf fest. Anweisung • Der Programmablauf wird bei genau break; der case-Marke fortgesetzt, die als default: Anweisung Konstante dem Ergebnis des Aus... drucks entspricht. Anweisung • Ab der Markierung werden die Anbreak; weisungen bis zur nächsten break} Marke ausgeführt. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 67 3. Kontrollstrukturen Selektionsanweisungen • Wird das Ergebnis des Ausdrucks in keiner case-Konstante gefunden, so wird die Programmausführung bei der default-Marke fortgesetzt. • default ist optional! Trifft keine case-Konstante zu und ist kein default vorhanden, so wird die Programmausführung mit der ersten Anweisung hinter der switch-Anweisung fortgesetzt. • Häufiger Fehler bei der Verwendung von switch: Das Vergessen der breakAnweisungen. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 68 3. Kontrollstrukturen Schleifen for-Anweisung Syntax: for ( Initialisierung ; boolscher Ausdruck ; Update ) Anweisung • Wird üblicherweise als Zählschleife eingesetzt. • Der Teil Initialisierung im Schleifenkopf dient der Deklaration und Initialisierung einer (oder mehrerer) Zählvariablen. • Die Anweisung im Rumpf der Schleife wird ausgeführt, solange der boolsche Ausdruck den Wert true liefert. • Update dient zur Aktualisierung der Zählvariablen für die folgende Iteration. Beispiel: zeilenweise Ausgabe der Zahlen 0 bis 9: for (int i=0 ; i<10 ; i++ ) System.out.println(i); Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 69 3. Kontrollstrukturen Schleifen • Wollen wir mehr als eine Anweisung im Inneren der Schleife ausführen, nehmen wir einen Block. • Alle drei Bestandteile des Schleifenkopfs sind optional. Dementsprechend ist auch for (;;) Anweisung syntaktisch korrekt. Dies entspricht einer Endlosschleife. • Worin besteht der Unterschied zwischen den folgenden Konstruktionen? for (int i=0 ; i<10 ; i++ ) Anweisung Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 int i; for ( i=0 ; i<10 ; i++ ) Anweisung 70 3. Kontrollstrukturen Schleifen while-Anweisung Syntax: while ( boolscher Ausdruck ) Anweisung • Kopfgesteuerte Schleife: – Bei jeder Iteration wird zunächst der boolsche Ausdruck ausgewertet. – Wenn dieser true liefert, wird die Anweisung (Schleifenrumpf) ausgeführt. • Die while-Schleife wird üblicherweise dann eingesetzt, wenn – der Schleifenrumpf u.U. gar nicht durchlaufen werden soll – und die Anzahl der Iterationen im voraus nicht bekannt ist. Beispiele: int i = 0; while ( i<10 ) { System.out.println(i); i++; } int c; c = System.in.read(); while ( c != -1 ) { verarbeite Eingabezeichen c c = System.in.read(); } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 71 3. Kontrollstrukturen Schleifen do-Anweisung do Syntax: Anweisung while (boolscher Ausdruck); • Fußgesteuerte Schleife: – Bei jeder Iteration wird zunächst die Anweisung ausgeführt. – Anschließend wird der boolsche Ausdruck ausgewertet. Liefert dieser true, wird zur nächsten Iteration übergegangen, ansonsten endet die Abarbeitung der doSchleife. • Die do-Schleife wird üblicherweise dann eingesetzt, wenn – der Schleifenrumpf mindestens einmal durchlaufen werden soll – und die Anzahl der Iterationen im voraus nicht bekannt ist. • Auch hier muß ein Block verwendet werden, wenn der Schleifenrumpf aus mehr als einer Anweisung besteht. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 72 3. Kontrollstrukturen Schleifen Beispiele: • Ausgabe von 0 bis 9: int i = 0; do { System.out.println(i); i++; } while ( i<10 ); • Verarbeitung von Zeichen der Standardeingabe: int c; do { c = System.in.read(); if ( c!= -1 ) verarbeite Eingabezeichen c } while ( c != -1 ); Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 73 3. Kontrollstrukturen Schleifen Sprungbefehle • Mit der Anweisung continue wird der aktuelle Schleifendurchlauf beendet und es wird direkt zur nächsten Iteration übergegangen. • Die Anweisung continue wird beispielsweise zur Behandlung von Ausnahmefällen bei Zählschleifen verwendet. for (int i=-10; i<=10 ; i++ ) { if ( i==0 ) continue; System.out.println( "Division von 1 durch " + i + " ergibt " + 1/i); } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 74 3. Kontrollstrukturen Schleifen • Die Anweisung break dient dazu, die Abarbeitung einer Schleife oder eines Blockes vorzeitig zu beenden. • Man verlässt damit die Schleife bzw. den Block, der aktuell ausgeführt wird. • Die Programmausführung wird fortgesetzt mit der nächsten Anweisung, die der Schleife bzw. dem Block folgt. • Beispiel: Suche eines Elementes in einem Feld. Wenn das Element gefunden wird, kann die Suche abgebrochen werden. int x; int feld; ... for ( int i=0 ; i<feld.length ; i++ ) if ( x == feld[i] ) { System.out.println( "Element " + x + " gefunden!" ); break; } • Sprungbefehl return zum Verlassen von Methoden: hierzu später mehr Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 75 3. Kontrollstrukturen Beispiele Beispiele • Gegeben ist der folgende Ausschnitt aus einem Programm: int i = 20; while ( i>0 ) { System.out.println(i); i -= 2; } – Was bewirkt diese Schleife? – Wie lautet eine for-Schleife mit gleicher Ausgabe? • Was bewirken die folgenden Zeilen? while (true) { System.out.println("Aloha"); } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 76 3. Kontrollstrukturen Beispiele • Bestimmen Sie die Ausgabe des folgenden Java-Programms: public class BreakAndContinue { public static void main(String args[] ) { for (int i=0 ; i<100 ; i++ ) { if ( i==74 ) break; if (i % 9 != 0 ) continue; System.out.println(i); } int i = 0; while (true) { // Endlos-Schleife ? i++; int j = i * 30; if (j==1260) break; if (i % 10 != 0 ) continue; System.out.println(i); } } } Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 77 3. Kontrollstrukturen Beispiele • Sie wollen ein Schachbrett numerieren in der folgenden Form: 1 2 3 4 5 6 7 8 2 3 4 5 3 4 5 6 4 5 6 7 5 6 7 8 6 7 8 9 7 8 9 10 8 9 10 11 9 10 11 12 6 7 8 9 10 11 12 13 7 8 9 10 11 12 13 14 8 9 10 11 12 13 14 15 Formulieren Sie eine geschachtelte for-Schleife, die eine entsprechende Ausgabe erzeugt. Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 07 78