252-0027
Einführung in die Programmierung 2 Einfache Java Programme
Thomas R. Gross
Department Informatik ETH Zürich
1
Übersicht (für diese Woche)
§ 2.6 Nochmals Schleifen
§ “while” Loops
§ 2.7 Ergebnis Rückgabe
§ 2.8 Sichtbarkeit
§ 2.9 Strings und andere nützliche Bibliotheken
§ 2.10 Wiederholung Typkonversion
2
2.6 Nochmals Schleifen
§ Bisher: Obergrenze für Schleifenzähler stand zu Beginn der Schleife fest
§ Jetzt: mehr Flexibilität
§ Korrekte Terminierung wichtig
3
Eine triviale Aufgabe ...
§ Schreiben Sie eine Methode printNumbers die die Zahlen von 1 bis N durch Komma getrennt ausgibt.
Beispiel:
Obergrenze N eingeben: 5
sollte ergeben:
1, 2, 3, 4, 5
Lösungsansatz
public static void printNumbers() {
Scanner console = new Scanner(System.in);
System.out.print("Obergrenze N eingeben: ");
int max = console.nextInt();
for (int i = 1; i <= max; i++) { System.out.print(i + ", ");
}
System.out.println(); // to end the line of output
}
7
Fehlerhafte Lösungen
public static void printNumbers() {
Scanner console = new Scanner(System.in);
System.out.print("Obergrenze N eingeben: ");
int max = console.nextInt();
for (int i = 1; i <= max; i++) { System.out.print(", " + i);
}
System.out.println(); // to end the line of output }
Output bei Eingabe 5: , 1, 2, 3, 4, 5
Gartenzaun Analogie
§ Wir geben n Zahlen aus aber brauchen nur n - 1 Kommas.
§ Ähnlich dem Bau eines Weidezaunes mit Pfosten und Querstreben
§ Wenn wir – wie in der 1. fehlerhaften Lösung – Pfosten und Streben installieren dann hat der letzte Pfosten in der Luft hängende Streben.
for (Laenge des Zauns) { Betoniere Pfosten.
Installiere Querstreben.
}
Schleife
§ Fügen Sie eine Anweisung ausserhalb der Schleife hinzu um den ersten "Pfosten" zu plazieren
Betoniere Pfosten.
for (Laenge des Zauns - 1) { Installiere Querstreben.
Betoniere Pfosten.
}
Lösungen basierend auf dieser Idee
System.out.print(1);
for (int i = 2; i <= max; i++) { System.out.print(", " + i);
}
System.out.println(); // to end the line
Alternative: 1. oder letzter Durchlauf durch die Schleife kann verändert werden:
for (int i = 1; i <= max - 1; i++) { System.out.print(i + ", ");
}
System.out.println(max); // to end the line
Lösung (eine Möglichkeit)
public static void printNumbers() {
Scanner console = new Scanner(System.in);
System.out.print("Obergrenze N eingeben: ");
int max = console.nextInt();
System.out.print(1);
for (int i = 2; i <= max; i++) { System.out.print(", " + i);
}
System.out.println(); // to end the line
}
"off-by-one" Error (Um-Eins-daneben-Fehler)
§ Die Schleife wurde einmal zuviel (oder einmal zuwenig) durchlaufen.
§ "Zaunpfahlproblem" – es gibt sogar eine D Wikipedia Seite (Inhalt ohne Gewähr)
13
15
import java.util.*;
class PrintPrimes1 {
public static void main (String[] args) { Scanner console = new Scanner(System.in);
System.out.print("Input max: ");
int max = console.nextInt();
if (max >= 2) {
printPrimes(max);
} }
public static void printPrimes(int limit)
// Prints all prime numbers up to limit, limit >= 2 System.out.print("2");
for (int candidate = 3; candidate <= limit; candidate++) { if ( /* isPrime(candidate) */ ) {
System.out.print(", " + candidate);
} }
System.out.println(); // to end output
}
}17
public static void printPrimes(int limit) {
// Prints all prime numbers from 2 up to the given limit // limit >= 2
System.out.print("2");
for (int candidate = 3; candidate <= limit; candidate++) { // Determine if candidate is prime
// Count factors! 2: prime, >2 not prime int count = 0;
for (int j = 1; j<=candidate; j++) { if (candidate % j == 0) {
count++;
} }
if (count == 2) {
System.out.print(", " + candidate);
} }
System.out.println(); // to end output
}
19
while Schleifen
Klassifizierung von Schleifen
§ bestimmte Schleife (definite loop): Anzahl der Ausführungen des Rumpfes ist vorher bekannt.
§ Die for Schleifen waren bisher immer bestimmte Schleifen.
§ Drucke "hello" 10-mal.
§ Finden Sie alle Primzahlen < einer ganzen Zahl n.
§ Drucken Sie jede ungerade Zahl zwischen 7 und 91.
§ unbestimmte Schleife (indefinite loop): Anzahl der
Ausführungen des Rumpfes ist nicht vorher bekannt.
Klassifizierung von Schleifen
§ unbestimmte Schleife (indefinite loop): Anzahl der Ausführungen des Rumpfes ist nicht vorher bekannt.
§ Lesen Sie den Input von der Konsole bis der Benutzer eine nicht- negative ganze Zahl eingibt.
§ Wiederholen Sie bis der Benutzer ein "q" eingegeben hat.
§ Lesen Sie eine Datei bis drei aufeinanderfolgende Sätze mit einem "!" enden.
§ Nehmen Sie Beiträge (via crowdfunding) entgegen bis das Ziel
erreicht ist.
Die while Schleife
§ while Schleife: Führen Sie den Schleifenrumpf so lange aus wie der boolesche Ausdruck test den Wert true ergibt.
while (test) { statement(s);
}
§ Beispiel:
int num = 1; // initialization while (num*num <= 2000) { // test
System.out.print(num + " ");
num = num * 2; // update }
// output: 1 2 4 8 16 32
25
Beispiel while Schleife
// finds the first factor of 91, other than 1 int n = 91;
int factor = 2;
while (n % factor != 0) { factor++;
} System.out.println("First factor is " + factor);
// output: First factor is 7
§ while ist hier bessser als for weil wir nicht wissen wie oft wir den
Zähler erhöhen müssen um den 1. Faktor zu finden
// Prints all prime numbers up to the given max.
public static void printPrimes(int limit) {
// Prints all prime numbers from 2 up to the given limit // limit >= 2
System.out.print("2");
for (int candidate = 3; candidate <= limit; candidate++) { // Determine if candidate is prime
// Find another factor <> 1: factor == candidate: candidate prime int count = 0;
int maybeFactor = 2;
while (count==0) {
if (candidate % maybeFactor == 0) { count++;
} else { // keep on searching maybeFactor++;
}
if (maybeFactor == candidate) { // prime!
System.out.print(", " + candidate);
} }
System.out.println(); // to end output }
§ Hinweiszeichen (Sentinel) ("sentinel"): Ein Wert der das Ende eine Reihe anzeigt
§ sentinel loop: Schleife deren Rumpf ausgeführt wird bis ein Sentinel gesehen wurde
§ Beispiel: Ein Programm soll Zahlen einlesen bis der Benutzer eine 0 eingibt; dann soll die Summe aller eingegebenen
Zahlen ausgegeben werden.
§ (In diesem Beispiel ist 0 das Hinweiszeichen/der Sentinel.)
Werte die Hinweise sind …
§ Beispiel: Ein Programm soll Zahlen einlesen bis der Benutzer eine 0 eingibt; dann soll die Summe aller eingegebenen
Zahlen ausgegeben werden.
§ (In diesem Beispiel ist 0 das Hinweiszeichen/der Sentinel.) Enter a number (0 to quit): 10
Enter a number (0 to quit): 20 Enter a number (0 to quit): 30 Enter a number (0 to quit): 0 The sum is 60
Werte die Hinweise sind …
Fehlerhafte Lösung
§ Was ist an diesem Programm schlecht?
Scanner console = new Scanner(System.in);
int sum = 0;
int number = 1; // "dummy value", anything but 0
while (number != 0) {
System.out.print("Enter a number (0 to quit): ");
number = console.nextInt();
sum = sum + number;
}
System.out.println("The total is " + sum);
Ein anderes Hinweiszeichen …
§ Ändern Sie das Programm so dass -1 der Sentinel ist.
§ Example log of execution:
Enter a number (-1 to quit): 15
Enter a number (-1 to quit): 25
Enter a number (-1 to quit): 10
Enter a number (-1 to quit): 30
Enter a number (-1 to quit): -1
The total is 80
Ein anderes Hinweiszeichen …
§ Setzen Sie den Sentinel auf -1:
Scanner console = new Scanner(System.in);
int sum = 0;
int number = 1; // "dummy value", anything but -1 while (number != -1) {
System.out.print("Enter a number (-1 to quit): ");
number = console.nextInt();
sum = sum + number;
}
System.out.println("The total is " + sum);
§ Jetzt ist das Result falsch. Warum?
The total was 79
Fehlerhafte Lösung – 0 à -1
§ Was ist an diesem Programm falsch?
Scanner console = new Scanner(System.in);
int sum = 0;
int number = 1; // "dummy value", anything but 0
while (number != 0) {
System.out.print("Enter a number (0 to quit): ");
number = console.nextInt();
sum = sum + number;
}
System.out.println("The total is " + sum);
Das Problem mit diesem Programm
§ Unser Programm folgt diesem Muster:
summe = 0.
while (input ist nicht der sentinel) { drucke prompt; lese input.
addiere input zu summe.
}
§ Beim letzten Durchlauf durch den Rumpf wird der Sentinel -1
zur Summe addiert:
Das Problem mit diesem Programm
§ Beim letzten Durchlauf durch den Rumpf wird der Sentinel -1 zur Summe addiert:
drucke prompt; lese input (-1).
addiere input (-1) zu summe.
§ Beispiel inkorrekter Terminierung (off-by-one error, Zaunpfahlproblem):
§ Müssen N Zahlen lesen aber nur die ersten N-1 addieren.
Lösung
summe = 0.
drucke prompt; lese input. // setzen eines pfostens
while (input ist nicht der sentinel) {
addiere input zu summe. // installation querstrebe drucke prompt; lese input. // setzen eines pfostens }
§ Schleifen mit einem Sentinel folgen oft diesem Muster.
Beispiel mit Sentinel
Scanner console = new Scanner(System.in);
int sum = 0;
// pull one prompt/read ("post") out of the loop System.out.print("Enter a number (-1 to quit): ");
int number = console.nextInt();
while (number != -1) {
sum = sum + number; // moved to top of loop System.out.print("Enter a number (-1 to quit): ");
number = console.nextInt();
}
System.out.println("The total is " + sum);
do/while Schleife
§ do/while Schleife: Führt den test am Ende des Schleifenrumpfes aus um zu entscheiden, ob ein weiterer Durchlauf nötig ist
§ Stellt sicher dass der Rumpf { … } mindestens einmal ausgeführt wird.
do {
statement(s);
} while (test);
Anweisung(en) im Loop ausfuehren
Ist test wahr?
Anweisung nach Loop ausfuehren
ja nein
do/while Schleife
§ Beispiel:
// Example: prompt until correct // PIN is typed
int input;
do {
System.out.print("Type your PIN: ");
input = console.nextInt();
} while (input != userPinCode[…]);
Anweisung(en) im Loop ausfuehren
Ist test wahr?
Anweisung nach Loop ausfuehren
ja nein
2.7 Ergebnis Rückgabe
45
import java.util.*;
class PrintPrimes1 {
public static void main (String[] args) { Scanner console = new Scanner(System.in);
System.out.print("Input max: ");
int max = console.nextInt();
if (max >= 2) {
printPrimes(max);
} }
public static void printPrimes(int limit)
// Prints all prime numbers up to limit, limit >= 2 System.out.print("2");
for (int i = 3; i <= limit; i++) { if ( /* isPrime(i) */ ) {
System.out.print(", " + i);
} }
System.out.println(); // to end output }
}
2.7 Ergebnis Rückgabe
§ Parameter erlauben Kommunikation vom Aufrufer zur aufgerufenen Methode
§ Bisher waren die Methoden sehr einfach
§ Methode als "Ersatz" für Anweisungen in main (oder anderer Methode)
§ Methoden können aber mehr …
§ Ein Rückgabewert (“return value”) erlaubt der aufgerufenen Methode dem Aufrufer einen Wert zu übermitteln
§ Damit eröffnen sich neue Möglichkeiten der Komposition
47
50
{
…
name ( 7+i, true);
… }
public static name(int k,
boolean b) { int result;
while (k++ < 10) { … } if (b) { … }
// result
}
51
{
…
name ( 7+i, true);
… }
public static name(int k,
boolean b) { int result;
while (k++ < 10) { … } if (b) { … }
// result
}
53
Rückgabe Anweisung
§ Das return Statement (Rückgabe Anweisung) wertet einen Ausdruck aus .
§ Der Wert wird dann an den Aufrufer “zurückgegeben”
§ Der Ausdruck muss einen Wert des Typs type (der Methoden Deklaration) ergeben.
§ Die Ausführung der return Anweisung beendet die
aufgerufene Methode.
Rückgabeanweisung (“return”)
§ return: Liefere einen Wert ab als das Ergebnis dieser Methode
§ “sende” das Ergebnis zum Aufrufer
§ Das Gegenstück zu Parametern:
§ Parameters schicken Werte in die aufgerufene Methode, vom Aufrufer
§ Rückgabewerte schicken Werte aus der Methode zum Aufrufer
§ Ein Methodenaufruf kann Teil eines Ausdrucks sein.
§ Aufrufer muss den Wert "annehmen"
56
{
…
int size = name ( 7+i, true);
… }
public static int name(int k,
boolean b) { int result;
while (k++ < 10) { … } if (b) { … }
return result;
}
Rückgabeanweisung (“return”)
main
abs(-42) -42
round(2.71) 2.71
42
3
abs(-81) -81
81
Beispiellösung mit Rückgabe eines Wertes
public static boolean isPrime (int arg){
// Determine how many factors the given number has.
boolean found = false;
int step = 2;
while (!found) {
if (arg % step == 0) {
found = true; // another factor found } else { step++ ; // keep on searching } }
// other factor == arg: prime found return (step == arg);
}
Rückgabe eines Wertes
Beispiel:
// Returns the slope of the line between the given points.
public static double slope(int x1, int y1, int x2, int y2) { double dy = y2 - y1;
double dx = x2 - x1;
return dy / dx;
}
slope(1, 3, 5, 11) liefert 2.0
return ohne einen Wert
Wenn eine Methode keinen Wert zurück liefert dann braucht ein return Statement keinen Wert zu schicken.
.
public static void printPoint(int x, int y) {
System.out.println(“x = “ + x + “ y = “ + y) ; return;
}
In dem Fall kann man das return Statement auch weglassen
(meine Empfehlung)
Weitere Beispiele
// Converts degrees Fahrenheit to Celsius.
public static double fToC(double degreesF) {
double degreesC = 5.0 / 9.0 * (degreesF - 32);
return degreesC;
}
// Computes triangle hypotenuse length given its side lengths.
public static double hypotenuse(int a, int b) { double c = squareRoot(a * a + b * b);
return c;
}
Weitere Beispiele
Ein return Statement kann auch einen (arithmetischen oder booleschen) Ausdruck verwenden
public static double fToC(double degreesF) { return 5.0 / 9.0 * (degreesF - 32);
}
Mögliche Fehler: Resultat nicht gespeichert
§ Ein return Statement schickt einen Wert an den Aufrufer
§ Namen, die in der aufgerufenen Methode verwendet
werden, sind belanglos (für den Aufrufer)
Was ist hier nicht richtig?
public static void main(String[] args) { slope(0, 0, 6, 3);
System.out.println("The slope is " + result); // ERROR:
} // result not defined
public static double slope(int x1, int x2, int y1, int y2) { double dy = y2 - y1;
double dx = x2 - x1;
double result = dy / dx;
return result;
}
Den Fehler vermeiden
§ return schickt den Wert der Variable zurück zum Aufrufer.
§ Der zurückgegebene Wert muss gespeichert werden – oder in einem Ausdruck verwendet werden.
§ Der Compiler generiert keine Warnung oder Fehlermeldung
wenn dies vergessen wird.
Den Fehler vermeiden
public static void main(String[] args) { double s = slope(0, 0, 6, 3);
System.out.println("The slope is " + s);
}
public static double slope(int x1, int x2, int y1, int y2) { double dy = y2 - y1;
double dx = x2 - x1;
double result = dy / dx;
return result;
}
return Anweisungen
§ Eine Methode kann mehrere return Anweisungen enthalten.
§ Sinnvoll für Fallunterscheidungen
§ Eine Methode die einen Rückgabewert deklariert muss eine (oder mehrere) return Anweisung(en) enthalten
68
if/else mit return
// Returns the larger of the two given integers.
public static int max(int a, int b) { if (a > b) {
return a;
} else {
return b;
} }
§ Methoden können ein return Statement in durch if/else kontrollierten Blöcken enthalten
§ Das return am Ende eines Pfades liefert den Rückgabewert für diese
Methode.
if/else mit return
§ Die Ausführung eines return Statements beendet die aufgerufene Methode.
§ Einem return sollten keine weiteren Anweisungen folgen
§ Alle Pfade durch eine Methode müssen ein return Statement enthalten
§ Wenn die Methode einen Rückgabewert deklariert hat
Alle Pfade …
public static int max(int a, int b) { if (a > b) {
return a;
}
// Error: not all paths return a value }
§ Der Compiler ist manchmal naiv:
public static int max(int a, int b) { if (a > b) {
return a;
} else if (b >= a) { return b;
} }
Der Compiler meint dass es einen Pfad ohne return gibt.
72
if/else , return Beispiel
§ Schreiben Sie eine Methode quadrant die für ein Paar von reellen Zahlen den Quadranten liefert in dem dieser Punkt
liegt.
§ Bespiel: quadrant(-4.2, 17.3) liefert 2
§ Fällt der Punkt auf eine der Achsen des Koordinatensystems liefere 0.
x+
x-
y+
y-
quadrant 1 quadrant 2
quadrant 3 quadrant 4
if/else , return Beispiellösung
public static int quadrant(double x, double y) { if (x > 0 && y > 0) {
return 1;
} else if (x < 0 && y > 0) { return 2;
} else if (x < 0 && y < 0) { return 3;
} else if (x > 0 && y < 0) { return 4;
} else { // at least one coordinate equals 0 return 0;
} }
if/else , return weitere Beispiele
§ Schreiben Sie eine Methode countFactors die die Anzahl der Faktoren (Teiler) einer Zahl liefert.
§ countFactors(24) liefert 8 da
1, 2, 3, 4, 6, 8, 12, und 24 alle Teiler von 24 sind.
if/else , return weitere Beispiele
§ Lösung:
// Returns how many factors the given number has.
public static int countFactors(int number) { int count = 0;
for (int i = 1; i <= number; i++) { if (number % i == 0) {
count++; // i is a factor of number }
}
return count;
}
2.8 Sichtbarkeit von Variablennamen
§ "Scope"
§ 1. Approximation
§ Weitere Aspekte in späteren Vorlesungen
78
Scope (Sichtbarkeitsbereich)
scope: Der Teil eines Programm in dem eine Variable sichtbar ist.
§ Variable müssen deklariert sein bevor sie sichtbar sind
§ Deklarationen müssen eindeutig sein
§ Sichtbar von Deklaration bis zum Ende des Blocks (der durch { }
angegeben wird) für den die Variable deklariert ist
Scope (Sichtbarkeitsbereich)
scope: Der Teil eines Programm in dem eine Variable sichtbar ist.
§ Variable müssen deklariert sein bevor sie sichtbar sind
§ Deklarationen müssen eindeutig sein
§ Sichtbar von Deklaration bis zum Ende des für den die Variable deklariert ist
Block: durch { und } begrenzt
{ und } strukturieren ein Programm
if (…) { int i;
}
for (int i=0; ...; ...) { }
public static void fct(int j) { }
81
if/else , return Beispiel
§ Schreiben Sie eine Methode quadrant die für ein Paar von reellen Zahlen den Quadranten (als int Wert) liefert in dem dieser Punkt liegt.
§ Bespiel: quadrant(-4.2, 17.3) liefert 2
§ Fällt der Punkt auf eine der Achsen des Koordinatensystems liefere 0.
x+
x-
y+
y-
quadrant 1 quadrant 2
quadrant 3 quadrant 4
Eine Lösung
public static int quadrant (double x, double y) { if (x==0) {
boolean nullx = true;
}
if (y==0) {
boolean nully = true;
}
if (nullx || nully) { return 0;
} ...
nullx's scope
nully's scope
Scope (Sichtbarkeitsbereich)
scope: Der Teil eines Programm in dem eine Variable sichtbar ist.
§ Variable müssen deklariert sein bevor sie sichtbar sind
§ Deklarationen müssen eindeutig sein
§ Sichtbar von Deklaration bis zum Ende des Blocks (der durch { } angegeben wird)
§ 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 der Methode.
Blöcke können geschachtelt sein
§ Siehe geschachtelte Schleifen (nested loops)
87
Scope (Sichtbarkeitsbereich)
public static void example() { int x = 3;
for (int i = 1; i <= 10; i++) { System.out.println(x+i);
} // i no longer exists here System.out.println(x);
} // x ceases to exist here
x's scope
i's sc op e
Folgen der Sichtbarkeitsregeln
§ Variable ohne überlappenden Sichtbarkeitsbereich können den selben Namen haben.
for (int i = 1; i <= 100; i++) { System.out.print("/");
}
for (int i = 1; i <= 100; i++) { // OK System.out.print("\\");
}
int i = 5; // OK: outside of loop's scope
Folgen der Sichtbarkeitsregeln
§ Eine Variable kann in einem Sichtbarkeitsbereich nicht mehrmals deklariert werden.
for (int i = 1; i <= 100 * line; i++) {
int i = 2; // ERROR: overlapping scope System.out.print("/");
}
i = 4; // ERROR: outside scope
§ Eine Variable kann nicht ausserhalb ihres Sichtbarkeitsbe-reiches
verwendet werden
Sichtbarkeitsregeln für Parameter Variable
§ Die selben Regeln gelten für Parameter Variable
Scope (Sichtbarkeitsbereich)
public static void function(int k) { int x = 3;
int y = k+x;
System.out.println(y);
} // k ceases to exist here
k's scope
y' s sc op e
Scope (Sichtbarkeitsbereich)
public static void function(int k) { int x = 3;
int y = anotherFct(k+x);
System.out.println(y);
} // k ceases to exist here
public static void anotherFct(int x) { int y= 5;
System.out.println(x+5);
}
k's scope
Warum diese Regeln
§ Lesbarkeit der Programme
§ Vereinfachung der Verwaltung des Speichers
§ Platz für eine Variable eines Basistypes muss nur in dem Block organisiert werden, in dem die Variable deklariert ist
§ Werte (die in einer Variable eines Basistypes) gespeichert werden verschwinden am Ende des Blockes
94
2.9 Strings und andere Bibliotheken
§ String
§ Math
§ Random
96
String Literals
§ String: Eine Folge von Buchstaben
§ Nur eine Zeile, ggf. mit Ersatzdarstellungen
§ Können auch einen Namen bekommen.
String name = "text";
String name = expression ;
§ Examples:
String firstName = ”Robin"; String lastName = "Williams”;
String mrsDoubtfire = firstName + " " + lastName;
int x = 3;
String point = "(" + x + ", " + 5 + ")";
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
103
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";
Wie würden Sie das Wort ”die” extrahieren ?
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 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