Objektorientierte Programmierung Eine Einführung mit anschaulichen Beispielen aus der Java-Welt apl. Prof. Dr. Achim Ebert
Inhalt Kapitel 3: Kontrollstrukturen Einfache Anweisungen Anweisungsblöcke Steuerung des Programmablaufs Verzweigungen Schleifen Achim Ebert OOP.3.1
Einfache Anweisungen Anweisung (statement) ist kleinste ausführbare Einheit eines Programms Stehen im Programm in vom Programmierer festgelegten Reihenfolge untereinander Werden in dieser Reihenfolge auch abgearbeitet Anweisung wird erst dann ausgeführt, wenn alle vorherigen Anweisungen beendet sind Bezeichnung: sequenzielle Anweisungsfolge Leere Anweisung Besteht (in Java) nur aus ; Hat keinerlei Auswirkungen auf Programm Kann dort verwendet werden, wo syntaktisch Anweisung erforderlich ist, von Programmlogik her aber nichts zu tun ist Achim Ebert OOP.3.2
Anweisungsblöcke Zusammenfassung mehrerer Anweisungen Block wird in geschweifte Klammern {} eingeschlossen { statement } Gültigkeit von Bezeichnern Beschränkt sich auf Block, in dem sie deklariert sind Prinzipiell darf Bezeichner in verschiedenen Blöcken redeklariert werden Redeklaration in einem inneren Block ist verboten In einem Block deklariertes Objekt lebt so lange, wie Programmfluss den Block abarbeitet Dies schließt Abarbeitung innerer Blöcke mit ein Achim Ebert OOP.3.3
Gültigkeit von Bezeichnern Beispiel 1 public class Gueltig1{ } public static void main (String[] args) { } int x = 1; { int y = 2; x = y + 1; System.out.println ("x = " + x); System.out.println ("y = " + y); } { int y; y = 1; System.out.println ("x = " + x); System.out.println ("y = " + y); } Achim Ebert OOP.3.4
Gültigkeit von Bezeichnern Beispiel 2 Achim Ebert OOP.3.5
Gültigkeit von Bezeichnern Beispiel 3 Achim Ebert OOP.3.6
Steuerung des Programmablaufs Anweisungen werden sequentiell abgearbeitet Aber oft erforderlich: Programmteile mehrmals ausführen Programmteile ggf. nicht ausführen Sprachelemente zur Steuerung des Programmablaufs nötig Allgemeine Bezeichnung: Kontrollstrukturen Verzweigungen Veränderung der sequentiellen Abarbeitung Schleifen Iterationen/Wiederholungen im Kontrollfluss Achim Ebert OOP.3.7
Verzweigungen Eingesetzt, wenn Abarbeitung der folgenden Anweisungen von einer oder mehreren Bedingungen abhängt Einseitige Verzweigung Abhängig von Bedingung wird statement ausgeführt oder nicht Wird Bedingung mit ja (true) beantwortet: statement wird ausgeführt Sonst ( nein, false): keine Ausführung In beiden Fällen: nach Ende der Alternative weiter mit nächster Anweisung? true statement false Achim Ebert OOP.3.8
Einseitige Verzweigung Umsetzung in Java: einfache if-anweisung if (expression) statement expression ist Ausdruck vom Typ boolean Beispiel: double betrag = 1500.99; double rabatt = 0.0; if (betrag > 1000) rabatt = betrag * 0.03;... Achim Ebert OOP.3.9
Zweiseitige Verzweigung Abhängig von Bedingung wird eines von zwei möglichen statements ausgeführt Wenn Bedingung erfüllt ist, dann wird statement1 ausgeführt, sonst statement 2 In beiden Fällen: nach Ende der Alternative weiter mit nächster Anweisung? true statement1 false statement2 Umsetzung in Java: allgemeine if-anweisung if (expression) statement1 else statement2 Achim Ebert OOP.3.10
Mehrstufige (verschachtelte) Verzweigung Innerhalb eines if- oder eines else-blocks dürfen wiederum Verzweigungen stehen Ist erste Bedingung wahr, wird auch nächste kontrolliert? false Trifft eine Bedingung nicht zu, wird gesamte Verzweigung true statement1 verlassen Umsetzung in Java if (expression1) { statement1 if (expression2) { statement2 if (expression3) { statement3... }? statement2? true true statement3 false false Achim Ebert OOP.3.11
Mehrstufige (n-seitige) Verzweigung Innerhalb eines if- oder eines else-blocks dürfen wiederum Verzweigungen stehen Nächste Bedingung wird nur kontrolliert, wenn alle vorangehenden nicht zutreffen Realisierung einer Auswahl 1 aus n möglich Umsetzung in Java if (expression1) statement1 else if (expression2) statement2 else if (expression3) statement3...??? false false false true true true statement1 statement2 statement3 Achim Ebert OOP.3.12
Mehrseitige Verzweigung (Fallauswahl) Auswahl 1 aus n Wert einer Variablen wird ausgewertet Abhängig von diesem Wert wird ein statement ausgewählt und ausgeführt? 1 2 3 default statement1 statement2 statement3 default st. Achim Ebert OOP.3.13
Mehrseitige Verzweigung (Fallauswahl) Umsetzung in Java: switch-anweisung switch (expression){ case constvalue1: statement1 case constvalue2: statement2... case constvaluen: statementn default: statementd } expression: Selektor, der ordinal (abzählbar) sein muss (z.b. vom Typ int) Jeder Auswahlblock beginnt mit case constvaluex: paarweise verschiedene Ausdrücke vom Typ des Selektors Stimmt Wert des Selektors mit keinem Auswahlwert überein, so wird default-zweig ausgeführt Achim Ebert OOP.3.14
Mehrseitige Verzweigung (Fallauswahl) Umsetzung in Java: switch-anweisung (Beispiel) int note = 3; String text = ""; switch (note){ case 1: text = "sehr gut"; break; case 2: text = "gut"; break; case 3: text = "befriedigend"; break; case 4: text = "ausreichend"; break; case 5: case 6: text = "nicht bestanden"; break; default: text = "nicht erschienen"; } System.out.println ("Klausurnote: " + text); Achim Ebert OOP.3.15
Schleifen Häufig müssen die gleichen Anweisungen mehrmals wiederholt werden statement1 statement2 statement1 statement2 statement1 statement2 statement1 statement2 Schleifenkopf statement1 statement2 Schleifenfuß Schleifenrumpf Schleifensteuerung Oft nicht vorbestimmbar, wie oft Anweisungen ausgeführt werden müssen Schleife: Schleifensteuerung + Schleifenrumpf Schleifenrumpf enthält zu wiederholende Anweisungen Schleifensteuerung gibt an, wie oft bzw. unter welchen Bedingungen Rumpf ausgeführt wird Achim Ebert OOP.3.16
Zählergesteuerte Schleife for-schleife, Zählschleife, Iteration for (init; expression; update) statement init ist Ausdrucksanweisung (ohne Semikolon, durch Kommata getrennte Anweisungsfolge, Deklarations-/ Definitionsanweisung oder leer expression ist boolean-ausdruck oder leer update ist Ausdrucksanweisung (ohne Semikolon), durch Kommata getrennte Anweisungsfolge oder leer statement ist Anweisung oder Anweisungsblock Achim Ebert OOP.3.17
Zählergesteuerte Schleife Häufigster Fall: Einsatz als Zählschleife Zähler, Laufvariable: Variable, die die Schleifendurchläufe zählt Laufvariable wird bei Schleifeneintritt mit Anfangswert initialisiert Nach jedem Schleifendurchlauf wird Wert aktualisiert Endwert kann durch Konstante, Variable oder Ausdruck festgelegt werden Laufvariable und Endwert müssen gleichen Typ haben Abbruchbedingung erfüllt Schleife wird verlassen Beispiel: for (int i=1; i<=20; i++) { System.out.println (i); } Achim Ebert OOP.3.18
Zählergesteuerte Schleife for-schleife für Arrays ( for-each ) for (type name : arrayname) statement In Java 5.0 eingeführt Vereinfachte Variante zum Durchlaufen von (u.a.) Arrays Bedeutung: Für jedes Element in arrayname weise das Element der Variablen name zu und führe dann Schleifenrumpf aus 1. Erzeuge Variable vom Typ type mit Namen name 2. Weise name ersten Wert aus arrayname zu 3. Führe Schleifenrumpf aus 4. Weise name nächsten Wert aus arrayname zu 5. Wiederhole solange Elemente in arrayname sind Beispiel: for (String name : telefonbuch) {... } Achim Ebert OOP.3.19
Zählergesteuerte Schleife for-schleife für Arrays ( for-each ) Beispiel Achim Ebert OOP.3.20
Kopfgesteuerte Schleife while-schleife while (expression) statement Bedingung wird ausgewertet, bevor Anweisungsfolge innerhalb des Rumpfes ausgeführt wird Sog. abweisende Schleife, da darin enthaltene Anweisungen nie ausgeführt werden, wenn Bedingung zu Beginn schon falsch ist Beispiel: int i=0; while (i>0) { i -= 2; System.out.println (i); } Achim Ebert OOP.3.21
Fußgesteuerte Schleife do-while-schleife do statement while (expression); Bedingungsprüfung am Ende der Schleife, d.h. nach Abarbeiten der Anweisungen im Rumpf Sog. annehmende Schleife, da darin enthaltene Anweisungen mindestens einmal durchlaufen werden Beispiel: int i=0; do { i -= 2; System.out.println (i); } while (i>0); Achim Ebert OOP.3.22
Spezielle Kontrollflussanweisungen Verzweigungen erlauben den Sprung an eine vom sonstigen Kontrollfluss abweichende Stelle Stelle kann implizit oder explizit durch Verwendung von Marken (Labels) festgelegt sein break-anweisung Beim Treffen auf unmarkierte break-anweisung führt Kontrollfluss unmittelbar aus innerster Schleifenumgebung (bzw. switch-anweisung) heraus Bei markierter break-anweisung break label; hingegen wird Umgebung verlassen, die durch die angegebene Marke label gekennzeichnet ist Achim Ebert OOP.3.23
break-anweisung (Beispiele) int i=1, j=1, k=10; // j = Fakultaet von k do { if (i>k) break; j *= i; i++; } while (true); // Einmaleins bis 9*9 nestedfor: for (i=1; i<10; i++) for (j=1; j<10; j++) { if ( i*j > 80 ) break nestedfor; } Achim Ebert OOP.3.24
continue-anweisung Bei unmarkierter continue-anweisung geht Kontrollfluss einer Schleife zur nachfolgenden Iteration über Bei while- oder do-while-schleifen wird nach continue die laufende Iteration sofort beendet, die Schleifenbedingung ausgewertet und je nach Ergebnis Schleife verlassen oder neue Iteration gestartet In for-schleifen wird vor der Auswertung der Schleifenbedingung noch update abgearbeitet Bei markierter continue-anweisung continue label; geht Kontrollfluss entsprechend an umgebende Schleife über, die durch label markiert ist In dieser Schleife läuft Übergang zur nächsten Iteration genauso ab wie bei unmarkierter continue-anweisung Achim Ebert OOP.3.25