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
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)
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)
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]
Array als Regal
Array als Regal
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 }
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 fester Länge
Aufgabe
Speichere die Farbe THM-Grün (128, 186, 36) in einem Array von drei ints 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 */
);
Arrays: Beispiel fester Länge
Aufgabe
Speichere die Farbe THM-Grün (128, 186, 36) in einem Array von drei ints 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 */
);
Arrays: Beispiel fester Länge
Aufgabe
Speichere die Farbe THM-Grün (128, 186, 36) in einem Array von drei ints 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 */
);
Arrays: Beispiel fester Länge
Aufgabe
Speichere die Farbe THM-Grün (128, 186, 36) in einem Array von drei ints 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 */
);
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−y1
x2−x1
Bonus: Verpacke deinen Code in eine Funktion, die zwei int-Arrays übernimmt und die Steigung als double zurückgibt.
Arrays: Beispiel variabler Länge
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 variabler Länge
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 variabler Länge
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 variabler Länge
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 variabler Länge
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 variabler Länge
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 ...
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.
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
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]);
} }
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]);
} }
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]);
} }
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?
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/| / \
Inhalt
Arrays
Wert- vs Referenzsemantik Einleitung
Nachmittag: Java-Objekte erstellen und verwenden
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;
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;
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;
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;
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
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
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?