01.11.05 1 Noch für heute: 01.11.05 3 primitie Datentypen in JAVA Primitie Datentypen Pseudocode Name Speichergröße Wertgrenzen boolean 1 Byte false true char 2 Byte 0 65535 byte 1 Byte 128 127 short 2 Byte 32768 32767 int 4 Byte 2147483648 2147483647 long 8 Byte 2 63 2 63 1 float 4 Byte 3.40282347 10 38 3.40282347 10 38 double 8 Byte ±1.79769313486231570 10 308 01.11.05 2 Dezimal-, Binär- und Headezimalsystem 01.11.05 4 der logische Typ boolean Menschen: haben 10 Finger zählen im 10er-System Dezimalsystem: Stellen haben Potenzen on 10 als Wertigkeit Beispiel: 46 10 = 4 10 1 + 6 10 0 Computer: kennen nur an und aus 2er-System Binärsystem: Stellen haben Potenzen on 2 als Wertigkeit Beispiel: 46 10 = 101110 2 = 1 2 5 + 1 2 3 + 1 2 2 + 1 2 1 Headezimalsystem: Stellen haben Potenzen on 16 als Wertigkeit Ziffern: 0 1 2 3 4 5 6 7 8 9 a b c d e f Beispiel: 46 10 = 02e 16 = 2 16 1 + 14 16 0 zeigt Wahrheitswerte an kennt nur die literalen Werte true und false alle Vergleichsausdrücke haben Ergebnistyp boolean Beispiele: n > 100 a + b == c + 8 Math.abs( - y ) <= 0.001 5 * i!= Math.round( z * 4. / 3 ) wird per default mit false initialisiert
01.11.05 5 der Zeichentyp char 01.11.05 7 die ganzzahligen Typen byte, short, int, long codiert die Zeichen aller erwendbaren Alphabete, z.b. ASCII laufen über, wenn Wertebereich überschritten wird: 0 1 kennt ASCII-Literale wie A a 2 @ +? eplizite Literale \u0000 bis \uffff (headezimal) kennt einige Sonderliterale, z.b.: \b Backspace \\ Backslash \ \n Zeilentrenner \t Tabulator \ das Zeichen selbst \" das Zeichen " selbst, z.b. im String "\"Dir auch!\"" wird kaum zum Rechnen erwendet, z.b.: char c = w ; int i = c - a + 1 ; wird per default mit \u0000 initialisiert // ein Buchstabe // seine Nr. im Alphabet short s = 32767 ; ++s ; System.out.println( "s = " + s ) ; "s = -32768" die Operationen + - * / % werden eakt ausgeführt (sofern kein Überlauf auftritt) alle Literale sind om Typ int, ein Suffi L kennzeichnet long: int i = -10 ; long l = 12345678900L ; werden per default mit 0 bzw. 0L initialisiert k 2 // auch "+10" erlaubt // sonst ungültiges int! ++ k 2 1 01.11.05 6 die ganzzahligen Typen byte, short, int, long 01.11.05 8 codieren ganze Zahlen mit Vorzeichen im Binärsystem: codieren rationale Zahlen mit Vorzeichen: e ist ein Vorzeichenbit: = 1 Zahl negati ist eine Binärzahl: byte 7 Stellen, short 15 Stellen int 31 Stellen, long 63 Stellen unterstützten Inkrement ++ und Dekrement -- : int i = 7, j = 7 ; ++i ; --j ; System.out.println( "i = " + i + " j = " + j ) ; "i = 8 j = 6" ist ein Vorzeichenbit: = 1 Zahl negati e ist der Eponent: float 8 Stellen, double 11 Stellen ist die Mantisse: float 23 Stellen, double 52 Stellen float = ( 1) 2 e 127 (1 + 2 23 ) double = ( 1) 2 e 1023 (1 + 2 52 ) alle Literale sind om Typ double, ein Suffi F kennzeichnet float: double d = 1. ; // Punkt. zeigt double an double e = -1E-3 ; // Zeichen E bedeutet: *10^ float f = 10.25F ; // sonst ungültiges float!
01.11.05 9 01.11.05 11 Der Verlust an Genauigkeit kommt wie folgt zustande: zeigen unendlich an, wenn Wertebereich überschritten wird: float f = 3.4E38F ; float g = -f / 0F ; f += 1E38F ; System.out.println( "f = " + f + " g = " + g ) ; (a) (b) 0.0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 1.0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 1 1 0 0 1 1 "f = Infinity g = -Infinity" (c) 0.0 0 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 0 0 0 0 haben speziellen Wert NaN (Not a Number), falls kein Ergebnis eistiert: double d = Math.sqrt( -1. ) ; System.out.println( "d = " + d ) ; "d = NaN" (a) Binärdarstellung on f. Der Kasten ist die Mantisse, sie beginnt immer bei der ersten 1 on links. (b) Addition: g = f + 1F. Die Mantisse wird normalisiert durch Verschiebung der Stellen on f nach rechts entsprechend dem Größenunterschied. Die roten Ziffern werden raus geschoben und gehen erloren. (c) Subtraktion: h = g - 1F. Die Mantisse wird wieder normalisiert, jedoch können die erlorenen Ziffern nicht wieder hergestellt werden (blau). 01.11.05 10 01.11.05 12 Umwandlung der primitien Datentypen sind nicht eakt, rechnen mit Rundungsfehlern Achtung: Verlust on Genauigkeit bei Addition erschiedener Größen bzw. bei Subtraktion mit gleichem Vorzeichen möglich (instabile Oper.): float f = 1.23456789E-7F ; float g = f + 1F ; // Addition ersch. Größenordnungen float h = g - 1F ; // Subtraktion fast gleicher Größen System.out.println( "f = "+f + " g = "+g + " h = "+h ) ; "f = 1.2345679E-7 g = 1.0000001 h = 1.1920929E-7" die Operationen * / sowie + bei gleichen Größenordnungen und Vorzeichen sind stabil werden per default mit 0F bzw. 0. initialisiert Die Umwandlung der Typen bei Zuweisung geschieht wie folgt: byte short int long float double char boolean wird nicht umgewandelt! Umwandlung in Pfeilrichtung ist implizit Umwandlung gegen Pfeilrichtung muss eplizit erfolgen Vorsicht zwischen ganzzahligen und Gleitkommatypen!!
01.11.05 13 Umwandlung der primitien Datentypen 01.11.05 15 Was bei der Konersion passiert Beispiele für implizite Umwandlung: float f = 2 ; // int float long l = ( W - A ) + 1 ; // char int long double d = 4 * l - f ; // int long float double Beispiele für eplizite Umwandlung, sog. Cast: "(type)" ganzzahlig Gleitkomma: etl. Verlust an Genauigkeit: long l = 1000000009999999L ; float f = l ; // kein Cast erforderlich System.out.println( "f = " + f ) ; "f = 9.9999999E14" float f = (float)( 2. / 3 ) ; // double float long l = (long) ( f * 3. ) ; // float double long char c = (char) ( A + l ) ; // char long char short s = (short)( W ) ; // char int short 0 long float! 01.11.05 14 Was bei der Konersion passiert 01.11.05 16 Was bei der Konersion passiert ganzzahlige aufsteigende Typen untereinander werden eakt übernommen: Gleitkomma ganzzahlig: etl. Bereichsüberschreitung: (char) short float f = 1e30F ; long l = (long)f ; System.out.println( "l = " + l ) ; // Cast erforderlich 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 int "l = 9223372036854775807" aufsteigende Gleitkommatypen untereinander werden eakt übernommen: e f float! long 0 e 0 0 0 f 0 0 0 0 0 0 double float
01.11.05 17 Ausdrücke mit primitie Datentypen 01.11.05 19 Pseudocode Ein Ausdruck hat den höchsten orkommenden Typ. Beispiele: <byte> + <long> <long> <int> - <float> <float> <short> * <int> + <byte> <int> <long> / ( <double> - <char> ) <double> Achtung: ein Ausdruck wird erst ausgerechnet und dann zugewiesen! Beispiel: int i = 2100000000 ; long l = i + 50000000 ; // int + int = int long System.out.println( "l = " + l ) ; "l = -2144967296" eakte Art, Algorithmen zu beschreiben Form zwischen Fließtet und Programmcode: sprachlich direkt wie Tet übersichtlich strukturiert wie Code Kompromiss zwischen beiden Etremen Vorteile: mathematische Klarheit Unabhängigkeit on Programmiersprachen iele Fachbücher erwenden Pseudocode 01.11.05 18 01.11.05 20 Unterschiede Pseudocode / Programmcode Bedeutung: Pseudocode JAVA Zuweisung := = Vergleich = ==!= log. Und, and && & log. Oder, or log. Nicht, not! Kommentar {... } /*...*/, //... alle Elemente a A eigene Schleife Auswahl wähle Methodenaufruf einf. Algor. initialisiere Methodenaufruf sortiere Methodenaufruf Vektoroperat. := w Methodenaufruf Blöcke if... then... endif {... } while... do... endwhile {... }
01.11.05 21 Unterschiede Pseudocode / Programmcode 01.11.05 23 weiteres Beispiel mit Pseudocode Pseudocode: kontetfrei Variablentyp passend Schleifen nach Sinn klare mathematische Struktur passender Rückgabetyp man erklärt Menschen Programmcode: braucht Klassen-/Methodenkontet Variablen mit Typ, muss deklarieren konkrete do-/for-/while-schleifen Effizienztricks Rückgabetyp zu definieren Sicherheitsabfragen etl. redundante Statements man erklärt dem Computer numbersmallest( word ) Input: word {a,...,z} (Wort aus Kleinbuchstaben beliebiger Länge) Output: Anzahl des kleinsten Buchstabens in word if word ist leer then { Sonderfall abfangen } write kein Wort gegeben stop else sortiere word buchstabenweise aufsteigend { klarer Teilalgorithmus } n := Häufigkeit des ersten Buchstabens in word { erbale Formel } return n endif 01.11.05 22 Form des Pseudocode Funktionskopf mit Parametern, Beschreibung des Input und Output: function( parameters ) Input: parameters from sets Output: actions and output alues if-blöcke: Schleifen-Blöcke: if condition then statement endif while condition do statement endwhile for i := 1 to n do statement endfor