Tag 3 - Lehrstuhl für Informatik 2 (Programmiersysteme)

Repetitorium Informatik (Java)
Tag 3
Lehrstuhl für Informatik 2 (Programmiersysteme)
Übersicht
1
Typkonvertierung
Implizite Typkonvertierung
Explizite Typkonvertierung
2
Mehrfach-Verzweigung: switch/case
3
Schleifen
while-Schleife
for-Schleife
do/while-Schleife
Sprünge in Schleifen: break, continue
Endlosschleifen
4
Hinweis zu den CIP-Rechnern
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 2 / 36
Übersicht
1
Typkonvertierung
Implizite Typkonvertierung
Explizite Typkonvertierung
2
Mehrfach-Verzweigung: switch/case
3
Schleifen
while-Schleife
for-Schleife
do/while-Schleife
Sprünge in Schleifen: break, continue
Endlosschleifen
4
Hinweis zu den CIP-Rechnern
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 3 / 36
Typkonvertierung
Unter Typkonvertierung (cast) versteht man die Überführung eines Wertes
eines Datentyps in einen Wert eines anderen Datentyps
Wir wissen bereits: Unterschiedliche Datentypen können unterschiedliche
Wertebereiche haben
Typerweiterung (type promotion)
Typeinschränkung (type demotion)
Man unterscheidet dabei zwei Arten der Typkonvertierung:
Implizite Typkonvertierung ( automatisch“)
”
Explizite Typkonvertierung ( durch den Programmierer“)
”
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 4 / 36
Implizite Typkonvertierung
Implizite Typkonvertierung muss nicht gekennzeichnet werden, sondern
passiert automatisch“.
”
Werte eines kleineren“ Datentyps werden automatisch dem größeren“
”
”
angepasst.
Typerweiterung
Kein Informationsverlust
Beispiele
int a = 13;
double b = a ; // I m p l i z i t e r Cast : int -> double
double pi = 3.14 f ; // 3.14 f i m p l i z i t g e w e i t e t : float -> double
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 5 / 36
Explizite Typkonvertierung
Problem: Was ist, wenn Ziel-Datentyp kleiner“ als Ausgangs-Datentyp ist?
”
Typeinschränkung
Informationsverlust!
So nicht...
double a = 9.8;
int b = a ; // Compiler - Fehler : p o s s i b l e loss of p r e c i s i o n
int c = a / 2; // Compiler - Fehler : p o s s i b l e loss of p r e c i s i o n
float pi = 3.14; // Compiler - Fehler : p o s s i b l e loss of p r e c i s i o n
Explizite Typkonvertierung notwendig
Syntax: (<Ziel-Datentyp>) <Wert>
So schon...
double a = 9.8;
int b = ( int ) a ; // b = 9
int c = ( int ) ( a / 2) ; // c = 4
float pi = ( float ) 3.14; // but use 3.14 f
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 6 / 36
Übersicht
1
Typkonvertierung
Implizite Typkonvertierung
Explizite Typkonvertierung
2
Mehrfach-Verzweigung: switch/case
3
Schleifen
while-Schleife
for-Schleife
do/while-Schleife
Sprünge in Schleifen: break, continue
Endlosschleifen
4
Hinweis zu den CIP-Rechnern
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 7 / 36
Motivation
Beispiel mit if/else...
String inWorten ;
In jeder Verzweigung wird die
gleiche Variable (ziffer) jeweils mit
einem anderen Wert (0-9) auf
Gleichheit (==) verglichen
if ( ziffer == 0) {
inWorten = " null " ;
} else if ( ziffer == 1) {
inWorten = " eins " ;
} else if ( ziffer == 2) {
inWorten = " zwei " ;
} else if ( ziffer == 3) {
inWorten = " drei " ;
} else if ( ziffer == 4) {
inWorten = " vier " ;
} else if ( ziffer == 5) {
inWorten = " fuenf " ;
} else if ( ziffer == 6) {
inWorten = " sechs " ;
} else if ( ziffer == 7) {
inWorten = " sieben " ;
} else if ( ziffer == 8) {
inWorten = " acht " ;
} else if ( ziffer == 9) {
inWorten = " neun " ;
} else {
inWorten = " Ohne Worte . " ;
}
Repetitorium Informatik
•
if/else-Konstrukt bei vielen
Verzweigungen sehr umständlich...
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 8 / 36
Lösung: switch/case
switch/case vergleicht eine Variable auf mehrere unterschiedliche Werte
Voraussetzung: Typ entspricht byte, short, int, char oder String
Syntax
switch ( i ) {
case Fall -1: Anweisungen -1; break ;
case Fall -2: Anweisungen -2; break ;
case Fall -3: Anweisungen -3; break ;
...
default : A n w e i s u ng e n D ef a u l t ;
}
String erst ab Java 7
Java 7 im CIP (prüfen und ggf. einrichten):
[~]> java -version
java version "1.7.0_25"
[~]> addpackage java-1.7
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 9 / 36
Lösung: switch/case
Syntax
switch ( i ) {
case Fall -1: Anweisungen -1; break ;
case Fall -2: Anweisungen -2; break ;
case Fall -3: Anweisungen -3; break ;
...
default : A n w e i s u ng e n D ef a u l t ;
}
Die Fall-j müssen vom gleichen Typ sein wie die Variable i
Die break-Anweisungen können entfallen
Die j-te Verzweigung wird gewählt, wenn i == Fall-j gilt
Achtung: Beginnend bei Anweisungen-j werden alle folgenden Anweisungen
bis zum ersten break oder bis zum Ende von switch ausgeführt,
also evtl. auch die Anweisungen-k der folgenden Fälle!
(Beispiel zu diesem fall through folgt gleich)
Die default-Verzweigung wird gewählt, wenn keine andere Bedingung
zutrifft
Die default-Verzweigung kann entfallen
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 10 / 36
Zurück zum Beispiel...
Beispiel mit if/else...
Jetzt mit switch/case-Konstrukt...
String inWorten ;
String inWorten ;
if ( ziffer == 0) {
switch ( ziffer ) {
case 0: inWorten
case 1: inWorten
case 2: inWorten
case 3: inWorten
case 4: inWorten
case 5: inWorten
case 6: inWorten
case 7: inWorten
case 8: inWorten
case 9: inWorten
default : inWorten
}
}
}
}
}
}
}
}
}
}
inWorten = " null " ;
else if ( ziffer == 1) {
inWorten = " eins " ;
else if ( ziffer == 2) {
inWorten = " zwei " ;
else if ( ziffer == 3) {
inWorten = " drei " ;
else if ( ziffer == 4) {
inWorten = " vier " ;
else if ( ziffer == 5) {
inWorten = " fuenf " ;
else if ( ziffer == 6) {
inWorten = " sechs " ;
else if ( ziffer == 7) {
inWorten = " sieben " ;
else if ( ziffer == 8) {
inWorten = " acht " ;
else if ( ziffer == 9) {
inWorten = " neun " ;
else {
inWorten = " Ohne Worte . " ;
=
=
=
=
=
=
=
=
=
=
=
" null " ;
break ;
" eins " ;
break ;
" zwei " ;
break ;
" drei " ;
break ;
" vier " ;
break ;
" fuenf " ; break ;
" sechs " ; break ;
" sieben " ; break ;
" acht " ;
break ;
" neun " ;
break ;
" Ohne Worte . " ;
}
}
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 11 / 36
break vergessen ⇒ fall through...
Beispiel...
int status = 0;
String ausgabe ;
switch ( status ) {
case 0:
ausgabe = " null " ;
default :
ausgabe = " nicht null " ;
}
System . out . println ( ausgabe ) ;
faui06a [~]> java SwitchCase
nicht null
WTF?!
ausgabe ist nach dem switch/case nicht null“, obwohl status 0 ist
”
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 12 / 36
Nun mit break:
Durchfallen“ kann mit einer break-Anweisung verhindert werden.
”
Ohne break: Ausführung der folgenden Anweisungen
break am Beispiel...
int status = 0;
String ausgabe ;
switch ( status ) {
case 0:
ausgabe = " null " ;
break ;
default :
ausgabe = " nicht null " ;
}
System . out . println ( ausgabe ) ;
faui06a [~]> java SwitchCase
null
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 13 / 36
Übersicht
1
Typkonvertierung
Implizite Typkonvertierung
Explizite Typkonvertierung
2
Mehrfach-Verzweigung: switch/case
3
Schleifen
while-Schleife
for-Schleife
do/while-Schleife
Sprünge in Schleifen: break, continue
Endlosschleifen
4
Hinweis zu den CIP-Rechnern
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 14 / 36
Motivation
Bisher: Anweisungen werden entweder einmal oder keinmal ausgeführt.
Beispiel
int a = 5; // einmal
int b = 9; // einmal
int absDiff ; // einmal
if ( a > b ) { // einmal
absDiff = a - b ; // keinmal
} else {
absDiff = b - a ; // einmal
}
Mehrfache Ausführung durch Schleifen möglich
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 15 / 36
while-Schleife
Syntax
while ( TEST ) {
SCHL EIFENRUM PF ;
}
TEST:
boolean-Ausdruck
Prüfung vor jedem Schleifendurchlauf
Sobald TEST false ist, Abbruch der Schleife
SCHLEIFENRUMPF:
Zu wiederholende Anweisungen
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 16 / 36
Ablauf-Diagramm der while-Schleife
Syntax
while ( TEST ) {
SCHL EIFENRUM PF ;
}
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 17 / 36
Beispiel zur while-Schleife
Beispiel: Ausgabe aller Zahlen von 1 bis 3
int i = 1;
while ( i <= 3) {
System . out . println ( i ) ;
i ++;
}
Ablauf
int i = 1; //INITIALISIERUNG
i <= 3; //TEST (1 <= 3)-> true
System.out.println(i); //SCHLEIFENRUMPF
i++; // FORTSETZUNG -> i wird 2
i <= 3; //TEST (2 <= 3)-> true
System.out.println(i); //SCHLEIFENRUMPF
i++; // FORTSETZUNG -> i wird 3
i <= 3; //TEST (3 <= 3)-> true
System.out.println(i); //SCHLEIFENRUMPF
i++; // FORTSETZUNG -> i wird 4
i <= 3; //TEST (4 <= 3)-> false
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 18 / 36
Beispiel: Ausgabe aller Quadratzahlen ≤ y
Gegeben: y
Gesucht: Alle Quadratzahlen n2 mit n2 ≤ y
Beispiel: y = 42 ⇒ 1, 4, 9, 16, 25, 36
Wir brauchen:
Variable für die aktuelle Basis n
(wird in jedem Schleifendurchlauf hochgezählt)
Schleife, die läuft, solange die aktuelle Quadratzahl ≤ y ist
Mögliche Lösung
int n = 1;
while ( n * n <= y ) {
System . out . println ( n * n ) ;
n ++;
}
Tipp: eigenes Programm immer auch mit Grenzwerten testen
funktioniert es z.B. auch für y = 48 / 49 / 50 korrekt?
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 19 / 36
for-Schleife
Syntax
for ( IN IT I AL IS IE RUNG ; TEST ; FORTSETZUNG ) {
SCHL EIFENRUM PF ;
}
INITIALISIERUNG:
Einmalige Ausführung vor der Schleife
TEST:
boolean-Ausdruck
Wiederholte Prüfung vor jedem Schleifendurchlauf
Sobald TEST false ist, Abbruch der Schleife
FORTSETZUNG:
Wiederholte Ausführung nach jedem Schleifendurchlauf
SCHLEIFENRUMPF:
Zu wiederholende Anweisungen
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 20 / 36
Ablauf-Diagramm der for-Schleife
Syntax
for ( IN IT I AL IS IE RUNG ; TEST ; FORTSETZUNG ) {
SCHL EIFENRUM PF ;
}
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 21 / 36
Beispiel zur for-Schleife
Beispiel: Ausgabe der Zahlen von 1 bis 3
for ( int i = 1; i <= 3; i ++) {
System . out . println ( i ) ;
}
Ablauf
int i = 1;
i <= 3; //TEST (1 <= 3)-> true
System.out.println(i); //SCHLEIFENRUMPF
i++; // SCHLEIFENRUMPF -> i wird 2
i <= 3; //TEST (2 <= 3)-> true
System.out.println(i); //SCHLEIFENRUMPF
i++; // SCHLEIFENRUMPF -> i wird 3
i <= 3; //TEST (3 <= 3)-> true
System.out.println(i); //SCHLEIFENRUMPF
i++; // SCHLEIFENRUMPF -> i wird 4
i <= 3; //TEST (4 <= 3)-> false
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 22 / 36
Schleifenvariable
Syntax
for ( IN IT I AL IS IE RUNG ; TEST ; FORTSETZUNG ) {
SCHL EIFENRUM PF ;
}
Bei einer for-Schleife ist die Lauf-Bedingung (TEST) häufig an den Wert einer
ganzzahligen Variablen ( Schleifen-Variable oder Lauf-Variable) geknüpft.
Deklaration der Variablen in der INITIALISIERUNG üblich, aber nicht
zwingend erforderlich
Üblich:
Möglich (aber unschön!):
for ( int i = 1; i <= 3; i ++) {
int i = 1;
// weitere A n w e i s u n g e n
System . out . println ( i ) ;
for ( ; i <= 3; ) {
}
System . out . println ( i ) ;
i ++;
}
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 23 / 36
Beispiel: Berechnung der n-ten Potenz
Berechnung von x n für gegebene x und n
Bedeutung: x · x · x · ... · x (n Mal)
Wir brauchen:
Schleife mit n Durchläufen
In jedem Durchlauf: Multiplikation des Zwischenergebnisses mit x
x n = (((...(x · x) · x) · ...) · x)
Möglich
Üblich
int potenz = 1;
int potenz = 1;
for ( int i = 1; i <= n ; i ++) {
for ( int i = 0; i < n ; i ++) {
potenz = potenz * x ;
potenz = potenz * x ;
}
}
System . out . println ( potenz ) ;
System . out . println ( potenz ) ;
Lauf-Variablen beginnen in
Java üblicherweise bei 0!
(Grund kommt gleich)
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 24 / 36
Vergleich for-Schleife/while-Schleife
for-Schleife:
Ideal, wenn Anzahl der Schleifendurchläufe bekannt bzw. berechenbar ist
for: Ausgabe der Zahlen von 1 bis 3
for ( int i = 1; i <= 3; i ++) {
System . out . println ( i ) ;
}
while-Schleife:
Ideal, wenn Anzahl der Schleifendurchläufe unbekannt bzw. nicht (trivial)
berechenbar ist
while: Ausgabe der Quadratzahlen ≤ y
int n = 1;
while ( n * n <= y ) {
System . out . println ( n * n ) ;
n ++;
}
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 25 / 36
do/while-Schleife: Motivation
Bisher (for, while):
Durchführung von TEST vor jedem Schleifendurchlauf
Auch vor dem ersten Schleifendurchlauf
Schleifenrumpf wird u.U. gar nicht ausgeführt.
sog. kopfgesteuerte / abweisende Schleifen
Jetzt (do/while);
Durchführung von TEST nach jedem Schleifendurchlauf
Schleifenrumpf wird mindestens einmal ausgeführt.
sog. fußgesteuerte / nicht-abweisende Schleifen
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 26 / 36
do/while-Schleife
Syntax
do {
SCHL EIFENRUMPF ;
} while ( TEST ) ;
SCHLEIFENRUMPF:
Zu wiederholende Anweisungen
TEST:
boolean-Ausdruck
Prüfung nach jedem Schleifendurchlauf
Sobald TEST false ist, Abbruch der Schleife
Semikolon am Schluss nicht vergessen!
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 27 / 36
Ablauf-Diagramm der do/while-Schleife
Syntax
do {
SCHL EIFENRUMPF ;
} while ( TEST ) ;
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 28 / 36
Beispiel: Sechser würfeln
Ziel: Solange würfeln“, bis eine 6 fällt
”
Wir brauchen:
Schleife, die läuft, solange die gewürfelte Zahl keine 6 ist
Schleife, die mindestens einmal ausgeführt wird
do/while
Hinweis
1 + (int)(Math.random()*6)“ erzeugt eine Zufallszahl von 1 bis 6.
”
Mögliche Lösung
int wuerfel ;
do {
wuerfel = 1 + ( int ) ( Math . random () *6) ;
System . out . println ( " Es wurde eine " + wuerfel + " gewuerfelt ! " ) ;
} while ( wuerfel != 6) ;
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 29 / 36
Komplexe Schleifenbedingungen
Schleifenbedingung kann auch ein komplexerer, zusammengesetzter
boolescher Ausdruck sein.
Beispiel: Würfeln, bis eine 6 fällt, aber maximal drei Mal
Mögliche Lösung
int wuerfel ;
int anzahl = 0;
do {
wuerfel = 1 + ( int ) ( Math . random () *6) ;
System . out . println ( " Es wurde eine " + wuerfel + " gewuerfelt ! " ) ;
anzahl ++;
} while (( wuerfel != 6) && ( anzahl < 3) ) ;
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 30 / 36
Sprünge in Schleifen: break und continue
Ablauf einer Schleife vorzeitig abbrechen:
break: Ganze Schleife komplett abbrechen
continue: Nur aktuellen Durchlauf abbrechen und mit nächstem Durchlauf
weitermachen
Gilt häufig als schlechter Stil, da realer Ablauf schwer nachvollziehbar
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 31 / 36
Beispiel zu break: Ganze Schleife abbrechen
Beispiel zu break
int i = 1;
while ( i < 100) {
System . out . println ( i ) ;
i ++;
if ( i == 3) {
break ;
}
}
Ausgabe
1
2
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 32 / 36
Beispiel zu continue: Aktuellen Durchlauf abbrechen
Es sollen alle Zahlen von 1 bis 100 ausgegeben werden, außer...
Die Zahl ist durch 5 teilbar oder
Die Zahl ist durch 7 teilbar
Mögliche Lösung
int i = 0;
while ( i < 100) {
i ++;
if (( i % 5 == 0) || ( i % 7 == 0) ) {
continue ;
}
System . out . print ( i + " " ) ;
}
Ausgabe
1 2 3 4 6 8 9 11 12 13 16 17 18 19 22 23 24 26 27 29 31 32 33 34 36 37 38 39 41 43 44 46 47
48 51 52 53 54 57 58 59 61 62 64 66 67 68 69 71 72 73 74 76 78 79 81 82 83 86 87 88 89 92 93
94 96 97 99
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 33 / 36
Endlosschleifen
Alle Schleifen-Typen machen die Ausführung des Schleifenrumpfs abhängig
von einer Bedingung
Wiederholung des Schleifenrumpfs, solange die Bedingung erfüllt ist
Abbruch der Schleife, sobald die Bedingung nicht mehr erfüllt ist
Was passiert, wenn die Bedingung immer erfüllt ist (also nie false wird)?
sog. Endlosschleife
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 34 / 36
Beispiele für Endlosschleifen
Offensichtliche Endlosschleife
while ( true ) {
System . out . println ( " Hallo Welt " ) ;
}
Weniger offensichtliche Endlosschleife
int i = 0;
while ( i < 100) {
if (( i % 5 == 0) || ( i % 7 == 0) ) {
continue ;
}
i ++;
System . out . println ( i ) ;
}
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 35 / 36
CIP-Rechner
Hinweis
Wir wurden von den Administratoren gebeten euch darauf hinzuweisen, die
Rechner in den CIP-Pools auf keinen Fall neu zu starten oder herunterfahren!
Repetitorium Informatik
•
Informatik 2
•
WS 2015/16
•
Tag 3
•
Folie 36 / 36