Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Proinformatik-Vorlesung Objektorientierte Programmierung Freie Universität Berlin Prof. Dr. Marco Block-Berlitz Sommersemester 2011 Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 1 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Organisatorisches Zeitlicher Ablauf 08:30 – 11:00 Uhr 2 Vorlesungsteile mit ca. 15 Minuten Pause 11:00 – 12:00 Uhr Mittagspause 12:00 – 13:30 Uhr 13:30 – 15:00 Uhr Theoretische und praktische Übungen (aktive und erfolgreiche Teilnahme) Tutoren und Tutorien Christoph Krüger SR 051 Takustr. 9, Benjamin Schönburg SR 006 Takustr. 9, Michael Kmoch Eduard Wolf SR K36 Takustr. 9 RR Bioinf Arnimallee 6 Scheinkriterien Übungszettel werden nach Bedarf am Ende einer Vorlesung ausgegeben (60% der Aufgaben erfolgreich bearbeiten) Klausur: vorletzter Vorlesungstag (08.09.2011), 8:30 Uhr s.t., 90 Minuten (Bestehen der Klausur) Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 2 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Vorlesungsmaterialen und Literaturliste Vorlesungsmaterialien Vorlesungsfolien werden bereit gestellt und ersetzen das Vorlesungsskript, Programme, Literaturhinweise und weiteres Material werden auf einer Veranstaltungswebseite zur Verfügung gestellt: http://www.mi.fu-berlin.de/kvv/course.htm?sid=22&iid=1&cid=9698 Literaturliste [1] Hoffmann D.W.: "Theoretische Informatik", Hanser-Verlag 2009 [2] Kleuker S.: "Formale Modelle der Softwareentwicklung - Model-Checking, Verifikation, Analyse und Simulation", Vieweg-Teubner-Verlag 2009 [3] Block M.: "Java-Intensivkurs - In 14 Tagen lernen Projekte erfolgreich zu realisieren", 2. Auflage, Springer-Verlag 2009 [4] Gries D., Gries P.: "Multimedia Introduction to Programming Using Java", Springer-Verlag 2005 [5] Weiss M.A.: "Data Structures & Problem Solving Using Java", 3. Auflage, Addison-Wesley-Verlag 2005 [6] Cormen T.H., Leiserson C.E., Rivest R.L., Stein C.: "Introduction to Algorithms", 3. Auflage, MIT Press 2009 [7] Logufatu D.: "Grundlegende Algorithmen mit Java: Vom Algorithmus zum fertigen Programm.", Vieweg-Teubner-Verlag 2008 Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 3 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Diskussionsplattform - Forum Mailingliste: werden wir nicht brauchen - wichtige Änderungen oder Mitteilungen erscheinen im Forum Forum: http://www.java-uni.de Es gibt einen passwortgeschützten Bereich nur für Euch: FU SoSe 2011: Proinformatik - Algorithmen und Programmierung II ("proinf") Das Java-Forum dient als Diskussionsplattform. Helft Euch gegenseitig! Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 4 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Überblick und Motivation Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 5 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 6 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Unsere wichtigsten Themen und Ziele Programmiersprache Java - Einführung und Ausbildung zum Selbststudium - lernen objektorientiert zu denken und zu programmieren Einführung in die Laufzeit- und Komplexitätsanalyse - kleine Programmabschnitte analysieren und vergleichen können - effiziente Lösungen für neuartige Probleme formulieren Verifikations- und Testtechniken - Programme möglichst fehlerfrei schreiben - Entworfene Programme testen Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 7 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Entwicklungsumgebung für Java (erste Tage) Für die ersten kleinen Programme in Java werden wir Notepad++ oder einen vergleichbaren Editor mit Syntaxhighlighting verwenden: Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 8 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 9 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Entwicklungsumgebung für Java Für eine professionelle Entwicklung größerer Programme in Java werden wir später lernen mit Eclipse zu arbeiten: Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 10 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Motivation zu Projekten und Ausblick Programmieren lernen heißt eine Sprache lernen … und Sprachen muss man sprechen! Das bedeutet für uns: - Projekte - Projekte - Projekte -… - viele Projekte Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 11 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Einstieg in die Softwaretechnik Visuelle Sprachen werden oft für die Kommunikation eingesetzt ... Wir werden diese in den verschiedenen Phasen der Softwareentwicklung kennenlernen und einsetzen. Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 12 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Handyprojekte mit Java Klein … aber jederzeit dabei! Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 13 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Multitouchprojekte mit Java Wenn uns Zeit bleibt … warum nicht auch so etwas! Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 14 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Top-Down- versus Bottom-Up-Lernen Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 15 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Vorbereitungen und Javas kleinste Bausteine Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 16 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Übersicht zum Vorlesungsinhalt zeitliche Abfolge und Inhalte können variieren Vorbereitungen und Javas kleinste Bausteine • • • • • • • Motivation zu Java Installation der aktuellen Java-Version Primitive Datentypen und ihre Wertebereiche Wiederholung: Boolesche Algebra Variablen und Konstanten Operationen auf primitiven Datentypen Umwandlungen von Datentypen Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 17 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Warum gerade mit Java beginnen? Es gibt viele Gründe mit dem Programmieren zu beginnen, aber warum sollte es gerade die Programmiersprache Java sein? • • • • • • • Java ist leicht zu erlernen relativ kleiner Befehlsumfang strikte Typsicherheit plattformunabhängig hat dominierende Stellung auf mobilen Geräten und in der Welt der Server mit dem Java Native Interface (JNI) können Windows-DLLs und C++-Bibliotheken eingebunden werden sehr große Community Generell gilt: Die Chance in Java etwas falsch zu machen ist sehr viel kleiner als in anderen Programmiersprachen, wie z.B. in C oder C++. Java wird deshalb auf Grund dieser Eigenschaften gerade in der Lehre intensiv eingesetzt. Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 18 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Was leistet Java nicht? Es gibt aber auch Systeme, bei denen Java nicht eingesetzt werden sollte bzw. folgende Nachteile: • • Geschwindigkeitsrelevante bzw. hardwarenahe Softwaresysteme Operatoren können nicht überladen werden In C++ können wir beispielsweise den Operator + für Vektoren überladen: Vektor c = a + b; In Java können wir dafür nur eine Funktionsschreibweise anbieten: Vektor c = Vektor.add(a, b); Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 19 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Installation von Java und Vorbereitungen Wir installieren die aktuelle Java-Version 1.7 mit interessanten Neuerungen. 1) Download1) und Installation des JDK (Java Development Kit) 2) Download2, 3) und Installation einer Entwicklungsumgebung 3) Testen der installierten Javaversion. i) In einer Konsole prüfen, ob der Compiler vorhanden ist: c:\javac ii) Folgendes Testprogramm im Editor schreiben und mit dem Namen TestProgramm.java speichern: public class TestProgramm {} iii) Kompilieren und ausführen des Testprogramms: c:\javac TestProgramm.java c:\java TestProgramm 1) Oracle: 2) Notepad++: 3) Eclipse: http://www.oracle.com/de/technologies/java/index.html http://notepad-plus-plus.org http://www.eclipse.org Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 20 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Variablen als Speicherplatz ... Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 21 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Primitive Datentypen in Java Wahrheitswerte boolean Zeichen und Symbole Zahlen char byte, short, int, long, float, double Warum haben Zahlen eine besondere Stellung? Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 22 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Primitive Datentypen und ihre Wertebereiche Datentyp Wertebereich true, false boolean 0 … 65.535 (z.B. ‘a‘, ‘b‘, …, ‘A‘, …, ‘1‘, ‘2‘, …) char -128 bis 127 byte -32.768 bis 32.767 short -2.147.483.648 bis 2.147.483.647 int long -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807 float +/-1,4E-45 bis +/-3,4E 38 double +/-4,9E-324 bis +/-1,7E 308 Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) Bit 8 16 8 16 32 64 32 64 23 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Deklaration von Variablen Deklaration von Variablen: <Datentyp> <Name>; Beispiel: boolean a; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 24 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Zuweisung von Werten Nach der Deklaration steht die Variable bereit und kann einen Wert mit dem Symbol = zugewiesen bekommen. Die Zuweisung erlaubt aber nur den Wert der rechten Seite auf die linke zu übertragen: a = true; Es andersherum aufzuschreiben wäre fehlerhaft: true = a; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 25 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Deklaration und Zuweisung Deklaration von Variablen und Zuweisung in einem Schritt: <Datentyp> <Name> = <Wert>; Beispiele: boolean a, b; a = true; char c = 'b'; int d = 12, e, f = 0; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 26 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Deklaration und Initialisierung vor Verwendung! Variablen müssen vor dem Einsatz immer initialisiert (also mit einem Wert versehen) werden. Folgendes Beispiel führt zu einem Fehler: int i; int j = i; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 27 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Bezeichnungen von Variablen Es gibt zwar ein paar Beschränkungen für die Namensgebung, aber der wichtigste Grund für die Wahl ist die Aufgabe der Variable. Ein paar Beispiele dazu: boolean istFertig; double kursWert; int schrittZaehler; Variablennamen beginnen mit einem Buchstaben, Unterstrich oder Dollarzeichen, nicht erlaubt sind dabei Zahlen. Nach dem ersten Zeichen dürfen aber sowohl Buchstaben als auch Zahlen folgen. Operatoren, Schlüsselwörter und vordefinierte Literale dürfen ebenfalls nicht als Variablennamen verwendet werden. Zu den reservierten Schlüsselwörtern und Literalen in Java gehören die folgenden: Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 28 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Syntaxhervorhebung Schlüsselwörter werden fett und Kommentare kursiv gekennzeichnet, das fördert Übersicht und Lesbarkeit. Hier ein Beispiel ohne Syntaxhervorhebung (Syntaxhighlighting): // zählt die Anzahl der bereits besetzten Felder private int countSigns(int[][] b){ int count=0; for (int i=0; i < 3; i++) for (int j=0; j < 3; j++) if (b[i][j]!=0) count++; return count; } ... und hier mit: // zählt die Anzahl der bereits besetzten Felder private int countSigns(int[][] b){ int count=0; for (int i=0; i < 3; i++) for (int j=0; j < 3; j++) if (b[i][j]!=0) count++; return count; } Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 29 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Groß- und Kleinschreibung in Java Bei Java muss auf Groß- und Kleinschreibung geachtet werden, denn unterschiedliche Schreibweisen bezeichnen unterschiedliche Variablen (case-sensitive). Folgendes würde deshalb nicht funktionieren: boolean istFertig; istFERTIG = true; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 30 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Variablenbezeichner und Code-Konventionen Durch eine überlegte Variablenbezeichnung werden zwei Dinge gefördert: • • Zum Einen benötigt der Programmautor weniger Zeit, um seine eigenen Programme zu lesen, deren Erstellung vielleicht schon etwas länger zurück liegt, und zum Anderen fördert es die Zusammenarbeit mit anderen Programmierern. Im Laufe der Zeit haben sich einige Konventionen1) bezüglich der Erstellung von Programmen etabliert. Der Programmierer sollte sich an diese halten, um sich selbst und anderen das Leben nicht unnötig schwer zu machen. Frei nach dem Motto: Wir müssen nicht immer alles machen, was erlaubt ist. Bei der Bezeichnung von Variablen in Java hat sich die Konvention durchgesetzt, dass wir Kombinationen von Verben und/oder Substantiven verwenden. Die Worte werden dabei, bis auf das erste, beginnen mit einem Großbuchstaben geschrieben (camelCase). 1) Oracle: http://www.oracle.com/technetwork/java/codeconv-138413.html Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 31 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Variablen versus Konstanten Manchmal ist es notwendig, Variablen zu verwenden, die die Eigenschaft besitzen, während des gesamten Programmablaufs unverändert zu bleiben. Beispielsweise eine Näherung der Zahl pi: double pi = 3.14159; Damit aber nun gewährleistet ist, dass der Softwareentwickler selbst oder auch ein anderer weiß, dass dieser Platzhalter im Speicher nicht variabel und demzufolge keine Änderung erlaubt ist, schreiben wir einfach ein final davor, verwenden (laut Konvention) für den Namen nur Großbuchstaben und machen so aus einer Variable eine Konstante. Die Syntax dafür sieht wie folgt aus: final <Datentyp> <Name> [= <Wert>]; Jetzt können wir unmissverständlich den Platzhalter für pi als Konstante deklarieren: final double PI = 3.14159; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 32 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Java-Compiler überprüft final Sollten wir dennoch versuchen, Konstanten zu verändern ... final double PI = 3.14159; PI = 4; ... liefert der Java-Compiler einen Fehler: KonstantenTest:4: cannot assign a value to final variable PI PI = 4; ^ 1 error Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 33 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Primitive Datentypen und ihre Operationen: Datentyp boolean Der Datentyp boolean bezeichnet einen Wahrheitswert und kann demzufolge true oder false sein. boolean a; a = true; Es gibt eine weit verbreitete Möglichkeit, auf die wir später noch genauer eingehen werden, einen boolean für eine Entscheidung zu verwenden: if (<boolean>) <Anweisung>; Wenn der boolean den Wert true hat, führen wir die nachfolgende Anweisung aus, ansonsten überspringen wir diesen Abschnitt. Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 34 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Das wichtigsten logische Operationen: UND, ODER und NICHT Sommersemester 2011 B1 B2 B1 UND B2 B1 ODER B2 B NICHT B 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 1 1 1 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 1 0 35 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin UND, ODER und NICHT in Java In Java verwenden wir && (UND), || (ODER) und ! (NICHT): boolean a, b, c; a = true; b = false; c = a && b; Welchen Wert hat c? boolean a, b, c; a = true; b = a && a; c = b || a; Welchen Wert hat c? boolean a = true, b = false, c, d; c = a && b; d = (a || b) && !c; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) Welchen Wert hat d? 36 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Datentyp char Zeichen oder Symbole werden durch den Datentyp char identifiziert und zwischen ' ' notiert: char d = '7'; char e = 'b'; Die Variable d trägt als Inhalt das Zeichen '7' und wird aber nicht als Zahl 7 interpretiert. Schauen wir uns die relationalen Operatoren (Vergleichsoperatoren) stellvertretend für char an: boolean d, e, f, g; char a, b, c; a = '1'; b = '1'; c = '5'; d e f g = = = = a a a c == b; != b; < c; >= b; Sommersemester 2011 // // // // gleich ungleich kleiner größer-gleich Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) Welche Werte gelten für d, e, f und g? 37 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Datentyp int Der Datentyp int repräsentiert Ganzzahlen und ist der wahrscheinlich am häufigsten verwendete: int a, b = 0; a = 10; Das Schöne an Zahlen ist, dass wir sie einfach addieren, subtrahieren, multiplizieren und dividieren können. Aber mit dem Dividieren meinen wir manchmal zwei verschiedene Dinge. Schauen wir uns ein Beispiel an: int a = 5, b = 2, c; c = a / b; // DIV-Operator liefert m // wenn a = m*b+r; c = a % b; // MOD-Operator liefert r int a = 29, b, c; b = a / 10; c = a % 10; Sommersemester 2011 Welche Werte haben b und c? Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 38 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Datentyp int Der Datentyp int hat einen Wertebereich von: {-231 , -231 +1, …, -1, 0, 1, 2, …, 231-1} Der kleinste bzw. größte darstellbare Wert liegt jeweils in einer Konstanten vor: int minimalerWert = Integer.MIN_VALUE; int maximalerWert = Integer.MAX_VALUE; Was würde jetzt passieren, wenn wir zu dem größten Wert eine 2 addieren? 231-1 +2 = 2147483647 +2 = Integer.MAX_VALUE +2 Statt 2147483649 erhalten wir -2147483647 auf Grund des zyklischen Verhaltens durch den begrenzten Speicher. Hier der Grund dafür: .. Ubertragsbit wird “vergessen” 1 … 111 int a + 0 … 001 int b 1 0 … 000 int c Stichwort: Zweierkomplement-Darstellung Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 39 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Zweierkomplement-Darstellung I Für 0 und positive Zahlen (z.B. Zweierkomplement-Darstellung mit 4 Bit) werden die entsprechenden Binärzahlen wie folgt erstellt: 0 = 0000 +1 = 0001 +2 = 0010 +3 = 0011 +4 +5 +6 +7 = = = = 0100 0101 0110 0111 Für negative Zahlen negieren wir die Binärzahl elementeweise und addieren anschließend eine 1 dazu (z.B. -1 => 0001 => 1110 => 1111): -1 -2 -3 -4 = = = = 1111 1110 1101 1100 Sommersemester 2011 -5 -6 -7 -8 = = = = 1011 1010 1001 1000 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 40 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Zweierkomplement-Darstellung I0 Folgendes zyklisches Verhalten ergibt sich: 0 0000 -2 -3 -1 1111 1110 1 0001 0010 2 3 0011 1101 0100 4 -4 1100 1011 0101 5 -5 1010 0110 6 -6 1001 0111 7 -7 1000 -8 Jetzt ist auch ersichtlich, warum es eine negative Zahl mehr als positive gibt. Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 41 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Kurzschreibweisen der Standardoperationen I In Java und anderen Programmiersprachen gibt es für alle Standardoperationen, wie addieren, subtrahieren, usw., eine Kurzschreibweise. Statt dieser: <Variable> = <Variable> <Operation> <Ausdruck> <Anweisung>; können wir die meisten zweistelligen Operationen auch kurz so schreiben: <Variable> <Operation>= <Ausdruck> <Anweisung>; Hier zwei Beispiele dazu: int a = 0, b = 1; a += b; // entspricht a = a + b; b -= 5; // entspricht b = b - 5; Da solche Standardoperationen typischerweise sehr oft in Programmen vorkommen, erlaubt diese Art der Notation eine Verkürzung der Programme. Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 42 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Kurzschreibweisen der Standardoperationen II Für Addition und Subtraktion um 1 (wird auch als inkrementieren und dekrementieren bezeichnet), deren Verwendung wahrscheinlich am häufigsten ist, gibt es sogar noch kürzere Schreibweisen: a++; ++a; a--; --a; // // // // Postinkrement: Preinkrement: Postdekrement: Predekrement: entspricht entspricht entspricht entspricht a a a a = = = = a a a a + + - 1 1 1 1 Den kleinen aber feinen Unterschied der Pre- und Postvarianten zeigt folgendes Beispiel: int a, b, c = 0; a = c++; // erst Wert von c in a kopieren dann c=c+1 b = ++c; // c=c+1 dann neuen Wert von c in a kopieren Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) Welche Werte haben a und b? 43 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Datentypen byte, short und long Die ebenfalls ganzzahligen Datentypen byte, short und long unterscheiden sich dem Datentypen int gegenüber nur in der Größe der zu speichernden Werte: byte b1=0, b2=100; b1 = b2; b2 = 100%15; short s1=4, s2=12; s1 -= s2; s2 /= 2; long a1=48659023, a2=110207203; a1 *= a2; Ganzzahlige Datentypen lassen sich neben der gebräuchlichen Dezimaldarstellung auch zu den Basen 8 (Oktalzahlen) und 16 (Hexadezimalzahlen) angeben: int zahlBasis10 = 21; // Dazimaldarstellung int zahlBasis8 = 025; // Oktaldarstellung int zahlBasis16 = 0x15; // Hexadezimaldarstellung Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 2·101 + 1·100 2·81 + 5·80 1·161 + 5·160 44 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Datentypen float und double I Die beiden primitiven Datentypen float und double repräsentieren gebrochene Zahlen (oder Gleitkommazahlen): double a = 2; double b = 2.2; float float // ganze Zahl wird double zugewiesen // 2.2 wird als double interpretiert c = 3; // ganze Zahl wird float zugewiesen d = 3.3f; // das f signalisiert den Float float e, f; e = d%c; e = d/c; f = c*(d/2.4f) + 1; f += 1.3f; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 45 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Datentypen float und double I Gleitkommazahlen lassen sich auch in der Exponentenschreibweise1) angeben, wobei der erste Teil vor dem E (oder e) der Mantisse und der zweite Teil danach dem Exponenten entspricht: double zahl = 1.526552E5; // entspricht 1.52655 * 10^5 System.out.println("Zahl: " + zahl); zahl = 4.2E-2; // entspricht 4.2 * 10^-2 System.out.println("Zahl: " + zahl); Die Anweisung System.out.println() gibt im Konsolenfenster eine Textzeile aus. Später kommen wir noch einmal intensiv darauf zu sprechen. Wir erhalten als Ausgabe die beiden Werte: 152655.2 0.042 1) SUN: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 46 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Umwandlungen von Datentypen - implizit Datentyp in größeren kopieren: 5 0 4 3 9 0 1 0 0 2 „kleiner Datentyp“ 5 0 4 3 9 0 1 0 0 2 „großer Datentyp“ Beispiele: byte a = 28; int b; b = a; // byte (8 Bit) in grösseren int (32 Bit) kopieren float f = 2.3f; double d; d = f; // float (32 Bit) in grösseren double (64 Bit) kopieren Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 47 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Umwandlungen von Datentypen - explizit Datentyp in kleineren kopieren: 0 0 0 0 0 0 0 0 0 0 0 0 2 6 1 1 8 5 3 9 „großer Datentyp“ Inhalt passt 0 0 2 6 1 1 8 5 3 9 „kleiner Datentyp“ Fehlerhaftes Beispiel: float f; double d = 2.3; f = d; // double (64 Bit) in kleineren float (32 Bit) kopieren Wir müssen explizit angeben, dass wir kopieren wollen und uns der Tragweite bewußt sind (Erinnerung an zyklisches Verhalten beim int): float f; double d = 2.3; f = (float)d; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 48 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Übersicht zu impliziten Umwandlungen Von oben nach unten können wir die erlaubten, impliziten Typumwandlungen ablesen: byte char short int explizit long implizit float double So dürfen wir beispielsweise den Inhalt eines byte ohne zusätzliche Angabe in einen int kopieren. Auch ein char darf implizit in einen int umgewandelt werden, aber nicht umgekehrt. Die Größen der Kästchen entsprechen dem relativen Speicherbedarf. Von unten nach oben müssen die Datentypen explizit umgewandelt werden. Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 49 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Datentypen sind für die Operationen entscheidend An dieser Stelle ist es wichtig, auf einen häufig gemachten Fehler hinzuweisen: int a=5, b=7; double erg = a/b; Wir erwarten eigentlich einen Wert um 0.71, erhalten aber 0.0. Was ist der Grund? Folgende Programmzeilen liefern das gewünschte Ergebnis: int a=5, b=7; double erg = (double)a/b; Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 50 Proinformatik: Objektorientierte Programmierung Freie Universität Berlin Vielen Dank fürs aufmerksame Zuhören. Gibt es Fragen? Ansonsten geht es mit dem praktischen Übungsteil nach der Mittagspause weiter. Sommersemester 2011 Prof. Dr. Marco Block-Berlitz (Mediadesign Hochschule in Berlin) 51