252-0027 Einführung indie Programmierung 2.3.2Verschachtelte Schleifen ThomasR.Gross DepartmentInformatik ETHZürich 2.3.2Verschachtelte for Schleifen for Schleife for (initialization; test; update) { statement; statement; ... statement; } header (Kopf) body (Rumpf) statement(Anweisung im Rumpf derSchleife)kann beliebige Java Anweisung sein Auch wieder eine Schleife …. Verschachtelte Schleifen § Verschachtelte Schleifen ("nestedloop"):Schleife ineiner Schleife for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 10; j++) { System.out.print("*"); } System.out.println(); // to end the line } § DerRumpf deräusseren Schleife wird 5-mal ausgeführt,derRumpf derinneren (Schleife) 10-mal(jedesmal) Output: ********** ********** ********** ********** ********** Verschachtelte Schleifen Wasgibt diesesProgrammsegment aus? for (int i = 1; i <= 5; i++) { for (int j = 1; j <= i; j++) { System.out.print("*"); } § Output: System.out.println(); * } ** *** **** ***** Mögliche Fehler § DieSchleife terminiert nicht § Läuft undläuft undläuft § Endlosschleife ("infiniteloop") Mögliche Fehler § DieSchleife terminiert nicht § Läuft undläuft undläuft § Endlosschleife ("infiniteloop") § Beispiele: for (int i = 1; i <= 5; i++) { for (int j = 1; i <= 10; j++) { System.out.print("*"); } System.out.println(); } Mögliche Fehler § DieSchleife terminiert nicht § Läuft undläuft undläuft § Endlosschleife ("infiniteloop") § Beispiele: for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 10; i++) { System.out.print("*"); } System.out.println(); } Wastun? § Eclipsekann solche Programme stoppen. § Klicken auf"Terminate" 17 Mehr Beispiele § Welche verschachtelten for Schleifen erzeugen diesen Output? ....1 ...2 ..3 .4 5 Äussere undinnere Schleife § Legen Sie erst dieäussere Schleife fest,zählt von1bis zur Anzahl derZeilen for (int line = 1; line <= 5; line++) { ... } § Analysieren Sie jede Zeile.Entdecken Sie dasMuster: § ein paar Punkte (0Punkte inderletzten Zeile)gefolgt vonZahl ....1 ...2 ..3 .4 5 Beobachtung:DieAnzahl der Punkte hängt vonder Zeilennummer ab. Zahlenfolgen à Schleifen for (int count = 1; count <= 5; count++) { System.out.print( ... ); } Welche Anweisung im Rumpf würde diesen Outputergeben: 4 7 10 13 16 for (int count = 1; count <= 5; count++) { System.out.print(3 * count + 1 + " "); } Zahlenfolgen à Schleifen mit Tabellen § Welche Anweisung im Rumpf würde diesen Outputergeben: 2 7 12 17 22 § Zum Finden desMusterserstellen Sie eine Tabelle mit count unddenZahlen. § Wenn sich count um1erhöht,sollte dieZahl um5heraufgehen. § Abercount * 5 ist zu gross(um3),alsosubtrahieren wir 3. count Zahl in Folge 5 * count 5 * count - 3 1 2 5 2 2 7 10 7 3 12 15 12 4 17 20 17 5 22 25 22 Weiteres Tabellen Beispiel § Welche Anweisung im Rumpf würde diesen Outputergeben: 17 13 9 5 1 § Konstruieren wir dieTabelle. § Wenn sich count um1erhöht,sollte dieZahl ... § AberdiesesProdukt ist zu ... count Zahl in Folge -4 * count -4 * count + 21 1 17 -4 17 2 13 -8 13 3 9 -12 9 4 5 -16 5 5 1 -20 1 Zurück zum Beispiel mit for Schleife § Konstruieren wir eine Tabelle ....1 ...2 ..3 .4 5 line # Punkte -1 * line -1 * line + 5 1 4 -1 4 2 3 -2 3 3 2 -3 2 4 1 -4 1 5 0 -5 0 § Umeinen Buchstaben mehrfach zu drucken verwenden wir eine for Schleife. for (int j = 1; j <= 4; j++) { System.out.print("."); } // 4 Punkte Lösung mit for Schleife § Antwort: for (int line = 1; line <= 5; line++) { for (int j = 1; j <= (-1 * line + 5); j++) { System.out.print("."); } § Output: System.out.println(line); ....1 } ...2 ..3 .4 5 Verschachtelte for Schleifen § Wasist derOutputdieser verschachtelten Schleifen? for (int line = 1; line <= 5; line++) { for (int j = 1; j <= (-1 * line + 5); j++) { System.out.print("."); } for (int k = 1; k <= line; k++) { System.out.print(line); } System.out.println(); } Verschachtelte for Schleifen § Wasist derOutputdieser verschachtelten Schleifen? for (int line = 1; line <= 5; line++) { for (int j = 1; j <= (-1 * line + 5); j++) { System.out.print("."); } for (int k = 1; k <= line; k++) { § Answer: System.out.print(line); ....1 } ...22 System.out.println(); ..333 } .4444 55555 Verschachtelte for Schleifen Uebung § Verändern Sie dasletzte Programm sodass dieser Output erzeugt wird: ....1 ...2. ..3.. .4... 5.... 2.4Methoden mit Parametern 31 Zurück zu unserem einfachen Beispiel § Wir sich nicht andieRegeln hält musssie abschreiben: class Beispiel { public static void main (String[] args) { for (int i = 1; i <= 5; i++) { System.out.println( "Ich werde die Schulhausregeln beachten"); } } // end main } 32 Mit Methode § Wir sich nicht andieRegeln hält musssie abschreiben: class Beispiel { public static void main (String[] args) { strafe(); } // end main public static void strafe() { … } // end strafe } 33 Mit Methode public static void strafe () { for (int i = 1; i <= 5; i++) { System.out.println( "Ich werde die Schulhausregeln beachten"); } } // end strafe 34 Mit Methoden strafe5, strafe10, strafe15 public static void strafe5 () { for (int i = 1; i <= 5; i++) { ... } } // end strafe5 public static void strafe10 () { for (int i = 1; i <= 10; i++) { ... } } // end strafe10 public static void strafe15 () { for (int i = 1; i <= 15; i++) { ... } } // end strafe15 35 Noch mehr Strafen … § Diese "Lösung"lässt nur eine vorgebene Anzahl von Wiederholungen zu … § WaswennwirauchandereAnzahl Wiederholungen wollen? § OK,keinechtesThemaaberesgehtunsjaumdasPrinzip § WirbraucheneinenWeg,dieAnzahl derWiederholungender Situationanzupassen § Parametrisierung:mit (veränderbaren)Parametern versehen 36 Parametrisierung § Parameter:Ein Wertdeneine aufgerufene Methode vonder aufrufenden Methode erhält. Parametrisierung § Parameter:Ein Wertdeneine aufgerufene Methode vonder aufrufenden Methode erhält. § Statt strafe5, strafe10, strafe15 entwicklen wir eine Methode flexstrafe sodass verschiedene Wiederholungen gewählt werden können. § Wenn wir eine Methode deklarieren dann geben wir an,dass diese Methode einen Parameterbraucht. § Wenn wir dieMethodaufrufen,dann geben wir einen Wertfür denParameteran. Parametrisierung main 5 10 flexstrafe flexstrafe Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Ich werde dieSchulhausregeln beachten Parameterdeklarationen Gibt andass eine Methode einen Parameterbraucht um ausgeführt werden zu können public static void name ( type name ) { statement; } § Beispiel: public static void echoPin(int code) { System.out.println(”Die Geheimnummer ist: " + code); } Wert(e)für Parameter Beim Aufruf einer Methode mussein Wertfür denParameterangegeben werden. name (expression); § Beispiel: public static void main(String[] args) { echoPin(42); echoPin(12345); } § Output Die Geheimnummer ist: Die Geheimnummer ist: 42 12345 Wie werden Parameterübergeben? § Uebergeben:vom Aufrufer zur aufgerufenen Methode § Wenn eine Methode aufgerufen wird dann: § Der Wertwird inder ParameterVariablegespeichert § DieAnweisungen derMethode werden ausgeführt (mit diesem Wert für dieParameterVariable). § DerWert,denderAufrufer übergibt,kann durch eine Variable gegeben sein § DerWertkann durch einen Ausdruck berechnet werden § Eine Konstante (Literal)ist auch ein Ausdruck § Zurück zum Beispiel: Methode mit Parameter class Beispiel { public static void main (String[] args) { flexstrafe(1000); } // end main public static void flexstrafe(int wieoft) { for (int i = 1; i <= wieoft; i++) { System.out.println("Ich werde die Schulhausregeln beachten"); } } // end flexstrafe } 46 Parameter § Ein ParameterinderDeklaration einer Methode heisst formaler Parameter(“formalparameter”) § Formalparameter:definiert Variable(legt Typ undNamen fest!) § Derübergebene Wertheisst tatsächlicher Parameter(“actual parameter”)oder Argument(“argument”) § Aktuell:augenblicklich,derzeitig [Duden] § Aktueller Wert Parameter Ein Parameterkann inderMethode wie jede Variableverwendet werden (z.B.Anzahl derIterationen einer Schleife kontrollieren) public static void main(String[] args) { printPunkt(3); } public static void printPunkt(int times) { for (int i = 1; i <= times; i++) { System.out.println(“."); } } Output:… Wie werden Parameterübergeben? public static void main(String[] args) { printPunkt(3); printPunkt(7); 3 7 } public static void printPunkt(int times) { for (int i = 1; i <= times; i++) { System.out.println(“."); } } Mögliche Fehler § Wenn eine Methode einen Parametererwartet dann muss dieser auch übergeben werden. printPunkte(); required // ERROR: parameter value § Der Wertmussdenrichtigen Typ hben printPunkte(3.7); // ERROR: must be of type int DieRegeln für Umwandlungen gelten auch hier Mehrere Parameter § Eine Methode kann mehrere Parametererwarten (getrennt durch ,inDeklaration undim Aufruf) § Wenn dieMethode aufgerufen wird mussein Wertfür jeden Parameterangegeben werden § Deklaration: public static void name (type name, ..., type name) { statement; } § Aufruf:name (value, value, ..., value); Beispiel mit mehreren Parametern public static void main (String[] args) { Scanner console = new Scanner(System.in); System.out.print("Input lower bound: "); int low = console.nextInt(); System.out.print("Input upper bound: "); int up = console.nextInt(); printOdd(low, up); printOdd(-up, -low); } public static void printOdd(int from, int to) { for (int i=from; i<=to; i++) { if (i%2==1) { System.out.println(i); } } } Wie werden Parameterübergeben? § Wenn eine Methode aufgerufen wird: § Derübergebene Wertwird inderParameterVariablegespeichert § DieAnweisungen derMethode werden ausgeführt (mit diesem Wert für dieParameterVariable). § DerWert,denderAufrufer übergibt,kann durch einen Ausdruck (Expression)gegeben sein § DerWertdesExpressionswird berechnet § Dieaufgerufene Methode erhält denWertundhatkeine Kenntnis wie derWertberechnet wurde Wie werden Parameterübergeben? § Wenn eine Methode aufgerufen wird: § Derübergebene Wertwird inderParameterVariablegespeichert § DieAnweisungen derMethode werden ausgeführt (mit diesem Wert für dieParameterVariable). § DerWert,denderAufrufer übergibt,kann durch eine Variable gegeben sein § Der Wertder Variablewird verwendet § Dieaufgerufene Methode erhält denWertundhatkeine Kenntnis wie derWertberechnet wurde § Insbesondere kennt dieaufgerufene Methode nicht dieVariablen des Aufrufers Uebergabe vonWerten (“Valuesemantics”) § Gegeben ein ParameterP eines Basistyps (int,double,…) § Wenn dasArgumentdurch eine VariableV bestimmt wird dann wird derWertdieser Variablekopiert,d.h.Pwird auf denWertvonV gesetzt § Wir sprechen von“valuesemantics” § Veränderungen derParameterVariableP inderaufgerufenen Methode haben keine Auswirkung aufV. Uebergabe vonWerten (“Valuesemantics”) public static void strange(int x) { x = x + 1; System.out.println("1. x = " + x); } public static void main(String[] args) { int x = 23; strange(x); System.out.println("2. x = " + x); ... } Output: 1. x = 24 2. x = 23 Uebergabe vonWerten (“Valuesemantics”) § valuesemantics bedeutet dass (nur)derWertübergeben wird § Veränderungen derParameterVariableinderaufgerufenen Methode haben keine Auswirkung aufV. § Nameeines aktuellen Parameters(wenn eine Variableverwendet wird)ist unwichtig. "ParameterUebergabe"Aufgabe public class ParameterMystery { public static void main(String[] args) { int x = 9; int y = 2; int z = 5; mystery(z, y, x); mystery(y, x, z); } public static void mystery(int x, int z, int y) { System.out.println(z + " and " + (y - x)); } } Uebersicht § 2.5"if"Anweisungen § 2.6Nochmal Schleifen 62 Verzweigungen (if-Anweisungen) if Anweisung ("if-statement") § Führt eine Anweisung (oder Anweisungen)nur aus wenn ein TestdenWertwahr ("true")ergibt. if (test) { statement; ... statement; } § Beispiel: nein Ist testwahr? ja Anweisung(en) ausführen Folgende Anweisung ausführen double punkte = console.nextDouble(); if (punkte >= 50.0) { System.out.println("Pruefung bestanden."); } if-else Anweisung § Führt einen Gruppe vonAnweisungen aus wenn ein TestdenWertwahr ("true")ergibt,sonst eine andere Gruppe if (test) { nein ja statement(s); Ist testwahr? } else { statement(s); "else"Anweisung(en) "if"Anweisung(en) ausführen ausführen } § Beispiel: Folgende Anweisung double punkte = console.nextDouble(); ausführen if (punkte >= 50.0) { System.out.println("Pruefung bestanden."); } else { System.out.println("Pruefung nicht bestanden."); } Boolesche Ausdrücke § if Anweisungen undfor Schleifen verwenden beide boolesche Ausdrücke. for (int i = 1; i <= 10; i++) { ... if (i <= 10) { ... § Diese Ausdrücke werden ausgewertet --- Ergebnis entweder "true"oder "false" § Verwenden Vergleichsoperatoren Vergleichsoperatoren Operator == Meaning gleich Example 1 + 1 == 2 Value true != ungleich 3.2 != 2.5 true < weniger als 10 < 5 false > grösser als 10 > 5 true <= weniger als oder gleich 126 <= 100 false >= grösser als oder gleich 5.0 >= 5.0 true Vorsicht:nicht alle Operatoren können für alle Typen (sinnvoll) angewendet werden. Gebrauch vonif Wasfällt Ihnen indiesem CodeBeispiel auf? Scanner console = new Scanner(System.in); System.out.print("Wieviele Punkte haben Sie erreicht? "); int percent = console.nextInt(); if (percent >= 90) { System.out.println("Ihre Note ist 6.0."); } if (percent >= 80) { System.out.println("Ihre Note ist 5.0."); } if (percent >= 70) { System.out.println("Ihre Note ist 4.0."); } if (percent >= 60) { System.out.println("Ihre Note ist 3.5."); } if (percent < 60) { System.out.println("Ihre Note ist 3.0."); } ... Verschachtelte if-else Anweisungen Auswahl bestimmt durch mehrere Tests if (test) { statement(s); } else if (test) { statement(s); } else { statement(s); } nein Ergibt test1wahr? nein Ergibt test2wahr? Gruppe 3Anweisungen ausführen ja Gruppe 1Anweisungen ausführen Gruppe 2Anweisungen ausführen Folgende Anweisung ausführen ja Verschachtelte if-else Anweisungen Beispiel: if (x > 0) { nein System.out.println("Positiv"); Ergibt testwahr? ja } else if (x < 0) { System.out.println("Negativ"); nein Ergibt testwahr? ja Gruppe 1Anweisungen ausführen } else { System.out.println("Null"); Gruppe 3Anweisungen ausführen Gruppe 2Anweisungen ausführen } Folgende Anweisung ausführen Verschachtelte if-else-if § Endet mit else:genau ein Pfad mussausgeführt werden § Endet mit if:Eventuell wird keine Anweisung ausgeführt. nein ja if (test) { Ergibt testwahr? statement(s); } else if (test) { Gruppe 1Anweinein ja Ergibt testwahr? sungen ausführen statement(s); } else if (test) { Gruppe 2Anweinein ja Ergibt testwahr? sungen ausführen statement(s); } Gruppe 3Anweisungen ausführen Verschachtelte if-else-if if (place == 1) { System.out.println("Gold!!"); } else if (place == 2) { System.out.println("Silver!"); } else if (place == 3) { System.out.println("Bronze."); } nein nein Ergibt testwahr? Ergibt testwahr? Ergibt testwahr? ja ja Gruppe 1Anweisungen ausführen Gruppe 2Anweisungen ausführen Gruppe 3Anweisungen ausführen ja Verschachtelte if Konstrukte • Genau ein 1 Pfad (gegenseitiger Ausschluss) • if (test) { statement(s); } else if (test) { statement(s); } else { statement(s); } • 0 oder 1 Pfad (gegenseitiger Ausschluss) if (test) { statement(s); } else if (test) { statement(s); } else if (test) { statement(s); } 0, 1, oder viele Pfade (unabhängig, kein gegenseitiger Ausschluss) if (test) { statement(s); } if (test) { statement(s); } if (test) { statement(s); } Verschachtelte if/else Beispiel Formelfür Body-Mass-Index(BMI): BMI < 18.5 18.5 – <25 25.0 -- <30 ≥ 30.0 Weight class Untergewicht Normalgewicht Uebergewicht Adipositas § Schreiben Sie ein Programm dasfolgenden Outputproduziert: Dieses Programm erhebt die Daten fuer 2 Personen und berechnet den Body-Mass-Index(BMI). Geben Sie die Daten fuer die naechste Person ein: Laenge(in m)? 1.70 Masse(in kg)? 60 Geben Sie die Daten fuer die naechste Person ein: Laenge(in m)? 1.65 Masse(in kg)? 75 Verschachtelte if/else Beispiel Formelfür Body-Mass-Index(BMI): BMI < 18.5 18.5 – <25 25.0 -- <30 ≥ 30.0 Weight class Untergewicht Normalgewicht Uebergewicht Adipositas § Schreiben Sie ein Programm dasfolgenden Outputproduziert: Dieses Programm erhebt die Daten fuer 2 Personen und berechnet den Body-Mass-Index(BMI). Person 1 BMI = 20.761245674740484 Normalgewicht Person 2 BMI = 27.548209366391184 Uebergewicht Differenz = 6.786963691650700 Nestedif/else System.out.println("Person " + number + " BMI = " + bmi); if (bmi < 18.5) { System.out.println(" Untergewicht "); } else if (bmi < 25) { System.out.println(" Normalgewicht "); } else if (bmi < 30) { System.out.println(" Uebergewicht "); } else { System.out.println(" Adipositas "); } Boolesche Operatoren § Vergleiche können durch boolesche Operatoren verknüpft werden Operator && Description and Example (2 == 3) && (-1 < 5) Result false || or (2 == 3) || (-1 < 5) true ! not !(2 == 3) true § ”Wahrheitstabelle"für diese Operatoren,für Aussagen p undq: p && q p true q true true false false false true true false false false false p || q true true p true false true false true false !p Boolesche Ausdrücke § Vergleichsoperatoren haben eine tiefere Präzedenz als arithmetische Operatoren. 5 * 7 5 * 7 35 35 true >= >= >= >= 3 + 5 * (7 - 1) 3 + 5 * 6 3 + 30 33 § Vergleichsoperatoren können nicht eine “Kette”bilden wie inMathematik 2 <= x <= 10 true <= 10 error! (Annahme:x ist 15) Boolesche Ausdrücke § Aussagen können mit && oder || kombiniert werden 2 <= x && x <= 10 true && false false (Annahme:x ist 15) § Boolesche Operatoren haben eine tiefere Präzedenz als Vergleichsoperatoren. § Verwenden Sie Klammern umKlarheit zu schaffen Beispiel § Welcher boolesche Ausdruck ergibt true wenn ein Jahr jahr ein Schaltjahr ist? § jahr ist Schaltjahr wenn jahr durch 4teilbar ist (ohne Rest),jahr aber nicht durch 100ohne Restteilbar ist,es sei denn dass jahr ohne Restdurch 400teilbar sei. § int jahr; // aktuelles Jahr 88 Boolesche Ausdrücke § Wasist dasErgebnis für diefolgenden Ausdrücke? int x = 42; int y = 17; int z = 25; § § § § § y < x && y <= z x % 2 == y % 2 || x % 2 == z % 2 x <= y + z && x >= y + z !(x < y && x < z) (x + y) % 2 == 0 || !((z - y) % 2 == 0) Faktorisierung § Sie erinnern sich andieZerlegung einer Zahl inPrimzahlen § OderdieZerlegung vonPolynomen § Faktorisierung § Idee:keine Ueberlappung § Faktorisierung (factoring)vonCode:Herausarbeiten von gemeinsamen/redundanten Anweisungen § Inder PraxisofRefaktorisierung (refactoring) Faktorisierung für if/else Anweisungen § Example: if (a == 1) { System.out.println(a); x = 3; b = b + x; } else if (a == 2) { System.out.println(a); x = 6; y = y + 10; b = b + x; } else { // a == 3 System.out.println(a); x = 9; b = b + x; } System.out.println(a); b = b + x; Faktorisierung für if/else Anweisungen § Example: if (a == 1) { System.out.println(a); x = 3; b = b + x; } else if (a == 2) { System.out.println(a); x = 6; y = y + 10; b = b + x; } else { // a == 3 System.out.println(a); x = 9; b = b + x; } System.out.println(a); x = 3 * a; b = b + x; Faktorisierung für if/else Anweisungen § Example: if (a == 1) { System.out.println(a); x = 3; b = b + x; } else if (a == 2) { System.out.println(a); x = 6; y = y + 10; b = b + x; } else { // a == 3 System.out.println(a); x = 9; b = b + x; } System.out.println(a); x = 3 * a; if (a == 2) { y = y + 10; } b = b + x; Boolesche Ausdrücke if (((x>0) && (y>0)) && (z > 0)) { // block 1 } // more code if (((x>0) && (y>0)) && (z >= 0)) { // block 2 } § Wasist andiesem CodeBeispiel schlecht? 97 Boolesche Ausdrücke if (((x>0) && (y>0)) && (z > 0)) { // block 1 } // more code if (((x>0) && (y>0)) && (z >= 0)) { // block 2 } § Wasist andiesem CodeBeispiel schlecht? § (x>0) && (y>0) mehrfach berechnet 98 Typ boolean § Boolesche Werte können inVariablen desTyps boolean gespeichert werden. § DerTyp boolean kennt nur zwei Werte:wahr (true)und falsch (false). § Ein Vergleich ("test")ist ein einfacher boolescher Ausdruck (ein Ausdruck derein boolean Ergebnis hat). § Boolesche Ausdrücke können mit denbooleschen Operatoren kombiniert werden. § boolean quadrant1; oder boolean quadrant1 = true; deklarieren boolesche Variable. Typ boolean Beispiele boolean isJugendlicher = (alter < 18); boolean wohntInZuerich = (plz >= 8000) && (plz < 8100); boolean studiertETH = true; // nur fuer volljaehrige/n Student/in aus Zuerich if (isJugendlicher || !wohntInZuerich || !studiertETH) { System.out.println("Kein Zutritt!"); } Gebrauch vonboolean § Kann Ergebnis eines komplizierten Ausdrucks speichern undspäter wiederverwenden § Vorausgesetzt dieKomponenten ändern sich nicht … § Macht Programm lesbarer Hinweise § Manchmal sieht mansolchen Code(testob eine VariabledenWerttrue hat): if (isPrime == true) { // schlecht ... } § Dasist nicht nötig undredundant.Besser : if (isPrime) { ... } // gut Hinweise § Auch nicht besser ist derTestfür false: if (isPrime == false) { // schlecht if (!isPrime) { // gut Bedingte ("short-circuit")Auswertung § Für && und|| müssen nicht immer beide Operanden ausgewertet werden,umdasErgebnis zu ermitteln § Javabeendet dieAuswertung eines booleschen Ausdrucks sobald dasErgebnis feststeht. Bedingte ("short-circuit")Auswertung § Für && und|| müssen nicht immer beide Operanden ausgewertet werden,umdasErgebnis zu ermitteln § Javabeendet dieAuswertung eines booleschen Ausdrucks sobald dasErgebnis feststeht. § Ausdrücke werden vonlinksnach rechts,gemäss Präzedenz ausgewertet § && stoppt sobald ein Teil(ausdruck)false ist § || stoppt sobald ein Teil(ausdruck) true ist Bedingte ("short-circuit")Auswertung § Javabeendet dieAuswertung eines booleschen Ausdrucks sobald dasErgebnis feststeht. § Ausdrücke werden vonlinksnach rechts,gemäss Präzedenz ausgewertet § && stoppt sobald ein Teil(ausdruck)false ist § || stoppt sobald ein Teil(ausdruck) true ist § Diese ArtderAuswertung heisst bedingte Auswertung § Folgende Teilausdrücke werden abhängig vonzuerst ausgewerteten Ausdrücken (nicht)evaluiert Auswertung desTests § Wir wollen nur Quotienten (für a,b)grösser als 0drucken: Scanner console = new Scanner(System.in); System.out.print("Eingabe zweier Zahlen: "); int a = console.nextInt(); int b = console.nextInt(); System.out.println(a + " / " + b + " = " + a/b); ... Auswertung desTests § Wir wollen nur Quotienten (für a,b)grösser als 0drucken: Scanner console = new Scanner(System.in); System.out.print("Eingabe zweier Zahlen: "); int a = console.nextInt(); int b = console.nextInt(); if ( b!=0) { if ( a/b>0 ) { System.out.println(a + " / " + b + " = " + a/b); }; } ... Auswertung desTests § Viele "if"Statementsmachen denCodeunlesbar Scanner console = new Scanner(System.in); System.out.print("Eingabe zwei Zahlen: "); int a = console.nextInt(); int b = console.nextInt(); if ( b!=0) { if ( a/b>0 ) { System.out.println(a + " / " + b + " = " + a/b); }; } ... Auswertung desTests § Wir wollen nur Quotienten (für a,b)grösser als 0drucken: Scanner console = new Scanner(System.in); System.out.print("Eingabe zweier Zahlen: "); int a = console.nextInt(); int b = console.nextInt(); // a/b > 0 UND // b != 0 System.out.println(a + " / " + b + " = " + a/b); } ... Reihenfolge ist wichtig § Dieser Codeführt zu einer Fehlermeldung wenn b==0: // Warning. Scanner console = new Scanner(System.in); System.out.print("Eingabe zweier Zahlen: "); int a = console.nextInt(); int b = console.nextInt(); if (a/b>0) && (b!=0) { System.out.println(a + " / " + b + " = " + a/b); }; } ... Bedingte ("short-circuit")Auswertung § Dieser Codeführt zu keiner Fehlermeldung wenn b==0: // Warning Scanner console = new Scanner(System.in); System.out.print("Eingabe zweier Zahlen: "); int a = console.nextInt(); int b = console.nextInt(); if (b!=0) && (a/b>0) { System.out.println(a + " / " + b + " = " + a/b); }; } ... Bedingte Auswertung:Vorsicht § Wassind dieWerte voni undj amEnde desCodesegments? // look closely int i = 0; int j = 0; if (j != 0) && (i++ > 0) { System.out.println(…); } § Vorsicht bei ++/-- Bedingte Auswertung:Vorsicht § Dielogischen Operatoren sind nicht kommutativ wenn die Auswertung denZustand desProgramms verändern kann. § Vorsicht bei Operatoren mit Nebenwirkungen (“sideeffects”) § Offensichtliche Nebenwirkungen:z.B.(int x,y)++x,–yo.ä. § Nicht sofort offensichtlich:(int x,y)x/y,(doublef,g)f/g,double(a,b)a+b DeMorgan'sRegeln DeMorgan'sRegeln:Regeln für dieNegationboolescher Ausdrücke. § Praktisch wenn mandasGegenteil eines Ausdrucks braucht. Ursprünglicher Ausdruck Negierter Ausdruck Alternative a && b a || b !a || !b !a && !b !(a && b) !(a || b) § Beispiel: Original if (x == 7 && y > 3) { Negiert if (x != 7 || y <= 3) { ... } ... }