2. Einfache Java-Programme Grundlagen der Programmierung 1 (Java) Fachhochschule Darmstadt Haardtring 100 D-64295 Darmstadt Prof. Dr. Bernhard Humm FH Darmstadt, 4. Oktober 2005 Agenda Agenda Grundstruktur Grundstruktur Datentypen Methoden Ausdrücke & Zuweisungen Ein- / Ausgabe Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 2 Grundstruktur Grundsymbole Namen bezeichnen Variablen, Typen, ... in einem Programm - bestehen aus Buchstaben, Ziffern und "_" - beginnen mit Buchstaben - beliebig lang - Groß-/Kleinschreibung signifikant! Schlüsselwörter - heben Programmteile hervor - dürfen nicht als Namen verwendet werden x x17 myVar my_var MyClass doSomething getAddress CONSTANT if while for repeat private public Satzzeichen - Interpunktionszeichen, engl. seperators ; , . () {} [] Operatoren - bilden Ausdrücke Trennung lexikalischer Einheiten Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 =><!~?:&|+-*/^% Leerzeichen, Tabulator, Zeilenvorschub, Satzzeichen, Operatoren, Kommentare 4.10.2005, Seite 3 Grundstruktur Lexikalische Konventionen Variablennamen Kleinbuchstaben variable Methodennamen Kleinbuchstaben methode() Klassennamen Person Großbuchstaben symbolische Konstanten MAXIMUM alle Buchstaben groß Bei zusammengesetzten Namen werden ab dem 2. Wort jeweils der 1. Buchstabe des Wortes groß geschrieben, z.B. die Variable firstName, die Methode getFirstName() Stets sprechende Namen wählen! Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 4 Grundstruktur Grundstruktur von Java-Programmen class ProgramName { public static void main (String[] arg) { ... // Deklarationen ... // Anweisungen } … // weitere Methoden } Beispiel class Sample { public static void main (String[] args) { } } Text muß in einer Datei namens ProgramName.java stehen - Jede Deklaration und jede Anweisung muss mit Semikolon enden - Zusammengehörige Gruppen von Anweisungen einrücken Klassenname Main-Methode: -public: kann von außen gerufen werden - static: ist Klassenmethode - void: gibt keinen Wert zurück - String[] args: Array args aus Zeichenketten als Parameter Text steht in Datei Sample.java Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 5 Grundstruktur Kommentare: Erläuterungen des Programms Zeilenendekommentare int sum; // total sales - beginnen mit // - gehen bis zum Zeilenende Klammerkommentare - durch /* ... */ begrenzt können über mehrere Zeilen gehen dürfen nicht geschachtelt werden oft zum "Auskommentieren" von Programmteilen /* Das ist ein längerer Kommentar, der über mehrere Zeilen geht */ Sinnvoll kommentieren! - alles kommentieren, was Erklärung bedarf - statt unklares Programm mit Kommentar, besser klares Programm ohne Kommentar - nicht kommentieren, was ohnehin schon im Programm steht; zum Beispiel nicht: int sum; // Summe - Möglichst englische Bezeichner und Kommentare; nicht deutsch und englisch mischen! Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 6 Grundstruktur Übersetzen und Ausführen mit JDK JDK installieren download http://java.sun.com/j2se/1.5.0/download.jsp Übersetzen C:\> cd MySamples wechselt ins Verzeichnis mit der Quelldatei C:\MySamples> javac Sample.java erzeugt Datei Sample.class Ausführen C:\MySamples> java Sample ruft main-Methode der Klasse Sample auf Frage: Wer ruft die Main-Methode auf? Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 7 Agenda Agenda Grundstruktur Datentypen Datentypen Methoden Ausdrücke & Zuweisungen Ein- / Ausgabe Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 8 Datentypen Datentypen Datentyp = Wertebereich + Operationen Äpfel können nicht mit Birnen verglichen werden Zentrales Konzept der Informatik Bekannt aus der Mathematik: Gruppen, Körper, Ringe, Algebren Auch Datenstruktur, abstrakter Datentyp genannt In Programmiersprache zusätzlich: Darstellung im Speicher Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 9 Datentypen Klassifikation der Datentypen in Java Datentyp Einfacher (elementarer, primitiver) Typ Wahrheitswerte - boolean Zeichen-Typ - char Integer-Typ - byte - short - int - long Referenztyp numerischer Typ KlassenTyp ArrayTyp SchnittstellenTyp Gleitpunkt-Typ - float - double Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 10 Datentypen Der Datentyp boolean Wertebereich Operationen • Konjunktion (&& bzw. &) UND: true && false false • true • false • Disjunktion (|| bzw. |) ODER: true || false true • Negation (!) NICHT: !true false • Exklusives Oder (^): true ^ true false Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 11 Datentypen Boolean Wahrheitstafeln x1 x2 AND && OR || XOR ^ true true true true false true false false true true false true false true true false false false false false x1 NOT ! true false false true Beispiele: boolean isEmployed, isaMinor, isaYoungWorker, isaVoter; isaYoungWorker = isEmployed & isaMinor; isaVoter = ! isaMinor; isaTaxpayer = isaVoter | isEmployed; boolean freeBus = (isPensioner | isaMinor) & !isEmployed; Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 12 Datentypen Boolesche Ausdrücke Operanden vom Typ byte, int, short, long, float, double oder char und gelieferter Ergebniswert vom Typ boolean Operatoren für Vergleiche == Gleichheit 4 == 5 (ergibt false) != Ungleichheit 6 != 7 (ergibt true) > Größer 'a' > 'b' (ergibt false) < Kleiner -2. < 0.1 (ergibt true) >= Größer-Gleich 1 >= -1 (ergibt true) <= Kleiner-Gleich 3 <= 3 (ergibt true) boolean isPensioner; int age = 67; isPensioner = age > 65; Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 13 Datentypen Operator-Prioritäten Verarbeitungsreihenfolge boolescher Operatoren in Java 1. ( ) 2. ! 3. & 4. | 5. && 6. || Vergleichsoperatoren haben in Java eine höhere Priorität als boolesche Operatoren! Klammern benutzen ! (zur Erhöhung der Lesbarkeit) möglichst einfache boolesche Ausdrücke verwenden Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 14 Agenda Agenda Grundstruktur Datentypen Methoden Methoden Ausdrücke & Zuweisungen Ein- / Ausgabe Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 15 Methoden Methoden Definition: Teil eines Programms, das in in sich abgeschlossene Aufgabe löst und hierzu eine Folge von Anweisungen und Deklarationen ausführt Analogon zu Funktion in der Mathematik (wie auch Operatoren) Vorteile – bessere Übersichtlichkeit von Programmen (Struktur) – separate Lösung von Teilproblemen – Wiederverwendbarkeit Aspekte: Methodendeklaration und Methodenaufruf Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 16 Methoden Deklaration einer Methode public / private, static, final Ergebnis-Datentyp oder void Namen und Datentypen der Eingaben Modifier Rückgabetyp Name (Typ1 Parameter1, … Typn Parametern) { Deklarationen und Anweisungen; return Ausdruck; // falls nicht void } Beendigung und Rückgabe innerhalb einer Klasse, vor/nach der main-Methode Reihenfolge der Methodendeklarationen hat keinen Einfluß auf Semantik keine Schachtelung von Methodendeklarationen möglich Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 17 Methoden Funktionen und Prozeduren: Beispiele für Methodendeklarationen Funktionen: Methoden mit Rückgabewert; ohne Seiteneffekte public static float fahrenheit(float c) { return c *9/5 +32; } Prozeduren: Methoden ohne Rückgabewert; mit Seiteneffekten public static void printBox() { System.out.println(“--------“); System.out.println(“| |“); System.out.println(“| |“); System.out.println(“--------“); } Mischformen sind möglich, aber sollten vermieden werden! Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 18 Methoden Aufruf einer Methode Aufruf einer Methode, welche in derselben Klasse deklariert ist: f = fahrenheit(42); printBox (); Geschachtelte Methodenaufrufe: main() { int f(int m,n) { (4) (2) (1) (3) n=f(2, 42); (9) (8) } void p(float x) { (5) p(n); (7) } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 (6) } 4.10.2005, Seite 19 Methoden Formale und aktuelle Parameter Formale Parameter (Methoden-Deklaration) – Einführung einer lokalen Variable für die Methode – wie viele Übergabeparameter, von welchem Typ und in welcher Reihenfolge Aktuelle Parameter (Methoden-Aufruf) – Übergabe eines "Initialwertes" für den formalen Parameter – Bedingung: Anzahl an formalen Parametern = Anzahl an aktuellen Parametern – für alle Parameter in der entsprechenden Reihenfolge gilt: Typ des aktuellen Parameters ist typkonform zum Typ des formalen Parameters Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 20 Methoden Der Teufel steckt im Detail Welche Fehler haben sich eingeschlichen? public static void methode1(int a) { return 2 * a; } public static int methode2 (int a) { return (a == a); } public static int methode3 (int a) { int temp = 2 * a; } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 21 Methoden Korrektheit von Methoden: Vor- und Nachbedingungen public static float fahrenheit(float c) pre: c > -273,15 post: result = c *9/5 +32 Vorbedingung (pre condition) Nachbedingung (post condition) • Muss der Aufrufer sicher stellen • Muss die Methode sicherstellen • Kann die Methode erwarten: • Kann der Aufrufer erwarten: public static int fahrenheit(int c) { assert (c > -273,15); return c *9/5 +32; } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 … f = fahrenheit(c); assert (f == c *9/5 +32); … 4.10.2005, Seite 22 Agenda Agenda Grundstruktur Datentypen Methoden Ausdrücke Zuweisungen Ausdrücke &&Zuweisungen Ein- / Ausgabe Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 23 Ausdrücke & Zuweisungen Variablendeklarationen Jede Variable muss vor ihrer Verwendung deklariert werden - macht den Namen und den Typ der Variablen bekannt - Compiler reserviert Speicherplatz für die Variable boolean isCorrect; deklariert eine Variable Typ boolean int x, y; deklariert zwei Variablen x und y vom Typ int (Ganzzahl) Initialisierung - Jede Variable sollte explizit initialisiert werden - Programmierstil: Variablendeklaration und Initialisierung am Anfang der Methode boolean isCorrect = false; int x = 100, y = 0; deklariert boolean Variable mit Initialwert false deklariert int Variablen x und y und weist Werte zu Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 24 Ausdrücke & Zuweisungen Konstantendeklaration Initialisierte "Variablen", deren Wert man nicht mehr ändern kann static final float PI = 3.14159; Zweck: – bessere Lesbarkeit: max ist lesbarer als 100 – bessere Wartbarkeit: wenn die Konstante mehrmals vorkommt und geändert werden muss, dann muss das nur an 1 Stelle erfolgen Konstantendeklaration muss auf Klassenebene stehen (s. später) Konvention: GROSSBUCHSTABEN Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 25 Ausdrücke & Zuweisungen Programmierstil: Verwende niemals Literale im Code Literale sind feste Werte von Datentypen float u, r; String tag; … u = 2 * 3.14159 * r; … if (tag == “Montag”) { … } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 static final float PI = 3.14159; static final int MONTAG = 1 float u, r; int tag; … u = 2 * PI * r; … if (tag == MONTAG) { … } 4.10.2005, Seite 26 Ausdrücke & Zuweisungen Zuweisungen x = x+1 ; Variable 1. berechne den Ausdruck 2. speichere seinen Wert in der Variablen Ausdruck Bedingung: linke und rechte Seite müssen zuweisungskompatibel sein - müssen dieselben Typen haben, oder - Typ links ⊇ Typ rechts Hierarchie der ganzzahligen Typen long ⊇ int ⊇ short ⊇ byte Beispiele int i, j; short s; byte b; i = j; // ok: derselbe Typ i = 300; // ok (Zahlkonstanten sind int) b = 300; // falsch: 300 paßt nicht in byte i = s; // ok s = i; // falsch Statische Typenprüfung: Compiler prüft: - dass Variablen nur erlaubte Werte enthalten - dass auf Werte nur erlaubte Operationen ausgeführt werden Java ist eine streng typisierte Sprache Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 27 Ausdrücke & Zuweisungen Arithmetische Ausdrücke Vereinfachte Grammatik (EBNF) Expr = Operand {BinaryOperator Operand}. Operand = [UnaryOperator] ( identifier | number | "(" Expr ")" ). Binäre Operatoren + * / % Addition Subtraktion Multiplikation Division, Ergebnis ganzzahlig 4/3 Modulo (Divisionsrest) 4%3 (-4)/3 (-4)%3 4/(-3) 4%(-3) (-4)/(-3) (-4)/(-3) Unäre Operatoren + - Identität (+x = x) Vorzeichenumkehr Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 28 Ausdrücke & Zuweisungen Vorrangs- und Typregeln in arithmetischen Ausdrücken Vorrangregeln - Punktrechnung (*, /, %) vor Strichrechnung (+, -) - Unäre Operatoren binden stärker als binäre z.B.: 3 + 4 * -2 ergibt -5 Typregeln Operandentypen byte, short, int, long Ergebnistyp - wenn mindestens 1 Operand long ist ⇒ long - sonst ⇒ int Beispiele Typumwandlung (type cast) (type)expression short s; int i; long x; x = x + i; // long i = s + 1; // int (1 ist vom Typ int) s = (short)(s + 1); // Typumwandlung nötig - wandelt Typ von expression in type um - dabei kann etwas abgeschnitten werden i (short)i Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 29 Ausdrücke & Zuweisungen Typkonvertierung Eine Konvertierung primitiver Datentypen heißt erweiternd, wenn sie in Pfeilrichtung erfolgt, einschränkend, wenn sie entgegen der Pfeilrichtung erfolgt. byte short int long float double char Implizite Typkonvertierung • Erweiternde Typkonvertierung; vom Compiler automatisch durchgeführt • Bei nicht identischen, aber kompatiblen Variablen, Ausdrücken, Parametern Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 Explizite Typkonvertierung • Erweiternde oder einschränkende Typkonvertierung; vom Programmierer erzwungen durch den Type Cast Operator • Beispiel: double a = 5.0; int i= (int) a; 4.10.2005, Seite 30 Ausdrücke & Zuweisungen Beispiel: Zinsberechnung Problem: Eine Bank ändert oft ihre Zinssätze. Frage: Wie verändern sich dadurch mein Zinsertrag? Lösung: Was wissen wir? Was wollen wir wissen ? Wie bekommen wir das Ergebnis heraus? Formel: I = (P T R) / 100 I (interest): Zinsertrag pro Jahr T (time): Zeit in Jahren P (principal): Guthaben R (rate): Zinssatz Algorithmus: – M Nummer des aktuellen Monats – (12 - M) /12 noch zu verzinsende Zeit im laufenden Jahr – (P * (12 - M) / 12) * oldRate) / 100 Zinsen bei altem Zinssatz – (P * (12 - M) / 12) * newRate) / 100 Zinsen bei neuem Zinssatz – Die Differenz hieraus ergibt die gesuchte Veränderung des Ertrags Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 31 Beispiel: Zinsberechnung public class Sample { static final double static final int static final double static final double p = 1000; m = 4; oldRate = 12.5; newRate = 13.0; // // // // in EUR for April % % public static void main(String[] args) { double dif = 0; // perform calculation dif = computeInterest(p, m, oldRate) – computeInterest(p, m, newRate); // print out the result System.out.println("Interest will change by: " + dif); } public static double computeInterest( double p, int m, double r) { double i = 0; double t = 0; } } t = (12.0 - m) / 12.0; i = p * t * r / 100; return i; Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 32 Agenda Agenda Grundstruktur Datentypen Methoden Ausdrücke & Zuweisungen Ein- / Ausgabe Ausgabe Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 33 Ein- / Ausgabe Standard-Ein- und Ausgabe Ausgabe auf die Konsole Eingabe von der Tastatur Programm System.in System.out Punkt-Notation: Zugriff auf Attribute und Methoden von Klassen und Objekten (siehe Objekt-Orientierung Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 34 Ein- / Ausgabe Standard-Ausgabe Ausgabe auf die Konsole: System.out.print(“ein Text“); // Parameter: Zeichenkette (String) Zeilenvorschub: System.out.println(); // print line beziehungsweise System.out.print(“ \n“); // newline Character Eine einzelne Zeichenkette darf nicht auf mehrere Zeilen aufgeteilt werden: “Das geht so nicht“ Konkatenation (Verkettung) von Zeichenketten mit +-Operator: “ Output value: “ + diff + “ Euro \n“ Dabei implizite Typkonversion double String Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 35 Ein- / Ausgabe Standard-Eingabe import java.io.*; public class Sample { public static void main(String[] args) throws IOException { int a, b, c; BufferedReader din = new BufferedReader( new InputStreamReader(System.in)); System.out.println("Bitte a eingeben: "); a = Integer.parseInt(din.readLine()); System.out.println("Bitte b eingeben: "); b = Integer.parseInt(din.readLine()); c = a + b; System.out.println("a+b="+c); Komplizierter als Standard-Ausgabe Import des Java-Pakets für Ein-/Ausgabe Exception Handling Geschachtelte ObjektInstaziierung Klassenmethoden verschiedener Klassen } } Bernhard Humm: „Grundlagen der Programmierung I (Java)“. FH Darmstadt, WS 2005/2006 4.10.2005, Seite 36