252-0027
Einführung in die Programmierung 2 Einfache Java Programme
Thomas R. Gross
Department Informatik
Übersicht (für diese Woche)
§ 2.3.2 Verschachtelte for Schleifen
§ 2.4 Methoden mit Parametern
§ 2.5 “if”-Anweisungen
§ 2.6 Nochmals Schleifen
§ “while” Loops
§ 2.7 Ergebnis Rückgabe
§ 2.X Input
2
2.3.2 Verschachtelte for Schleifen
for Schleife
for (initialization; test; update) { statement;
statement;
...
statement;
}
statement (Anweisung im Rumpf der Schleife) kann beliebige Java Anweisung sein
Auch wieder eine Schleife ….
body (Rumpf) header (Kopf)
4
Verschachtelte Schleifen
§ Verschachtelte Schleifen ("nested loop"): Schleife in einer 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 }
Verschachtelte Schleifen
§ Verschachtelte Schleifen ("nested loop"): Schleife in einer 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 }
Output:
**********
**********
**********
**********
**********
§ Der Rumpf der äusseren Schleife wird 5-mal ausgeführt, der Rumpf der inneren
(Schleife) 10-mal (jedesmal)
6
Verschachtelte Schleifen
Was gibt dieses Programmsegment aus?
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) { System.out.print("*");
}
System.out.println();
}
8
Verschachtelte Schleifen
Was gibt dieses Programmsegment aus?
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) { System.out.print(i);
}
System.out.println();
}
11
Verschachtelte Schleifen
Was gibt dieses Programmsegment aus?
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= i; j++) { System.out.print(i);
}
System.out.println();
}
§ Output:
1
22
333
Mögliche Fehler
§ Die Schleife terminiert nicht
§ Läuft und läuft und läuft
§ Endlosschleife ("infinite loop")
14
Mögliche Fehler
§ Die Schleife terminiert nicht
§ Läuft und läuft und läuft
§ Endlosschleife ("infinite loop")
§ Beispiele:
for (int i = 1; i <= 5; i++) {
for (int j = 1; i <= 10; j++) { System.out.print("*");
} System.out.println();
Mögliche Fehler
§ Die Schleife terminiert nicht
§ Läuft und läuft und läuft
§ Endlosschleife ("infinite loop")
§ Beispiele:
for (int i = 1; i <= 5; i++) {
for (int j = 1; j <= 10; i++) { System.out.print("*");
} System.out.println();
}
16
Was tun?
§ Eclipse kann solche Programme stoppen.
§ Klicken auf "Terminate"
Mehr Beispiele
§ Welche verschachtelten for Schleifen erzeugen diesen Output?
....1 ...2 ..3 .4 5
18
Mehr Beispiele
§ Welche verschachtelten for Schleifen erzeugen diesen Output?
....1 ...2 ..3 .4 5
§ Wir müssen eine Ausgabezeile konstruieren:
äussere Schleife (5-mal da es 5 Zeilen gibt) innere Schleife (für jede Zeile)
Äussere und innere Schleife
§ Legen Sie erst die äussere Schleife fest, zählt von 1 bis zur Anzahl der Zeilen
for (int line = 1; line <= 5; line++) { ...
}
§ Analysieren Sie jede Zeile. Entdecken Sie das Muster:
ein paar Punkte (0 Punkte in der letzten Zeile) gefolgt von Zahl
....1 ...2 ..3 .4 5
20
Äussere und innere Schleife
§ Legen Sie erst die äussere Schleife fest, zählt von 1 bis zur Anzahl der Zeilen
for (int line = 1; line <= 5; line++) { ...
}
§ Analysieren Sie jede Zeile. Entdecken Sie das Muster:
ein paar Punkte (0 Punkte in der letzten Zeile) gefolgt von Zahl
....1 ...2 ..3
.4
Beobachtung: Die Anzahl der
Zahlenfolgen à Schleifen
for (int count = 1; count <= 5; count++) { System.out.print( ... );
}
Welche Anweisung im Rumpf würde diesen Output ergeben:
4 7 10 13 16
for (int count = 1; count <= 5; count++) { System.out.print(3 * count + 1 + " ");
}
22
Zahlenfolgen à Schleifen mit Tabellen
§ Welche Anweisung im Rumpf würde diesen Output ergeben:
2 7 12 17 22
§ Zum Finden des Musters erstellen Sie eine Tabelle mit count und den Zahlen.
§ Wenn sich count um 1 erhöht, sollte die Zahl um 5 heraufgehen.
§ Aber count * 5 ist zu gross (um 3), also subtrahieren wir 3.
count Zahl in Folge 5 * count
1 2 5
2 7 10
3 12 15
5 * count - 3
2 7 12
count Zahl in Folge
1 2
2 7
3 12
Weiteres Tabellen Beispiel
§ Welche Anweisung im Rumpf würde diesen Output ergeben:
17 13 9 5 1
§ Konstruieren wir die Tabelle.
§ Wenn sich count um 1 erhöht, sollte die Zahl ...
§ Aber dieses Produkt ist zu ...
count Zahl in Folge
1 17
2 13
3 9
4 5
5 1
-4 * count -4 * count + 21
-4 17
-8 13
-12 9
-16 5
-20 1
-4 * count -4
-8 -12 -16
-20 24
Zurück zum Beispiel mit for Schleife
§ Konstruieren wir eine Tabelle
....1 ...2 ..3 .4 5
§ Um einen Buchstaben mehrfach zu drucken verwenden wir eine for Schleife.
for (int j = 1; j <= 4; j++) {
line # Punkte
1 4
2 3
3 2
4 1
5 0
-1 * line -1
-2 -3 -4 -5
-1 * line + 5
4 3 2 1 0
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(".");
}
System.out.println(line);
}
§ Output:
....1 ...2 ..3 .4
5
26Verschachtelte for Schleifen
§ Was ist der Output dieser 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
§ Was ist der Output dieser 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();
}
§ Answer:
....1
...22
..333
.4444
55555
28Verschachtelte for Schleifen Übung
§ Verändern Sie das letzte Programm so dass dieser Output erzeugt wird:
....1 ...2.
..3..
.4...
5....
Verschachtelte for Schleifen Übung
Verändern Sie das letzte Programm so dass dieser Output erzeugt wird:
....1 ...2.
..3..
.4...
5....
(Eine) Antwort:
for (int line = 1; line <= 5; line++) {
for (int j = 1; j <= (-1 * line + 5); j++) { System.out.print(".");
}
System.out.print(line);
for (int j = 1; j <= (line - 1); j++) { System.out.print(".");
}
System.out.println();
}
302.4 Methoden mit Parametern
Zurück zu unserem einfachen Beispiel
§ Jede/r soll die Aufgaben machen (können):
class Beispiel {
public static void main (String[] args) { for (int i = 1; i <= 5; i++) {
System.out.println(
"Ich werde die Uebungsaufgaben machen");
}
} // end main }
32
Mit Methode
§ Jede/r soll die Aufgaben machen (können):
class Beispiel {
public static void main (String[] args) { vorsatz();
} // end main
public static void vorsatz() {
…
Mit Methode
public static void vorsatz () { for (int i = 1; i <= 5; i++) {
System.out.println(
"Ich werde die Uebungsaufgaben machen");
}
} // end vorsatz
34
Mit Methoden vorsatz5, vorsatz10, vorsatz15
public static void vorsatz5 () {
for (int i = 1; i <= 5; i++) { ... } } // end vorsatz5
public static void vorsatz10 () {
for (int i = 1; i <= 10; i++) { ... } } // end vorsatz10
public static void vorsatz15 () {
for (int i = 1; i <= 15; i++) { ... }
Noch mehr Vorsätze …
§ Diese "Lösung" lässt nur eine vorgebene Anzahl von Wiederholungen zu …
§ Was wenn wir auch andere Kombinationen wollen?
§ OK, kein echtes Thema aber es geht uns ja um das Prinzip
§ Wir brauchen einen Weg, die Anzahl Wiederholungen der Situation anzupassen
§ Parametrisierung: mit (veränderbaren) Parametern versehen
36
Parametrisierung
§ Parameter: Ein Wert den eine aufgerufene Methode von der
aufrufenden Methode erhält.
Parametrisierung
§ Parameter: Ein Wert den eine aufgerufene Methode von der aufrufenden Methode erhält.
§ Statt vorsatz5, vorsatz10, vorsatz15 entwicklen wir eine Methode flexVorsatz so dass verschiedene
Wiederholungen gewählt werden können.
§ Wenn wir eine Methode deklarieren dann geben wir an, dass diese Methode einen Parameter braucht.
§ Wenn wir die Method aufrufen, dann geben wir einen Wert für
den Parameter an.
Parametrisierung
main 5 flexVorsatz flexVorsatz 10
Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen
Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen Ich werde die Hausaufgaben machen
Parameterdeklarationen
Gibt an dass eine Methode einen Parameter braucht um ausgeführt werden zu können
public static void methodName ( type name ) { statement;
}
Parameterdeklarationen
Gibt an dass eine Methode einen Parameter braucht um ausgeführt werden zu können
public static void methodName ( type name ) { statement;
} name: Parameter Variable
Parameterdeklarationen
Gibt an dass eine Methode einen Parameter braucht um ausgeführt werden zu können
public static void methodName ( type name ) { statement;
}
§ Beispiel:
public static void echoPin(int code) {
System.out.println(”Die Geheimnummer ist: " + code);
}
Parameterdeklarationen
Gibt an dass eine Methode einen Parameter braucht 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);
Wenn echoPin aufgerufen wird dann muss
der Aufrufer einen int Wert angeben.
Wert(e) für Parameter
Beim Aufruf einer Methode muss ein Wert für den Parameter angegeben werden.
name (expression);
§ Beispiel:
public static void main(String[] args) { echoPin(42);
echoPin(12345);
}
§ Output
Die Geheimnummer ist: 42 Die Geheimnummer ist: 12345
Wie werden Parameter übergeben?
§ Übergeben: vom Aufrufer zur aufgerufenen Methode
§ Wenn eine Methode aufgerufen wird dann:
§ Der Wert wird in der Parameter Variable gespeichert
§ Die Anweisungen der Methode werden ausgeführt (mit diesem Wert für die Parameter Variable).
§ Der Wert, den der Aufrufer übergibt, kann durch eine Variable gegeben sein
§ Der Wert kann durch einen Ausdruck berechnet werden
Methode mit Parameter
§ Zurück zum Beispiel:
class Beispiel {
public static void main (String[] args) { flexVorsatz(1000);
} // end main
public static void flexVorsatz(int wieoft) { for (int i = 1; i <= wieoft; i++) {
System.out.println(
"Ich werde die Hausaufgaben machen");
}
} // end flexVorsatz
}
46Parameter
§ Ein Parameter in der Deklaration einer Methode heisst formaler Parameter (formal parameter).
§ Formal parameter: definiert
§ Der übergebene Wert heisst tatsächlicher Parameter (actual parameter) oder Argument (argument)
§ Aktuell: augenblicklich, derzeitig [Duden]
Parameter
Ein Parameter kann in der Methode wie jede Variable verwendet werden (z.B. Anzahl der Iterationen 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.print(“.");
}
System.out.println();
} Output: ...
Wie werden Parameter übergeben?
public static void main(String[] args) { printPunkt(3);
printPunkt(7);
}
public static void printPunkt(int times) { for (int i = 1; i <= times; i++) {
System.out.print(“.");
}
System.out.println();
37
50
Mögliche Fehler
§ Wenn eine Methode einen Parameter erwartet dann muss dieser auch übergeben werden.
printPunkt(); // ERROR: parameter value required
§ Der Wert muss den richtigen Typ hben
printPunkt(3.7); // ERROR: must be of type int
§ Die Regeln für Umwandlungen gelten auch hier
Mehrere Parameter
§ Eine Methode kann mehrere Parameter erwarten (getrennt durch , in Deklaration und im Aufruf)
§ Wenn die Methode aufgerufen wird muss ein Wert für jeden Parameter angegeben werden
§ Deklaration:
public static void method(type name, ..., type name) { statement;
}
§ Aufruf: method (value, value, ..., value);
Mehrere Parameter
§ Eine Methode kann mehrere Parameter erwarten (getrennt durch , in Deklaration und im Aufruf)
§ Wenn die Methode aufgerufen wird muss ein Wert für jeden Parameter angegeben werden
§ Deklaration:
public static void method(type1 name1, ..., typeN nameN) { statement;
}
Aufruf: method (value1, value2, ..., valueN);
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 Wert wird in der Parameter Variable gespeichert
§ Die Anweisungen der Methode werden ausgeführt (mit diesem Wert für die Parameter Variable).
§ Der Wert, den der Aufrufer übergibt, kann durch einen Ausdruck (Expression) gegeben sein
§ Der Wert des Expressions wird berechnet
§ Die aufgerufene Methode erhält den Wert und hat keine Kenntnis
Wie werden Parameter übergeben?
§ Wenn eine Methode aufgerufen wird:
§ Der übergebene Wert wird in der Parameter Variable gespeichert
§ Die Anweisungen der Methode werden ausgeführt (mit diesem Wert für die Parameter Variable).
§ Der Wert, den der Aufrufer übergibt, kann durch eine Variable gegeben sein
§ Der Wert der Variable wird verwendet
§ Die aufgerufene Methode erhält den Wert und hat keine Kenntnis davon wie der Wert berechnet wurde
§ Insbesondere kennt die aufgerufene Methode nicht die Variablen des
Aufrufers
Übergabe von Werten (“Value semantics”)
§ Wenn ein Parameter durch eine Variable V eines Basistyps ( int , double,boolean ) bestimmt wird dann wird der Wert dieser Variable kopiert (“value semantics”):
§ Veränderungen der Parameter Variable in der aufgerufenen
Methode haben keine Auswirkung auf V.
Übergabe von Werten (“Value semantics”)
public static void main(String[] args) { printPunkt(3);
printPunkt(3+4);
}
public static void printPunkt(int times) { for (int i = 1; i <= times; i++) {
System.out.print(“.");
}
System.out.println();
}
37
Übergabe von Werten (“Value semantics”)
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
60
Übergabe von Werten (“Value semantics”)
§ Wenn ein Parameter durch eine Variable V eines Basistyps ( int , double,boolean ) bestimmt wird dann wird der Wert dieser Variable kopiert (“value semantics”):
§ Veränderungen der Parameter Variable in der aufgerufenen Methode haben keine Auswirkung auf V.
§ Name eines aktuellen Parameters (wenn eine Variable verwendet
wird) ist unwichtig.
"Parameter Übergabe" Problem
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));
} }
"Parameter Übergabe" Problem
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) {
x y z
x y z
9 2 5
"Parameter Übergabe" Problem
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));
} }
x y z
x y z
9 2 5
5 2 9
5 2 9
"Parameter Übergabe" Problem
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) {
x y z
x y z
9 2 5
2 9 5
2 9 5
Übersicht
§ 2.5 "if" Anweisungen
§ 2.6 Nochmal Schleifen
68
2.5 Verzweigungen (if-Anweisungen)
if Anweisung (" if -statement")
§ Führt eine Anweisung (oder Anweisungen) nur aus wenn test den Wert wahr ("true") ergibt.
if (test) { statement;
...
}
// folgende Anweisung
§ Beispiel:
double punkte = console.nextDouble();
if (punkte >= 50.0) {
System.out.println("Pruefung bestanden.");
}
Anweisung(en) ausführen Ist test wahr?
Folgende Anweisung ausführen
ja nein
if-else Anweisung
§ Führt eine Gruppe von Anweisungen aus wenn test den Wert wahr ("true") ergibt, sonst eine andere Gruppe
if (test) {
statement(s);
} else {
statement(s);
}
§ Beispiel:
double punkte = console.nextDouble();
if (punkte >= 50.0) {
System.out.println("Pruefung bestanden.");
"if" Anweisung(en) ausführen
Ist test wahr?
Folgende Anweisung ausführen
nein ja
"else" Anweisung(en) ausführen
Boolesche Ausdrücke
§ if Anweisungen und for 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
Vorsicht: nicht alle Operatoren können für alle Typen (sinnvoll)
Operator Bedeutung Beispiel Wert
== gleich 1 + 1 == 2 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
Gebrauch von if
Was fällt Ihnen in diesem Code Beispiel 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 (test1) {
statement(s);
} else if (test2) { statement(s);
} else {
statement(s);
}
Gruppe 1 Anwei- sungen ausführen Ergibt test1 wahr?
nein ja
Gruppe 2 Anwei- sungen ausführen Ergibt test2 wahr? ja
nein
Gruppe 3 Anwei- sungen ausführen
Verschachtelte if-else Anweisungen
Beispiel :
if (x > 0) {
System.out.println("Positiv");
} else if (x < 0) {
System.out.println("Negativ");
} else {
System.out.println("Null");
}
Gruppe 1 Anwei- sungen ausführen Ergibt test1 wahr?
nein ja
Gruppe 2 Anwei- sungen ausführen Ergibt test2 wahr?
Folgende Anweisung ausführen
ja nein
Gruppe 3 Anwei- sungen ausführen
Verschachtelte if-else-if
§ Endet mit else: genau ein Pfad muss ausgeführt werden
§ Endet mit if: Eventuell wird keine Anweisung ausgeführt.
if (test1) {
statement(s);
} else if (test2) { statement(s);
} else if (test) { statement(s);
}
Gruppe 1 Anwei- sungen ausführen Ergibt test1 wahr?
nein ja
Gruppe 2 Anwei- sungen ausführen Ergibt test2 wahr? ja
nein
Gruppe 3 Anwei- sungen ausführen Ergibt test wahr? ja
nein
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.");
}
Gruppe 1 Anwei- sungen ausführen Ergibt test wahr?
nein ja
Gruppe 2 Anwei- sungen ausführen Ergibt test wahr? ja
Gruppe 3 Anwei- sungen ausführen Ergibt test wahr? ja
nein
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);
Welche if/else Kombination?
(1) if/if/if (2) verschachtelte if/else (3) verschachtelte if/else/if
§ Ob – abhängig von früheren Rennen – jemand in der ersten, zweiten, oder dritten Gruppe startet.
§ (2) verschachtelte if / else if / else
§ Ob es eine Medaille (Notendurschnitt ≥ 5.9) oder eine Urkunde (5.75-5.9) gibt.
§ (3) verschachtelte if / else if
§ Ob eine Zahl durch 2, 3, und/oder 5 teilbar ist.
§ (1) Folge von if / if / if
§ Note (auf 0.25 gerundet) aufgrund der Punkte (Prozent) in der Prüfung.
§ (2) verschachtelte if / else if / else if / else if / else
Vergleichsoperatoren
§ Vergleichsoperatoren haben eine tiefere Präzedenz als arithmetische Operatoren.
5 * 7 >= 3 + 5 * (7 - 1) 5 * 7 >= 3 + 5 * 6
35 >= 3 + 30 35 >= 33
true
§ Vergleichsoperatoren können nicht eine “Kette” bilden wie in Mathematik
2 <= x <= 10
Boolesche Operatoren
§ Vergleichsoperatoren können durch boolesche Operatoren verknüpft werden
§ ”Wahrheitstabelle" für diese Operatoren, für Aussagen p und q:
Operator Description Example Result
&& and (2 == 3) && (-1 < 5) false
|| or (2 == 3) || (-1 < 5) true
! not !(2 == 3) true
p q p && q p || q
true true true true true false false true false true false true false false false false
p !p
true false false true
Boolesche Ausdrücke
§ Aussagen können mit && oder || kombiniert werden
2 <= x && x <= 10 (Annahme: x ist 15) True && False
False
§ Boolesche Operatoren haben eine tiefere Präzedenz als Vergleichsoperatoren.
§ Verwenden Sie Klammern um Klarheit zu schaffen
Beispiel
§ Welcher boolesche Ausdruck ergibt true wenn ein Jahr jahr ein Schaltjahr ist?
§ jahr ist Schaltjahr wenn jahr durch 4 teilbar ist (ohne Rest), jahr aber nicht durch 100 ohne Rest teilbar ist, es sei denn dass jahr
ohne Rest durch 400 teilbar sei.
§ int jahr; // aktuelles Jahr
95
Beispiel
§ Welcher boolesche Ausdruck ergibt true wenn ein Jahr jahr ein Schaltjahr ist?
§ jahr ist Schaltjahr wenn jahr durch 4 teilbar ist (ohne Rest), jahr aber nicht durch 100 ohne Rest teilbar ist, es sei denn dass jahr
ohne Rest durch 400 teilbar sei.
§ int jahr; // aktuelles Jahr
§ jahr % 4 == 0 && jahr % 100 != 0 || jahr % 400 == 0
Beispiel
§ Welcher boolesche Ausdruck ergibt true wenn ein Jahr jahr ein Schaltjahr ist?
§ jahr ist Schaltjahr wenn jahr durch 4 teilbar ist (ohne Rest), jahr aber nicht durch 100 ohne Rest teilbar ist, es sei denn dass jahr
ohne Rest durch 400 teilbar sei.
§ int jahr; // aktuelles Jahr
§ jahr % 4 == 0 && jahr % 100 != 0 || jahr % 400 == 0
§ Besser mit Klammern:
((jahr % 4 == 0) && (jahr % 100 != 0)) || (jahr % 400 == 0)
97
Boolesche Ausdrücke
§ Was ist das Ergebnis für die folgenden 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)
§ Was ist das Ergebnis für die folgenden 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)
§ Antworten: true, false, true, true, false
Boolesche Ausdrücke
Typ boolean
§ Boolesche Werte können in Variablen des Typs boolean gespeichert werden.
§ Der Typ boolean kennt nur zwei Werte: wahr ( true ) und falsch ( false ).
§ Ein Vergleich ("test") ist ein einfacher boolescher Ausdruck (ein Ausdruck der ein boolean Ergebnis hat).
§ Boolesche Ausdrücke können mit den booleschen Operatoren
kombiniert werden.
Typ boolean Beispiele
boolean isJugendlicher = (alter < 18);
boolean wohntInZuerich = (plz >= 8000) && (plz < 8100);
boolean studiertETH = true;
// nur fuer volljaehrige/n ETH Student/in aus Zuerich
if (isJugendlicher || !wohntInZuerich || !studiertETH) { System.out.println("Kein Zutritt!");
}
Gebrauch von boolean
§ Kann Ergebnis eines komplizierten Ausdrucks speichern und später wiederverwenden
§ Vorausgesetzt die Komponenten ändern sich nicht …
§ Macht Programm lesbarer
Hinweise
§ Manchmal sieht man solchen Code (test ob eine Variable den Wert true hat):
if (isPrime == true) { // schlecht ...
}
§ Das ist nicht nötig und redundant. Besser :
if (isPrime) { // gut ...
}
Hinweise
§ Auch nicht besser ist der Test für false :
if (isPrime == false) { // schlecht
if (!isPrime) { // gut
Bedingte ("short-circuit") Auswertung
§ Für && und || müssen nicht immer beide Operanden
ausgewertet werden, um das Ergebnis zu ermitteln
§ Java beendet die Auswertung eines booleschen Ausdrucks
sobald das Ergebnis fest steht.
Bedingte ("short-circuit") Auswertung
§ Für && und || müssen nicht immer beide Operanden
ausgewertet werden, um das Ergebnis zu ermitteln
§ Java beendet die Auswertung eines booleschen Ausdrucks sobald das Ergebnis fest steht.
§ && und || sind links-assoziativ
§ Ausdrücke werden von links nach rechts, gemäss Präzedenz und Assoziativität ausgewertet
§ && stoppt sobald ein Teil(ausdruck) false ist
Bedingte ("short-circuit") Auswertung
§ Java beendet die Auswertung eines booleschen Ausdrucks sobald das Ergebnis fest steht.
§ && stoppt sobald ein Teil(ausdruck) false ist
§ || stoppt sobald ein Teil(ausdruck) true ist
§ Diese Art der Auswertung heisst bedingte Auswertung
§ Folgende Teilausdrücke werden abhängig von zuerst ausgewerteten
Ausdrücken (nicht) evaluiert
Auswertung eines Tests
§ Wir wollen nur Quotienten (für a,b) grösser als 0 drucken:
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 eines Tests
§ Wir wollen nur Quotienten (für a,b) grösser als 0 drucken:
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 eines Tests
§ Viele "if" Statements machen den Code unleserlich
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 des Tests
§ Wir wollen nur Quotienten (für a,b) grösser als 0 drucken:
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 des Tests
§ Wir wollen nur Quotienten (für a,b) grösser als 0 drucken:
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 Code fü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 Code führt zu keiner Fehlermeldung wenn b == 0:
// Now there is no problem
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
§ Was sind die Werte von count am Ende des Codesegments?
// look closely int count = 0;
Scanner console = new Scanner(System.in);
for (int i; i<4; i++) {
System.out.print("Eingabe Zahl: ");
int wert = console.nextInt();
if ((wert != 0) && (count++ < 9)) { System.out.println("Hit");
}
} // count: Anzahl Werte ungleich 0, nicht Iterationen
§ Vorsicht bei ++/--
Bedingte Auswertung: Vorsicht
§ Die logischen Operatoren sind nicht kommutativ wenn die Auswertung den Zustand des Programms verändern kann.
§ (expr1 && expr2) nicht immer gleich (expr2 && expr1)
§ Vorsicht bei Operatoren mit Nebenwirkungen (“side effects”)
§ Offensichtliche Nebenwirkungen: z.B. int x,y; x++ y-- o. ä.
§ Nicht sofort offensichtlich:
De Morgan's Regeln
Regeln für die Negation boolescher Ausdrücke.
§ Praktisch wenn man das Gegenteil eines Ausdrucks braucht.
§ Beispiel:
Ursprünglicher Ausdruck Negierter Ausdruck Alternative
a && b !a || !b !(a && b)
a || b !a && !b !(a || b)
Original Negiert
if (x == 7 && y > 3) {
...
}
if (x != 7 || y <= 3) {
...