Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Brückenkurs ProgrammierenTag 4: Arrays
Christopher SchölzelTechnische Hochschule Mittelhessen5. September 2019
Inhalt
Arrays
Wert- vs ReferenzsemantikEinleitung
Nachmittag: Java-Objekte erstellen und verwenden
2 / 23
Inhalt
Arrays
Wert- vs ReferenzsemantikEinleitung
Nachmittag: Java-Objekte erstellen und verwenden
3 / 23
Arrays
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int q1,q2,q3,q4, ... , q100;for(int i = 1; i <= 100; i++) {if (i == 1) { q1 = i*i; }else if (i == 2) { q2 = i*i; }...else if (i == 99) { q99 = i*i; }else { q100 = i*i; }
}
⇒ wir brauchen einen Datentyp, derI mehrere Werte speichern kannI adressierbar ist (z.B. über einen Index)
4 / 23
Arrays
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int q1,q2,q3,q4, ... , q100;for(int i = 1; i <= 100; i++) {
if (i == 1) { q1 = i*i; }else if (i == 2) { q2 = i*i; }...else if (i == 99) { q99 = i*i; }else { q100 = i*i; }
}
⇒ wir brauchen einen Datentyp, derI mehrere Werte speichern kannI adressierbar ist (z.B. über einen Index)
4 / 23
Arrays
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int q1,q2,q3,q4, ... , q100;for(int i = 1; i <= 100; i++) {
if (i == 1) { q1 = i*i; }else if (i == 2) { q2 = i*i; }...else if (i == 99) { q99 = i*i; }else { q100 = i*i; }
}
⇒ wir brauchen einen Datentyp, derI mehrere Werte speichern kannI adressierbar ist (z.B. über einen Index)
4 / 23
Arrays
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int q1,q2,q3,q4, ... , q100;for(int i = 1; i <= 100; i++) {
if (i == 1) { q1 = i*i; }else if (i == 2) { q2 = i*i; }...else if (i == 99) { q99 = i*i; }else { q100 = i*i; }
}
⇒ wir brauchen einen Datentyp, derI mehrere Werte speichern kannI adressierbar ist (z.B. über einen Index)
4 / 23
Arrays
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int q1,q2,q3,q4, ... , q100;for(int i = 1; i <= 100; i++) {
if (i == 1) { q1 = i*i; }else if (i == 2) { q2 = i*i; }...else if (i == 99) { q99 = i*i; }else { q100 = i*i; }
}
⇒ wir brauchen einen Datentyp, derI mehrere Werte speichern kannI adressierbar ist (z.B. über einen Index)
4 / 23
Arrays: Definition, Datentyp, Adressierung
DefinitionEin Array ist ein Datentyp, der mehrere Werte vom gleichen Typ enthält.Die Werte werden über einen ganzzahligen Index adressiert (beginnendmit Index 0).
Arraytyp: SyntaxElementtyp[]
Arraytyp: Beispieledouble[]int[]String[]
Arrayadressierung: SyntaxvariablenName[index]
Arrayadressierung: BeispieledoubleArray[0]doubleArray[1]doubleArray[i+1]
5 / 23
Array als Regal
6 / 23
Array als Regal
6 / 23
Array als Regal
6 / 23
Arrays: Erzeugung
Variante 1: Syntaxnew Elementtyp[Anzahl]
Variante 1: Beispielenew int[17]new double[8]new String[i+1]
Variante 2: Syntaxnew Elementtyp[]{Element1,Element2, ...
}
Variante 2: Beispielenew int[]{ 1, 1, 2, 3, 5 }new double[]{3.1416, 2.7183}new String[]{"Mr. "+name,"Ms. "+name
}
7 / 23
Arrays: Erzeugung
Variante 1: Syntaxnew Elementtyp[Anzahl]
Variante 1: Beispielenew int[17]new double[8]new String[i+1]
Variante 2: Syntaxnew Elementtyp[]{Element1,Element2, ...
}
Variante 2: Beispielenew int[]{ 1, 1, 2, 3, 5 }new double[]{3.1416, 2.7183}new String[]{"Mr. "+name,"Ms. "+name
}
7 / 23
Arrays: Beispiel fester Länge
AufgabeSpeichere die Farbe THM-Grün (128, 186, 36) in einem Array von dreiint s und gib sie dann im Hexadezimalformat aus.
int[] thmGreen = new int[3]; /* neues Array mit 3 ints anlegen */thmGreen[0] = 128; /* Rotkanal setzen */thmGreen[1] = 186; /* Grünkanal setzen */thmGreen[2] = 36; /* Blaukanal setzen */System.out.println(
Integer.toString(thmGreen[0], 16) /* Rot als Hex */+ Integer.toString(thmGreen[1], 16) /* Grün als Hex */+ Integer.toString(thmGreen[2], 16) /* Blau als Hex */
);
8 / 23
Arrays: Beispiel fester Länge
AufgabeSpeichere die Farbe THM-Grün (128, 186, 36) in einem Array von dreiint s und gib sie dann im Hexadezimalformat aus.
int[] thmGreen = new int[3]; /* neues Array mit 3 ints anlegen */thmGreen[0] = 128; /* Rotkanal setzen */thmGreen[1] = 186; /* Grünkanal setzen */thmGreen[2] = 36; /* Blaukanal setzen */System.out.println(
Integer.toString(thmGreen[0], 16) /* Rot als Hex */+ Integer.toString(thmGreen[1], 16) /* Grün als Hex */+ Integer.toString(thmGreen[2], 16) /* Blau als Hex */
);
8 / 23
Arrays: Beispiel fester Länge
AufgabeSpeichere die Farbe THM-Grün (128, 186, 36) in einem Array von dreiint s und gib sie dann im Hexadezimalformat aus.
int[] thmGreen = new int[3]; /* neues Array mit 3 ints anlegen */thmGreen[0] = 128; /* Rotkanal setzen */thmGreen[1] = 186; /* Grünkanal setzen */thmGreen[2] = 36; /* Blaukanal setzen */System.out.println(
Integer.toString(thmGreen[0], 16) /* Rot als Hex */+ Integer.toString(thmGreen[1], 16) /* Grün als Hex */+ Integer.toString(thmGreen[2], 16) /* Blau als Hex */
);
8 / 23
Arrays: Beispiel fester Länge
AufgabeSpeichere die Farbe THM-Grün (128, 186, 36) in einem Array von dreiint s und gib sie dann im Hexadezimalformat aus.
int[] thmGreen = new int[3]; /* neues Array mit 3 ints anlegen */thmGreen[0] = 128; /* Rotkanal setzen */thmGreen[1] = 186; /* Grünkanal setzen */thmGreen[2] = 36; /* Blaukanal setzen */System.out.println(
Integer.toString(thmGreen[0], 16) /* Rot als Hex */+ Integer.toString(thmGreen[1], 16) /* Grün als Hex */+ Integer.toString(thmGreen[2], 16) /* Blau als Hex */
);
8 / 23
Aufgabe: Steigungsdreieck
1. Speichere den Punkt (0, 5) in einem int -Array namens p1 .2. Speichere den Punkt (3, 11) in einem int -Array namens p2 .3. Berechne die Steigung zwischen p1 und p2 mit der folgenden Formel.
Steigung zwischen (x1, y1) und (x2, y2) =y2 − y1x2 − x1
Bonus: Verpacke deinen Code in eine Funktion, die zwei int -Arraysübernimmt und die Steigung als double zurückgibt.
9 / 23
Arrays: Beispiel variabler Länge
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int[] sq = new int[100];for(int i = 0; i < sq.length; i++) {sq[i] = (i+1)*(i+1);
}System.out.println(sq[7]);
1. Erzeuge ein Array von 100 Ganzzahlen.
2. Fülle das Array mit Quadratzahlen.I Index 0: 12
I Index 1: 22
I Index 2: 32
I ...3. Test: Gib das Element an Index 7 aus.
10 / 23
Arrays: Beispiel variabler Länge
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int[] sq = new int[100];for(int i = 0; i < sq.length; i++) {sq[i] = (i+1)*(i+1);
}System.out.println(sq[7]);
1. Erzeuge ein Array von 100 Ganzzahlen.
2. Fülle das Array mit Quadratzahlen.I Index 0: 12
I Index 1: 22
I Index 2: 32
I ...3. Test: Gib das Element an Index 7 aus.
10 / 23
Arrays: Beispiel variabler Länge
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int[] sq = new int[100];for(int i = 0; i < sq.length; i++) {sq[i] = (i+1)*(i+1);
}System.out.println(sq[7]);
1. Erzeuge ein Array von 100 Ganzzahlen.2. Fülle das Array mit Quadratzahlen.
I Index 0: 12
I Index 1: 22
I Index 2: 32
I ...
3. Test: Gib das Element an Index 7 aus.
10 / 23
Arrays: Beispiel variabler Länge
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int[] sq = new int[100];for(int i = 0; i < sq.length; i++) {sq[i] = (i+1)*(i+1);
}System.out.println(sq[7]);
1. Erzeuge ein Array von 100 Ganzzahlen.2. Fülle das Array mit Quadratzahlen.
I Index 0: 12
I Index 1: 22
I Index 2: 32
I ...
3. Test: Gib das Element an Index 7 aus.
10 / 23
Arrays: Beispiel variabler Länge
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int[] sq = new int[100];for(int i = 0; i < sq.length; i++) {sq[i] = (i+1)*(i+1);
}System.out.println(sq[7]);
1. Erzeuge ein Array von 100 Ganzzahlen.2. Fülle das Array mit Quadratzahlen.
I Index 0: 12
I Index 1: 22
I Index 2: 32
I ...3. Test: Gib das Element an Index 7 aus.
10 / 23
Arrays: Beispiel variabler Länge
AufgabeFinde die Quadrate aller Zahlen von 1 bis 100.
int[] sq = new int[100];for(int i = 0; i < sq.length; i++) {sq[i] = (i+1)*(i+1);
}System.out.println(sq[7]);
1. Erzeuge ein Array von 100 Ganzzahlen.2. Fülle das Array mit Quadratzahlen.
I Index 0: 12
I Index 1: 22
I Index 2: 32
I ...3. Test: Gib das Element an Index 7 aus.
10 / 23
Aufgabe: Zinseszinsen
1. Erstelle ein Array von 100 Fließkommazahlen.2. Schreibe den Wert 1000 an die erste Stelle des Arrays.3. Fülle das restliche Array, indem du immer den Wert des vorherigen
Elements mit 1.01 multiplizierst.
Erinnerung: Arraydefinition und -zugriff
int[] ar = new int[10]; // Erzeugen/Definierenar[3] = 10; // BeschreibenSystem.out.println(ar[0]); // Auslesenint l = ar.length; // Länge ermitteln
Bonus: Finde heraus, nach wie viel Schritten der Ursprungswert sichverdoppelt hat. Benutze dazu zuerst eine Schleife und finde dann einebessere Methode.
11 / 23
Aufgabe: Zinseszinsen
1. Erstelle ein Array von 100 Fließkommazahlen.2. Schreibe den Wert 1000 an die erste Stelle des Arrays.3. Fülle das restliche Array, indem du immer den Wert des vorherigen
Elements mit 1.01 multiplizierst.
Erinnerung: Arraydefinition und -zugriff
int[] ar = new int[10]; // Erzeugen/Definierenar[3] = 10; // BeschreibenSystem.out.println(ar[0]); // Auslesenint l = ar.length; // Länge ermitteln
Bonus: Finde heraus, nach wie viel Schritten der Ursprungswert sichverdoppelt hat. Benutze dazu zuerst eine Schleife und finde dann einebessere Methode.
11 / 23
Mehrdimensionale Arrays
Frage: Was hält uns davon ab, den Typ int[][] zu verwenden?
Antwort: Gar nichts.
Beispiel
int[][] ar = new int[][]{new int[]{1, 2, 3},new int[]{4, 5, 6},new int[]{7, 8, 9}
};for(int row=0; row < ar.length; row++) {
for(int column=0; column < ar[row].length; column++) {System.out.println(ar[row][column]);
}}
12 / 23
Mehrdimensionale Arrays
Frage: Was hält uns davon ab, den Typ int[][] zu verwenden?
Antwort: Gar nichts.
Beispiel
int[][] ar = new int[][]{new int[]{1, 2, 3},new int[]{4, 5, 6},new int[]{7, 8, 9}
};for(int row=0; row < ar.length; row++) {
for(int column=0; column < ar[row].length; column++) {System.out.println(ar[row][column]);
}}
12 / 23
Mehrdimensionale Arrays
Frage: Was hält uns davon ab, den Typ int[][] zu verwenden?
Antwort: Gar nichts.
Beispiel
int[][] ar = new int[][]{new int[]{1, 2, 3},new int[]{4, 5, 6},new int[]{7, 8, 9}
};for(int row=0; row < ar.length; row++) {
for(int column=0; column < ar[row].length; column++) {System.out.println(ar[row][column]);
}}
12 / 23
Mehrdimensionale Arrays
Frage: Was hält uns davon ab, den Typ int[][] zu verwenden?
Antwort: Gar nichts.
Beispiel
int[][] ar = new int[][]{new int[]{1, 2, 3},new int[]{4, 5, 6},new int[]{7, 8, 9}
};for(int row=0; row < ar.length; row++) {
for(int column=0; column < ar[row].length; column++) {System.out.println(ar[row][column]);
}}
12 / 23
Mehrdimensionale Arrays
Frage: Was hält uns davon ab, den Typ int[][] zu verwenden?
Antwort: Gar nichts.
Beispiel
int[][] ar = new int[][]{new int[]{1, 2, 3},new int[]{4, 5, 6},new int[]{7, 8, 9}
};for(int row=0; row < ar.length; row++) {
for(int column=0; column < ar[row].length; column++) {System.out.println(ar[row][column]);
}}
12 / 23
Arraydefinition: Kurzschreibweise
Langschreibweise
int[][] ar = new int[][]{new int[]{1, 2, 3},new int[]{4, 5, 6},new int[]{7, 8, 9}
};
Kurzschreibweise
int[][] ar = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};
Achtung: Das funktioniert nur innerhalb einer Variablendefinition, nichtwenn das Array später neu zugewiesen wird.
13 / 23
Aufgabe: ASCII-ArtSchreibe eine Funktion printAscii , die ein zweidimensionales Array vomTyp char[][] als „Bild“ auf der Konsole ausgibt.
Beispiel
jshell> char[][] image = {{ '\\', 'o' ,'/' },{ ' ', '|' ,' ' },{ '/', ' ', '\\' }
};jshell> printAscii(image);\o/|/ \
Bonus: Schaffst Du das auch mit einem eindimensionalen Array?
14 / 23
Aufgabe: ASCII-ArtSchreibe eine Funktion printAscii , die ein zweidimensionales Array vomTyp char[][] als „Bild“ auf der Konsole ausgibt.
Beispiel
jshell> char[][] image = {{ '\\', 'o' ,'/' },{ ' ', '|' ,' ' },{ '/', ' ', '\\' }
};jshell> printAscii(image);\o/|/ \
Bonus: Schaffst Du das auch mit einem eindimensionalen Array?
14 / 23
Inhalt
Arrays
Wert- vs ReferenzsemantikEinleitung
Nachmittag: Java-Objekte erstellen und verwenden
15 / 23
Wert- vs Referenzsemantik
Erinnerung
Java unterscheidet zwischen primitiven Typen (z.B. int ) undReferenztypen (Arrays und Klassen).
Frage: Produzieren die beiden folgenden Codestücke die gleiche Ausgabe?
int a = 3;int b;b = a;b = 4;System.out.println(a);
int[] a = new int[2];a[0] = 3;int[] b;b = a;b[0] = 4;System.out.println(a[0]);
16 / 23
Wertsemantik bei primitiven Typen
int a = 3;
int b;
b = a;
b = 4;
17 / 23
Wertsemantik bei primitiven Typen
int a = 3;
int b;
b = a;
b = 4;
17 / 23
Wertsemantik bei primitiven Typen
int a = 3;
int b;
b = a;
b = 4;
17 / 23
Wertsemantik bei primitiven Typen
int a = 3;
int b;
b = a;
b = 4;
17 / 23
Referenzsemantik bei Referenztypen
int[] a = new int[2];a[0] = 3;
int[] b;
b = a;
b[0] = 4;
18 / 23
Referenzsemantik bei Referenztypen
int[] a = new int[2];a[0] = 3;
int[] b;
b = a;
b[0] = 4;
18 / 23
Referenzsemantik bei Referenztypen
int[] a = new int[2];a[0] = 3;
int[] b;
b = a;
b[0] = 4;
18 / 23
Referenzsemantik bei Referenztypen
int[] a = new int[2];a[0] = 3;
int[] b;
b = a;
b[0] = 4;
18 / 23
Wert- vs Referenzsemantik: Zusammenfassung
Der Inhalt von Variablen unterscheidet sich je nach dem, welchen Typ dieVariable hat.
I primitiver Typ: Variable enthält WertI bei Zuweisung wird der Wert direkt kopiert
I Referenztyp: Variable enthält Referenz bzw. ZeigerI verweist auf Speicherstelle an der die Daten liegenI bei Zuweisung wird nur die Referenz kopiertI die Daten bleiben die selben
19 / 23
Wert- vs Referenzsemantik: Übungsaufgabe
Gemeinsam an der Tafel: Was steht im Speicher, wenn der folgende Codeausgeführt wurde?
float[] ypos;float[] xpos;
ypos = new float[]{100, 150, 200};xpos = ypos;
float x = xpos[1];x *= 2;ypos[1] += 1;
20 / 23
Zusammenfassung
Arrays: Erzeugung
double[] dar = new double[4];int[] iar = new int[]{1,3};int[] iar2 = {7, 8, 1};
Arrays: Zugriff
dar[0] = 1.8;iar[1] = iar[0]+1;int l = iar.length;
Mehrdimensionale Arrays
int[][] matrix = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
}matrix[0][2] = 0; // 3 -> 0
21 / 23
Inhalt
Arrays
Wert- vs ReferenzsemantikEinleitung
Nachmittag: Java-Objekte erstellen und verwenden
22 / 23
Mögliche Themen zur Besprechung am Nachmittag
Java-Objekte verwendenI Wie erstelle ich eine Variable vom Typ Random , Scanner oder
StringBuilder ?I Was heißt null ?I Was macht der Operator . ?I Wie finde ich heraus, was ein Objekt von einem bestimmten Typ kann?
23 / 23