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
© Copyright 2024 ExpyDoc