• Keine Ergebnisse gefunden

252-0027 Einführung in die Programmierung 2.4 Methoden mit Parametern

N/A
N/A
Protected

Academic year: 2022

Aktie "252-0027 Einführung in die Programmierung 2.4 Methoden mit Parametern"

Copied!
117
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

252-0027

Einführung in die Programmierung 2.4 Methoden mit Parametern

Thomas R. Gross

Department Informatik ETH Zürich

92

(2)

Parameter für eine Methode

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

(3)

Parametrisierung

§ Parameter: Ein Wert den eine aufgerufene Methode von der aufrufenden Methode erhält.

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

(4)

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.

(5)

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

(6)

Parameter

§ Ein Parameter in der Deklaration einer Methode heisst formaler Parameter (formal parameter).

§ Formal parameter: definiert

(7)

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 = i+1) {

System.out.print(“.");

}

System.out.println();

} Output: ...

(8)
(9)

§ Der übergebene Wert heisst tatsächlicher Parameter (actual parameter) oder Argument (argument)

§ Kann für jeden Aufruf ein anderer Wert sein

100

(10)

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 = i+1) {

System.out.print(“.");

}

System.out.println();

}

37

Output:

...

(11)

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

(12)

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

(13)

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

(14)

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 = i+1) {

if (i%2==1) { System.out.println(i);

}

(15)

106

(16)

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

davon wie der Wert berechnet wurde

(17)

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

(18)

Ü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”)

(19)

Ü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 = i+1) {

System.out.print(“.");

}

System.out.println();

}

37

Output:

...

...

(20)
(21)

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

(22)

Ü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

(23)

114

(24)

Ü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”):

§ Name eines aktuellen Parameters (wenn eine Variable

verwendet wird) ist unwichtig.

(25)

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

} }

(26)

"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

(27)

"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

(28)

"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

(29)

121

(30)

"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

2 9 5

2 5 9

(31)

Output:

2 and 4 9 and 3

123

(32)

Übersicht

§ 2.5 "if" Anweisungen

§ 2.6 Nochmal Schleifen

(33)

2.5 Verzweigungen (if-Anweisungen)

(34)
(35)

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

(36)

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

} else {

"if" Anweisung(en) ausführen

Ist test wahr?

Folgende Anweisung ausführen

nein ja

"else" Anweisung(en) ausführen

(37)

Boolesche Ausdrücke

§ if Anweisungen und for Schleifen verwenden beide boolesche Ausdrücke.

for (int i = 1; i <= 10; i = i+1) { ...

if (i <= 10) { ...

§ Diese Ausdrücke werden ausgewertet --- Ergebnis entweder "true" oder "false"

§ Verwenden Vergleichsoperatoren

(38)

Vergleichsoperatoren

Vorsicht: nicht alle Vergleichsoperatoren können für alle Typen (sinnvoll) angewendet werden.

Operator Bedeutung Beispiel Wert

== gleich 1 + 1 == 2 true

!= ungleich 3 != 2 true

< weniger als 10.0 < 5.2 false

> grösser als 10 > 5 true

<= weniger als oder gleich 126 <= 100 false

>= grösser als oder gleich 5.0 >= 5.0 true

(39)

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

}...

(40)
(41)

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?

Folgende Anweisung ausführen

ja nein

Gruppe 3 Anwei- sungen ausführen

(42)

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

(43)

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

(44)

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

(45)

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

(46)

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.

(47)

Vergleichsoperatoren

§ Vergleichsoperatoren haben eine tiefere Präzedenz als arithmetische Operatoren.

5 * 7 >= 8 + 4 * (7 - 1) 5 * 7 >= 8 + 4 * 6

35 >= 8 + 24 35 >= 32

true

§ Vergleichsoperatoren können nicht eine “Kette” bilden wie in Mathematik

2 <= x <= 10

true <= 10 (Annahme: x ist 15)

error!

(48)

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

p !p

true false

(49)

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

(50)

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

(51)

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

152

(52)

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:

(53)

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)

§ (x + y) % 2 == 0 || !((z - y) % 2 == 0)

(54)

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

Boolesche Ausdrücke

(55)

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.

§ boolean quadrant1; oder boolean quadrant1 = true;

deklarieren boolesche Variable.

(56)

Typ boolean Beispiele

boolean isJugendlicher = (alter < 18);

boolean wohntInZuerich = (plz >= 8000) && (plz < 8100);

boolean studiertETH = true;

// Zutritt nur fuer volljaehrige/n ETH Student/in // aus Zuerich – dann:

if (isJugendlicher || !wohntInZuerich || !studiertETH) { System.out.println("Kein Zutritt!");

}

// Nur 2 Optionen: Zutritt/Kein Zutritt

(57)

Gebrauch von boolean

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

§ Vorausgesetzt die Komponenten ändern sich nicht …

§ Macht Programm lesbarer

(58)

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

...

(59)

Hinweise

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

if (isPrime == false) { // schlecht

if (!isPrime) { // gut

(60)

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.

(61)

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

§ || stoppt sobald ein Teil(ausdruck) true ist

(62)

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

(63)

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

// nur positive Werte sollten ausgegeben werden // integer division kann 0 fuer a,b !=0 ergeben

System.out.println(a + " / " + b + " = " + a/b);

...

(64)

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

};

}

(65)

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

};

}

...

(66)

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

}

...

(67)

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

}

...

(68)

Reihenfolge ist wichtig

§ Dieser Code führt zu einer Fehlermeldung wenn b == 0:

// Warning: Division durch 0 möglich im if-test

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

};

}

(69)

Bedingte ("short-circuit") Auswertung

§ Dieser Code führt zu keiner Fehlermeldung wenn b == 0:

// Bedingte Ausfuehrung verhindert Division durch 0

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

};

}

...

(70)

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

...

(71)

252-0027

Einführung in die Programmierung 2. X Input

Thomas R. Gross

Department Informatik ETH Zürich

1

(72)

Interaktive Programme mit Scanner

(73)

3

(74)
(75)

Einfache Eingabe (Input)

§ Interaktives Programm: Liest Input von der Konsole (“console”) oder Terminal.

§ Während das Programm ausgeführt wird fragt das Programm den Benutzer

§ Benutzer tippt Input ein

§ Der vom Benutzer eingegebene Input wird durch Anweisungen im Programm in Variablen gespeichert

§ Später auch andere Arten des Inputs (von anderen Fenstern)

(76)

Konsole und System.in

§ Konsole (“console”): früher ein Gerät, das mit Computer verbunden war

§ Erlaubte Eingabe (manchmal auch Ausgabe)

(77)

Konsole und System.in

§ Konsole (“console”): früher ein Gerät, das mit Computer verbunden war

§ Erlaubte Eingabe (manchmal auch Ausgabe)

User LPfi on the Swedish Wikipedia (on Commons: LPfi) [CC BY-SA ]

(78)

Konsole und System.in

§ Konsole (“console”): früher ein Gerät das mit Computer

verbunden war und Start/Management des Computers zulies

§ Heute: (meist) ein Fenster im (graphischen) Benutzerinterface

§ System.in (Standard Input): Ein (vordefiniertes) Fenster für Input

§ System.out (Standard Output): Ein (vordefiniertes) Fenster für Output.

§ System.in und System.out können dasselbe Fenster

sein.

(79)

Input und Output

§ Input komplizierter als Output

§ Benutzer können sich auf unvorgesehene Weise verhalten

§ Benutzer können Fehler machen

§ Benutzer können unpassenden Input liefern

§ Aber interaktive Programme sind viel interessanter …..

§ Eclipse verwendet ein Fenster um System.in und System.out zu zeigen:

§ Output zu System.out

§ Keyboard Input für System.in

(80)

Input für Programm

§ Müssen Input lesen

§ Umwandlung von Darstellung der Konsole/des Terminals in Format, das vom Java Programm verarbeitet werden kann

§ Idealerweise wird diese (Basis)Software zur Verfügung gestellt

§ Scanner bietet solche Services an

§ Es gibt auch andere Möglichkeiten aber Scanner ist (relativ) einfach und erleichtert unsere Arbeit.

§ Output hat das selbe Problem (Umwandlung der Darstellung) – auch

(81)

Input und System.in

§ Idee: Benutzer tippt Eingabe (via Tastatur) und Programm liest diese von System.in mittels eines Scanner s

§ Scanner: erlaubt es Input von unterschiedlichen Quellen zu lesen

§ Kann von verschiedenen Stellen lesen

§ Auch von System.in

§ Datenquelle wird angegeben wenn Scanner konstruiert wird

§ Später auch von Dateien, Web Seiten, Datenbanken, … lesen

(82)

Scanner Syntax

§ Scanner sind in der Bibliothek java.util definiert

§ Muss erst bekannt gegeben werden

§ import java.util.*; // so dass wir Scanner benutzen können

§ Programm braucht ein Scanner Objekt um von der Konsole zu lesen:

§ Dieses muss konstruiert werden

§ Scanner name = new Scanner(System.in);

§ Beispiel:

(83)

Scanner Syntax

§ Scanner sind in der Bibliothek java.util definiert

§ Muss erst bekannt gegeben werden

§ import java.util.*; // so dass wir Scanner benutzen können

§ Programm braucht ein Scanner Objekt um von der Konsole zu lesen:

§ Dieses muss konstruiert werden

§ Scanner name = new Scanner(System.in);

§ Beispiel:

Scanner myConsole = new Scanner(System.in);

(84)

Scanner Methoden

Aufruf einer Methode braucht einen Scanner

Scanner myConsole = new Scanner(System.in);

und dann Aufruf in Punktnotation (“dot notation”):

int alter = myConsole.nextInt();

Method Description

nextInt() reads an int from the user and returns it nextDouble() reads a double from the user

next() reads a one-word String from the user nextLine() reads a one-line String from the user

(85)

15

(86)

Scanner Methoden

§ Der eingegebene Wert kann weiter verarbeitet werden.

int alter = myConsole.nextInt();

System.out.println("Ihre Eingabe " + alter);

§ Aber wie weiss der Benutzer dass eine Eingabe erwartet wird?

Method Description

nextInt() reads an int from the user and returns it nextDouble() reads a double from the user

next() reads a one-word String from the user nextLine() reads a one-line String from the user

(87)

Scanner Eingabe

§ Das Programm fordert den Benutzer auf, Wert(e) einzugeben

§ "prompt" (Aufforderung): Text der angibt welche Eingabe erwartet wird

§ Der Prompt erscheint im Konsolenfenster

§ Jetzt kann die Eingabe erfolgen – erscheint auch im selben Fenster

§ System.in und System.out werden von Eclipse besonders behandelt

§ Jede Scanner Methode wartet bis der Benutzer die Eingabe mit der

"ENTER" (oder "RETURN") Taste abschliesst.

§ Beispiel:

System.out.print("Wie alt sind Sie? "); // prompt int alter = myConsole.nextInt();

System.out.println("Ihre Eingabe " + alter);

(88)

Scanner Beispiel

import java.util.*; // so dass Scanner verwendent werden kann public class UserInputExample {

public static void main(String[] args) {

Scanner myConsole = new Scanner(System.in);

System.out.print("Wie alt sind Sie? ");

int alter = myConsole.nextInt();

int jahre = 65 - alter;

System.out.println(jahre + " Jahre bis zur Pensionierung!");

} }

Konsole (Eingabe des Benutzers unterstrichen):

Wie alt sind Sie? 19

alter 19 jahre 46

(89)

Geht auch mit JShell

§ Müssen Scanner nicht importieren (schon vorhanden)

§ Anweisungen der Methode in scanner.jsh (nächste Slide)

> jshell

| Welcome to JShell -- Version 11.0.4

| For an introduction type: /help intro jshell> /set editor emacs

| Editor set to: emacs

// Benutzen Editor um Datei scanner.jsh zu lesen und uns das Tippen zu ersparen jshell> /edit

| created method test() jshell> test()

Wie alt sind Sie? 42

23 Jahre bis zur Pensionierung!

jshell> /exit

| Goodbye 19

(90)

scanner.jsh

void test () {

Scanner myConsole = new Scanner(System.in);

System.out.print("Wie alt sind Sie? ");

int alter = myConsole.nextInt();

int jahre = 65 - alter;

System.out.println(jahre + " Jahre bis zur Pensionierung!");

}

(91)

Scanner Beispiel 2

import java.util.*;

public class ScannerMultiply {

public static void main(String[] args) {

Scanner console = new Scanner(System.in);

System.out.print("Please type two numbers: ");

int num1 = console.nextInt();

int num2 = console.nextInt();

int product = num1 * num2;

System.out.println("The product is " + product);

}

Output (Benutzereingabe unterstrichen):

}

Please type two numbers: 8 6 The product is 48

§ Der Scanner kann mehrere Zahlen in einer Zeile (endet mit RETURN) lesen.

(92)

Wo finde ich Informationen

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Scanner.html

§ Dort finden wir mehr Informationen

§ Z.Zt. noch nicht alle Konzepte erklärt

§ Darum "ignorieren" wir die andere Aspekte (ausser denen, die wir für das

Beispiel brauchen)

(93)

23

(94)

Eingabe Elemente

§ Der Scanner liest (für nextInt()) eine Folge von Ziffern und wandelt diese in eine Zahl (int) um

§ Braucht Beschreibung von legalen ints

§ Z.B. EBNF Beschreibung

§ Muss wissen wo eine int Beschreibung aufhört (anfängt)

§ Beschreibung von Leerzeichen/Trennzeichen

§ Auch wieder mit EBNF möglich

§ Folge von Zeichen die der Scanner liest: Token

§ Input Element

§ Erwartete Zeichen hängen von Methode (z.B. nextDouble()) ab

(95)

Eingabe Elemente

§ Folge von Zeichen die der Scanner liest: Token

§ Token werden durch Leerraum ("whitespace") getrennt

§ Leerzeichen ("space", "blank")

§ Tabulator Zeichen ("tab"),

§ Zeilenvorschub ("new line").

§ Wie viele Token sind in dieser Zeile?

23 John Smith 42.0 $2.50

(96)

Eingabe Elemente

§ Folge von Zeichen die der Scanner liest: Token

§ Token werden durch Leerraum ("whitespace") getrennt

§ Leerzeichen ("space", "blank")

§ Tabulator Zeichen ("tab"),

§ Zeilenvorschub ("new line").

§ Wie viele Token sind in dieser Zeile?

23 John Smith 42.0

§ Token kann Kontext-abhängig sein

$2.50 "hello World" 1.456E12 "45 18"

(97)

Eingabe Elemente

Wenn das Token nicht den richtigen Typ hat gibt es (zur Laufzeit) eine Fehlermeldung.

System.out.print("Was ist Ihr Alter? ");

int alter = myConsole.nextInt();

Output:

Was ist Ihr Alter? Timmy

java.util.InputMismatchException

at java.util.Scanner.next(Unknown Source) at java.util.Scanner.nextInt(Unknown Source) ...

(98)

Noch ein Beispiel

import java.util.*; // for Scanner public class IncNumber {

public static void main(String[] args) {

Scanner console = new Scanner(System.in);

System.out.print("Type a number: ");

int numberIn = console.nextInt();

System.out.println("Number + 1: " + (1 + numberIn));

}

}

(99)

2.9 Strings und andere Bibliotheken

§ String

§ Math

§ Random

33

(100)

String Literals

§ String: Eine Folge von Buchstaben

§ Nur eine Zeile, ggf. mit Ersatzdarstellungen

§ Können auch einen Namen bekommen.

String name = "text";

String note = name + " " + name;

§ Examples:

String firstName = ”Robin"; String lastName = "Williams”;

String mrsDoubtfire = firstName + " " + lastName;

int x = 3;

(101)

35

(102)

Stringparameter

public class StringParameters {

public static void main(String[] args) { sayHello(”Mark");

String friend = ”Peter";

sayHello(friend);

}

public static void sayHello(String name) { System.out.println("Welcome, " + name);

}

(103)

Stringparameter

public class StringParameters {

public static void main(String[] args) { sayHello(”Mark");

String friend = ”Peter";

sayHello(friend);

}

public static void sayHello(String name) { System.out.println("Welcome, " + name);

} }

Output:

Welcome, Mark

Welcome, Peter

(104)

Strings

§ Strings erlauben Zugriff auf die Buchstaben die den Text ausmachen.

§ Weil Strings wichtig sind werden sie vom Compiler besonders behandelt

§ Wir hatten schon bei int und double gesehen dass praktische Überlegungen die Programmierer zwingen, sich um Details zu

kümmern

§ Auch Strings erfahren eine Sonderbehandlung

(105)

Elemente eines Strings

§ Auf die einzelnen Buchstaben eines Strings wird mit einem Index zugegriffen (Basis 0) :

String name = ”B. Dylan";

§ Index des ersten Buchstaben: 0

§ Index des letzten Buchstabens: 1 weniger als die Länge des Strings

§ Die einzelnen Buchstaben sind Werte des (Basistyps) char (später mehr)

index 0 1 2 3 4 5 6 7

character B . D y l a n

(106)
(107)

Elemente eines Strings

§ Auf die einzelnen Buchstaben eines Strings wird mit einem Index zugegriffen (Basis 0) :

String name = ”B. Dylan";

§ Index des ersten Buchstaben: 0

§ Index des letzten Buchstabens: 1 weniger als die Länge des Strings

§ Die einzelnen Buchstaben sind Werte des (Basistyps) char (später mehr)

§ (Ein String ist kein Array ("Reihe") – später mehr)

index 0 1 2 3 4 5 6 7

character B . D y l a n

(108)

Strings

§ Zugriff auf Elemente eines Strings erfolgt mit (vordefinierten) Methoden

§ Aufruf dieser Methoden in Punktnotation (Dot Notation) (“dot notation”)

String s = “hello”;

s.method(parameterValues);

§ Führe Methode method für s aus, “wende method auf s an”,

rufe method für s auf

(109)

String Methoden

§ Beispiel

String writer = ”S. Beckett";

System.out.println(writer.length()); // 10

Method name Description

indexOf(str) index where the start of the given string appears in this string (-1 if not found) length() number of characters in this string substring(index1, index2)

or

substring(index1)

the characters in this string from index1 (inclusive) to index2 (exclusive);

if index2 is omitted, grabs till end of string toLowerCase() a new string with all lowercase letters toUpperCase() a new string with all uppercase letters

(110)

String weitere Beispiele

// index 0123456789012 String s1 = "Alice Munro";

String s2 = "Doris Lessing";

System.out.println(s1.length()); // 11 System.out.println(s1.indexOf("e")); // 4

System.out.println(s2.substring(6, 9)); // ”Les"

String s3 = s2.substring(1, 7);

System.out.println(s3.toLowerCase()); // ”oris l”

§ Mit diesem String

// index 012345678901234567890123456789012 String class = ”Einfuehrung in die Programmierung";

(111)

String Literale

§ Methoden wie substring und toLowerCase

konstruieren und liefern einen neuen String zurück, sie

modifizieren nicht den String für den sie aufgerufen wurden.

String s = ”Hello World";

s.toUpperCase();

System.out.println(s); // Hello World

§ Um den Wert zu verändern muss dieser wieder einer Variablen zugewiesen werden:

String s = "Hello World";

s = s.toUpperCase();

System.out.println(s); // HELLO WORLD

(112)

String Literale

§ Methoden wie substring und toLowerCase konstruieren und liefern einen neuen String zurück, sie modifizieren nicht den String für den sie aufgerufen wurden.

String s = ”Hello World";

s.toUpperCase();

System.out.println(s); // Hello World

§ Um den Wert zu verändern muss dieser wieder einer Variablen zugewiesen werden:

String s = "Hello World";

String t = s.toUpperCase();

System.out.println(t); // HELLO WORLD

s = s.toUpperCase(); // s jetzt wie t

(113)

Elemente eines Strings

§ Auf die einzelnen Buchstaben eines Strings kann mit einem Index zugegriffen warden (Basis 0):

String name = ”B. Dylan";

name.charAt(0) // B

if (name.charAt(1) == '.') { … } // single quote System.out.println(name.indexOf('.')); // 1

index 0 1 2 3 4 5 6 7

character B . D y l a n

(114)

String Vergleiche/Abfragen

String name = console.next();

if (name.contains("Prof")) {

System.out.println("Wann gibt es eine Sprechstunde?");

}

"Prof. Welzl", "Professor Welzl", "Profifussballtrainerin"

Method Description

equals(str) ob 2 Strings die selben Buchstaben enthalten

equalsIgnoreCase(str) ob 2 Strings die selben Buchstaben enthalten, ohne Berücksichtigung von Gross- und Kleinschreibung startsWith(str) ob der String mit den Buchstaben des anderen (str)

anfängt endsWith(str) ob … endet

contains(str) ob der String str (irgendwo) auftritt

(115)

Scanner Methoden

§ Jede Methode wartet bis der Benutzer die Eingabe mit der "ENTER"

(oder "RETURN") Taste abschliesst.

§ Der eingegebene Wert kann weiter verarbeitet werden.

System.out.print("Wie alt sind Sie? "); // prompt int alter = console.nextInt();

System.out.println("Ihre Eingabe " + alter);

§ "prompt" (Aufforderung): Text der angibt welche Eingabe erwartet wird.

Method Description

nextInt() reads an int from the user and returns it nextDouble() reads a double from the user

next() reads a one-word String from the user nextLine() reads a one-line String from the user

(116)

§ Scanner 's next Methode liest ein Wort als String .

Scanner console = new Scanner(System.in);

System.out.print("What is your name? ");

String name = console.next();

name = name.toUpperCase();

System.out.println(name + " has " + name.length() +

" letters and starts with " + name.substring(0, 1));

Output:

What is your name? Chamillionaire

CHAMILLIONAIRE has 14 letters and starts with C

Strings as user input

(117)

§ Die Methode nextLine liest eine Zeile als String .

System.out.print("What is your address? ");

String address = console.nextLine();

Strings as user input

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

ArrayList § Java stellt die Klasse ArrayList für solche Listenobjekte zur Verfügung § "Array" erinnert daran, dass die Elemente über einen Index erreicht werden können § Die Anzahl

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

containsAll( coll ) returns true if this set contains every element from given set equals( set ) returns true if given other set contains the same elements iterator() returns

§ Eine Aussage gilt für den Zustand eines Programms wenn die Auswertung der Aussage mit dem Zustand das Ergebnis true ergibt. § Die Auswertung jedes Variable ergibt den Wert

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