Java CoMa-Übung II TU Berlin 24.10.2012 CoMa-Übung II (TU Berlin) Java 24.10.2012 1 / 28 Themen der Übung 1 Java-Installation 2 Hello World 3 Temperature CoMa-Übung II (TU Berlin) Java 24.10.2012 2 / 28 Java installieren Installation Java SE Development Kit 7u9 herunterladen (http://www.oracle.com/technetwork/java/javase/ downloads/jdk7u9-downloads-1859576.html) Installieren (hier am Beispiel von Windows 7) Merkt euch, wohin ihr das JDK installiert! CoMa-Übung II (TU Berlin) Java 24.10.2012 3 / 28 Java installieren Installation (Fortsetzung) Nachdem das JDK installiert ist, wird nach einem Ordner für das Java Runtime Environment gefragt JDK = Java Programme entwickeln JRE = Java Programme ausführen Fertig! CoMa-Übung II (TU Berlin) Java 24.10.2012 4 / 28 Java installieren Test Kommandozeile aufrufen (Start → Nach cmd suchen → cmd starten) Benutzung: Befehl eingeben, mit Enter bestätigen java -version gibt die Version des installierten Java aus Wird der Befehl java nicht gefunden, obwohl die Installation geklappt hat, liegt Java vermutlich nicht im (Such-)Pfad http://www.java-forum.org/einfuehrungen-erste-schritte/ 94072-java-umgebungsvariable-einstellen-windows-7-a.html CoMa-Übung II (TU Berlin) Java 24.10.2012 5 / 28 Java-Programme schreiben Vom Programmierer zum Programm Text-Editor (NotePad++) Programmierer Java-Kompiler (javac) Text-Datei (.java) Java Virtual Machine Java-Bytecode (.class) Programm Programmierer nimmt einen beliebigen Text-Editor und legt eine neue .java-Datei an (z.B. HelloWorld.java) Ist die Datei fertig, kann die Text-Datei mit javac HelloWorld.java (Kommandozeile) in Java-Bytecode übersetzt werden Java-Bytecode kann auf allen Systemen ausgeführt werden, für die es eine Java Virtual Machine (JVM) gibt (java HelloWorld) JVM ist Teil des JREs, der Kompiler Teil des JDKs CoMa-Übung II (TU Berlin) Java 24.10.2012 6 / 28 Hello World Test Legt eine neue Textdatei HelloWorld.java an I I Groß- und Kleinschreibung beachten Passt auf, dass kein zusätzliches .txt an den Dateinamen angehängt wird Schreibt das Programm: 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( ” H e l l o World ! ” ) ; } 3 4 5 6 7 } Startet die Kommandozeile, navigiert in das Verzeichnis mit HelloWorld.java CoMa-Übung II (TU Berlin) Java 24.10.2012 7 / 28 Hello World (Fortsetzung) Test Kompiliert die Datei mittels javac HelloWorld.java Startet das Programm mittels java HelloWorld Wenn alles gut geht, sollte das Hello World! ausgegeben werden CoMa-Übung II (TU Berlin) Java 24.10.2012 8 / 28 Hello World – Wenn es nicht gut geht... Vergessenes Semikolon 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( ” H e l l o World ! ” ) } 3 4 5 6 7 } HelloWorld.java:4: error: ’;’ expected Gibt eine Fehlermeldung in der Kommandozeile Sagt euch die Art des Fehlers und wo dem Kompiler der Fehler aufgefallen ist CoMa-Übung II (TU Berlin) Java 24.10.2012 9 / 28 Hello World – Wenn es nicht gut geht... Vergessene Anführungszeichen 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( H e l l o World ! ) ; } 3 4 5 6 7 } Der Kompiler versucht Hello World! als Java-Befehl zu übersetzen Geht schief, produziert ”komische” Fehlermeldungen Mensch ist bei der Interpretation der Fehler gefragt CoMa-Übung II (TU Berlin) Java 24.10.2012 10 / 28 Hello World – Wenn es nicht gut geht... Falsche Klammern 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n [ ” H e l l o World ! ” ] ; } 3 4 5 6 7 } Viele Symbole in Java haben eine Bedeutung Benutzt ihr die falschen, kommt der Kompiler durcheinander In der Regel wird nicht erkannt, was ihr eigentlich wolltet Ergebnis: ”komische” Fehler CoMa-Übung II (TU Berlin) Java 24.10.2012 11 / 28 Hello World – Wenn es nicht gut geht... Groß- und Kleinschreibung, Rechtschreibung 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { s y s t e m . o u t . p r i n t l n ( ” H e l l o World ! ” ) ; } 3 4 5 6 7 } Groß- und Kleinschreibung, Rechtschreibung sehr wichtig Ein falscher Buchstabe und der Kompiler versteht euch nicht Ergebnis: Der Kompiler beschwert sich, dass er etwas nicht kennt CoMa-Übung II (TU Berlin) Java 24.10.2012 12 / 28 Hello World – Wenn es nicht gut geht... Klassen- und Dateinamen 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( ” H e l l o World ! ” ) ; } 3 4 5 6 7 } Eine Datei mit einer Klasse namens HelloWorld muss HelloWorld.java genannt werden Sonst gibt es einen Fehler beim Kompilieren CoMa-Übung II (TU Berlin) Java 24.10.2012 13 / 28 Java – Konzepte Konzepte Java ist eine objekt-orientierte Programmiersprache Man fängt mit sehr einfachen Datentypen (z.B. Zahlen) an und baut daraus komplexere Strukturen (Klassen/Objekte) Aus diesen Strukturen baut man dann noch komplexere Strukturen, etc. CoMa-Übung II (TU Berlin) Java 24.10.2012 14 / 28 Java – Konzepte Konzepte Java ist eine objekt-orientierte Programmiersprache Man fängt mit sehr einfachen Datentypen (z.B. Zahlen) an und baut daraus komplexere Strukturen (Klassen/Objekte) Aus diesen Strukturen baut man dann noch komplexere Strukturen, etc. Klassenbibliotheken Wenn jeder bei Null anfangen würde, wäre das sehr ineffizient Es gibt große Bibliotheken voller vorgefertigter Strukturen (die ihr auch als Teil des JDKs bekommen habt) Werden wir nach und nach einführen CoMa-Übung II (TU Berlin) Java 24.10.2012 14 / 28 Die anderen Bestandteile von Hello World 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( ” H e l l o World ! ” ) ; } 3 4 5 6 7 } class Sagt, dass ihr jetzt eine neue Klasse (= eine der erwähnten komplexeren Strukturen) definieren wollt Sichtbarkeitsmodifikatoren: public, private Schlüsselwörter wie public und private bestimmen, welche Teile eurer Klassen von außen sichtbar sind Bsp.: In einem Handy wäre das Display public (da von außen sichtbar), der Prozessor aber nicht. CoMa-Übung II (TU Berlin) Java 24.10.2012 15 / 28 Die anderen Bestandteile von Hello World 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( ” H e l l o World ! ” ) ; } 3 4 5 6 7 } class Sagt, dass ihr jetzt eine neue Klasse (= eine der erwähnten komplexeren Strukturen) definieren wollt Sichtbarkeitsmodifikatoren: public, private Schlüsselwörter wie public und private bestimmen, welche Teile eurer Klassen von außen sichtbar sind Bsp.: In einem Handy wäre das Display public (da von außen sichtbar), der Prozessor aber nicht. CoMa-Übung II (TU Berlin) Java 24.10.2012 16 / 28 Die anderen Bestandteile von Hello World 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( ” H e l l o World ! ” ) ; } 3 4 5 6 7 } public static void main(String[] args) Definiert die Einstiegsmethode für ein Programm, damit Java weiß wo das Programm anfängt System.out.println() Ruft die Methode println() der Variable out der Klasse System auf Gibt etwas in der Kommandozeile aus CoMa-Übung II (TU Berlin) Java 24.10.2012 17 / 28 Hello World – Zusammenfassung 1 p u b l i c c l a s s HelloWorld { 2 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { System . o u t . p r i n t l n ( ” H e l l o World ! ” ) ; } 3 4 5 6 7 } Was ihr von dem Programm mitnehmen solltet: System.out.println(x) gibt x auf der Kommandozeile aus und beginnt eine neue Zeile x kann dabei eine Zahl, eine Zeichenkette oder ein beliebiges komplexeres Objekt sein Ihr kennt jetzt ein Grundgerüst, um ein ausführbares Java-Programm zu erstellen CoMa-Übung II (TU Berlin) Java 24.10.2012 18 / 28 Variablen und Zuweisungen in Java Variablen Variablen haben in Java ein Typ, der festlegt, welche Werte eine Variable annehmen kann (vgl. n ∈ N). Der Datentyp einer Variablen muss bei ihrer Deklaration festgelegt werden und kann danach nicht mehr geändert werden. Datentyp variablenName; deklariert eine Variable von Typ Datentyp die variablenName heißt. Datentyp variablenName1, variablenName2; für mehrere Variablen des gleichen Typs. Bevor eine Variable vom Programm benutzt werden kann, muss ihr ein Wert zugewiesen werden. Zuweisungen Der Operator für Zuweisungen in Java ist =. Eine Zuweisung hat somit die Form a = b;. b muss zu dem Typ von a passen. CoMa-Übung II (TU Berlin) Java 24.10.2012 19 / 28 (Primitive) Datentypen Datentypen für Zahlen z ∈ Z byte: −128 = −27 ≤ z ≤ 27 − 1 = 127 short: −32.768 = −215 ≤ z ≤ 215 − 1 = 32.767 int: −2.147.483.648 = −231 ≤ z ≤ 231 − 1 = 2.147.483.647 long: −9 · 1018 ≈ −263 ≤ z ≤ 263 − 1 ≈ 9 · 1018 Datentypen für Zahlen z ∈ Q float: 32-bit Gleitkommazahl (≈ ±3.7 · 1038 ) double: 64-bit Gleitkommazahl (≈ ±1.8 · 10308 ) Sehr großer Wertebereich, aber Zahlen werden nur approximiert Rundungsfehler (→ Numerik) Andere primitive Datentypen boolean: true/false, char: 16-bit Unicode-Zeichen CoMa-Übung II (TU Berlin) Java 24.10.2012 20 / 28 Operatoren Operatoren Addition: +, Subtraktion: −, Multiplikation ∗ Division: / (wenn einer der beiden Operanden keine Ganzzahl ist) Ganzzahlige Division: / (wenn beide Operanden Ganzzahlen sind) Darum: 9/5 = 1, aber 9.0/5 = 1.8 Es gelten die üblichen Präzedenzregeln: Klammern vor ∗, / vor +, − Die Klasse Math Stellt grundlegende mathematische Funktionen zur Verfügung Math.round(x) gibt für einen double-Wert x den am nächsten liegenden long-Wert zur̈uck; gibt es zwei Kandidaten, wird aufgerundet. CoMa-Übung II (TU Berlin) Java 24.10.2012 21 / 28 Stolperfallen beim Rechnen Beachtet: Die Datentypen für Zahlen können nur Zahlen einer bestimmten Größe darstellen. Verlässt man bei einer Rechnung diesen Bereich, wird das Ergebnis falsch. Java erlaubt Zuweisungen der Form a = b; nur, wenn der Datentyp von b zu dem von a passt. Das ist unter anderem dann der Fall, wenn I I I a und b den gleichen Datentyp haben a ein Zahlen-Datentyp ist, der einen größeren Zahlenbereich als b darstellen kann a ein Gleitkomma-Datentyp ist und b ein Ganzzahl-Datentyp ist Beispiele: double d = 1.0; int i = 1; long ell = 1; d = i; ell = i; → geht i = ell; → Fehler CoMa-Übung II (TU Berlin) Java 24.10.2012 22 / 28 Benutzereingaben einlesen Die Klasse Scanner Die Klasse Scanner liest Text von der Kommandozeile oder einer Datei ein und zerlegt sie in Einheiten (Token) Standard der Klasse ist, den gelesenen Text bei Leerzeichen zu zerlegen, d.h. jedes Wort wird ein Token "Hello World!" würde also zu "Hello" und "World!" zerlegt Scanner scan = new Scanner(System.in); erzeugt eine Variable namens scan vom Typ Scanner, welche ein neues Scanner-Objekt zugewiesen bekommt, dass die Kommandozeilen-Eingabe ausliest (System.in) Lesen eines Token nextDouble(), nextInt(), nextLong(), ... lesen das nächste Token und wandeln es in einen double, int, long, etc. um (sofern möglich) CoMa-Übung II (TU Berlin) Java 24.10.2012 23 / 28 Benutzereingaben einlesen (2) Funktionsweise Benutzer-Eingabe kann mehrere Token enthalten; können mit mehreren next-Aufrufen nacheinander abgearbeitet werden Sind keine Token mehr verfügbar und wird eine next-Methode aufgerufen, wartet das Programm auf eine Benutzer-Eingabe (d.h. eine mit Enter bestätigte Zeichenkette) Je nach der Umgebung, in der die Scanner-Klasse sich befindet, erwartet die Klasse ein . (Englisch) oder ein , (Deutsch) in Gleitkommazahlen Kann eine Benutzer-Eingabe nicht wie gewünscht als Zahl interpretiert werden, gibt es eine Fehlermeldung CoMa-Übung II (TU Berlin) Java 24.10.2012 24 / 28 Temperature 1 import j a v a . u t i l . S c a n n e r ; 2 3 4 5 6 7 8 9 10 11 12 13 14 p u b l i c c l a s s Temperature { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { double f a h r e n h e i t , c e l s i u s ; S c a n n e r s c a n = new S c a n n e r ( System . i n ) ; System . o u t . p r i n t l n ( ” Geben S i e e i n e Te mp er at ur i n F a h r e n h e i t e i n und d r u e c k e n S i e r e t u r n ” ) ; f a h r e n h e i t = scan . nextDouble () ; c e l s i u s = 5.0 / 9 ∗ ( f a h r e n h e i t − 32) ; c e l s i u s = Math . r o u n d ( c e l s i u s ∗ 1 0 0 ) ; c e l s i u s = c e l s i u s / 100.0; System . o u t . p r i n t l n ( f a h r e n h e i t + ” Grad F a h r e n h e i t e n s t p r e c h e n ” + c e l s i u s + ” Grad C e l s i u s . ” ) ; } } CoMa-Übung II (TU Berlin) Java 24.10.2012 25 / 28 Temperature – Zusammenfassung Was ihr von dem Programm mitnehmen solltet: Variablen deklarieren Grundlegende Datentypen Zuweisungen vornehmen Arithmetische Operatoren Einfaches Rechnen mit Java Runden mit Math.round Eingaben aus der Kommandozeile auslesen mit Scanner CoMa-Übung II (TU Berlin) Java 24.10.2012 26 / 28 HAs und PAs Hausaufgaben Members-Datei anlegen (→ wichtig für euren Mumie-Zugriff und für euren CoMa-Schein) Streichholz-Spiel – Algorithmisches Denken I I I I Zum Spielbeginn liegen 18 Streichhölzer auf dem Tisch Spieler nehmen abwechselnd 1-3 Hölzer Wer das letzte Holz nimmt, hat verloren Kann der anfangende Spieler immer gewinnen? Was passiert, wenn es nicht 18 Hölzer zu Beginn sind? Linux, Taschenrechner und Suche nach dem größten Wert, für die die Fakultätsfunktion berechnet werden kann Programmieraufgaben Temperature.java so modifizieren, dass ein Strompreisrechner daraus wird CoMa-Übung II (TU Berlin) Java 24.10.2012 27 / 28 Temperature 1 import j a v a . u t i l . S c a n n e r ; 2 3 4 5 6 7 8 9 10 11 12 13 14 p u b l i c c l a s s Temperature { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { double f a h r e n h e i t , c e l s i u s ; S c a n n e r s c a n = new S c a n n e r ( System . i n ) ; System . o u t . p r i n t l n ( ” Geben S i e e i n e Te mp er at ur i n F a h r e n h e i t e i n und d r u e c k e n S i e r e t u r n ” ) ; f a h r e n h e i t = scan . nextDouble () ; c e l s i u s = 5.0 / 9 ∗ ( f a h r e n h e i t − 32) ; c e l s i u s = Math . r o u n d ( c e l s i u s ∗ 1 0 0 ) ; c e l s i u s = c e l s i u s / 100.0; System . o u t . p r i n t l n ( f a h r e n h e i t + ” Grad F a h r e n h e i t e n s t p r e c h e n ” + c e l s i u s + ” Grad C e l s i u s . ” ) ; } } fahrenheit – Jahresstromverbrauch, celsius – Preis Formeln, Namen, Kommentare und Ausgaben anpassen für PA 1 CoMa-Übung II (TU Berlin) Java 24.10.2012 28 / 28