Kapitel 5 Programmierkurs Wiederholung Kapitel 5 Birgit Engels, Anna Schulze ZAIK Universität zu Köln WS 07/08 1 / 19 Kontrollstrukturen 2 Arten von Kontrollstrukturen Bis jetzt wurden in jedem Programm alle Befehle nacheinander einmal ausgeführt: Das Programm machte (bis auf unterschiedliche Eingabewerte) immer das gleiche. Bedingte Ausführung I I if/if ... else-Anweisung switch-Anweisung (Bedingte) Mehrfachausführung Sogenannte “Kontrollstrukturen” sind besondere Anweisungen, die es einem Programm ermöglichen, sich unterschiedlich zu verhalten oder Befehlsabfolgen mehrfach auszuführen. I I I 3 / 19 for-Schleife while-Schleife do ... while-Schleife 4 5.0 Die if-Anweisung Fallunterscheidungen mit else if if ( < Bedingung > ) < Anweisung > oder if ( < Bedingung > ) < Anweisung 1 > else < Anweisung 2 > char c=’x’; int ascii; if (c==’a’) ascii=97; else if (c==’b’) ascii=98; ... else if (c==’z’) ascii=122; else ascii=0; < Bedingung > ist ein Wert ∈ {true, false}, eine Variable vom Typ boolean oder ein boolscher Ausdruck, der zu einem solchen Wert ausgewertet wird. Anweisung ist eine einzelne Anweisung oder ein Block von Anweisungen. Fallunterscheidungen mit else if sind bei vielen Fällen unkomfortabel und enthalten den Overhead der Vergleichsbedingung. Für solche Anwendungen verwendet man daher die switch- Anweisung. Im ersten Fall wird die Anweisung nur ausgeführt, wenn die Bedingung den Wert true hat. Im zweiten Fall wird die Anweisung1 ausgeführt, wenn die Bedingung den Wert true hat. Andernfalls wird Anweisung2 ausgeführt. 5 / 19 5.0 Die switch-Anweisung 6 switch vs. else if switch (< Ausdruck >) { case < Wert1 > : < Anweisung >; break; case < Wert2 > : < Anweisung >; break; ... default : < Anweisung >; break; } Die Zeile case < Wert > : < Anweisung >; break; einer switch-Anweisung entspricht in etwa der Zeile: (else) if (< Ausdruck >==< Wert >) < Anweisung >; einer else if-Anweisung. < Ausdruck >: arithmetischer Ausdruck oder einzelne Variable. Die Zeile default : < Anweisung >; break; einer switch-Anweisung entspricht der letzten Zeile: else < Anweisung >; // einer else if-Anweisung. < Wert >: Wert, den < Ausdruck > annehmen kann. < Anweisung >: einzelne Anweisungen Block von Anweisungen. Die Anweisungen hinter default werden ausgeführt, falls < Ausdruck > keinen der < Wert >e annimt. Nur im default-Fall darf break; weggelassen werden. 7 / 19 8 Bemerkung zu break 5.0 Die for-Schleife for (< Initialbefehl >; < Schleifenbedingung >; < Iteration > ) < Schleifenanweisung >; Es kann natürlich auch sinnvoll sein, einen Fall einer switch-Anweisung nicht mit break; abzuschliessen. < Initialbefehl >: Einmalig durchgeführte Anweisung. Meist Deklaration+Initialisierung der Iterationsvariablen (Schleifenindex). Z.B.: Wenn in 2 Fällen die gleiche Anweisung folgen soll oder im ersten Fall nur zusätzliche Anweisungen zuvor auszuführen sind. < Schleifenbedingung >: Bedingung, die für die nächste Ausführung der < Schleifenanweisung > erfüllt sein muss. Da ein weggelassenes break nur der Bequemlichkeit dient, ein vergessenes aber zu Fehlern führt, sollte generell jedes case mit einem break; abgeschlossen werden. < Iteration >: Hochzählen des Schleifenindex. < Schleifenanweisung >: Einzelne Anweisung oder Block von Anweisungen. 9 / 19 Verwendung der for-Schleife Unbestimmte Schleifen Die for-Schleife wird meist verwendet, um eine Folge von Anweisungen (Block) mehrfach auszuführen. Die Zahl der Ausführungen ist dabei oft vorher klar (feste Zahl oder begrenzt durch Wert einer Variablen). Daher werden for-Schleifen auch Zählschleifen genannt. Dabei werden immer folgende Schritte Einzelne Elemente der for-Klammer können leer bleiben. Es funktioniert auch: for( ; ; ) {tuwas;} Dabei ist eine leere Bedingung immer wahr, d.h. hier wird tuwas; unendlich oft ausgeführt. ausgeführt: 1. Initiatbefehl wird einmal ausgeführt. 2. Bedingung wird geprüft: I I 10 Trotz leerer Bedingung können die Schleifendurchläufe gezählt werden: for(int i=1; ; i++ ) {tuwas;} Falls true: Anweisungen werden ausgeführt. Falls false: Schleife wird beendet. 3. Iteration wird ausgeführt. 4. Weiter bei 2. Häufigste Art der Verwendung: for( int i=0; i<xyz; i++) {tuwas;} 11 / 19 12 Verlassen unbestimmter Schleifen break und continue Unbestimmte Schleifen können auf 2 Arten verlassen werden: 1. Es tritt eine “Ausnahme” (Exception) auf (später). Mit break wird eine Schleife komplett abgebrochen, falls die vorhergehende Bedingung erfüllt ist. 2. Die Schleife wird abhängig von einer Bedingung mit break verlassen: for(int i=1; ; i++ ) { if (i>10) break; } Eventuell soll nur ein bestimmter Fall übersprungen werden, für den die Schleife nicht durchgeführt werden soll. Einmaliges überspringen des restlichen Schleifenkörpers gelingt mit: if (i==10) continue; Ist die Bedingung erfüllt springt das Programm direkt zum Ende des Durchlaufs und startet die Schleife mit dem nächsten Durchlauf. Beide Arten eine unbestimmte Schleife zu verlassen sind sehr unschön, da sie zu unübersichtlichen, schwer zu verifizierenden Programmen führen. Daher sollten unbestimmte Schleifen immer vermieden werden. Dies ist (manchmal aufwendiger, aber) immer möglich! Eine Programmiersprache ist mit break nicht mächtiger als ohne! 13 / 19 5.0 Die while-Schleife 14 Verwendung der while-Schleife Im Gegesatz zur for-Schleife steht bei der while-Schleife die Schleifenbedingung, nicht die Anzahl der Schleifendurchläufe eher im Vordergrund. Um die Anzahl zu ermitteln, muss man selbst einen Zählindex verwalten. Die Schleifenbedingung ist ein eher komplexerer boolescher Ausdruck. Es werden immer folgende while (< Schleifenbedingung >) < Schleifenanweisung >; < Schleifenbedingung >: Bedingung, die für die nächste Ausführung der < Schleifenanweisung > erfüllt sein muss. Schritte ausgeführt: 1. Bedingung wird geprüft: < Schleifenanweisung >: Einzelne Anweisung oder Block von Anweisungen, die ausgeführt werden, falls < Schleifenbedingung > true liefert. I I Falls true: Anweisungen werden ausgeführt. Falls false: Schleife wird beendet. 2. Weiter bei 1. 15 / 19 16 Sonderfälle for vs. while Eine leere Bedingung, ist bei while-Schleifen anders als bei for-Schleifen standardmässig nicht vorgesehen (erzeugt Kompilierfehler). Eine Endlosschleife mittels while wird mit true als Bedingung erreicht: while (true) < Schleifenanweisung >; Es gelten die gleichen Möglichkeiten zum verlassen einer solchen Endlosschleife mit while wie mit for: I I Die while-Schleife und for-Schleife sind äquivalent, es gilt: for(Start; Bedingung; Änderung) Anweisung; entspricht: Start; while (Bedingung) { Anweisung; Änderung; } Exceptions break; Auch hier kann continue; zum Überspringen einer Ausführung verwendet werden. while-Schleifen können verschachelt werden (Blöcke bilden!). 17 / 19 5.0 Die do-Schleife do < Schleifenanweisung > while (< Schleifenbedingung >); < Schleifenanweisung >: Einzelne Anweisung oder Block von Anweisungen, die ausgeführt werden. < Schleifenbedingung >: Bedingung, die für die nächste Ausführung der < Schleifenanweisung > erfüllt sein muss. In do-Schleife entspricht der while-Schleife die allen Eigenschaften ausser dem Zeitpunkt der Bedingungsüberprüfung. 19 / 19 18