Dietrich Boles
Dietrich Boles
Dietrich Boles
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Programmierkurs Java<br />
Vorlesung<br />
am FB Informatik<br />
der Universität Oldenburg<br />
Vorlesung 8<br />
<strong>Dietrich</strong> <strong>Boles</strong><br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 1
Gliederung von Vorlesung 8<br />
Strukturierte Datentypen<br />
Felder<br />
– Motivation<br />
– Anmerkungen<br />
– Definition<br />
– Erzeugung<br />
– Zugriff<br />
– Initialisierung<br />
– Zerstörung<br />
– mehrdimensionale Felder<br />
– Beispiel<br />
Referenzdatentypen<br />
– Motivation<br />
– Zuweisung<br />
– Parameter<br />
– Funktionsrückgabewerte<br />
– lokale Variablen<br />
– Beispiel<br />
Verbunde<br />
– Motivation<br />
– Verbundtypdefinition<br />
– Verbundvariablen<br />
– Zugriff auf Verbunde<br />
– Beispiel<br />
Beispielprogramme<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 2
Strukturierte Datentypen<br />
bisher: einfache Datentypen (int, float, char, ...)<br />
Benutzung: Speicherung von „einfachen“ Daten in „einfachen“<br />
Variablen<br />
häufig: besonderer Zusammenhang zwischen bestimmten Daten<br />
Beispiele:<br />
– Menge von Zahlen, die zu sortieren sind<br />
– Verwaltung von Personendaten (Name, Alter, Adresse, ...)<br />
Strukturierte Datentypen: Zusammenfassung mehrerer Daten zu<br />
einer Einheit<br />
– Felder: Daten desselben Typs<br />
– Verbunde: Daten mit u.U. unterschiedlichem Typ<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 3
Felder / Motivation<br />
Definition:<br />
Ein Feld repräsentiert ein homogenes kartesisches Produkt zur<br />
Aufnahme mehrere Daten des gleichen Typs (genannt Elementtyp),<br />
wobei auf die Komponenten mit Hilfe eines Index zugegriffen wird.<br />
Synomyme:<br />
Array, Tupel, Matrix, Vektor, Tabelle<br />
0<br />
1<br />
2<br />
0 1 2 3 4<br />
2 -2 67 2 90<br />
33 3 -6 5 2<br />
4 2 2 78 93<br />
3 x 5 - Matrix (2-dimensional)<br />
Elementtyp: int<br />
3 Zeilen, 5 Spalten<br />
Numerierung beginnt bei 0<br />
m[0][0] == 2<br />
m[0][2] == 67<br />
m[5][5] → Laufzeitfehler<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 4
Felder / Anmerkungen<br />
Alternative zu Arrays: int v1, v2, v3, ..., v1000; ?????<br />
– was ist bei 100.000 Elementen?<br />
– es existiert kein Zusammenhang (Index)!<br />
Elementtyp ist fest<br />
Dimension ist fest<br />
1-, 2-, ..., n-dimensionale Arrays erlaubt<br />
Zugriff über n-dimensionalen Index<br />
random-access-Zugriff (alternativ: sequentiell → Dateien auslesen)<br />
Arrays sind in Java Referenzdatentypen (wie Objekte)<br />
Arrays werden in Java dynamisch erzeugt<br />
Arrays werden in Java automatisch gelöscht, wenn sie nicht mehr benutzt<br />
werden (können)<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 5
Felder / Definition einer Feldvariablen<br />
::= <br />
← Elementtyp<br />
„[“ „]“ { „[“ „]“ } ← Dimension<br />
{ „,“ }<br />
„;“<br />
Beispiele:<br />
int[] vektor1; // ElemTyp: int, Dim: 1<br />
float[][] matrix1; // ElemTyp: float, Dim: 2<br />
char[] buchstaben; // ElemTyp: char, Dim: 1<br />
double[][][] quader1, quader2;<br />
// ElemTyp: double, Dim: 3<br />
char ziffern[]; // Definitionsalternative!<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 6
Felder / Definition einer Feldvariablen<br />
Unterscheidung zwischen den eigentlichen Felder und den Feldvariablen<br />
Feldvariablen speichern die Adresse des eigentlichen Feldes<br />
Felder werden auf dem Heap angelegt<br />
bei der Definition einer Feldvariablen wird kein Speicherplatz für das Feld<br />
selbst angelegt<br />
vielmehr wird ein Speicherbereich reserviert, dem mittels des new-Operators<br />
Adressen zugewiesen werden können (→ Zeiger, Felderzeugung)<br />
man kann die Adressen weder auslesen noch auf den Adressen Operationen<br />
ausführen (wie bspw. in C oder C++)<br />
Default-Initialisierung einer Feldvariablen mit dem Literal null<br />
auch explizite Initialisierung möglich: int[] zahlen = null;<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 7
Felder / Erzeugung eines Feldes<br />
::= „=“ „new“ <br />
„[“ „]“<br />
{ „[“ „]“ }<br />
„;“<br />
Nebenbedingung/Anmerkungen:<br />
– Elementyp und Dimension müssen mit der Definition der vorher definierten<br />
Feldvariablen übereinstimmen<br />
– int-Ausdrücke bestimmen die Anzahl an Elementen der jeweiligen Dimension<br />
– Feldelemente werden nicht implizit initialisiert!<br />
Beispiele:<br />
int[] vektor1;<br />
vektor1 = new int[8];<br />
// Reservierung von 8 Speicherplätzen für int-Variablen<br />
int i = 3;<br />
float[][] vektor2 = new float[i][2];<br />
// Reservierung von 3*2 Speicherplätzen für float-Variablen<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 8
Felder / Erzeugung eines Feldes<br />
Schema:<br />
Stack oder Heap<br />
Heap<br />
„Zeiger“<br />
<br />
0 1 2 3 4 5 6 7<br />
0<br />
1<br />
2<br />
0 1<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 9
Felder / Zugriff auf Feldelemente<br />
::= <br />
„[“ „]“<br />
{ „[“ „]“ }<br />
Nebenbedingungen / Anmerkungen:<br />
– Bezeichner muss gültige Feldvariable sein<br />
– int-Ausdruck muß Wert zwischen 0 und der Anzahl der Elemente - 1 der<br />
jeweiligen Dimension liefern (→ Laufzeitfehler!)<br />
– Zugriff auf Feldelemente nennt man Indexierung<br />
Beispiele:<br />
int[] vek = new int[5];<br />
vek[0] = -23;<br />
vek[1] = vek[0] + 25;<br />
vek[vek[1]] = -4;<br />
vek[5] = 56; // Laufzeitfehler!<br />
vek<br />
0 1 2 3 4<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 10
Felder / Initialisierung der Feldelemente<br />
Explizite Initialisierung:<br />
int[] vektor = new int[5];<br />
for (int i=0; i
Felder / Initialisierung der Feldelemente<br />
Implizite Erzeugung und Initialisierung:<br />
int i = 3;<br />
int[] vektor = {0, 1, 4, i*i, 16};<br />
vektor<br />
0 1 2 3 4<br />
0 1 4 9 16<br />
erzeugt Feld mit entsprechender Elementanzahl<br />
initialisiert die Elemente<br />
Initialisierungswerte können durch Ausdrücke des entsprechenden<br />
Elementtyps gebildet werden (i.a. Literale)<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 12
Felder / Zerstörung eines Feldes<br />
Java: automatisches Garbage-Collection!<br />
Kein delete-Operator<br />
Speicherplatz wird automatisch freigegeben, wenn nicht mehr auf Heap-<br />
Speicherplatz referenziert („gezeigt“) wird<br />
Beispiel:<br />
int[] vek = new int[3];<br />
vek[0] = 4;<br />
// ...<br />
vek = new int[5];<br />
vek[2] = 45;<br />
vek[4] = -5;<br />
vek<br />
0 1 2<br />
0 1 2 3 4<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 13
Felder / Mehrdimensionale Felder<br />
Normalfall: Anzahl an Elementen pro Dimension ist identisch<br />
float[][] vektor = new float[2][3];<br />
for (int z=0; z < vektor.length; z++)<br />
for (int s=0; s < vektor[z].length; s++)<br />
vektor[z][s] = z + s;<br />
vektor<br />
0<br />
1<br />
0 1 2<br />
0.0<br />
1.0 2.0<br />
1.0 2.0 3.0<br />
vektor[0]<br />
vektor[1]<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 14
Felder / Mehrdimensionale Felder<br />
Möglich: Anzahl an Elementen pro Dimension ist unterschiedlich<br />
float[][] vektor = new float[2][];<br />
vektor[0] = new float[2];<br />
vektor[1] = new float[3];<br />
for (int z=0; z < vektor.length; z++)<br />
for (int s=0; s < vektor[z].length; s++)<br />
vektor[z][s] = z + s;<br />
vektor<br />
0<br />
1<br />
0 1 2<br />
0.0 1.0<br />
1.0 2.0 3.0<br />
vektor[0]<br />
vektor[1]<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 15
Felder / Mehrdimensionale Felder<br />
Implizite Erzeugung und Initialisierung:<br />
char[][] zeichen = { {‘a‘, ‘b‘, ‘c‘},<br />
{‘A‘, ‘B‘},<br />
{‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘}<br />
};<br />
zeichen<br />
0<br />
1<br />
2<br />
0 1 2 3 4<br />
a b c<br />
A B<br />
0 1 2 3 4<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 16
Felder / Beispiel<br />
Berechnung der Summe zweier Vektoren:<br />
public static float min(float v1, float v2) {<br />
return v1
Referenzdatentypen<br />
Motivation<br />
– es existieren bestimmte Variablen, die lediglich Adressen („Referenzen“,<br />
„Zeiger“) auf andere Speicherbereiche speichern können<br />
– die Kontrolle über die referenzierten Speicherbereiche liegt beim Programmierer<br />
bzw. Anwendungsprogramm, nicht beim Laufzeitsystem<br />
– das Anwendungsprogramm kann zur Laufzeit entscheiden, wieviel Speicherplatz<br />
denn tatsächlich benötigt wird; diese Menge fordert es sich mittels des new-<br />
Operators explizit an<br />
– ein „Garbage Collector“ gibt automatisch nicht mehr benötigte Speicherbereiche<br />
frei<br />
Referenzdatentypen in Java sind Felder und Objekte<br />
es existieren einige Unterschiede zwischen „normalen“ Speicherelementen<br />
(Variablen von einem Standarddatentyp) und referenzierten<br />
Speicherelementen (Variablen vom Referenzdatentyp):<br />
– Zuweisung<br />
– Parameterübergabe<br />
– Funktionswert<br />
– lokale Variablen<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 18
Referenzdatentypen / Zuweisung<br />
Adress-Zuweisung:<br />
int[] v = {1, 2, 3}; v[0] = -77;<br />
int[] w = {9, 8, 7, 6};<br />
v = w; // Adress-Zuweisung<br />
w[0] == -77 -> true!<br />
v<br />
0 1 2<br />
1 2 3<br />
w<br />
0 1 2<br />
9 8 7 6<br />
v = w;<br />
0 1 2<br />
bei der Adress-Zuweisung werden lediglich die Referenzen kopiert, nicht die<br />
referenzierten Elemente<br />
v<br />
1 2 3<br />
0 1 2<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 19<br />
w<br />
9 8 7 6
Referenzdatentypen / Zuweisung<br />
Element-Zuweisung (Wert-Zuweisung):<br />
int[] v = {1, 2, 3}; v[0] = -77;<br />
int[] w = {9, 8, 7, 6}; w[0] == 9 -> true<br />
for (int i=0; i
Referenzdatentypen / Parameterübergabe<br />
Sind bei einer Funktionsdefinition Referenzdatentypen als formale Parameter<br />
definiert, so werden als aktuelle Parameter die Referenzen als Wert übergeben<br />
in einer Funktionen können in diesem Fall die referenzierten Elemente<br />
manipuliert werden<br />
nicht manipuliert werden kann jedoch die Referenzvariable selbst<br />
public static void init(int[] vek, int value) {<br />
for (int i=0; i true<br />
}<br />
Heap<br />
vek<br />
werte<br />
0 1 2<br />
47 47 47<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 21
Referenzdatentypen / Funktionswerte<br />
Funktionen können als Funktionswert Werte vom Referenztyp liefern<br />
public static int[] init(int[] vek, int value) {<br />
for (int i=0; i true<br />
Stack<br />
init<br />
main<br />
} Heap 0 1 2<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 22<br />
w1<br />
vek<br />
w2<br />
47 47 47
Referenzdatentypen / lokale Variablen<br />
bzgl. des Gültigkeitsbereich von Variablen vom Referenztyp gilt dasselbe wie<br />
bei „normalen“ Variablen<br />
die referenzierten Elemente werden durch Anwendung des new-Operators<br />
lebendig; sie sind solange lebendig, bis sie nicht mehr referenziert werden,<br />
also u.U. länger als die Funktion lebendig ist (→ Garbage Collection)<br />
public static foat[] init(int[] vek) {<br />
float[] fvek = new float[vek.length];<br />
init vek<br />
for (int i=0; i true<br />
}<br />
fvek<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 23
Referenzdatentypen / Beispiel<br />
Sortierung von Zahlen:<br />
0<br />
2<br />
1<br />
5<br />
2<br />
3<br />
3<br />
7<br />
public static void main(String[] args) {<br />
int[] feld = {2,5,3,7,1};<br />
print(feld);<br />
bubbleSort(feld);<br />
print(feld);<br />
}<br />
public static void print(int[] vektor) {<br />
Terminal.out.print(“Vektor: „);<br />
for (int i=0; i
Referenzdatentypen / Beispiel<br />
public static void bubbleSort(int[] vektor) {<br />
boolean veraendert = false;<br />
do {<br />
veraendert = false;<br />
for (int i=1; i vektor[i]) {<br />
0 1 2 3 4<br />
2 5 3 7 1<br />
int help = vektor[i-1];<br />
vektor[i-1] = vektor[i];<br />
vektor[i] = help;<br />
veraendert = true;<br />
}<br />
}<br />
} while (veraendert);<br />
}<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 25
Verbunde / Motivation<br />
Definition:<br />
Datenstruktur/-typ zur Zusammenfassung von mehreren u.U. Elementen<br />
unterschiedlichen Typs zu einer Einheit. Der Wertebereich eines<br />
Verbundes ist das kartesische Produkt der Wertebereiche seiner einzelnen<br />
Elemente.<br />
Synomyme:<br />
Records, Strukturen, Datensätze<br />
Anmerkungen:<br />
– Verbunde gibt es in Java nicht; man kann sie aber mit Hilfe von Klassen<br />
bzw. Objekten nachbilden<br />
– Verbundtypen sind Referenzdatentypen!<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 26
Verbunde / Motivation<br />
Beispiel: Personaldatei<br />
Mitarbeiter:<br />
Name: char[] name;<br />
Alter: short alter;<br />
Geschlecht: boolean ist_mann;<br />
Gehalt: float gehalt;<br />
Java:<br />
Definition des Verbundtyps:<br />
class Mitarbeiter {<br />
char[] name;<br />
short alter;<br />
boolean maennlich;<br />
float gehalt = 2000.0F;<br />
}<br />
Definition einer Verbundvariablen:<br />
Mitarbeiter dibo;<br />
Nutzung der Variablen:<br />
dibo.alter = 37;<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 27
Verbunde / Definition eines Verbundtyps<br />
::= „class“ <br />
„{“ { } „}“<br />
Anmerkungen:<br />
– der Bezeichner legt den Namen für den neuen Typ fest<br />
– die Variablen nennt man auch Elemente<br />
– Ort der Definition: vor oder nach der Definition der public-Klasse:<br />
Beispiel: Datei Personalverwaltung.java<br />
class Mitarbeiter {...}<br />
public class Personalverwaltung {...}<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 28
Verbunde / Verbundvariablen<br />
Definition einer Verbundvariablen:<br />
Mitarbeiter dibo;<br />
Mitarbeiter[] personen;<br />
Erzeugung eines Verbundes:<br />
Mitarbeiter dibo = new Mitarbeiter();<br />
Mitarbeiter[] personen = new Mitarbeiter[3];<br />
for (int i=0; i
Verbunde / Zugriff auf Verbunde<br />
Zugriff auf Verbund: (via Punkt-Notation)<br />
dibo.name = {‘d‘, ‘i‘, ‘b‘, ‘o‘};<br />
dibo.alter = 37;<br />
dibo.gehalt = 2000.0F * (dibo.alter / 10);<br />
personen[0] = dibo;<br />
personen[2].maennlich = true;<br />
personen[2].alter = personen[0].alter + 2;<br />
Initialisierung eines Verbundes:<br />
– bei der Definition des Verbundtyps (allgemeingültig)<br />
– explizit für jedes Element via Punkt-Notation<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 30
Verbunde / Beispiel<br />
class Mitarbeiter {<br />
String name;<br />
float gehalt = 2000.F;<br />
boolean maennlich = true;<br />
int alter;<br />
}<br />
public class Verwaltung {<br />
public static void main(String[] args) {<br />
Mitarbeiter karl = genM(“Karl“, 5000, true, 30);<br />
Mitarbeiter ute = genM(“Ute“, 4500, false, 34);<br />
print(karl);<br />
print(ute);<br />
}<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 31
Verbunde / Beispiel<br />
public static Mitarbeiter genM(<br />
String n, float gh, boolean gl, int a) {<br />
Mitarbeiter person = new Mitarbeiter();<br />
person.name = n; person.gehalt = gh;<br />
person.maennlich = gl; person.alter = a;<br />
return person;<br />
}<br />
public static void print(Mitarbeiter person) {<br />
System.out.println(“Name: “ + person.name);<br />
System.out.println(“Geh: “ + person.gehalt);<br />
if (person.maennlich)<br />
System.out.println(“maennlich“);<br />
else<br />
System.out.println(“weiblich“);<br />
System.out.println(“Alter: “ + person.alter);<br />
} }<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 32
Beispielprogramm 1<br />
import dibo.*;<br />
class Position { int zeile; int spalte; }<br />
public class SchiebeSpiel {<br />
public static void main(String[] args) {<br />
int[][] matrix = { {2, 14, 5, 7},<br />
{3, 4, 15, 13},<br />
{6, 1, 12, 11},<br />
{3, 8, 9, 0} };<br />
print(matrix);<br />
while (!korrekt(matrix)) {<br />
Position position = posEingabe(matrix);<br />
verschieben(matrix, position);<br />
print(matrix);<br />
} }<br />
2 14 5 7<br />
3 4 15 13<br />
6 1 12 11<br />
3 8 9<br />
1 2 3<br />
4 5 6 7<br />
8 9 10 11<br />
12 13 14<br />
Programmierkurs Java Vorlesung 8 <strong>Dietrich</strong> <strong>Boles</strong> Seite 33<br />
15
Beispielprogramm 1<br />
public static void print(int[][] matrix) {<br />
for (int i=0; i
Beispielprogramm 1<br />
public static boolean korrekt(int[][] matrix) {<br />
int vgl = 0;<br />
for (int i=0; i
Beispielprogramm 1<br />
public static void verschieben(int[][] m, Position pos) {<br />
Position frei = freiesFeld(m);<br />
m[frei.zeile][frei.spalte] = m[pos.zeile][pos.spalte];<br />
m[pos.zeile][pos.spalte] = 0;<br />
}<br />
public static Position freiesFeld(int[][] matrix) {<br />
for (int i=0; i
Beispielprogramm 2<br />
import dibo.*;<br />
public class DamenProblem {<br />
public static void main(String[] args) {<br />
int[] zeile = new int[8];<br />
}<br />
boolean[] spalte = new boolean[8];<br />
for (int k=0; k
Beispielprogramm 2<br />
public static void setze(int i, int[] zeile,<br />
boolean[] spalte,<br />
boolean[] steidiag,<br />
boolean[] falldiag,<br />
int[] loe) {<br />
for (int j=0; j
Beispielprogramm 2<br />
public static void print(int[] zeile) {<br />
for (int i=0; i