27.11.2012 Aufrufe

Dietrich Boles

Dietrich Boles

Dietrich Boles

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!