Abteilung für Telekooperation Übung Softwareentwicklung 1 für Wirtschaftsinformatik Dr. Wieland Schwinger UE02 B - Variablen und Datentypen
Abteilung für Telekooperation Folie-2 Softwareentwicklung I UE Schwinger [
Abteilung für Telekooperation Folie-3 Softwareentwicklung I UE Schwinger Was wäre wenn?! a = "Hello World" b = 42 c = a / b Was soll der Comuter an dieser Stelle wohl machen? Was ist das Ergebnis für c?
Abteilung für Telekooperation Folie-4 Softwareentwicklung I UE Schwinger Variablen und Datentypen Variablendeklaration Variablen müssen vor ihrer ersten Verwendung deklariert werden ■ Zweck: Bekanntgabe des Namens und des Datentyps für den Compiler ■ z.B. int i; short s1, s2; Variableninitialisierung ■ Zweck: Explizite Belegung der Variable mit einem Ausgangswert. In Java sind Variablen mit einem Wert vorinitialisiert. Auf diesen sollte man sich in Hinblick auf andere Programmiersprachen nicht verlassen. ■ z.B. i = 0; ■ shortVar1 = 1, ■ Deklaration und Initialisierung können zusammenfallen! ■ z.B. short shortVar2 = 2; Konstanten ( final ) ■ Konstanten sind Variable, deren Wert sich nicht mehr verändert! ■ final float PI = ;
Abteilung für Telekooperation Folie-5 Softwareentwicklung I UE Schwinger Variablen und Datentypen Was ist ein Datentyp? Java ist eine hybride Sprache, d.h. es verfügt über privimitive und Objekt/Referenz-Datentypen Primitive Datentypen: ■ Im Grundvokabular von Java "eingebaut". Datentyp bestimmt... ■ die Menge von Werten, die zu diesem Typ gehören, z.B. byte ist die Menge der ganzen Zahlen zwischen -128 und 127 ■ die Operationen, welche auf den Daten des Typs ausgeführt werden dürfen, z.B. für int +, -, *,... Statische Typisierung ■ Jede Variable und jeder Ausdruck hat einen statischen Datentyp ■ Compiler überprüft auf erlaubte Werte und erlaubte Operationen (statische Typprüfung)
Abteilung für Telekooperation Folie-6 Softwareentwicklung I UE Schwinger Variablen und Datentypen Primitive Datentypen Primitive Datentypen: DatentypBytesWerte Bereich boolean 1true / false char 2Unicode Zeichensatz byte bis bis 127 short bis bis int bis bis long bis bis float 4+/ Achtung beschränkte Genauigkeit! double 8+/ Achtung beschränkte Genauigkeit!
Abteilung für Telekooperation Folie-7 Softwareentwicklung I UE Schwinger Variablen und Datentypen Numerische Datentypen 1/3 Ganze Zahlen ■ byte -128 … 127 (1 Byte) ■ short … (2 Bytes) ■ int … (4 Bytes) ■ long … (8 Bytes) Gleitpunktzahlen (IEEE 754) ■ float +/ e-45 … 3.4e+38 (4 Bytes) ■ double +/- 4.94e-324 … 1.798e+308 (8 Bytes)
Abteilung für Telekooperation Folie-8 Softwareentwicklung I UE Schwinger Variablen und Datentypen Numerische Datentypen 3/3 Arithmetische Operatoren: +, -, *, /, % ■ Punkt- vor Strichrechnung … * 3 … // 7 … (1 + 2) * 3 … // 9 Bit-Operatoren: &, |, ^, ~, >, >>> ■ nur auf ganzen Zahlen ( byte, short, int, long ) Verlgeichsoperatoren: =, > ■ Datentyp des Ergebnisses ist boolean … i+j <= 10 …
Abteilung für Telekooperation Folie-9 Softwareentwicklung I UE Schwinger Variablen und Datentypen Gleitkommazahlen Der Altmeister der Numerik W. Kahan schreibt dazu in seinem pointierten und teilweise ironischen Stil: Jede Rechnung mit Gleitkommazahlen ist mindestens leicht fehlerhaft. In einer Gleitkommaarithmetik repräsentiert eine Zahl die Menge aller Zahlen, die von ihr in der Stelle nach der letzten abweichen. „3“, „3.0e0“ und „3.0d0“ sind als Gleitkommazahlen verschieden (will sagen, verschiedene Mengen). Arithmetik, die genauer ist als die bearbeiteten Daten ist nutzlos und eine Verschwendung. In einer Gleitkommaarithmetik ist nichts jemals genau 0; Falls doch, gibt es keinen Grund +0 und −0 zu unterscheiden. Auslöschung bei Subtraktionen verursacht immer numerische Ungenauigkeiten oder ist die einzige Ursache dafür. Eine Singularität vermindert die Genauigkeit, wenn die Zahlen ihr zu nahe kommen. Schlecht konditionierte Daten und Probleme verdienen nichts anderes als ungenaue Ergebnisse. Klassische Schulregeln und -formeln, auch wenn sie in Büchern stehen, müssen die Probe der Zeit bestanden, nicht nur überstanden haben. Fortschritt ist unvermeidlich; wenn bessere Formeln gefunden werden, ersetzen sie die alten. Die moderne backward analysis zur Fehlerfortpflanzung erklärt alle Fehler – oder entschuldigt sie. Als numerisch instabil bekannte Algorithmen sollten nie verwendet werden. Falsche Ergebnisse sind immer auf schlechte Daten oder schlechte Programmierer zurückzuführen, niemals auf eine schlechte Programmiersprache. Die meisten Eigenschaften des IEEE 754 sind zu obskur, um für die meisten Programmierer eine Bedeutung zu haben. „Schönheit und Wahrheit sind dasselbe. Das ist alles was wir auf Erden wissen und wissen müssen“ aus Keats, Ode auf eine griechische Urne. Anders ausgedrückt: Über häßliche Details sollte niemand Schweiß vergießen!Jede Variable und jeder Ausdruck hat einen statischen Datentyp
Abteilung für Telekooperation Folie-10 Softwareentwicklung I UE Schwinger Variablen und Datentypen Objekttype / Referntypen Objekttypen (Referenztypen) ■ Klassen z.B. String, BigInteger, BigDecimal, List ■ Interfaces ■ Arrays z.B. int[], String[] Mehr dazu wenn wir zum Themenbereich Arrays und Objektorientierung kommen.
Abteilung für Telekooperation Folie-11 Softwareentwicklung I UE Schwinger Variablen und Datentypen Literale Literale ■ int : 0, 123, -33 ■ long : 0L, 123l ■ float : 0f, 1.234F,.7e6F ■ double : 2e-3, 0.11E-04, 4d Oktale ( 0… ) und hexadezimale ( 0x… ) Literale 0123// 83 int 077L// 63 long 0x77L// 119 long 0xbadFace// int
Abteilung für Telekooperation Folie-12 Softwareentwicklung I UE Schwinger Variablen und Datentypen Division durch 0 Ganze Zahlen ( byte, short, int, long ) ArithmeticException Fließkommazahlen ( float, double ) POSITIVE_INFINITY NEGATIVE_INFINITY -0.0 NaN = not-a-number, ist ungleich mit jeder Zahl, auch mit sich selbst -> java.lang.Double.isNaN() Beispiele 1.0 / 0.0 => POSITIVE_INFINITY 1.0 / -0.0 => NEGATIVE_INFINITY 0.0 / 0.0 => NaN
Abteilung für Telekooperation Folie-13 Softwareentwicklung I UE Schwinger Variablen und Datentypen Zuweisungen Zuweisung durch =, nicht := x = 10; x = x + 1; Zuweisungskompatibilität ■ Entweder gleicher Typ der Variable und des Wertes, z.B. int ■ oder Typ der Variable schließt den des Wertes ein, z.B. int enthält short, byte ■ Sonst: Übersetzungsfehler (statische Typprüfung) die Variable x erhält den Wert 10 2) das Ergebnis wieder auf die Variable x gespeichert 1) zum Wert der Variable x wird der Wert 1 hinzugezählt und
Abteilung für Telekooperation Folie-14 Softwareentwicklung I UE Schwinger Variablen und Datentypen Zuweisungsoperatoren Inkrement- und Dekrement x++;//oder ++x; //entspricht x = x + 1; x--;//oder --x; //entspricht x = x - 1; ■ Innerhalb von Ausdrücken: … x++ * 3 … //Ergebnis: x alt *3, und dann x neu =x alt +1 … ++x * 3 … //zuerst x neu =x alt +1, Ergebnis: x neu *3 Zuweisungsoperatoren ■ Kurzschreibweise für x = x y; z.B.: x += 1; // x = x + 1; y /= 10; // y = y / 10;
Abteilung für Telekooperation Folie-15 Softwareentwicklung I UE Schwinger Variablen und Datentypen Typkonvertierung Alle numerischen Typen lassen sich gegenseitig umwandeln byte short int long float double ■ In Ausdrücken und bei Zuweisungen automatisch in den größeren Typ short s; long l; … l + 1 … // long … s + 1 … // int (the type of 1 is int) ■ Explizite Typkonvertierung durch type cast s = (short) (s+1); //type cast required Explizite Typkonvertierungen nur, wenn notwendig und man weiß was man tut!
Abteilung für Telekooperation Folie-16 Softwareentwicklung I UE Schwinger +-*/%charbyteshortintlongfloatdouble charint longfloatdouble byteint longfloatdouble shortint longfloatdouble int longfloatdouble long floatdouble float double Typumwandlungen
Abteilung für Telekooperation Folie-17 Softwareentwicklung I UE Schwinger Variablen und Datentypen Zuweisungskompatibilität int i,j; short s; byte b; i = j; //ok, same type i = s; //ok, int contains short s = i; //error i = 300; //ok (number constants are of type int) b = 1; //ok (1 is of type int; // the compiler knows, however, that 1 fits into byte) b = 300; //error (300 does not fit into byte)
Abteilung für Telekooperation Folie-18 Softwareentwicklung I UE Schwinger Variablen und Datentypen Type Cast int i; short s; byte b; s = (short)i;//possible loss of data b = (byte)300;// 44 (lowest byte) b = (byte)400;// -112 (lowest byte) i = (int)1.9;// 1 (rounded down) i = (int)10e20;// (max. of int) int i (short)i avoid!
Abteilung für Telekooperation Folie-19 Softwareentwicklung I UE Schwinger Variablen und Datentypen boolean Wahrheitswert ( true oder false ) boolean b = true; Boolsche Operationen: &, |, ! int i=10, j=-1; boolean b = i > 0 & j > 0;//false ■ mit „Kurzschluß-Auswertung“: &&, || while (i<tab.length && tab[i]!=0) {…} Vergleichsoperationen: ==, != boolean b = i>0 == true;//entspricht b = i>0;
Abteilung für Telekooperation Folie-20 Softwareentwicklung I UE Schwinger Variablen und Datentypen Der Auswahloperator „? :“ Bedingte Auswertung int max = a > b ? a : b; Abkürzung für: int max; if (a > b) max = a;// a war groesser else max = b;// b war groesser Nur erlaubt bei Ausdrücken, deren Ergebnis verwendet wird (Zuweisung, Parameter)
Abteilung für Telekooperation Folie-21 Softwareentwicklung I UE Schwinger Variablen und Datentypen char Unicode Zeichen (2 Bytes) ■ char a = 'a'; char a = (char)65; int shift = 'd'-'a';// gives 3 Escape-Sequenzen ■ \", \', \\, z.B. char singleQuote = '\''; ■ Steuerzeichen: \b, \t, \n, \r, \f ■ Unicode: \u0000 … \uFFFF, z.B. \u00e4 = ä ■ Oktale Darstellung: \123 Arithmetische Operatoren +, -, *, /, %
Abteilung für Telekooperation Folie-22 Softwareentwicklung I UE Schwinger ASCII-Codetabelle Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex | Char Dec Oct Hex (nul) x00 | (sp) x x40 | ` x60 (soh) x01 | ! x21 | A x41 | a x61 (stx) x02 | " x22 | B x42 | b x62 (etx) x03 | # x23 | C x43 | c x63 (eot) x04 | $ x24 | D x44 | d x64 (enq) x05 | % x25 | E x45 | e x65 (ack) x06 | & x26 | F x46 | f x66 (bel) x07 | ' x27 | G x47 | g x67 (bs) x08 | ( x28 | H x48 | h x68 (ht) x09 | ) x29 | I x49 | i x69 (nl) x0a | * x2a | J x4a | j x6a (vt) x0b | x2b | K x4b | k x6b (np) x0c |, x2c | L x4c | l x6c (cr) x0d | x2d | M x4d | m x6d (so) x0e | x2e | N x4e | n x6e (si) x0f | / x2f | O x4f | o x6f (dle) x10 | x30 | P x50 | p x70 (dc1) x11 | x31 | Q x51 | q x71 (dc2) x12 | x32 | R x52 | r x72 (dc3) x13 | x33 | S x53 | s x73 (dc4) x14 | x34 | T x54 | t x74 (nak) x15 | x35 | U x55 | u x75 (syn) x16 | x36 | V x56 | v x76 (etb) x17 | x37 | W x57 | w x77 (can) x18 | x38 | X x58 | x x78 (em) x19 | x39 | Y x59 | y x79 (sub) x1a | : x3a | Z x5a | z x7a (esc) x1b | ; x3b | [ x5b | { x7b (fs) x1c | < x3c | \ x5c | | x7c (gs) x1d | = x3d | ] x5d | } x7d (rs) x1e | > x3e | ^ x5e | ~ x7e (us) x1f | ? x3f | _ x5f | (del) x7f
Abteilung für Telekooperation Folie-23 Softwareentwicklung I UE Schwinger Variablen und Datentypen String Unicode Zeichenkette (ein Objekt) String x = "Johann Wolfgang von Goethe"; String s = "Jim said, \"Hello!\""; String l = ""; //Leerer String String n = null; //Kein String Operator + zur Verkettung von Strings String name = "Spencer"; s = "Hallo, " + name + "!"; //"Hallo, Spencer!" ■ Automatische Umwandlung in Strings bei + int x = 10; s = "x=" + x + " meter"; //"x=10 meter" s = "y=" + 1 * 2 + "3"; //"y=23" !!! s = 1 * "=z"; //"5=z"