FH D Fachhochschule Düsseldorf University of Applied Sciences 4 Informatik 2 Objektorientierte Programmierung in Java Prof. Dr.‐ Ing. André Stuhlsatz FH D Blöcke Fachhochschule Düsseldorf University of Applied Sciences Blöcke erweitern einzelne Anweisungen, etwa bei Kontrollstrukturen später Beispiel: Einzelne Anweisung: anweisung; Erweiterung der einzelnen Anweisung: { anweisung1; anweisung2; … } Blöcke können geschachtelt werden. Wichtig: Variablen sind nur innerhalb des Blocks und in den Verschachtelungsebenen sichtbar! Wenn der Block geschlossen wird, ist die Variable weg! Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences 2 Beispiel: Variablen in Blöcken In diesem Beispiel Die Variablen sind nur innerhalb des Blocks sichtbar. Nach dem Block können die Variablen mit gleichem Namen wieder anders definiert werden. public static void main(String[] args) { { int a = 15; { int b = 16; System.out.println("Zahl:" + (b + a)); } System.out.println("Zahl:" + a); } { double a = 17.0; System.out.println("Zahl:" + a); } System.out.println("Zahl:" + a); } Informatik 2 3 1 FH D Bedingte Verzweigung Fachhochschule Düsseldorf University of Applied Sciences Wenn Teile eines Programms nur unter bestimmten Bedingungen ausgeführt werden sollen, werden Verzeigungen verwendet. Die Bedingungen können sich zur Laufzeit ändern. In Java gibt es zwei verschiedene Anweisungen für Verzweigungen if‐Anweisung switch‐Anweisung switch (Ausdruck) { case Konstante1: Anweisung1; case Konstante2: Anweisung2; … default: StandardAnweisung; } if (logischer Ausdruck) Anweisung; if (logischer Ausdruck) Anweisung; else Anweisung; Informatik 2 FH D 4 If‐Anweisung Fachhochschule Düsseldorf University of Applied Sciences Wichtig: Der logische Ausdruck hinter if muss vom Typ boolean (true/false) sein! Es ist nicht möglich dort Zahlen einzusetzen (wie in C oder MATLAB) random() erzeugt eine gleichverteile Zufallszahl (double) zwischen 0…1 Beispiel: Münzwurf double zufallZahl = java.lang.Math.random(); String strKopfZahl; if (zufallZahl > 0.5) strKopfZahl = "Kopf"; else strKopfZahl = "Zahl"; System.out.println("Die Münze zeigt " + strKopfZahl); Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences 5 If‐Anweisung: Gleichheit Wichtig: Auf Gleichheit wird mit zwei Gleichheitszeichen getestet! Beispiel: Würfel mit Anzeige, ob Pasch gewürfelt wurde Achtung: Beachten Sie die Vorgehensweise bei den ganzen Zufallszahlen int würfel_a = (int) (java.lang.Math.random()*6) + 1; int würfel_b = (int) (java.lang.Math.random()*6) + 1; String Meldung = "Die Würfel zeigen "; if (würfel_a == würfel_b) Meldung += würfel_a + "er Pasch"; else Meldung += würfel_a + " und " + würfel_b; System.out.println(Meldung); Informatik 2 6 2 FH D Fachhochschule Düsseldorf University of Applied Sciences If‐Anweisung: Gleichheit von Fließkommazahlen Wichtig: Vermeiden Sie es Fließkommazahlen auf Gleichheit zu testen! Gerade im Ingenieurbereich kann es zu schwerwiegenden Fehlern kommen! Beispiel: 1 b a 1 a a b 11 a ba double a = 0.42; double b = ((1/a) * a) - 1.0 + a ; if (b == a) System.out.println("a gleich b"); else System.out.println("a ungleich b"); Mit Zahlen: a=0,42 a gleich b a=0,41 a ungleich b Besser: Unterschreiten von Schwellwert. final double EPSILON = 1e-10; if (Math.abs(a-b)<EPSILON) System.out.println("a gleich b"); Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences 7 If‐Anweisung: „Dangling else“ Verschachtelte If‐Anweisung können bei ungeeigneter Formatierung vom Menschen falsch interpretiert werden. Das else wird immer der inneren if‐Anweisung zugeordnet! c = 0; if (a == 1) if (b == 1) c = 1; else c = 2; c = 0; if (a == 1) if (b == 1) c = 1; else c = 2; c = 0; if (a == 1) { if (b == 1) c = 1; } else c = 2; Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences 8 Switch‐Anweisung Mehrfachverzeigungen können mit der switch‐Anweisung verständlicher implementiert werden, als mit geschachtelten if‐Abfragen. Ausdruck muss vom Typ byte, short, int oder char sein! Die Konstante und der Ausdruck müssen zuweisungskompatibel sein. Konstanten dürfen nicht doppelt vorkommen. Das default‐Label ist optional und wird angesprungen, wenn keine Konstante zutrifft. switch (Ausdruck) { case Konstante1: Anweisung1; case Konstante2: Anweisung2; … default: StandardAnweisung; } Die Anweisungen werden alle ab der zutreffenden Konstanten ausgeführt! Soll dies nicht geschehen, muss die Anweisung am Ende mit break beendet werden. Informatik 2 9 3 FH D Fachhochschule Düsseldorf University of Applied Sciences Ausgabe: Zwei Null? Beispiel: Switch‐Anweisung int a = 2; switch (a) { case 1: System.out.println("Eins"); case 2: System.out.println("Zwei"); default: System.out.println("Null?"); } int a = 2; switch (a) { case 1: System.out.println("Eins"); break; case 2: System.out.println("Zwei"); break; default: System.out.println("Null?"); break; } Ausgabe: Zwei 10 Informatik 2 FH D Schleifen Fachhochschule Düsseldorf University of Applied Sciences while‐Schleife: Die Schleife wird durchlaufen, solang der logische Ausdruck wahr ist. Wenn der logische Ausdruck zu Anfang schon falsch ist, wird die Anweisung gar nicht ausgeführt! while (logischer Ausdruck) Anweisung; do‐Schleife: Die Schleife wird beendet, wenn der logische Ausdruck falsch ist. Die Anweisung wird mindestens einmal durchlaufen, weil der logische Ausdruck erst am Ende geprüft wird! do Anweisung; while (logischer Ausdruck) Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences 11 for‐Schleifen for (init; test; update) Anweisung; Der Kopf der for‐Schleife besteht aus drei Ausdrücken, die jeder für sich optional sind: Der init‐Ausdruck wird einmal vor dem Start der Schleife aufgerufen. Er dient dazu, Initialisierungen durchzuführen. Der init‐Teil darf auch aus mehreren Ausdrücken bestehen, wenn die einzelnen Teilausdrücke durch Kommata getrennt sind. Fehlt der Initialisierungsteil, wird keine Initialisierung im Kopf der Schleife durchgeführt. Der init‐Teil darf auch Variablendeklarationen enthalten, beispielsweise, um einen Schleifenzähler zu erzeugen. Der test‐Teil bildet den Testausdruck der Schleife. Analog zur while‐Schleife wird er am Anfang der Schleife ausgeführt. Der update‐Ausdruck dient dazu, den Schleifenzähler zu verändern. Informatik 2 12 4 FH D Beispiel: for‐Schleifen Fachhochschule Düsseldorf University of Applied Sciences for (int i=1; i<=3; i++) { System.out.println("i ist " + i); } int i = 1; for (; i<=3; i++) { System.out.println("i ist " + i); } int i = 1; for (; i<=3;) { System.out.println("i ist " + i++); } 13 Informatik 2 FH D Übung Fachhochschule Düsseldorf University of Applied Sciences Schreiben Sie eine berechneGLS_Versandkosten()‐Methode für die Klasse GLS_Paket, welche die Versandkosten in Euro zurückgibt. Auf der Internetseite von GLS findet sich folgende Anleitung für die Berechnung der Versandkosten. „Die Größe Ihres Pakets (längste Seite + kürzeste Seite) wird in Ihrem Paketshop mit einem Maßband vermessen. Je nach Größe ergeben sich nur noch fünf verschiedene Preisklassen – XS bis XL – unabhängig vom Gewicht.“ „Das Gurtmaß (Umfang des Paketes zzgl. längste Seite) darf 3 m nicht überschreiten.“ Pack‐Größe Längste + kürzeste Seite Versandkosten Wenn das maximale XS max. 35 cm 4,10 € Gurtmaß überschritten S max. 50 cm 5,90 € wird, soll die M max. 65 cm 6,90 € Methode ‐1.0 zurückgeben. L max. 80 cm 9,90 € XL max. Gurtmaß Informatik 2 FH D Fachhochschule Düsseldorf University of Applied Sciences 15,30 € 14 Vorbereitung Gegeben ist: a = kürzeste Seite b = zweitkürzeste Seite c = längste Seite c Wichtige Berechnungen: a+c = längste + kürzeste Seite a 2*(a+b)+c = Gurtmaß b Rückgabetyp: float oder double, weil die Versandkosten Nachkommastellen haben. Also: public float berechneGLS_Versandkosten() Informatik 2 15 5 FH D Fachhochschule Düsseldorf University of Applied Sciences Verzweigung wie in Tabelle 1. if (a+c <= 35) 2. return 4.1f; 3. if (a+c <= 50) 4. return 5.9f; 5. if (a+c <= 65) 6. return 6.9f; 7. if (a+c <= 80) 8. return 9.9f; Pack‐ Längste + kürzeste Versand‐ Größe Seite kosten XS max. 35 cm 4,10 € S max. 50 cm 5,90 € M max. 65 cm 6,90 € L max. 80 cm 9,90 € XL max. Gurtmaß 15,30 € 9. if ((2*(a+b)+c) <= 300) 10. return 15.3f; 11. return -1f; // unzulässige Paketgröße Informatik 2 16 6