Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration CoMa-Übung III TU Berlin 30.10.2013 CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 1 / 31 Themen der Übung 1 Primitive Datentypen 2 Programmeingaben 3 Fallunterscheidungen 4 Schleifen 5 Branching 6 Methodendeklaration CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 2 / 31 Variablen und Zuweisungen in Java Variablen Variablen haben in Java eine 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 vom 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 III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 3 / 31 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 III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 4 / 31 Operatoren Arithmetische 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 III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 5 / 31 Operatoren Einstellige Operatoren Einstelliger Plus-Operator: +; definiert positiven Wert Einstelliger Minus-Operator: −; definiert negativen Wert Inkrement: ++ erhöht einen Wert um 1 Dekrement: −− vermindert einen Wert um 1 Achtung: Es macht einen Unterschied, ob ++ bzw. −− vor oder nach einem Ausdruck steht! Zusammengesetzte Zuweisung Statt a = a + b; kann man auch a += b; schreiben Entsprechendes gilt für die anderen Operatoren CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 6 / 31 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. Da man nur endliche Zahldarstellungen speichern kann, muss man mit numerischen Fehlern rechnen. Insbesondere spielt hier die Zahldarstellung eine Rolle. 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 CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 7 / 31 Stolperfallen beim Rechnen Beispiele: double d = 1.0; int i = 1; long ell = 1; d = i; ell = i; → geht i = ell; → Fehler CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 8 / 31 Zeichen Zeichen in Java Zeichen werden in Java als 16-bit Unicode-Charaktere dargestellt Primitiver Datentyp char – Zahl zwischen 0 und 65535 Klasse Character – Kann ein Zeichen darstellen und bietet nützliche Methoden für den Umgang mit Zeichen Automatische Umwandlung zwischen char und Character Zeichen-Konstanten werden durch einfache Anführungszeichen ausgewiesen: z.B. ’a’ CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 9 / 31 Zeichenketten Zeichenketten in Java Die Klasse String stellt nicht-veränderbare Zeichenketten dar Zeichen-Konstanten werden durch doppelte Anführungszeichen ausgewiesen: z.B. "Hello" Der Konkatenations-Operator + hängt zwei Strings aneinander "Hello" + "World" und erzeugt einen neuen String "HelloWorld" Bekommt der Konkatenations-Operator einen String und etwas anderes, wird das andere in eine String-Darstellung umgewandelt Nützliche Methoden der Klasse String s.length(): gibt die Anzahl Zeichen in s zurück s.charAt(int i): gibt das Zeichen an Position i in s zurück. Das erste Zeichen ist bei 0, das letzte bei s.length()-1. s.equals(String t): sind s und t gleich? (==,!= funktionieren hier nicht, da wir es nicht mit primitiven Datentypen zu tun haben). CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 10 / 31 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 III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 11 / 31 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 III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 12 / 31 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 III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 13 / 31 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 III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 14 / 31 Der Bedingungsoperator und switch Der Bedingungsoperator ?: Zuweisung abhängig von einer Bedingung maximum = (a > b)? a : b; Kurzform für: if (a > b) maximum = a; else maximum = b; Der switch-Befehl Für Fallunterscheidungen von Ganzzahlen, Zeichen, Zeichenketten oder Aufzählungstypen mit vielen Fällen switch (month) { case 1: System.out.println("Januar"); break; case 2: System.out.println("Februar"); break; default: System.out.println("Kein anderer Fall passt."); } Ohne das break; würden ab dem ersten passenden Fall alle Fälle ausgeführt Nur Konstanten als Fälle möglich CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 15 / 31 Beispiel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import j a v a . u t i l . Scanner ; p u b l i c c l a s s Switch { 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 c a n n e r s c a n n e r = new S c a n n e r ( System . i n ) ; double x = scanner . nextDouble () ; char operator = scanner . next () . charAt (0) ; double y = scanner . nextDouble () ; switch ( operator ) { c a s e ’+ ’ : System . o u t . p r i n t l n ( x + y ) ; break ; c a s e ’− ’ : System . o u t . p r i n t l n ( x − y ) ; break ; case ’ ∗ ’ : System . o u t . p r i n t l n ( x ∗ y ) ; break ; case ’ / ’ : System . o u t . p r i n t l n ( x / y ) ; break ; } } } CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 16 / 31 Schleifen while-Schleifen Wiederholen einer oder mehrerer Anweisungen, solange eine Bedingung erfüllt ist. Die Bedingung ist ein boolean Ist die Bedingung beim ersten Erreichen der Schleife nicht erfüllt, werden die Anweisungen nie ausgeführt Bleibt die Bedingung erfüllt, werden die Anweisungen potentiell unendlich oft ausgeführt → Vorsicht! 1 2 3 4 1 2 3 4 5 int i = 1; w h i l e ( i <= 1 0 ) { System . o u t . p r i n t l n ( i ∗ i ) ; } int i = 1; w h i l e ( i <= 1 0 ) { System . o u t . p r i n t l n ( i ∗ i ) ; i = i + 1; } CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 17 / 31 Schleifen (2) do-while-Schleifen Wiederholen eine oder mehrere Anweisungen, solange eine Bedingung erfüllt ist. Die Bedingung ist ein boolean Die Anweisungen in der Schleife werden mindestens einmal ausgeführt Bleibt die Bedingung erfüllt, werden die Anweisungen potentiell unendlich oft ausgeführt → Vorsicht! 1 2 3 4 1 2 3 4 5 int i = 1; do { System . o u t . p r i n t l n ( i ∗ i ) ; } w h i l e ( i <= 1 0 ) ; int i = 1; do { System . o u t . p r i n t l n ( i ∗ i ) ; i = i + 1; } w h i l e ( i <= 1 0 ) ; CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 18 / 31 Schleifen (3) for-Schleifen Spezielle Variante von while-Schleifen, in denen gezählt werden soll Bestehen aus einer Initialisierung, einer Bedingung und einer Aktualisierung des Zählers 1 2 3 1 2 3 1 2 3 4 5 f o r ( I n i t i a l i s i e r u n g ; Bedingung ; A k t u a l i s i e r u n g ) { ... } for ( int ... } i =1; i <=n ; i=i +1) { i n t i =1; w h i l e ( i <=n ) { ... i=i +1; } CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 19 / 31 Beispiel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import j a v a . u t i l . Scanner ; public class Calculator { 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 c a n n e r s c a n n e r = new S c a n n e r ( System . i n ) ; double x = scanner . nextDouble () ; boolean stop = f a l s e ; while (! stop ) { char operator = scanner . next () . charAt (0) ; double y = scanner . nextDouble () ; switch ( operator ) { c a s e ’+ ’ : x = x + y ; b r e a k ; c a s e ’− ’ : x = x − y ; b r e a k ; case ’ ∗ ’ : x = x ∗ y ; break ; case ’ / ’ : x = x / y ; break ; default : stop = true ; } System . o u t . p r i n t ( ” = ” + x ) ; } } } CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 20 / 31 Branching break Kommt auch in switch-Ausdrücken vor Zum sofortigen Verlassen von for, while oder do-while Schleifen Die (nicht-gelabelte) Version beendet immer den innersten Ausdruck. Es gibt auch eine Version mit Label um bei geschachtelten Ausdrücken festzulegen, welcher beendet werden soll continue Sorgt dafür, dass der Rest des aktuellen for, while oder do-while Schleifendruchlaufs übersprungen wird und direkt die Abbruchbedingung der Schleife überprüft wird. Gibt es auch mit Label. return Verlassen einer Methode und (falls vorhanden) Rückgabewert CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 21 / 31 Methoden Grundlagen Methoden sind Javas Konzept von Algorithmen. Methoden haben festgelegte Eingaben und Ausgaben, sowie eine Folge von Befehlen, die aus der Eingabe die Ausgabe erzeugen. Methoden gehören in Java immer zu einer Klasse oder einem Objekt. Diese Klasse bzw. dieses Objekt wird dann Eigentümer der Methode genannt. Math.min(int a, int b) Algorithmus, der das Minimum zweier Werte zurückgibt. Eingabe: zwei int-Werte. Ausgabe: der Minimum der beiden int-Werte. Gehört zu der Klasse Math. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 22 / 31 Vorteile von Methoden Vorteil 1: Übersicht Die Benutzung von Methoden teilt Programme in viele kleine Algorithmen auf. Gibt dem Programm eine Struktur. Kleinere Algorithmen sind leichter verständlich. Vorteil 2: Wiederverwendbarkeit Methoden können vom ganzen Programm verwendet werden Jeder Algorithmus muss nur einmal geschrieben werden Spart Arbeit Macht nachträgliche Änderungen leichter Vermeidet unnötige Code-Wiederholungen. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 23 / 31 Deklaration von Methoden Bestandteile einer Methode Methoden bestehen aus zwei Teilen, dem Methodenkopf und dem Methodenrumpf. Der Methodenkopf besteht aus Modifizieren, einem Rückgabetyp, dem Methodennamen, und einer Parameterliste. Der Methodenrumpf besteht aus den Anweisungen der Methode. Signatur einer Methode Unter der Signatur einer Methode versteht man ihren Methodennamen und die Typen ihrer Parameterliste. Modifikatoren, der Rückgabetyp und der Methodenrumpf gehören nicht dazu. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 24 / 31 Bestandteile einer Methode – Beispiel 1 Erinnerung: Die Signatur einer Methode besteht aus ihrem Namen und der Liste der Typen ihrer Parameter. Beispiel 1 2 3 p u b l i c s t a t i c l o n g sum ( l o n g a , l o n g b ) { return a + b ; } Methodenkopf: I I I I Modifizierer: public und static Rückgabetyp: long Methodenname: sum Parameterliste: long a, long b Methodenrumpf: I Besteht nur aus der Anweisung return a + b; Die Signatur der Methode ist sum(long,long) – der Methodenname ist sum und die Methode hat zwei Parameter, beide vom Typ long. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 25 / 31 Rückgaben in Methoden return Der Befehl return; beendet die Ausführung einer Methode und gibt nichts zurück. Der Befehl return a; beendet die Ausführung einer Methode und gibt a an den Aufrufer zurück. return und der Rückgabetyp Der Befehl return; darf nur in Methoden benutzt werden, deren Rückgabetyp void ist. Der Befehl return a; darf nur in Methoden benutzt werden, deren Rückgabetyp nicht void ist; außerdem muss der Typ von a zu dem Rückgabetyp der Methode passen. Hat eine Methode einen Rückgabetyp, der nicht void ist, muss die Methode mit einem return-Befehl enden, der einen passenden Typ zurückgibt. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 26 / 31 Klassenmethoden Methoden in Java können zwei Arten von Eigentümern haben: Klassen und Objekte. Demetsprechend lassen sie sich in zwei Kategorien aufteilen: Klassenmethoden und Objektmethoden. Klassenmethoden Werden durch den Modifizierer static in der Methoden-Deklaration gekennzeichnet (ohne static Objektmethode). Beispiel: public static void main(String[] args) Arbeiten nur mit Klassen und brauchen keine Objekte. Werden üblicherweise in der Form Klassenname.Methodenname(Parameterliste) aufgerufen. Objektmethoden hingegen müssen an einem Objekt aufgerufen werden. Wir arbeiten zunächst nur mit Klassenmethoden. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 27 / 31 Bestandteile einer Methode – Beispiel 2 Erinnerung: Die Signatur einer Methode besteht aus ihrem Namen und der Liste der Typen ihrer Parameter. Beispiel 1 2 3 Character f i r s t C h a r ( String s t r ) { return s t r . charAt (0) ; } Methodenkopf: I I I I Modifizierer: keiner Rückgabetyp: Character Methodenname: firstChar Parameterliste: String str Methodenrumpf: I Besteht nur aus der Anweisung return str.charAt(0); Die Signatur der Methode ist firstChar(String) – der Methodenname ist firstChar und die Methode hat einen Parameter vom Typ String. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 28 / 31 Namen und Typen Namenskonvention für Methoden Methodennamen werden mit einem Kleinbuchstaben begonnen. Methodennamen fangen üblicherweise mit einem Verb an. Methoden dürfen nicht wie Schlüsselwörter heißen – class, int, double, ... sind also tabu. Methode heißt wie Schlüsselwort → Fehler beim Kompilieren. Parameter- und Rückgabetypen Typen für Parameter können sein: I I jeder primitive Datentyp (boolean, byte, char, ...), jeder Referenztyp (Character, String, ...), Der Rückgabetyp kann sein: I I jeder für Parameter erlaubte Typ, der spezielle Rückgabetyp void, falls nichts zurückgeben wird. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 29 / 31 Parameter und Signatur Parameter Wie Variablen in der Form Datentyp parametername deklariert. Jeder Parameter muss einen Typ haben. → Kurzform double a,b ist nicht erlaubt! Mehrere Parameter werden durch , getrennt. Methode mit leerer Parameterliste → die Liste besteht nur aus (). Parameter werden wie Variablen benutzt in der Methode. Signatur Der Kompiler sucht Methoden anhand ihrer Signatur in den Methoden des Eigentümers. → Jede Methode eines Eigentümers muss eine eindeutige Signatur haben! → Kompiler-Fehler sonst. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 30 / 31 Bestandteile einer Methode – Beispiel 3 Erinnerung: Die Signatur einer Methode besteht aus ihrem Namen und der Liste der Typen ihrer Parameter. Beispiel 1 2 3 public void h e l l o () { System . o u t . p r i n t l n ( ” H e l l o ” ) ; } Methodenkopf: I I I I Modifizierer: public Rückgabetyp: void Methodenname: hello Parameterliste: keine Parameter Methodenrumpf: I Besteht nur aus der Anweisung System.out.println("Hello"); Die Signatur der Methode ist hello() – der Methodenname ist hello und die Methode hat keine Parameter. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 31 / 31 Deklaration von Methoden – Zusammenfassung Deklaration von Methoden Eine Methodendeklaration hat in Java folgenden Aufbau: Modifizieren, gefolgt von genau einem Rückgabetyp, dem Methodennamen, einer (möglicherweise leeren) Liste von Parametern, I I die in runde Klammern ( ) eingeschlossen ist, deren Parameter durch , getrennt sind, und dem Methodenrumpf, I der in geschweifte Klammern { } eingeschlossen ist. Diese Bestandteile müssen in genau dieser Reihenfolge erscheinen. Signatur einer Methode Die Signatur einer Methode besteht aus ihrem Namen und der Liste der Typen ihrer Parameter. CoMa-Übung III (TU Berlin) Primitive Datentypen, Eingaben, Kontrollstrukturen und Methodendeklaration 30.10.2013 32 / 31