• Keine Ergebnisse gefunden

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

N/A
N/A
Protected

Academic year: 2022

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

Copied!
91
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

252-0027

Einführung in die Programmierung 2 Einfache Java Programme

Thomas R. Gross

Department Informatik ETH Zürich

1

(2)

Ü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

(3)

2.6 Nochmals Schleifen

§ Bisher: Obergrenze für Schleifenzähler stand zu Beginn der Schleife fest

§ Jetzt: mehr Flexibilität

§ Korrekte Terminierung wichtig

3

(4)

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

(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

}

(6)

7

(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

(8)

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.

}

(9)

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.

}

(10)

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

(11)

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

}

(12)

"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

(13)

15

(14)

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

}

}

(15)

17

(16)

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

}

(17)

19

(18)

while Schleifen

(19)

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.

(20)

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.

(21)

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

(22)

25

(23)

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

(24)

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

(25)

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

(26)

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

(27)

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

(28)

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

(29)

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

(30)

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

(31)

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:

(32)

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.

(33)

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.

(34)

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

(35)

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

(36)

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

(37)

2.7 Ergebnis Rückgabe

45

(38)

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 }

}

(39)

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

(40)

50

{

name ( 7+i, true);

… }

public static name(int k,

boolean b) { int result;

while (k++ < 10) { … } if (b) { … }

// result

}

(41)

51

{

name ( 7+i, true);

… }

public static name(int k,

boolean b) { int result;

while (k++ < 10) { … } if (b) { … }

// result

}

(42)

53

(43)

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.

(44)

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"

(45)

56

{

int size = name ( 7+i, true);

… }

public static int name(int k,

boolean b) { int result;

while (k++ < 10) { … } if (b) { … }

return result;

}

(46)

Rückgabeanweisung (“return”)

main

abs(-42) -42

round(2.71) 2.71

42

3

abs(-81) -81

81

(47)

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

}

(48)

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

(49)

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)

(50)

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;

}

(51)

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

}

(52)

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)

(53)

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;

}

(54)

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.

(55)

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;

}

(56)

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

(57)

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.

(58)

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

(59)

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.

(60)

72

(61)

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

(62)

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;

} }

(63)

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.

(64)

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;

}

(65)

2.8 Sichtbarkeit von Variablennamen

§ "Scope"

§ 1. Approximation

§ Weitere Aspekte in späteren Vorlesungen

78

(66)

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

(67)

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

(68)

{ und } strukturieren ein Programm

if (…) { int i;

}

for (int i=0; ...; ...) { }

public static void fct(int j) { }

81

(69)

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

(70)

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

(71)

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.

(72)

Blöcke können geschachtelt sein

§ Siehe geschachtelte Schleifen (nested loops)

87

(73)

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

(74)

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

(75)

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

(76)

Sichtbarkeitsregeln für Parameter Variable

§ Die selben Regeln gelten für Parameter Variable

(77)

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

(78)

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

(79)

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

(80)

2.9 Strings und andere Bibliotheken

§ String

§ Math

§ Random

96

(81)

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

(82)

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

}

}

(83)

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

(84)

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

(85)

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

(86)

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

(87)

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

(88)

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

(89)

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 ?

(90)

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

(91)

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

Referenzen

ÄHNLICHE DOKUMENTE

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

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

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

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

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

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

§ Wenn eine Methode einen Parameter erwartet dann muss dieser auch übergeben werden. printPunkte(); // ERROR: parameter value

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