Einführung in die JavaProgrammierung Dr. Volker Riediger Tassilo Horn riediger|[email protected] WiSe 2012/13 1 Rückblick ● Schleifen ● ● ● while do-while for ● Methoden ● Verfahren: Intervallschachtelung 2 Wo sind meine Programme? ● ● ● ● Windows-Rechner in den Rechner-Räumen sind alle gleich (meistens...) Benutzerdaten (begrenzter Speicherplatz, ein paar 100 MB) zentral im Rechenzentrum, mit Datensicherung Unter Windows erreichbar über Laufwerksbuchstabe Z: Eclipse-Workspace normalerweise bei: Z:\nt\workspace 3 Beispiele in Eclipse importieren ● ● Nach dem Entpacken der ZIP-Datei javakurs-wise1213-demo.zip ist darin ein Ordner javakurs-wise1213-demo Dieser Ordner ist ein Eclipse-Projekt und kann so in Eclipse importiert werden ● File > Import... ● Existing Projects into workspace, [Next] ● Select root directory: Browse... Ordner suchen: javakurs-wise1213-demo ● Auswählen und [Finish] 4 Java-Namenskonventionen ● Klassennamen sind i.d.R. Substantive und werden in CamelCase mit Großbuchstabe am Anfang geschrieben ● ● ● ● ● ● EinMalEins, JConsole, Rechner, String Methodennamen sind i.d.R. Verbalphrasen (Verb und Objekt) oder mathematische Funktionen und werden in camelCase geschrieben printValue(), readInt(), sqrt(), sin(), cos(), wurzel() Variablennamen sind i.d.R. Substantive in camelCase mit Kleinbuchstabe am Anfangoder im Falle von mathematischen Funktionen die Formelzeichen zaehler, obereSchranke, x, y Konstanten werden wie Variablen benannt, aber vollständig in GROSSBUCHSTABEN geschrieben, Trennung mehrerer Teile durch _ EPSILON, MAX_VALUE Will man Programme weitergeben, so empfelt es sich, alle Bezeichner englisch zu schreiben Java unterstützt Unicode (Umlaute, Sonderzeichen, etc.), aber man sollte für Bezeichner besser nur normale Buchstaben und Zahlen, evtl. den Unterstrich _ 5 Themen der heutigen Vorlesung ● rekursive Methoden ● Arrays 7 Rekursive Methoden ● ● Methoden können sich auch selbst aufrufen (Rekursion) Viele mathematischen Funktionen sind rekursiv defniert, z.B. die Fakultät: 8 Rekursive Methoden ● Eine rekursive Defnition hat immer einen nicht-rekursiven Basisfall (Abbruchbedingung) 9 Rekursive Methoden 4! = 4 * 3! = 4 * 3 * 2! = 4 * 3 * 2 * 1! = 4 * 3 * 2 * 1 * 0! = 4 * 3 * 2 * 1 * 1 = 4 * 3 * 2 * 1 = 4 * 3 * 2 = 4 * 6 = 24 Rekursionstiefe 10 Demo: Rekursion.java ● Aufgabe: Schreibe eine Methode fact(), welche die Fakultät einer gegebenen natürlichen Zahl n rekursiv berechnet 11 Rekursive Methoden ● ● ● ● Beim Aufruf einer rekursiven Methode wird die Aufrufstelle (Rücksprungadresse) und aktuellen Parameter auf dem Stack der JavaMaschine gespeichert Je höher die Rekursionstiefe, desto mehr Speicher wird verbraucht Ab einer gewissen Rekursionstiefe (~1500) wirft die Java-Maschine einen StackOverflowError Für die meisten Programme ist das aber kein Problem 12 Rekursive Methoden ● Rekursion und Schleifen sind äquivalent in ihrer Mächtigkeit ● ● ● Jedes Programm mit Schleifen kann in ein rekursives Programm ohne Schleifen überführt werden Jedes rekursive Programm kann in ein Programm ohne Rekursion mit Schleifen überführt werden Es gibt einige Programmiersprachen, die tatsächlich keine Schleifen enthalten, funktionale Sprachen: Haskell, Scheme,... 13 Demo: Summe.java ● ● Aufgabe: Schreibe eine Methode summeVonBis() die zwei Ganzzahlen a und b erhält und die Summe aller Zahlen von a bis b zurückgibt. (Aufgabe C1/C2) Schreibe eine äquivalente Methode summeVonBisRekursiv(), welche die gleiche Summe mittels Rekursion berechnet. 14 Wechselseitige Rekursion ● ● Eine Funktion kann auch rekursiv sein, ohne sich selbst direkt aufzurufen Demo: GeradeUngerade.java: ● 0 ist eine gerade Zahl ● n ist gerade, wenn n-1 ungerade ist ● n ist ungerade, wenn n-1 gerade ist 15 Demo: Hofstadter.java ● Aufgabe: Schreibe ein Klasse Hofstadter mit zwei Methoden male() und female(), die jeweils einen long n erhalten und dann die n-te Zahl der jeweiligen Folge zurückgibt 16 Für die Mittagspause http://www.stupidedia.org/stupi/Rekursiv 17 Arrays ● Viele mathematische Probleme müssen Vektoren (oder Matrizen) verarbeiten ● ● Vektoren im zweidimensionalen Raum (R²) bestehen aus einem x- und einem y-Wert Vektoren im dreidimensionalen Raum (R³) bestehen aus einem x-, einem y- und einem z-Wert (Länge, Höhe, Breite) 18 Arrays ● ● Beispiel: Sei p1 ein Punkt im zweidimensionalen Raum mit den Koordinaten (1, 2) und p2 ein Punkt mit den Koordinaten (3, 4) Mit dem bisher bekannten Stof können wir einen Punkt mit jeweils 2 einzelnen Variablen darstellen: int p1_x = 1; int p1_y = 2; // Punkt p1 int p2_x = 3; int p2_y = 4; // Punkt p2 // Punkte p1 und p2 addieren int p3_x = p1_x + p2_x; int p3_y = p1_y + p2_y; ● ● Noch schlimmer wird es, wenn wir viele Punkte in der Berechnung oder höhere Dimensionen benötigen. Für einen Punkt aus dem R^n benötigen wir hier n Variablen 19 Arrays ● Ein weiteres Problem: Wir können keine Methode schreiben, die 2 Vektoren/Punkte addiert static ??? add2DPoints(int p1_x, int p1_y, int p2_x, int p2_y) { int p3_x = p1_x + p2_x; int p3_y = p1_y + p2_y; return ???; } ● Was ist der Ergebnistyp dieser Methode? Man müsste ja eigentlich 2 Werte zurückgeben, aber das geht in Java nicht. 20 Arrays ● ● ● ● ● Die Lösung sind Arrays (Felder) Ein Array ist eine nummerierte Sammlung von Werten genau eines Typs (alle Komponenten haben den selben Typ) Die einzelnen Komponenten werden über ihren Index angesprochen Der Index beginnt bei 0 und endet bei der Länge des Arrays – 1 Die Länge eines Arrays ist mit der Deklaration festgelegt und kann nicht verändert werden 21 Arrays ● Beispiel: Ein Array der Länge 10 (Typ unbekannt) 22 Arrays deklarieren ● Arrays werden wie Variablen deklariert, allerdings wird dem Element-Typ ein [] nachgestellt: // Uninitialisierte Arrays, Länge // noch nicht festgelegt int[] intArray; long[] longArray; double[] doubleArray; 23 Arrays deklarieren und initialisieren ● ● Wie Variablen können Arrays direkt bei der Deklaration initialisiert werden Jedes Array kennt seine Länge int[] p1 = {1, 2}; System.out.println(p1.length) // ?? double[] p2 = {3.3, 7.9, -1.0}; System.out.println(p2.length) // ?? 24 Index-Zugrif ● ● Auf die einzelnen Elemente des Arrays wird per Index zugegrifen Ist der Index nicht gültig, d.h. < 0 oder >= als die Array-Länge, wird eine ArrayIndexOutOfBoundsException geworfen double[] p = {3.3, 7.9, -1.0}; // p[0] = 3.3,p[1] = 7.9,p[2] = -1.0 25 Demo: ArrayUtils.java ● Aufgabe: Schreibe eine Klasse ArrayUtils, die 3 Methoden void printArray(int[] a) void printArray(long[] a) void printArray(double[] a) enthält. Diese Methoden sollen das übergebene Array einfach in der Form {1, 2, 3, 4} auf der Standardausgabe ausgeben. 26 Arrays zur Laufzeit initialisieren ● In den meisten Programmen wollen wir zur Laufzeit Arrays beliebiger Länge erzeugen int[] oneToThree = new int[3]; // Speicher zuweisen, Array-Länge // Nach der Speicherzuweisung haben alle // Komponenten den Standartwert des jeweiligen // Typs, also 0 bei int. oneToThree[0] = 1; // Eigene Werte zuweisen oneToThree[1] = 2; oneToThree[2] = 3; 27 Demo: ArrayUtils.java ● Aufgabe: Füge der Klasse ArrayUtils die 3 Methoden int[] readIntArray(int n) long[] readLongArray(int n) double[] readDoubleArray(int n) hinzu. Diese Methoden sollen mittels JConsole n Werte des jeweiligen Typs einlesen und als Array zurückliefern. 28