INE2 (Die weite Reise ) von C zu Java Teil 1: Grundlagen ■ Anweisungen ■ Variablen und Datentypen ■ Ausdrücke und Operatoren ■ Entscheidungen ■ Wiederholungen ■ Methoden und Parameterübergabe Anweisungen School of Engineering © G. Burkert, K. Rege, ZHAW 2 von 87 Anweisungen in Java ■ Wie in anderen imperativen Programmiersprachen (C...) werden Anweisungen in Java der Reihe nach von links nach rechts und oben nach unten abgearbeitet ■ Jede Anweisung muss mit einem ";" enden ■ Ein Anweisung kann auch leer sein: ; // Dies ist eine Leeranweisung ■ Beispiel System.out.println("Hello"); School of Engineering © G. Burkert, K. Rege, ZHAW 3 von 87 Anweisungssequenz public class HelloYouThere { public static void main(String[] args) { System.out.println("Hello"); System.out.println ("you"); System.out.println ("there"); } } Das Programm erzeugt auf der Konsole folgende Zeilen: Hello you there School of Engineering © G. Burkert, K. Rege, ZHAW 4 von 87 Anweisungssequenz School of Engineering © G. Burkert, K. Rege, ZHAW 5 von 87 Variablen ■ Variablen müssen vor ihrer Verwendung vereinbart werden ■ Vereinbarung einer Variablen laenge vom Typ int (integer): int laenge; School of Engineering © G. Burkert, K. Rege, ZHAW 6 von 87 Zuweisung ■ Eine Zuweisung ist eine Anweisung, die einer Variablen einen neuen Wert zuweist ■ Allgemeine Form einer Zuweisung in Java: ■ Ausdruck: Bezeichnet eine einzelne Zahl, Variable oder eine ganze Berechnung Beispiele flaeche = laenge * breite; n = n + 1; x = Math.cos(winkel) * radius School of Engineering © G. Burkert, K. Rege, ZHAW 7 von 87 Kommentare // this line is ignored by Java ■ bezeichnet einen einzeiligen Kommentar (geht bis zum Ende der Zeile) /* comment1 comment2 */ ■ bezeichnet einen mehrzeiligen Kommentar /** comment1 comment2 */ ■ bezeichnet einen mehrzeiligen Kommentar für die Dokumentation (JavaDoc) School of Engineering © G. Burkert, K. Rege, ZHAW 8 von 87 Variablen und Datentypen School of Engineering © G. Burkert, K. Rege, ZHAW 9 von 87 Gültige Variablennamen in Java ■ Erstes Zeichen: Buchstabe (Unicode) , _ oder $ ■ Nachfolgende Zeichen: Buchstaben , Ziffern , _ oder $ ■ Namen können beliebig lange sein ■ Keine reservierten Wörter erlaubt (public, class, extends, implements etc.) à beliebter Fallstrick! ■ Java ist case sensitive: Gross- und Kleinbuchstaben werden unterschieden! D.h. A und a sind zwei verschiedene Variablen (Speicherplätze) ■ Variablennamen dürfen beliebige UNICODE Zeichen enthalten also auch Umlaute School of Engineering © G. Burkert, K. Rege, ZHAW 10 von 87 Variablennamen ■ Beispiele für gültige Variablennamen: breite Hoehe LÄNGE jahr2000 x b$3_n ■ Beispiele für illegale Variablennamen: neues Haus 1Ka School of Engineering © G. Burkert, K. Rege, ZHAW 11 von 87 Namenskonventionen ■ Variablen und Methodennamen beginnen in Java mit einem Kleinbuchstaben ■ Klassennamen beginnen mit einem Grossbuchstaben ■ Bei Namen aus mehreren Wörtern wird der Anfangsbuchstabe jedes neuen Wortes gross geschrieben ■ Beispiele : paint, drawString, Grafik , Applet, rateProMonat, dezemberLohn, setzeFarbe, liesBuchstaben, endeMonat, besteNote ■ Wichtig beim Programmieren: Sinnvolle und präzise Namen verwenden (Länge des Namens ist weniger wichtig) School of Engineering © G. Burkert, K. Rege, ZHAW 12 von 87 Variablendeklaration public class Berechnung { public static void main(String[] args){ // Deklaration lokaler Variablen int laenge; // einfache Deklaration int breite = 10; // Deklaration mit Initialisierung int flaeche, flaeche2 = 100; // Mehrere Deklarationen // Hier folgen die Anweisungen laenge = 20; // Dies ist eine Anweisung! flaeche = laenge * breite; // 2. Anweisung System.out.println("Flaeche = " + flaeche); } } School of Engineering © G. Burkert, K. Rege, ZHAW 13 von 87 Lokale Variablen ■ Werden Variablen innerhalb einer Methode deklariert, so sind sie nur in dieser Methode sichtbar (nicht-lokale Variablen siehe später) ■ Empfehlung: Alle Variablen an derselben Stelle vor der ersten Anweisung deklarieren School of Engineering © G. Burkert, K. Rege, ZHAW 14 von 87 Variablendeklaration ■ Beispiele gültiger Deklaration einer lokalen Variablen in Java double laenge; int laenge = 4; String name = "Quadrat" ■ Interpretation: ■ Zuerst muss ein Datentyp angegeben werden: Typ ersetzen z.B. durch int oder double ■ Dann muss ein Variablennamen angegeben werden: Variablennamen z.B. durch laenge ersetzen School of Engineering © G. Burkert, K. Rege, ZHAW 15 von 87 Einfache Datentypen (Primtive Datatypes) ■ Ganze Zahlen ■ Fliesskommazahlen ■ Wahrheitswerte (Boolean) ■ Alphanumerische Zeichen School of Engineering © G. Burkert, K. Rege, ZHAW 16 von 87 Ganze Zahlen ■ Vier Datentypen mit unterschiedlichen Wertebereichen ■ byte (8 Bit), short (16 Bit), int (32 Bit), long (64 Bit) uC z d e i sch Unter ? ■ Beispiele von Variablendeklarationen mit Initialisierung: byte b = 127; short s = -1214; long l = 104L; School of Engineering int i = -25; int k = 0x6B; // hex, dez: 107 © G. Burkert, K. Rege, ZHAW 17 von 87 Ganze Zahlen ■ Wertebereiche Typ Grösse [Bits] byte 8 short negativer Maximalwert positiver Maximalwert -128 127 16 -32768 32767 int 32 -2147483648 2147483647 long 64 -9223372036854775808 9223372036854775807 School of Engineering © G. Burkert, K. Rege, ZHAW 18 von 87 Fliesskommazahlen ■ Zwei Datentypen mit unterschiedlichen Wertebereichen und Genauigkeiten float (32 Bit), double (64 Bit) Typ Grösse [Bits] Max.wert Min.wert Präzision float 32 ± 3.4e+38 ±1.4e-45 6-7 Dez.Stellen double 64 ± 1.79e+308 ±4.9e-324 14-15 Stellen School of Engineering © G. Burkert, K. Rege, ZHAW 19 von 87 Fliesskommazahlen ■ double ■ Beispiele: 1.34, -10.3, 1.e5, 5d, 0.3D, .001 ■ float (diesen Datentyp vermeiden) ■ Beispiele: 1.34f, -234.837F, 1E-3F, 3f, 0.75f, .001f ■ Ohne f am Schluss wird automatisch der Datentyp double angenommen School of Engineering © G. Burkert, K. Rege, ZHAW 20 von 87 Logische Werte ■ Datentyp boolean ■ Umfasst nur die Werte true und false ■ Beispiele von Variablendeklarationen mit Initialisierung: boolean ready = false; boolean ok = true; uC z d e i sch Unter School of Engineering © G. Burkert, K. Rege, ZHAW ? 21 von 87 Zeichen (Character) ■ Einfacher Datentyp für einzelne Zeichen: char ■ char-Literale mit einfachen Anführungsstrichen: 'a', 'T', '3', ' ', '@', '.', 'ü' ■ Länge: 16 Bit (Unicode eines Zeichens) ■ Unicode 0x0000 bis 0x007F entsprechen dem ASCII-Code Deklaration: Zuweisung zu einer char-Variablen: char ch; char grossM = 'M'; char ue = 'ü'; ch = 'a'; ch = grossM; School of Engineering © G. Burkert, K. Rege, ZHAW 22 von 87 Vergleich von Zeichen ■ Characters sind nach ihrem Unicode geordnet ■ 'A' hat den Unicode 0041 (Hex), 'B' hat den Unicode 0042 usw. ■ Die Kleinbuchstaben beginnen bei Unicode 0061 if (ch == 's') {...} // falls ch das Zeichen 's' ist ... 'b' > 'a' // ist true, da der Unicode von 'b' // grösser ist als der von 'a' if (ch > 'a') {...} // true für ch = 'b', 'c', 'd', ... if (ch != ' ') {...} // falls ch nicht der Leerschlag ist, ... School of Engineering © G. Burkert, K. Rege, ZHAW 23 von 87 Übung ■ wahr oder falsch? 'n' == 'n' // immer true 'k' > 'o' // false '3' > '2' // true 'A' <= 'a' // true ch >= 'a' && ch <= 'z' // true für a-z School of Engineering © G. Burkert, K. Rege, ZHAW 24 von 87 Spezielle Zeichen '\n' Neue Zeile '\t' Tabulator '\r' Carriage return (Wagenrücklauf) '\f' Form Feed (neue Seite) '\"' Anführungszeichen '\'' Apostroph '\\' Backslash '\' '\uxxxx' Unicode-Zeichen mit Hexcode xxxx Beispiel: '\u0040' für '@' School of Engineering © G. Burkert, K. Rege, ZHAW 25 von 87 Einfache Datentypen (Wertetypen) ■ Speichern und Verarbeiten einzelne Werte (Zahlen, Buchstaben, logische Werte) ■ Variablenname bezeichnet den Speicherplatz, wo der Wert abgespeichert ist ■ Speicherplatz wird bei der Deklaration der Variablen reserviert School of Engineering © G. Burkert, K. Rege, ZHAW 26 von 87 Einfache Datentypen (Wertetypen) ■ Nur ein Wert int, double, double, boolean, char, ... ■ Bei Zuweisungen und Methodenaufrufen wird nur Kopie des Wertes übergeben („by value“) a = 5; a 5 b 7 5 b = 7; b = a; School of Engineering © G. Burkert, K. Rege, ZHAW 27 von 87 Referenz Datentypen (= Pointer) ■ Speichern und Verarbeiten mehrerer Werte zusammen ■ Die einzelnen Werte vom gleichen oder von unterschiedlichem Datentyp sein ■ Beispiel: Arrays, Objekte (später) ■ Bei der Deklaration der Variablen wird nur Platz für die Adresse der eigentlichen Daten reserviert int[] a = new int[10]; int[] b = a; School of Engineering © G. Burkert, K. Rege, ZHAW 28 von 87 Keine Pointer in Java? ■ In Java bestimmt immer der Datentyp, ob in den Variablen der Wert oder lediglich eine Referenz (ein Pointer) in der Variablen gespeichert wird. Werte(Typ) Werte(Typ)->->Variable Variableenthält enthält Wert Wert int a = 5; int b = a; Referenz(Typ) Referenz(Typ)->->Variable Variableenthält enthält "Pointer" "Pointer" int[] a = new int[10]; int[] b = a; School of Engineering © G. Burkert, K. Rege, ZHAW 29 von 87 Ausdrücke und Operatoren School of Engineering © G. Burkert, K. Rege, ZHAW 30 von 87 Ausdruck (Expression) ■ Ein Ausdruck ist eine einzelne Zahl oder eine ganze Berechnung, d.h. eine Folge von Operanden und Operatoren ■ Ein Ausdruck liefert immer ein Ergebnis mit einem bestimmten Datentyp, z.B. int ■ Operanden können sein: ■ Literale (z.B. Zahlen) und Variablen ■ Funktionsaufruf (ein Aufruf liefert immer einen Funktionswert zurück) ■ Operatoren: z.B. +, -, *, /, aber auch > , < School of Engineering © G. Burkert, K. Rege, ZHAW 31 von 87 Arithmetische Operatoren ■ Präzedenz (Vorrang) bestimmt die Reihenfolge der Auswertung der Ausdrücke ■ Ein Operator der Präzedenz 2 wird vor den Operatoren der Präzedenz 3 ausgeführt! ■ Bei gleicher Präzedenz werden die Ausdrücke von Links nach Rechts ausgewertet. ■ Mit Klammern kann die Präzedenz übersteuert werden. Beispiele int resultat; resultat = 4 * 8 + 2; resultat = 6 + 3 * 4 - 1; resultat = 3 + ( 2 - 2 ) * 3; School of Engineering © G. Burkert, K. Rege, ZHAW // = 34 // = 17 // = 3 32 von 87 Division ■ Division / führt je nach Typ der beteiligten Variablen eine normale Division oder aber eine Ganzzahldivision durch ■ Achtung: Bei Ganzzahldivision wird (wie in C) nicht gerundet, sondern der Rest nach dem Dezimalpunkt abgeschnitten! ■ Beispiele: int a = x = a = x = a; double x; 15 / 4; 15 / 4; 9 / 4; 9 / 4; School of Engineering // // // // a x a x = = = = 3 3.75 2 !! 2.0!! © G. Burkert, K. Rege, ZHAW 33 von 87 Modulo, % ■ Modulo (Rest-Operator) gibt den Rest der Division zurück ■ Er ist auch für Fliesspunktzahlen definiert (double, double); dabei verhält er sich wie bei ganzen Zahlen ■ Beispiele: int a = a = a = x = x = x = a; double x; 12 % 4; // a 13 % 4; // a 15 % 4; // a 7.0 % 2.0; // x = 1.0 8.6 % 2.0; // x 7.1 % 2.5; // x School of Engineering = 0 (kein Rest) = 1 (Rest 1) = 3 = 0.6 = 2.1 © G. Burkert, K. Rege, ZHAW 34 von 87 Operatoren School of Engineering © G. Burkert, K. Rege, ZHAW 35 von 87 Bibliothek der mathematischen Funktionen ■ Klasse mit den wichtigsten mathematischen Funktionen und Konstanten: java.lang.Math ■ Wird automatisch importiert ■ Konstanten Math.E Math.PI Konstante e Konstante pi ■ Methoden: es muss jeweils die Klasse (= Math) angegeben werden double ceil(double x) Aufrunden auf nächst grössere ganze Zahl double floor(double x) Abrunden auf nächst kleinere ganze Zahl int round(double x) Math. Runden auf nächste ganze Zahl. ... ... Bsp: i = Math.round(d); School of Engineering © G. Burkert, K. Rege, ZHAW 36 von 87 Ausnahmebedingungen ■ Beim Rechnen mit Ganzzahlendatentypen können unterschiedliche Ausnahmen auftreten: ■ Überläufe führen zu falschem Ergebnis ■ Division durch 0 bei ganzen Zahlen führt zu einer Arithmetic-Exception (Programmabbruch) ■ Bei Fliesskommazahlen können spezielle Grenzwerte auftreten: 1.0/0 -1.0/0 0/0 -> POSITIVE_INFINITY -> NEGATIVE_INFINITY -> NaN School of Engineering plus unendlich minus unendlich keine Zahl © G. Burkert, K. Rege, ZHAW 37 von 87 Typenumwandlungen School of Engineering © G. Burkert, K. Rege, ZHAW 38 von 87 Typumwandlung (Type Cast) ■ Bevor ein Ausdruck ausgewertet wird, müssen alle Operanden in denselben Datentyp umgewandelt werden à Typkonversion ■ Einzelne Typkonversionen werden von Java automatisch ausgeführt ■ Andere müssen vom Programmierer explizit angegeben werden School of Engineering © G. Burkert, K. Rege, ZHAW 39 von 87 Implizite Typumwandlung ■ Regel: ■ Bei Operationen mit gemischten Datentypen wird jeweils der Wert mit dem niedrigeren Datentyp in den höheren Datentyp des anderen umgewandelt ■ Typenhierarchie: Genauigkeitsverlust möglich ! School of Engineering double float long int short byte (höchster Typ) (niedrigster Typ) © G. Burkert, K. Rege, ZHAW 40 von 87 Explizite Typkonversion ■ Eine explizite Typkonversion erreicht man mit dem Cast-Operator: ■ Der gewünschter Datentyp wird dabei in runden Klammern (Typ) vor die zu konvertierende Variable gestellt (int)x (double)x // x wird in int-Wert umgewandelt // x wird in double-Wert umgewandelt School of Engineering © G. Burkert, K. Rege, ZHAW 41 von 87 Typkonversion – Beispiel ■ Achtung: Cast-Operator hat Präzedenz 1 und wird deshalb zuerst ausgeführt! x = (double) (10+11)/2; x = (double) ((10+11)/2); x = (int) 0.5 * 100; x = (int) (0.5 * 100); School of Engineering // x = 10.5 // x = 10.0 // x = 0 // x = 50 © G. Burkert, K. Rege, ZHAW 42 von 87 Umwandlungen mit Datentyp char ■ Implizite Typumwandlung ■ char nach int oder long ■ Explizite Typumwandlung ■ ■ int oder long nach char mit Type-Cast: (char) nur die niedrigsten 16 Bit berücksichtigt int i = c = i = c = i; char c = 'A'; c; System.out.println(i); // 65 65; System.out.println(c); // A 0x10000 + 65; System.out.println(i); // 65601 (char)i; System.out.println(c); // A School of Engineering © G. Burkert, K. Rege, ZHAW 43 von 87 String (Einführung) ■ String ist in Java ein eigener Datentyp (eigentlich eine Klasse) String s = "hallo"; System.out.println(s); ■ Strings können mit dem + -Operator zusammengehängt werden String s = "Hallo " + "Welt"; System.out.println(s); School of Engineering © G. Burkert, K. Rege, ZHAW 44 von 87 Stringverkettung ■ Wird ein String mit dem + -Operator mit einer numerischen Variablen (hier area) verknüpft, so wird der Wert der Variablen automatisch in einen String konvertiert! System.out.println("Area is " + area); ■ Typkonversion von int zu String geschieht fortlaufend (normalerweise von links nach rechts): System.out.println("Resultat = " + 1 + 2); Achtung: Resultat = 12 System.out.println("Resultat = " + (1 + 2)); Achtung: Resultat = 3 School of Engineering © G. Burkert, K. Rege, ZHAW 45 von 87 Entscheidungen School of Engineering © G. Burkert, K. Rege, ZHAW 46 von 87 Der Block ■ Grundbaustein einer Ablaufstruktur ■ Enthält beliebig viele (auch gar keine!) Anweisungen ■ Genau ein Eingang und ein Ausgang ■ Block in Java: ■ ■ ■ Umgeben von geschweiften {...} Klammern, aneinandergereiht Ein Block wird wie eine einzelne Anweisung behandelt Wo einzelne Anweisungen erlaubt sind, kann auch ein Block eingefügt werden School of Engineering © G. Burkert, K. Rege, ZHAW 47 von 87 Auswahlanweisung: if...else if (alter > 6) { if (alter < 16) { System.out.println("Junior"); } else { System.out.println("Erwachsen"); } } zu C d e i h sc Unter School of Engineering © G. Burkert, K. Rege, ZHAW ? 48 von 87 Mehrfachauswahl: switch School of Engineering © G. Burkert, K. Rege, ZHAW 49 von 87 Mehrfachauswahl: switch (Beispiel) int day = 3; switch( day ) { case 1: System.out.println("Montag"); break; case 2: System.out.println("Dienstag"); break; case 3: case 4: System.out.println("Mittwoch oder " + "Donnerstag"); break; … default: System.out.println("kein Tag"); } School of Engineering © G. Burkert, K. Rege, ZHAW 50 von 87 Vergleichsoperatoren ■ Auswahlanweisungen enthalten als Bedingungen häufig Vergleichsoperatoren ■ Ausdrücke mit solchen Operatoren liefern als Resultat einen der zwei Werte true (wahr; richtig) oder false (falsch) ■ Java bietet die Vergleichsoperatoren: ■ Grösser als > ■ Kleiner als < ■ Gleich == (NICHT: =) ■ Nicht gleich != (NICHT: <>) ■ Kleiner oder gleich <= ■ Grösser oder gleich >= School of Engineering © G. Burkert, K. Rege, ZHAW 51 von 87 Logische Operatoren ■ Zum Verknüpfen mehrerer Bedingungen UND-Operator && ODER-Operator || NICHT-Operator ! School of Engineering © G. Burkert, K. Rege, ZHAW 52 von 87 Logische Variablen ■ Logische Ausdrücke haben als Resultat entweder „wahr“ oder „falsch“ ■ Eigener Datentyp in Java: boolean ■ Wertebereich: { true, false } ■ Deklaration: boolean gezeichnet; boolean fertig = false; School of Engineering © G. Burkert, K. Rege, ZHAW 53 von 87 Logische Variablen ■ Zuweisung fertig = true; ■ In Bedingungen: if (fertig) { System.out.println("bye"); } ■ Bitte verwenden Sie solche „Flags“ sparsam! School of Engineering © G. Burkert, K. Rege, ZHAW 54 von 87 Rückgabewert boolean ■ Definition einer Methode mit Rückgabewert vom Typ boolean: public boolean istGeradeZahl (int n) { return (n%2) == 0; } ■ Der Methodenname soll ausdrücken, dass die Methode den Typ boolean zurückgibt: istIrgendwas(...), existsSomething(...), ... School of Engineering © G. Burkert, K. Rege, ZHAW 55 von 87 Ausdruck mit Bedingung ■ Für eine einfache Auswahl innerhalb eines Ausdrucks gibt es eine Kurzform: min = a < b ? a : b ; ■ Ist eine Kurzform für: if (a < b ) min = a; else min = b; ■ Allgemein: <bedingung> ? <wert wenn true> : <wert wenn false> ■ Nur verwenden, wenn nicht auf Kosten der Lesbarkeit! School of Engineering © G. Burkert, K. Rege, ZHAW 56 von 87 Wiederholungen School of Engineering © G. Burkert, K. Rege, ZHAW 57 von 87 Schleifen in Java School of Engineering © G. Burkert, K. Rege, ZHAW 58 von 87 Schleifen in Java: while ■ Form: while ( Bedingung ) Block ■ Bedingung: logischer Ausdruck, der wahr oder falsch ist ■ Block wird solange ausgeführt, wie die Bedingung erfüllt ist (evtl. gar nicht) ■ Block kann auch leer sein! School of Engineering © G. Burkert, K. Rege, ZHAW 59 von 87 Schleifen in Java: do..while ■ Form: do Block while ( Bedingung ); ■ Bedingung: logischer Ausdruck, der wahr oder falsch ist ■ Block wird mindestens einmal ausgeführt ■ Block wird danach solange ausgeführt, wie die Bedingung erfüllt ist (evtl. kein weiteres mal) School of Engineering © G. Burkert, K. Rege, ZHAW 60 von 87 Beispiel: do..while ■ Wir würfeln: int wurf = 0; int versuch = 0; do { wurf = (int)(Math.random()*6)+1; versuch++; System.out.println("Versuch " + versuch + " : " + wurf); } while( wurf != 6 ); School of Engineering © G. Burkert, K. Rege, ZHAW 61 von 87 Schleifen in Java: for ■ Form: for ( [ Initialisierung ] ; [ Bedingung ] ; [ Aufdatierung ] ) Block ■ Die for-Schleife ist primär dazu gedacht, einen Block eine fixe Anzahl mal zu wiederholen ■ Achtung: Unterschied zu C ■ In der Initialiserung der for-Schleife wird i.d.R. die Schleifenvariable deklariert for (int i = 0; i < 10; i++) { } School of Engineering © G. Burkert, K. Rege, ZHAW uC z d e i sch Unter ? 62 von 87 Verschachtelte Schleifen for (int rows = 0; rows < 3; rows++ ) { for (int counter = 0; counter < 8; counter++ ) { System.out.println("*"); } } ■ Schreibt 3 Reihen à 8 Sternchen ■ Die "Zweidimensionalität" drückt sich in zwei verschachtelten Schleifen aus School of Engineering © G. Burkert, K. Rege, ZHAW 63 von 87 break ■ Mit break kann eine Schleife vorzeitig beendet werden: Aus einer Schleife heraus springen ■ Bitte verwenden Sie dieses Konstrukt sparsam! ■ Beispiel: boolean found = false; for( int i = 0; i < liste.length; i++ ) { if( liste[i] == meineVar ) { found = true; break; } } School of Engineering © G. Burkert, K. Rege, ZHAW 64 von 87 continue ■ Mit continue kann der Rest eines Schleifenkörpers übersprungen werden ■ Bitte verwenden Sie dieses Konstrukt sparsam! ■ Beispiel: for( int i = 0; i < liste.length; i++ ) { if( liste[i] != meineVar ) continue; // sonst machen wir etwas Komplexes, // was viele Zeilen Code lang ist } School of Engineering © G. Burkert, K. Rege, ZHAW 65 von 87 Methoden und Parameterübergabe School of Engineering © G. Burkert, K. Rege, ZHAW 66 von 87 Einführung ■ Grosse (lange) Programme sind komplex ■ ■ ■ unübersichtlich aufwendig zu lesen und verstehen schwierig zu testen und debuggen (Fehler zu finden) ■ Wie kriegt man die Komplexität in den Griff School of Engineering © G. Burkert, K. Rege, ZHAW 67 von 87 Lösung komplexer Probleme ■ Idee: "Teile und herrsche" ■ Zwei Phasen: ■ ■ Analyse ■ Analyse ■ Design ■ ■ ?? Analyse Analyse Problem aufteilen in Teilprobleme Problem Problem Teillösungen für Teilprobleme finden Teillösungen zusammensetzen School of Engineering TeilTeilproblem problem TeilTeilproblem problem TeilTeilproblem problem TeilTeilproblem problem © G. Burkert, K. Rege, ZHAW Lösung Lösung Design Design ■ TeilTeillösung lösung TeilTeillösung lösung TeilTeillösung lösung TeilTeillösung lösung 68 von 87 Aufteilung in Unterprogramme ■ Umsetzung in prozeduraler Programmierung ■ Problem (Programmablauf) in Teilprobleme (Teilabläufe) aufteilen ■ Teillösungen für Teilprobleme suchen -> Unterprogramme (Funktionen -> Methoden) ■ Teillösungen zusammensetzen -> Hauptprogramm (main Funktion/Methode) ■ Vorteile der Aufteilung in Unterprogramme ■ Reduktion der Komplexität ■ Bessere Lesbarkeit ■ Erlaubt Denken in auf höheren Abstraktionsebene ■ Wiederverwendung -> kein redundanter Code School of Engineering © G. Burkert, K. Rege, ZHAW 69 von 87 Unterprogramm -> Methode ■ Unterprogramme haben ihren Ursprung in der prozeduralen Programmierung ■ In der objektorientierten Programmierung werden Unterprogramme durch Methoden realisiert ■ Objekte bestehen aus Daten und Methoden (Verhalten) ■ Methoden sind immer an ein Objekt/eine Klasse gebunden und übernehmen eine spezifisch Aufgabe für dieses Objekt z.B. Vogel.sucheFutter()‚ Fisch.sucheFutter() ■ Methoden können selber wieder andere Methoden aufrufen School of Engineering © G. Burkert, K. Rege, ZHAW 70 von 87 Beispiel public class Zufall { public static void main(String[] args) { int ergebnis; ergebnis = (int)(Math.random()*6)+1; System.out.println("Würfelzahl: " + ergebnis); ergebnis = (int)(Math.random()*49)+1; System.out.println("Lottozahl: " + ergebnis); } } School of Engineering © G. Burkert, K. Rege, ZHAW 71 von 87 Beispiel ■ Falls das Erzeugen von zufälligen ganzen Zahlen mehrfach benötigt wird (oder auch nur zum Verdeutlichen der Programmstruktur), sollte dieser Teil in eine Methode ausgelagert werden ■ Die Methode muss hier ebenfalls static sein (mehr dazu später) ■ Wenn sie für andere Klassen nicht zugänglich sein soll, fügt man sie als private Methode ein School of Engineering © G. Burkert, K. Rege, ZHAW 72 von 87 Beispiel public class Zufall { Reihenfolge Reihenfolgespielt spieltininJava Java keine keineRolle Rolle public static void main(String[] args) { System.out.println("Würfelzahl: " + zufallsZahl(1, 6)); System.out.println("Lottozahl: " + zufallsZahl(1, 49)); } private static int zufallsZahl(int von, int bis) { int ergebnis; ergebnis = (int)(Math.random() * (bis-von+1)) + von; return ergebnis; } } School of Engineering © G. Burkert, K. Rege, ZHAW 73 von 87 Weitere Beispiele public static int berechneFlaeche (int hoehe, int breite) {...} private static void vergrössern (double faktor) {...} public static void bremsen () {...} ■ Die Parameterliste kann leer sein! School of Engineering © G. Burkert, K. Rege, ZHAW 74 von 87 Methodenkopf (Signatur) private static int zufallsZahl (int von, int bis) ■ Methodenname: zufallsZahl ■ Parameterliste: (int von, int bis) ■ Parameterdeklarationen, durch Kommas getrennt ■ in runden Klammern unmittelbar nach dem Methodennamen ■ Parameterdeklaration sieht gleich aus wie die Deklaration lokaler Variablen ■ Methode mit leerer Parameterliste: methodenname () {...} School of Engineering © G. Burkert, K. Rege, ZHAW 75 von 87 Methodenkopf (Signatur) private static int zufallsZahl (int von, int bis) ■ Resultattyp ■ In Java kann jede Methode einen Wert zurückgeben ■ Der Resultattyp gibt den Datentyp des Rückgabewertes an, z.B. int oder double ■ void wird als Resultattyp verwendet, wenn eine Methode nichts zurückgibt ■ Zugriffsmodifikator (access control modifier) ■ public überall sichtbar (auch für andere Klassen; main Methode muss public sein) ■ private nur innerhalb derselben Klasse sichtbar ■ static: Methode kann auch Aufgerufen werden, ohne dass man eine Instanz (i.e. Objekt) erstellt. ■ main-Methode muss static sein ■ Methoden die von main direkt aufgerufen werden ebenfalls School of Engineering © G. Burkert, K. Rege, ZHAW 76 von 87 Methodenkörper (Body) ■ ist alles innerhalb der geschweiften Klammern { ... } nach dem Methodenkopf ■ Der Methodenkörper entspricht einem Block ■ Er besteht dementsprechend aus: ■ Deklaration lokaler Variablen (local variables) ■ Anweisungen School of Engineering © G. Burkert, K. Rege, ZHAW 77 von 87 Methodenaufruf (method invocation) ■ In Java muss für den Aufruf einer Methode der Name zusammen mit einer Parameterliste angegeben werden: zufallsZahl(1, 6) ■ Bezeichner: Kann ein Objektname oder Klassenname sein ■ Argumente (auch aktuelle Parameter genannt) können sein: Konstante Werte, Variablen und ganze Ausdrücke School of Engineering © G. Burkert, K. Rege, ZHAW 78 von 87 Parameterübergabe ■ Ausserhalb der Methode sind nur die Anzahl und Typ der Parameter bekannt, nicht die Namen der Parameter ■ Beim Aufruf der Methode muss die Anzahl der Argumente mit der Anzahl Parameter der Methode übereinstimmen ■ Es werden nur die Werte der Argumente, nicht die Argumente selbst an die Methode übergeben (pass by value) ■ Bei der Zuordnung von Argumenten zu den Parametern ist nur die Reihenfolge massgebend, nicht etwa die Namen School of Engineering © G. Burkert, K. Rege, ZHAW 79 von 87 Parameterübergabe ■ Compiler prüft, ob die Datentypen der Argumente mit den Parameter übereinstimmen ■ Innerhalb der Methode verhalten sich die Parameter genau wie lokale Variablen, die mit den übergebenen Argumentwerten initialisiert wurden. Die Werte der Parameter können deshalb in der Methode beliebig verändert werden. In der aufrufenden Methode verändern sich die Werte der Variablen dadurch nicht School of Engineering © G. Burkert, K. Rege, ZHAW 80 von 87 Rückgabe von Resultaten - return private static double gradNachRadiant (double grad ) { double radiant = grad * Math.PI / 180; return radiant; } ■ Falls der Resultattyp einer Methode nicht void ist, muss sie ein Resultat zurückgeben: return Ausdruck; ■ Der Datentyp des Rückgabewertes muss mit der Deklaration übereinstimmen. ■ Nach der return-Anweisung kehrt Programm sofort aus der Methode zurück School of Engineering © G. Burkert, K. Rege, ZHAW 81 von 87 Verwendung des Rückgabewerts ■ In der aufrufenden Methode muss der Rückgabewert der Methode direkt verwendet werden: double rad = gradNachRadiant(60.0) * 2.5; ■ Ablauf: ■ Die Methode gradNachRadiant() wird aufgerufen ■ Der Methodenaufruf in der Anweisung wird durch den Rückgabewert der aufgerufenen Methode ersetzt: double rad = 1.047197551196598 * 2.5; ■ Die Anweisung wird ausgeführt ■ Test: ■ Falls beim Ersetzen des Methodenaufrufs durch den Rückgabewert keine gültige Anweisung entsteht, ist der Methodenaufruf falsch School of Engineering © G. Burkert, K. Rege, ZHAW 82 von 87 Entwicklung einer Methode ■ Vorgehen ■ Genau festlegen, was Methode machen soll -> Methodenname festlegen ■ Welche Informationen braucht die Methode dazu? -> Parameterliste festlegen ■ Welche Resultate gibt die Methode zurück? -> Resultattyp festlegen School of Engineering © G. Burkert, K. Rege, ZHAW 83 von 87 Entwicklung einer Methode ■ Aufgabe: ■ Schreiben Sie eine Methode, die eine Rechteckfläche berechnet. ■ folgende Fragen sind offen: ■ Sinnvoller Namen ■ Datentyp der Parameter, Resultattyp? int (Pixel) ■ Was passiert mit negativen Parameterwerten? Fall wird nicht berücksichtigt School of Engineering © G. Burkert, K. Rege, ZHAW 84 von 87 Beispiel: Entwickeln einer Methode ■ Was soll die Methode machen? ■ Rechteckfläche berechnen aus Breite und Höhe Æ Name: rechteckFlaeche() ■ Parameterliste festlegen ■ Input: Breite, Höhe (negative Werte nicht beachten) ■ Datentyp int (da nur ganze Pixel darstellbar) ■ Æ int breite, int hoehe ■ Resultattyp festlegen ■ Æ int (Resultat < 2 Milliarden) School of Engineering © G. Burkert, K. Rege, ZHAW 85 von 87 Beispiel: Entwickeln einer Methode ■ Methode (und ev. bain dazu) schreiben public class Test { private static int rechteckFlaeche (int breite, int hoehe) { int flaeche = length * height; return flaeche; } public static void main(String[] args) { int f = rechteckFlaeche(4,4); System.out.println("Fläche = "+ f); } } School of Engineering © G. Burkert, K. Rege, ZHAW 86 von 87 Noch Fragen? School of Engineering © G. Burkert, K. Rege, ZHAW 87 von 87