University of Paderborn Software Engineering Group E. Kindler University of Paderborn Software Engineering Group E. Kindler Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 4 II. Grundlagen der Programmierung … Zuweisungen, Anweisungen, Blöcke Kontrollstrukturen, Erweiterungen Datentypen & Typisierung Konventionen & Kommentare … Ekkart Kindler 3.3.3 Ergänzungen Kurz If-Anweisungen University of Paderborn Software Engineering Group E. Kindler University of Paderborn Software Engineering Group E. Kindler if (x == 0) if (y == 0) z = 0; else z = 1; Kurze If-Anweisungen & Mehrdeutigkeiten if (x == 0) if (y == 0) { z = 0; } else z = 1; Problem Mehrdeutigkeit: Weitere Schleifenkonstrukte if (x == 0){ if (y == 0) z = 0; else z = 1; } Abbruch von Schleifen if (x == 0){ if (y == 0) z = 0; } else z = 1; if u welchem Frage: Z ? as else d rt hö ge do while / for oder break E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Kurze If-Anweisung: Regel 1 VL 4 3 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Kurze If-Anweisung: Regel 2 University of Paderborn Software Engineering Group E. Kindler VL 4 4 University of Paderborn Software Engineering Group E. Kindler Lassen Sie in Ihren Programmen keine Mehrdeutigkeiten zu! Schreiben Sie if (x == 0) { if (y == 0) { z = 0; } else { z = 1; } } oder ung ist e Einrück Die richtig htig wie die wic ebenso ung! Klammer explizite In einer langen If-Anweisung kommt als erste Anweisung (im dann-Fall) niemals unmittelbar eine kurze If-Anweisung (short-if) vor! if (x == 0) { if (y == 0) { z = 0; } } else { z = 1; } E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 5 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 6 1 Regel 2: graphisch Zählschleifen University of Paderborn Software Engineering Group E. Kindler University of Paderborn Software Engineering Group E. Kindler Schleifen haben oft die Form, daß eine Variable alle Werte von einer vorgegeben Untergrenze bis zu einer Obergrenze durchläuft. Z.B.: int erg = 1; if (bed1) if (bed2) Anw1 else Anw2 int i while erg i = } sich e bezieht Das els te if. letz s da f au E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Zählschleifen VL 4 7 Für solche Schleifen gibt es eigenes Schleifenkonstrukt: die for-Schleife E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn for (int i = 1; i <= n; i++) { erg = erg * i; } Obergrenze für die ZählErhöhung der Zähl- Bemerkung <Loop>::= variablen i um eins (nach jedem Schleifendurchlauf)! VL 4 9 Man kann jede for-Schleife in eine äquivalente while-Schleife umformen ( Übung) Deshalb ist das Konstrukt der for-Schleife nicht unbedingt nötig Aber Programme werden lesbarer und besser verständlich, wenn man for-Schleifen (richtig) einsetzt. E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 11 8 University of Paderborn Software Engineering Group E. Kindler ifener Schle , die in d werden, rt rie Variablen a kl rung de leife initialisie b der Sch innerhal Block)! sind nur m ne ei ie in gültig (w …| "for" "(" <BasicCommand> ";" <BoolExpression> ";" <BasicCommand> ")" <Command> E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Durchlaufschleife University of Paderborn Software Engineering Group E. Kindler VL 4 <BasicCommand> ";" | <Block> | Das ist auch neu! <Alternative> | Ausdrücke sind <Loop> | auch Anweisungen! … <BasicCommand>::= <Assignment> | <VarDecl> | <Expression> | … Initialisierung der “Zählvariablen” E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn “Inkrement” Zählschleife: BNF University of Paderborn Software Engineering Group E. Kindler variable i! Diese Bedingung wird vor jedem Schleifendurchlauf überprüft. Obergrenze = 1; (i <= n) { = erg * i; i + 1; <Command>::= int erg = 1; Untergrenze VL 4 10 University of Paderborn Software Engineering Group E. Kindler Manchmal möchte man eine Schleife mindestens einmal durchlaufen, bevor die Bedingung überprüft wird. Diese Schleifen nennen wir Durchlaufschleife (im Gegensatz zur bisherigen abweisenden Schleife). E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 12 2 Durchlaufschleife: Beispiel Durchlaufschleife University of Paderborn Software Engineering Group E. Kindler <Command>::= Wir wollen für eine Zahl n der Reihe nach die Ziffern dieser Zahl ausgeben (angefangen bei der niedrigsten Ziffer bis zur höchsten Ziffer): do { Out.print( n % 10 ); n = n / 10; } while ( n > 0 ); führe die Anweisung aus …| "do" werte die Bedingung aus wenn falsch <Command> "while" "(" <BoolExpression> ")" ";" VL 4 13 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Abbruch einer Schleife: Beispiel University of Paderborn Software Engineering Group E. Kindler Manchmal möchte man eine Schleife in der Mitte ihres Rumpfes verlassen; z.B. wenn ein Fehler eingetreten ist Dies kann man mit der Anweisung break; erreichen Wenn break-Anweisung irgendwann ausgeführt wird, wird das Programm unmittelbar nach der unmittelbar umgebenden Schleife fortgesetzt E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn 4. Typisierung und Datentypen <BasicCommand> ";" | <Block> | <Alternative> | <Loop> … wenn wahr <Loop>::= E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Abbruch einer Schleife University of Paderborn Software Engineering Group E. Kindler VL 4 15 14 University of Paderborn Software Engineering Group E. Kindler int erg = 1; int i = 1; while (i <= n) { erg = erg * i; if (erg <= 0) break; i = i + 1; } E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn 4.1 Primitive Datentypen University of Paderborn Software Engineering Group E. Kindler VL 4 VL 4 16 University of Paderborn Software Engineering Group E. Kindler Bisher: nur Programme über den ganzen Zahlen Die ganzen Zahlen sind nicht für jede Information eine zweckmäßige Repräsentation: Primitive Datentypen Typisierung Variablendeklarationen (Forts.) Zuweisungen (Forts.) E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 Funktionen über den reellen Zahlen Textverarbeitung 17 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 18 3 Primitive Datentypen „Ganze Zahlen“ University of Paderborn Software Engineering Group E. Kindler University of Paderborn Software Engineering Group E. Kindler byte –128 bis 127 short –32768 bis 32767 (2 Byte) int -2147483648 bis 2147483647 (4 Byte) long -9223372036854775808 bis 9223372036854775807 (8 Byte) ganze Zahlen: ..., -3, -2, -1, 0, 1, 2, ..., 4711, … reelle Zahlen: 0.321, π, e, 0.777..., 3.1*10-11 Zeichen: ‘a‘, ‘b‘, ‘c‘, ... , ‘A‘, ‘B‘, ... ‚‘0‘, ... ‘9‘, ‘&‘, ‘*‘, ... Echte ganze Zahlen gibt es nicht (als primitive Datentypen) !!! Zeichenreihen: n ner ganze ist an bei ei usagt, az Wenn m d r te ts wei Zahl nich . nt sie ein i “Hallo Echo!“, “Eine Zeichenfolge: %$§.“ Wahrheitswerte: false, true E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn „Reelle Zahlen“/ Gleitkommazahlen VL 4 19 Zeichen (Character) University of Paderborn Software Engineering Group E. Kindler E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Zeichenreihen (Strings) VL 4 'a', ... , 'z, 'ä', 'ö', 'ü', 'ß', 'A', ... 'Z', ... , '0', ... , '9', '+', '-', '\t', '\n', '\r', '\\', '\'', ... '\u2200' 21 "Dies ist ein Beispiel für eine\n Zeichenreihe mit einem Zeilenumbruch!" 23 ∀, '\u00A9' E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Achtung! String Zeichenreihen (-folgen) in Unicode! Zeichenfolgen werden im Gegensatz zu (einzelnen) Zeichen in Gänsefüßchen dargestellt: VL 4 University of Paderborn Software Engineering Group E. Kindler „Alle Zeichen der Welt“ sind in Unicode darstellbar (2 Byte): University of Paderborn Software Engineering Group E. Kindler E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn 20 http://www.unicode.org/charts/ „D“ wie double! n ner reelle an bei ei Wenn m dazusagt r te ei w ts Zahl nich er „D“), ist sie ein od (d.h. „F“ . double VL 4 char Zeichen in sogenanntem Unicode float ca. –3*1038 bis 3*1038 (4 Byte) ca. 6 bis 7 Stellen Genauigkeit „F“ wie float! Darstellung: 3.578671E+22F 0.0145456E-15F double ca. –2*10308 bis 2*10308 (8 Byte) ca. 15 Stellen Genauigkeit Darstellung: 1.234567897897E+220D -3.956745656e-12 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 22 University of Paderborn Software Engineering Group E. Kindler 'c' ist ein Zeichen! "c" ist eine Zeichenreihe, die aus genau einem Zeichen besteht "\u2200" ist auch eine Zeichenreihe, die aus genau einem Zeichen besteht ( ∀ ) "\\u2200" besteht dagegen aus 6 (!) Zeichen (\\ repräsentiert den Backslash) E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 24 4 Achtung! Wahrheitswerte University of Paderborn Software Engineering Group E. Kindler University of Paderborn Software Engineering Group E. Kindler boolean Zeichenreihen sind streng genommen in Java kein primitiver Datentyp! Werte: false und true ter m e n spä Wir kom k! c rü u z f darau Für den Augenblick sehen wir String jedoch als primitiven Datentyp an E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Wir benutzen int double char boolean und String VL 4 25 4.2 Typisierung University of Paderborn Software Engineering Group E. Kindler , real $#nat # " int n; int sum; double x; String name; boolean ende; Für die anderen Datentypen gelten die meisten der folgenden Aussagen analog (mit ein paar für uns nicht relevanten Abweichungen) Variablendeklaration <VarDecl>::= VL 4 27 26 University of Paderborn Software Engineering Group E. Kindler Strenge ng ! Typisieru E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Typisierung von Konstanten University of Paderborn Software Engineering Group E. Kindler <Type> <Identifier> [ "=" <Expression> ] { "," <Identifier> [ "=" <Expression> ] } VL 4 28 University of Paderborn Software Engineering Group E. Kindler Jede Konstante hat einen eindeutigen Typ: <Identifier>::= <Letter> { <Letter> | <Digit> } <Letter>::= "a" | "b" | "c" | … | "z" | "A" | "B" | "C" | … | "Z" | "_" <Digit>::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" <Type>::= "int" | " long" | "byte" | "short" | "double" | "float" | "char" | "boolean" | "String" | … E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 Jede Variable hat einen eindeutig definierten Typ Der Typ der Variablen wird bei der Deklaration der Variablen festgelegt: ! E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn 0, -1, 4711, 32768, -1000000 sind vom Typ int (zumindest für uns) 0.1, -1.7359e-34, 0.0 sind vom Typ double 'a', '©' sind vom Typ char Strenge ng ! Typisieru "Bla bla", "Test\n Test\n" sind vom Typ String VL 4 29 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 30 5 Typisierung von Ausdrücken Signatur von Operatoren University of Paderborn Software Engineering Group E. Kindler Jeder Ausdruck hat einen eindeutigen Typ: int n, m; double x, y; 1 * 2 n + m x x / y x < y // // // // // vom vom vom vom vom Type int Typ int Typ double Typ double Typ boolean E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Typ eines Ausdrucks VL 4 Math.min: int, int → int Math.abs: int → int . + . : int int → int . < . : int int → boolean 31 < int h1 int h6 2 int h4 + n int h2 + Geht das? int h3 n 1 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 r e weitere Eine List n folgt. re to ra Ope VL 4 32 University of Paderborn Software Engineering Group E. Kindler Der Operator + ist bereits für die Addition zweier Zahlen des Datentyps int vergeben! Wir würden + jedoch auch gerne für die Addition zweier Zahlen des Datentyps double benutzen! < * Strenge ng ! Typisieru E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn 4.3 Polymorphimus boolean h7 * Polymorphismus Beispiele: University of Paderborn Software Engineering Group E. Kindler ergibt sich (induktiv) aus dem Typ der Konstanten, der Variablen, und der Operatoren int h5 und Funktionen int n; ... n * (n + 1) < 2 Für jeden Operator (und jede Funktion) ist eindeutig festgelegt, welchen Typ die Operanden und das Ergebnis besitzen! Strenge ng ! Typisieru ist ist ist ist ist University of Paderborn Software Engineering Group E. Kindler 33 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn . + . : int int → int University of Paderborn Software Engineering Group E. Kindler h= polymorp ltig“, „vielgesta ig“. „vielförm VL 4 34 University of Paderborn Software Engineering Group E. Kindler Es geht: Da die Typen der Teilausdrücke, auf die + angewendet wird, bekannt sind, können wir diese Typen benutzen, um den gemeinten Operator eindeutig zu identifizieren Addiert zwei Zahlen vom Typ int und liefert eine Zahl vom Typ int Der Operator + kommt in verschiedenen Formen („Gestalten“) vor: . + . : int int → int . + . : double double → double . + . : String String → String E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 35 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 36 6 . + . : double double → double . + . : String String → String University of Paderborn Software Engineering Group E. Kindler University of Paderborn Software Engineering Group E. Kindler Schreibt die beiden Zeichenreihen hintereinander (Konkatenation) Addiert zwei Zahlen vom Typ double und liefert eine Zahl vom Typ double "abc" + "def" ergibt "abcdef" E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Weitere (implizite) Formen . . . . . . . . + + + + + + + + . . . . . . . . : : : : : : : : VL 4 37 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Weitere Operatoren University of Paderborn Software Engineering Group E. Kindler int double → double double int → double int String → String String int → String double String → String String double → String String boolean → String boolean String → String VL 4 38 University of Paderborn Software Engineering Group E. Kindler Dasselbe gilt für die anderen arithmetischen Operatoren -, *, / % (Rest) kommt auf den Gleitpunktzahlen nicht vor Auf Zeichenreihen kommen %, -, * und / nicht vor " ' "# l do ub e String % & E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Weitere Operatoren VL 4 39 Beispiele University of Paderborn Software Engineering Group E. Kindler Über Math stehen eine Reihe weiterer Operationen zur Verfügung: "abc" + 1 1 / 2 1 / 2.0 Math.abs(.) Absolutbetrag der Zahl (im jeweiligen Datentyp) VL 4 40 University of Paderborn Software Engineering Group E. Kindler ergibt "abc1" ergibt 0 (ganzzahlige Division) ergibt 0.5 (Gleitkomma-Division) "abc" + false ergibt "abcfalse" "abc" + (1 + 2) ergibt "abc3" Math.max(.,.) Math.min(.,.) Maximum und Minimum der beiden Zahlen (im jeweiligen Datentyp) Math.sqrt(.) Quadratwurzel der Zahl (double) bt Was ergi 3 Fragen: + 10 + "bla" b + " la" 10 + 3 Math.sin(.) Math.cos(.) Math.tan(.) Math.asin(.) Math.acos(.) Math.atan(.) Ergebnis der jew. trigonometrischen Operation (double) E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 41 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 42 7 Weitere Operatoren Weitere Operatoren University of Paderborn Software Engineering Group E. Kindler Vergleiche (auf Zahlen): Boolesche Operationen: == Test auf Gleichheit (binär) <, <=, >, >= Größenvergleiche (binär) != Test auf Ungleichheit (binär) Das Ergebnis einer solchen Operation ist vom Typ boolean. Einen Ausdruck vom Typ boolean nennen wir einen booleschen Ausdruck. ; = mit == : niemals Achtung t zum hseln sie ch ec ni w e er llt V • so rator == n • Der Ope henreihe von Zeic Vergleich nutzt werden; be ls) ) ua gs in eq ( (Str er mehr dazu spät E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Operatorvorrang unäre Operatoren * / % + < <= > >= == != && || int n; n = 0.0; | ! n & und Achtung ch die Operatore res und as ande w Es gibt au et er also uten ab die bede t mit && und || ch sollten ni t werden!!! el verwechs 43 VL 4 44 University of Paderborn Software Engineering Group E. Kindler Der Wert der Auswertung eines Ausdrucks kann nur an eine Variable zugewiesen werden, die den gleichen Typ hat wie der Ausdruck: int n, m; boolean b; ... m = n * (n + 1); b = m < n; niedrigste Priorität VL 4 E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn Zuweisung höchste Priorität E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn double x; x = 0.0; VL 4 ! Negation (unär) && Konjunktion „logisches und“ (binär) || Disjunktion „logisches oder“ (binär) University of Paderborn Software Engineering Group E. Kindler Typen müssen passen!! University of Paderborn Software Engineering Group E. Kindler 45 besitzt perator = r eisungso tärke alle ss g Der Zuw un d gste Bin die gerin n. re Operato E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 46 University of Paderborn Software Engineering Group E. Kindler (# ( (# ( läßt sich rderung Diese Fo rn! c ke etwas lo lung: Umwand e it liz p Im ; 0 z.B. x = E. Kindler: Technische Informatik für Ingenieure, WS 2005/06, Universität Paderborn VL 4 47 8