• Keine Ergebnisse gefunden

252-0027 Einführung in die Programmierung 2 Einfache Java Programme

N/A
N/A
Protected

Academic year: 2022

Aktie "252-0027 Einführung in die Programmierung 2 Einfache Java Programme"

Copied!
102
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

252-0027

Einführung in die Programmierung 2 Einfache Java Programme

Thomas R. Gross

Department Informatik

(2)

Ü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

(3)

2.3.2 Verschachtelte for Schleifen

(4)

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

(5)

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 }

(6)

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

(7)
(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("*");

}

System.out.println();

}

8

(9)
(10)

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

(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

(12)

Mögliche Fehler

§ Die Schleife terminiert nicht

§ Läuft und läuft und läuft

§ Endlosschleife ("infinite loop")

14

(13)

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();

(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; j <= 10; i++) { System.out.print("*");

} System.out.println();

}

16

(15)

Was tun?

§ Eclipse kann solche Programme stoppen.

§ Klicken auf "Terminate"

(16)

Mehr Beispiele

§ Welche verschachtelten for Schleifen erzeugen diesen Output?

....1 ...2 ..3 .4 5

18

(17)

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)

(18)

Ä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

(19)

Ä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

(20)

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

(21)

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

(22)

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

(23)

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

(24)

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

26

(25)

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();

(26)

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

28

(27)

Verschachtelte for Schleifen Übung

§ Verändern Sie das letzte Programm so dass dieser Output erzeugt wird:

....1 ...2.

..3..

.4...

5....

(28)

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();

}

30

(29)

2.4 Methoden mit Parametern

(30)

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

(31)

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() {

(32)

Mit Methode

public static void vorsatz () { for (int i = 1; i <= 5; i++) {

System.out.println(

"Ich werde die Uebungsaufgaben machen");

}

} // end vorsatz

34

(33)

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++) { ... }

(34)

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

(35)

Parametrisierung

§ Parameter: Ein Wert den eine aufgerufene Methode von der

aufrufenden Methode erhält.

(36)

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.

(37)

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

(38)

Parameterdeklarationen

Gibt an dass eine Methode einen Parameter braucht um ausgeführt werden zu können

public static void methodName ( type name ) { statement;

}

(39)

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

(40)

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);

}

(41)

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.

(42)

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

(43)

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

(44)

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

}

46

(45)

Parameter

§ 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]

(46)

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: ...

(47)

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

(48)

50

(49)

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

(50)

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);

(51)

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);

(52)

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);

} } }

(53)

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

(54)

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

(55)

Ü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.

(56)

Ü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

(57)

Ü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

(58)

60

(59)

Ü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.

(60)

"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));

} }

(61)

"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

(62)

"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

(63)

"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

(64)

Übersicht

§ 2.5 "if" Anweisungen

§ 2.6 Nochmal Schleifen

68

(65)

2.5 Verzweigungen (if-Anweisungen)

(66)

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

(67)

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

(68)

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

(69)

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

(70)

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.");

}...

(71)

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

(72)

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

(73)

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

(74)

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

(75)

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);

(76)

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

(77)

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

(78)

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

(79)

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

(80)

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

(81)

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

(82)

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

(83)

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)

(84)

§ 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

(85)

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.

(86)

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!");

}

(87)

Gebrauch von boolean

§ Kann Ergebnis eines komplizierten Ausdrucks speichern und später wiederverwenden

§ Vorausgesetzt die Komponenten ändern sich nicht …

§ Macht Programm lesbarer

(88)

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 ...

}

(89)

Hinweise

§ Auch nicht besser ist der Test für false :

if (isPrime == false) { // schlecht

if (!isPrime) { // gut

(90)

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.

(91)

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

(92)

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

(93)

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);

(94)

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);

};

}

...

(95)

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);

};

(96)

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);

}

...

(97)

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);

}

(98)

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);

};

}

...

(99)

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);

(100)

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 ++/--

(101)

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:

(102)

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) {

...

}

Referenzen

ÄHNLICHE DOKUMENTE

Um Eclipse einfacher zu starten, können Sie eine Verknüpfung erstellen.. Gehen Sie mit Ihrem Datei-Explorer in den Ordner, wo Sie Eclipse

§ Programm: Folge von Anweisungen, die von einem Computer ausgeführt werden (können).. § Programm realisiert

§ Wenn wir eine Methode deklarieren dann geben wir an, dass diese Methode einen Parameter braucht. § Wenn wir die Method aufrufen, dann geben wir einen

§ Eine Methode die einen Rückgabewert deklariert muss eine (oder mehrere) return Anweisung(en)

Ihr Programm muss diese Bedingung nicht zwingend testen, Sie können aber eine Überprüfung implementieren. Wenn zahl diese Bedingung nicht erfüllt, dann ist das Ergebnis des

§ Schiedsrichter entscheidet ob das Symbol legal ist oder nicht (für diese EBNF Beschreibung)2. § Symbol legal gemäss einer Regel: alle Buchstaben des Symbols stimmen mit den

§ Eine Variable die in einer for Schleife deklariert wurde kann nur im Rumpf der Schleife verwendet werden. § Eine Variable die in einer Methode deklariert wurde existiert nur in

Eclipse hilft Ihnen dabei, indem es anzeigt, wo die Fehler sind (und eine mehr oder weniger hilfreiche Fehlermeldung dazu ausgibt), aber Sie müssen selber herausfinden, was das