Brückenkurs Programmieren
Tag 4: Arrays
Christopher Schölzel
Technische Hochschule Mittelhessen
5. September 2019
Inhalt
Arrays
Wert- vs Referenzsemantik Einleitung
Nachmittag: Java-Objekte erstellen und verwenden
Inhalt
Arrays
Wert- vs Referenzsemantik Einleitung
Nachmittag: Java-Objekte erstellen und verwenden
3 / 21
Arrays
Aufgabe
Finde 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, der I mehrere Wertespeichern kann
I adressierbarist (z.B. über einen Index)
Arrays
Aufgabe
Finde 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, der I mehrere Wertespeichern kann
I adressierbarist (z.B. über einen Index)
4 / 21
Arrays
Aufgabe
Finde 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, der I mehrere Wertespeichern kann
I adressierbarist (z.B. über einen Index)
Arrays
Aufgabe
Finde 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, der I mehrere Wertespeichern kann
I adressierbarist (z.B. über einen Index)
4 / 21
Arrays
Aufgabe
Finde 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, der I mehrere Werte speichern kann
I adressierbar ist (z.B. über einen Index)
Arrays: Definition, Datentyp, Adressierung
Definition
Ein Arrayist ein Datentyp, dermehrere Wertevomgleichen Typenthält.
Die Werte werden über einen ganzzahligen Indexadressiert (beginnend mit Index 0).
Arraytyp: Syntax Elementtyp[]
Arraytyp: Beispiele double[]
int[]
String[]
Arrayadressierung: Syntax variablenName[index]
Arrayadressierung: Beispiele doubleArray[0]
doubleArray[1]
doubleArray[i+1]
5 / 21
Array als Regal
Array als Regal
6 / 21
Array als Regal
Arrays: Erzeugung
Variante 1: Syntax new Elementtyp[Anzahl]
Variante 1: Beispiele new int[17]
new double[8]
new String[i+1]
Variante 2: Syntax new Elementtyp[]{
Element1, Element2, ... }
Variante 2: Beispiele
new int[]{ 1, 1, 2, 3, 5 } new double[]{3.1416, 2.7183} new String[]{
"Mr. "+name,
"Ms. "+name }
7 / 21
Arrays: Erzeugung
Variante 1: Syntax new Elementtyp[Anzahl]
Variante 1: Beispiele new int[17]
new double[8]
new String[i+1]
Variante 2: Syntax new Elementtyp[]{
Element1, Element2, ...
}
Variante 2: Beispiele
new int[]{ 1, 1, 2, 3, 5 } new double[]{3.1416, 2.7183}
new String[]{
"Mr. "+name,
"Ms. "+name }
Arrays: Beispiel
Aufgabe
Finde 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.
8 / 21
Arrays: Beispiel
Aufgabe
Finde 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.
Arrays: Beispiel
Aufgabe
Finde 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.
8 / 21
Arrays: Beispiel
Aufgabe
Finde 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.
Arrays: Beispiel
Aufgabe
Finde 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.
8 / 21
Arrays: Beispiel
Aufgabe
Finde 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.
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/Definieren
ar[3] = 10; // Beschreiben
System.out.println(ar[0]); // Auslesen
int l = ar.length; // Länge ermitteln
Bonus: Finde heraus, nach wie viel Schritten der Ursprungswert sich verdoppelt hat. Benutze dazu zuerst eine Schleife und finde dann eine bessere Methode.
9 / 21
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/Definieren
ar[3] = 10; // Beschreiben
System.out.println(ar[0]); // Auslesen
int l = ar.length; // Länge ermitteln
Bonus: Finde heraus, nach wie viel Schritten der Ursprungswert sich verdoppelt hat. Benutze dazu zuerst eine Schleife und finde dann eine bessere Methode.
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]);
} }
10 / 21
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]);
} }
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]);
} }
10 / 21
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]);
} }
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]);
} }
10 / 21
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 nurinnerhalb einer Variablendefinition, nicht wenn das Array später neu zugewiesen wird.
Aufgabe: ASCII-Art
Schreibe eine Funktion printAscii, die ein zweidimensionales Array vom Typ 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?
12 / 21
Aufgabe: ASCII-Art
Schreibe eine Funktion printAscii, die ein zweidimensionales Array vom Typ 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?
Inhalt
Arrays
Wert- vs Referenzsemantik Einleitung
Nachmittag: Java-Objekte erstellen und verwenden
13 / 21
Wert- vs Referenzsemantik
Erinnerung
Java unterscheidet zwischen primitiven Typen(z.B. int) und Referenztypen (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]);
Wertsemantik bei primitiven Typen
int a = 3;
int b;
b = a;
b = 4;
15 / 21
Wertsemantik bei primitiven Typen
int a = 3;
int b;
b = a;
b = 4;
Wertsemantik bei primitiven Typen
int a = 3;
int b;
b = a;
b = 4;
15 / 21
Wertsemantik bei primitiven Typen
int a = 3;
int b;
b = a;
b = 4;
Referenzsemantik bei Referenztypen
int[] a = new int[2];
a[0] = 3;
int[] b;
b = a;
b[0] = 4;
16 / 21
Referenzsemantik bei Referenztypen
int[] a = new int[2];
a[0] = 3;
int[] b;
b = a;
b[0] = 4;
Referenzsemantik bei Referenztypen
int[] a = new int[2];
a[0] = 3;
int[] b;
b = a;
b[0] = 4;
16 / 21
Referenzsemantik bei Referenztypen
int[] a = new int[2];
a[0] = 3;
int[] b;
b = a;
b[0] = 4;
Wert- vs Referenzsemantik: Zusammenfassung
DerInhaltvon Variablen unterscheidet sich je nach dem, welchen Typ die Variable hat.
I primitiver Typ: Variable enthält Wert I bei Zuweisung wird der Wert direkt kopiert
I Referenztyp: Variable enthält Referenzbzw. Zeiger I verweist auf Speicherstelle an der die Daten liegen I bei Zuweisung wird nur die Referenz kopiert I die Daten bleiben die selben
17 / 21
Wert- vs Referenzsemantik: Übungsaufgabe
Gemeinsam an der Tafel: Was steht im Speicher, wenn der folgende Code ausgeführt wurde?
float[] ypos;
float[] xpos;
ypos = new float[]{100, 150, 200};
xpos = ypos;
float x = xpos[1];
x *= 2;
ypos[1] += 1;
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
19 / 21
Inhalt
Arrays
Wert- vs Referenzsemantik Einleitung
Nachmittag: Java-Objekte erstellen und verwenden
Mögliche Themen zur Besprechung am Nachmittag
Java-Objekte verwenden
I 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?
21 / 21