Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1
Wichtig... Mittags Pommes... Praktikum A 230 C 207 (Madeleine) F 112 F 113 (Kevin) E 413 E 313 (Jan) Evaluation Lösungsbeispiele 2
Rückblick Rekursive Methoden Fakultät Summe Gerade/Ungerade Arrays Deklaration & Initialisierung Array-Ausgabe & Array-Benutzereingabe 3
Heutige Themen Mehr (Numerik-)Aufgaben Referenztypen Rechen(un)genauigkeit Zweidimensionale Arrays Heute Mittag und Freitag: Erste Einblicke in die objektorientierte Programmierung 4
Heutige Themen Referenztypen Mehr Numerik-Aufgaben Rechen(un)genauigkeit Zweidimensionale Arrays Erste Einblicke in die objektorientierte Programmierung 5
Referenztyp Array Sei unten das ein int-array der Länge 10, so besteht das Array aus zehn direkt aufeinanderfolgenden Speicherbereichen Arrays sind Referenztypen, d.h. die Array- Variable x in int[] x = {1, 2, 3}; ist eine Referenz, die auf die erste Komponente des Arrays zeigt 6
Referenztyp Array Da ein Array ein Referenztyp ist, wird durch eine Zuweisung keine Kopie angefertigt: int[] x = {1, 2, 3}; int[] y = x; // y ist Alias für x, d.h. y zeigt auf // den selben Speicherbereich wie x 7
Referenztyp Array Auch die Verwendung als Methodenparameter erzeugt nur einen Alias public static void main(string[] args) { int[] y = {1, 2, 3}; foo(y); } public static void foo(int[] x) { } // x ist das selbe Array wie y 8
Referenztyp Array Implikationen: Wird ein Array als Methodenparameter übergeben und ändert die Methode das Array, dann sind die Änderungen auch für den Aufrufer sichtbar Will man ein Array kopieren, so muss man ein neues Array gleichen Typs und gleicher Länge erzeugen und dann alle Komponenten einzeln kopieren siehe Übungsaufgabe E.5 9
Demo: ArrayAlsReferenztyp.java Aufgabe: Schreibe eine Methode loeschearray(), die ein int-array als Parameter erhält und alle Komponenten auf -1 setzt Die Methode soll keinen Rückgabewert haben, da das übergebene Array direkt modifiziert wird Teste die Methode, um zu zeigen, dass das übergebene Array tatsächlich modifiziert wurde 10
Demo: VektorRechnung.java Aufgabe: Schreibe eine Methode addvectors(), welche zwei gegebene Vektoren (int-arrays) addiert und den Ergebnisvektor als neues int-array liefert Die beiden übergebenen Vektoren sollen nicht modifiziert werden Der Vektorraum darf eine beliebige Dimension haben, d.h. die Vektoren dürfen beliebig lang sein, müssen aber gleich lang sein 11
Demo: VektorRechnung.java Aufgabe: Erweitere die Klasse VektorRechnung um eine Methode distance(), die einem die Entfernung zweier gegebener Punkte berechnet 12
Exkurs: Referenztyp String Auch Strings sind in Java Referenztypen Im Gegensatz zu Arrays können Strings nicht modifiziert werden Für alle Referenztypen gilt: == vergleicht nicht den Inhalt sondern nur die Referenz (d.h. die Speicheradresse) Strings kann man mit der equals()- Methode vergleichen, für Arrays muss man eine eigene Methode schreiben 13
Demo: StringGleichheit.java Diese Demo veranschaulicht, dass nur literale, inhaltlich gleiche Strings == sind Sobald ein String erst zur Laufzeit erzeugt wird, ist er mit hoher Wahrscheinlichkeit nicht mehr == zu einem String gleichen Inhalts Also: Strings immer mit equals() vergleichen, oder mit equalsignorecase(), fall Groß-/Kleinschreibung egal ist 14
Demo: ArrayUtils.java Aufgabe: Erweitere die Klasse ArrayUtils um drei Methoden arrayequals(), die jeweils 2 gegebene int-, long- bzw. double-arrays inhaltlich vergleichen 15
Demo: Fibonacci.java Aufgabe: Schreibe eine Methode fibonacci() die einen int n als Parameter erhält und dann ein int-array mit den ersten n Fibonacci-Zahlen zurückgibt Die erste Fibonacci-Zahl ist 0 Die zweite Fibonacci-Zahl ist 1 Die n-te Fibonacci-Zahl ist die Summe der (n- 2)-ten und (n-1)-ten Fibonacci-Zahl 16
Demo: Permutation.java Aufgabe: Lasst uns eine Methode permutation() schreiben, die 2 ints m und n (mit m <= n) als Parameter erhält und dann ein int-array der Länge m mit zufälligen Werten aus dem Intervall [1, n] liefert. Das Array darf keine Duplikate enthalten! Beispiel: Eine normale Lottoziehung 6 aus 49 kann dann mit permutation(6, 49) erfolgen 17
Mehrdimensionale Arrays Ein Array kann auch mehr als eine Dimension haben Ein mehrdimensionales Array ist ein Array, dessen Komponenten wieder Arrays sind Beispiel: Eine Matrix ist ein zweidimensionales Array Das Array an sich repräsentiert die Zeilen der Matrix, die einzelnen Komponenten-Arrays sind die Spalten 18
Mehrdim. Arrays: Deklaration Bei der Deklaration gibt die Anzahl der [] die Dimension an int[] l; // 1-dim. Array int[][] m; // 2-dim. Array int[][][] n; // 3-dim. Array int[][][][] o; // 4-dim. Array 19
Mehrdim. Arrays: Erzeugung Genau wie eindimensionale Arrays erfolgt die Erzeugung mit new: int[] l = new int[10]; // m ist eine 2x3-Matrix int[][] m = new int[2][3]; // n ist ein Quader der Breite 2, // Länge 3, und noch undef. Höhe int[][][] n = new int[2][3][]; 20
2-dim. Arrays: Erzeugung Auch mehrdimensionale Arrays können in der Literalform notiert werden: int[][] m = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // Frage: was ist m[1][2]? 21
Demo: Matrix.java Aufgabe: Schreibe eine Methode printmatrix(), die ein zweidimensionales int-array erhält und in der gewohnten Form ausgibt, also z.b. {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}} 22
Demo: Matrix.java Aufgabe: Schreibe eine Methode readintmatrix(), die zwei int-werte z und s erhält und dann eine zxs-matrix vom Benutzer einliest und zurückgibt 23
Zur Erinnerung: Matrizen Deklaration: int[][] m; Initialisierung: m = new int[zeilen][spalten]; Zugriff auf einen Wert der Matrix: m[zeile][spalte] Setzen des Werts einer Komponente: m[zeile][spalte] = wert; Frage: Was ist der Typ von m[z]? 24
Demo: Matrix.java Aufgabe: Schreibe eine Methode einheitsmatrix(), die eine natürliche Zahl n erhält und eine nxn-matrix zurückgibt, auf deren Diagonalen überall der Wert 1 ist, und alle anderen Werte 0 sind 25
2-dimensionale Arrays Ein zweidimensionales Array muss nicht notwendigerweise rechteckig, d.h. eine Matrix, sein int[][] x = {{1}, {1, 2}, {1, 2, 3}}; 26
Demo: DreiecksArray.java Aufgabe: Schreibe eine Methode dreiecksarray(), die eine natürliche Zahl n erhält und dann ein dreieckiges, zweidimensionales Array in der Form {{1}, {1, 2}, {1, 2, 3}} zurückgibt. 27