252-0027
Einführung in die Programmierung 2.4 Methoden mit Parametern
Thomas R. Gross
Department Informatik ETH Zürich
92
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
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.
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.
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
Parameter
§ Ein Parameter in der Deklaration einer Methode heisst formaler Parameter (formal parameter).
§ Formal parameter: definiert
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: ...
§ Der übergebene Wert heisst tatsächlicher Parameter (actual parameter) oder Argument (argument)
§ Kann für jeden Aufruf ein anderer Wert sein
100
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:
...
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 = i+1) {
if (i%2==1) { System.out.println(i);
}
106
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
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”)
Ü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:
...
...
Ü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 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
114
Ü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.
"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) { System.out.println(z + " and " + (y - x));
x y z
x y z
"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
"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
121
"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
Output:
2 and 4 9 and 3
123
Übersicht
§ 2.5 "if" Anweisungen
§ 2.6 Nochmal Schleifen
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.");
} else {
"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 = i+1) { ...
if (i <= 10) { ...
§ Diese Ausdrücke werden ausgewertet --- Ergebnis entweder "true" oder "false"
§ Verwenden Vergleichsoperatoren
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
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?
Folgende Anweisung ausführen
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); }
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.
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!
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
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
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
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:
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)
§ 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
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.
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
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
§ || stoppt sobald ein Teil(ausdruck) true 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();
// nur positive Werte sollten ausgegeben werden // integer division kann 0 fuer a,b !=0 ergeben
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: 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);
};
}
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);
};
}
...
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) {
...
252-0027
Einführung in die Programmierung 2. X Input
Thomas R. Gross
Department Informatik ETH Zürich
1
Interaktive Programme mit Scanner
3
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)
Konsole und System.in
§ Konsole (“console”): früher ein Gerät, das mit Computer verbunden war
§ Erlaubte Eingabe (manchmal auch Ausgabe)
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 ]
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.
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
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
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
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 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);
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
15
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
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);
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
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
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!");
}
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.
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)
23
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
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
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"
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) ...
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));
}
}
2.9 Strings und andere Bibliotheken
§ String
§ Math
§ Random
33
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;
35
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);
}
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
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
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
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
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
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
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";
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
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
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
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
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
§ 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
§ Die Methode nextLine liest eine Zeile als String .
System.out.print("What is your address? ");
String address = console.nextLine();