Einführung in die JavaProgrammierung Dr. Volker Riediger Tassilo Horn riediger|[email protected] 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 ArrayVariable 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 (n2)-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