Themen der Übung Java CoMa-Übung II TU Berlin 1 Java-Installation 2 Hello World 3 Temperature 24.10.2012 CoMa-Übung II (TU Berlin) Java 24.10.2012 1 / 28 CoMa-Übung II (TU Berlin) Java installieren Java installieren Installation Installation (Fortsetzung) Java SE Development Kit 7u9 herunterladen (http://www.oracle.com/technetwork/java/javase/ downloads/jdk7u9-downloads-1859576.html) Java 24.10.2012 2 / 28 Nachdem das JDK installiert ist, wird nach einem Ordner für das Java Runtime Environment gefragt Installieren (hier am Beispiel von Windows 7) JDK = Java Programme entwickeln JRE = Java Programme ausführen Merkt euch, wohin ihr das JDK installiert! CoMa-Übung II (TU Berlin) Java Fertig! 24.10.2012 3 / 28 CoMa-Übung II (TU Berlin) Java 24.10.2012 4 / 28 Java installieren Java-Programme schreiben Test Vom Programmierer zum Programm Kommandozeile aufrufen (Start → Nach cmd suchen → cmd starten) Text-Editor (NotePad++) Java-Kompiler (javac) Benutzung: Befehl eingeben, mit Enter bestätigen java -version gibt die Version des installierten Java aus Programmierer 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 Wird der Befehl java nicht gefunden, obwohl die Installation geklappt hat, liegt Java vermutlich nicht im (Such-)Pfad Java-Bytecode kann auf allen Systemen ausgeführt werden, für die es eine Java Virtual Machine (JVM) gibt (java HelloWorld) 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 JVM ist Teil des JREs, der Kompiler Teil des JDKs 5 / 28 CoMa-Übung II (TU Berlin) Hello World Hello World (Fortsetzung) Test Test I 24.10.2012 6 / 28 Kompiliert die Datei mittels javac HelloWorld.java Legt eine neue Textdatei HelloWorld.java an I Java Groß- und Kleinschreibung beachten Passt auf, dass kein zusätzliches .txt an den Dateinamen angehängt wird Startet das Programm mittels java HelloWorld Wenn alles gut geht, sollte das Hello World! ausgegeben werden 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 CoMa-Übung II (TU Berlin) Java 24.10.2012 8 / 28 1 Hello World – Wenn es nicht gut geht... Hello World – Wenn es nicht gut geht... Vergessenes Semikolon Vergessene Anführungszeichen 1 p u b l i c c l a s s HelloWorld { 2 4 5 4 5 6 6 7 } HelloWorld.java:4: error: Der Kompiler versucht Hello World! als Java-Befehl zu übersetzen ’;’ expected Geht schief, produziert ”komische” Fehlermeldungen Sagt euch die Art des Fehlers und wo dem Kompiler der Fehler aufgefallen ist Mensch ist bei der Interpretation der Fehler gefragt Java 24.10.2012 9 / 28 CoMa-Übung II (TU Berlin) Falsche Klammern 1 2 p u b l i c c l a s s HelloWorld { 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 10 / 28 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 ! ” ] ; } 5 24.10.2012 Groß- und Kleinschreibung, Rechtschreibung p u b l i c c l a s s HelloWorld { 4 Java Hello World – Wenn es nicht gut geht... Hello World – Wenn es nicht gut geht... 3 } Gibt eine Fehlermeldung in der Kommandozeile CoMa-Übung II (TU Berlin) 1 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 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 7 p u b l i c c l a s s HelloWorld { 2 6 } 7 Viele Symbole in Java haben eine Bedeutung Groß- und Kleinschreibung, Rechtschreibung sehr wichtig Benutzt ihr die falschen, kommt der Kompiler durcheinander Ein falscher Buchstabe und der Kompiler versteht euch nicht In der Regel wird nicht erkannt, was ihr eigentlich wolltet Ergebnis: Der Kompiler beschwert sich, dass er etwas nicht kennt Ergebnis: ”komische” Fehler CoMa-Übung II (TU Berlin) Java 24.10.2012 } 11 / 28 CoMa-Übung II (TU Berlin) Java 24.10.2012 12 / 28 Hello World – Wenn es nicht gut geht... Java – Konzepte Klassen- und Dateinamen 1 Konzepte p u b l i c c l a s s HelloWorld { Java ist eine objekt-orientierte Programmiersprache 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 Man fängt mit sehr einfachen Datentypen (z.B. Zahlen) an und baut daraus komplexere Strukturen (Klassen/Objekte) 6 7 Aus diesen Strukturen baut man dann noch komplexere Strukturen, etc. } Eine Datei mit einer Klasse namens HelloWorld muss HelloWorld.java genannt werden Klassenbibliotheken Sonst gibt es einen Fehler beim Kompilieren 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 13 / 28 CoMa-Übung II (TU Berlin) Die anderen Bestandteile von Hello World 1 24.10.2012 14 / 28 Die anderen Bestandteile von Hello World p u b l i c c l a s s HelloWorld { 1 p u b l i c c l a s s HelloWorld { 2 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 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 Java 6 } 7 class } class Sagt, dass ihr jetzt eine neue Klasse (= eine der erwähnten komplexeren Strukturen) definieren wollt Sagt, dass ihr jetzt eine neue Klasse (= eine der erwähnten komplexeren Strukturen) definieren wollt Sichtbarkeitsmodifikatoren: public, private Sichtbarkeitsmodifikatoren: public, private Schlüsselwörter wie public und private bestimmen, welche Teile eurer Klassen von außen sichtbar sind 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. 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 CoMa-Übung II (TU Berlin) Java 24.10.2012 16 / 28 Die anderen Bestandteile von Hello World 1 Hello World – Zusammenfassung p u b l i c c l a s s HelloWorld { 1 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 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 p u b l i c c l a s s HelloWorld { 2 6 } 7 Was ihr von dem Programm mitnehmen solltet: public static void main(String[] args) Definiert die Einstiegsmethode für ein Programm, damit Java weiß wo das Programm anfängt 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 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 Ihr kennt jetzt ein Grundgerüst, um ein ausführbares Java-Programm zu erstellen CoMa-Übung II (TU Berlin) Variablen und Zuweisungen in Java (Primitive) Datentypen Variablen Datentypen für Zahlen z ∈ Z Java 24.10.2012 Variablen haben in Java ein Typ, der festlegt, welche Werte eine Variable annehmen kann (vgl. n ∈ N). byte: −128 = −27 ≤ z ≤ 27 − 1 = 127 Der Datentyp einer Variablen muss bei ihrer Deklaration festgelegt werden und kann danach nicht mehr geändert werden. int: −2.147.483.648 = −231 ≤ z ≤ 231 − 1 = 2.147.483.647 18 / 28 short: −32.768 = −215 ≤ z ≤ 215 − 1 = 32.767 long: −9 · 1018 ≈ −263 ≤ z ≤ 263 − 1 ≈ 9 · 1018 Datentyp variablenName; deklariert eine Variable von Typ Datentyp die variablenName heißt. Datentypen für Zahlen z ∈ Q Datentyp variablenName1, variablenName2; für mehrere Variablen des gleichen Typs. float: 32-bit Gleitkommazahl (≈ ±3.7 · 1038 ) Bevor eine Variable vom Programm benutzt werden kann, muss ihr ein Wert zugewiesen werden. Sehr großer Wertebereich, aber Zahlen werden nur approximiert double: 64-bit Gleitkommazahl (≈ ±1.8 · 10308 ) Rundungsfehler (→ Numerik) Zuweisungen Andere primitive Datentypen 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 boolean: true/false, char: 16-bit Unicode-Zeichen 19 / 28 CoMa-Übung II (TU Berlin) Java 24.10.2012 20 / 28 Operatoren Stolperfallen beim Rechnen Beachtet: Operatoren 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 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 I Es gelten die üblichen Präzedenzregeln: Klammern vor ∗, / vor +, − Die Klasse Math 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 Stellt grundlegende mathematische Funktionen zur Verfügung Beispiele: 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. 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 21 / 28 CoMa-Übung II (TU Berlin) Java Benutzereingaben einlesen Benutzereingaben einlesen (2) Die Klasse Scanner Funktionsweise 24.10.2012 Die Klasse Scanner liest Text von der Kommandozeile oder einer Datei ein und zerlegt sie in Einheiten (Token) Benutzer-Eingabe kann mehrere Token enthalten; können mit mehreren next-Aufrufen nacheinander abgearbeitet werden Standard der Klasse ist, den gelesenen Text bei Leerzeichen zu zerlegen, d.h. jedes Wort wird ein Token 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) "Hello World!" würde also zu "Hello" und "World!" zerlegt 22 / 28 Je nach der Umgebung, in der die Scanner-Klasse sich befindet, erwartet die Klasse ein . (Englisch) oder ein , (Deutsch) in Gleitkommazahlen 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) Kann eine Benutzer-Eingabe nicht wie gewünscht als Zahl interpretiert werden, gibt es eine Fehlermeldung 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 CoMa-Übung II (TU Berlin) Java 24.10.2012 24 / 28 Temperature 1 Temperature – Zusammenfassung 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 Was ihr von dem Programm mitnehmen solltet: 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 ) { d ou bl e 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 m p e r a t u r 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 Variablen deklarieren Grundlegende Datentypen Zuweisungen vornehmen Arithmetische Operatoren Einfaches Rechnen mit Java Runden mit Math.round Eingaben aus der Kommandozeile auslesen mit Scanner 25 / 28 CoMa-Übung II (TU Berlin) 1 Hausaufgaben 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 3 4 5 6 7 8 9 10 11 12 13 14 Programmieraufgaben Temperature.java so modifizieren, dass ein Strompreisrechner daraus wird CoMa-Übung II (TU Berlin) 26 / 28 import j a v a . u t i l . S c a n n e r ; 2 Members-Datei anlegen (→ wichtig für euren Mumie-Zugriff und für euren CoMa-Schein) Streichholz-Spiel – Algorithmisches Denken I 24.10.2012 Temperature HAs und PAs I Java Java 24.10.2012 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 T e m p er a t u r 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 27 / 28 CoMa-Übung II (TU Berlin) Java 24.10.2012 28 / 28