Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 1 Programmierkurs Java Vorlesung am FB Informatik der Universität Oldenburg Vorlesung 8 Dietrich.

Ähnliche Präsentationen


Präsentation zum Thema: "Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 1 Programmierkurs Java Vorlesung am FB Informatik der Universität Oldenburg Vorlesung 8 Dietrich."—  Präsentation transkript:

1 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 1 Programmierkurs Java Vorlesung am FB Informatik der Universität Oldenburg Vorlesung 8 Dietrich Boles

2 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 2 Gliederung von Vorlesung 8 Strukturierte Datentypen Felder –Motivation –Anmerkungen –Definition –Erzeugung –Zugriff –Initialisierung –Zerstörung –mehrdimensionale Felder –Beispiel Referenzdatentypen –Motivation –Zuweisung –Parameter –Funktionsrückgabewerte –lokale Variablen –Beispiel Verbunde –Motivation –Verbundtypdefinition –Verbundvariablen –Zugriff auf Verbunde –Beispiel Beispielprogramme

3 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 3 Strukturierte Datentypen bisher: einfache Datentypen (int, float, char,...) Benutzung: Speicherung von einfachen Daten in einfachen Variablen häufig: besonderer Zusammenhang zwischen bestimmten Daten Beispiele: –Menge von Zahlen, die zu sortieren sind –Verwaltung von Personendaten (Name, Alter, Adresse,...) Strukturierte Datentypen: Zusammenfassung mehrerer Daten zu einer Einheit –Felder: Daten desselben Typs –Verbunde: Daten mit u.U. unterschiedlichem Typ

4 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 4 Felder / Motivation Definition: Ein Feld repräsentiert ein homogenes kartesisches Produkt zur Aufnahme mehrere Daten des gleichen Typs (genannt Elementtyp), wobei auf die Komponenten mit Hilfe eines Index zugegriffen wird. Synomyme: Array, Tupel, Matrix, Vektor, Tabelle x 5 - Matrix (2-dimensional) Elementtyp: int 3 Zeilen, 5 Spalten Numerierung beginnt bei 0 m[0][0] == 2 m[0][2] == 67 m[5][5] Laufzeitfehler

5 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 5 Felder / Anmerkungen Alternative zu Arrays: int v1, v2, v3,..., v1000; ????? –was ist bei Elementen? –es existiert kein Zusammenhang (Index)! Elementtyp ist fest Dimension ist fest 1-, 2-,..., n-dimensionale Arrays erlaubt Zugriff über n-dimensionalen Index random-access-Zugriff (alternativ: sequentiell Dateien auslesen) Arrays sind in Java Referenzdatentypen (wie Objekte) Arrays werden in Java dynamisch erzeugt Arrays werden in Java automatisch gelöscht, wenn sie nicht mehr benutzt werden (können)

6 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 6 Felder / Definition einer Feldvariablen ::= [ ] { [ ] } {, } ; Beispiele: int[] vektor1; // ElemTyp: int, Dim: 1 float[][] matrix1; // ElemTyp: float, Dim: 2 char[] buchstaben; // ElemTyp: char, Dim: 1 double[][][] quader1, quader2; // ElemTyp: double, Dim: 3 char ziffern[]; // Definitionsalternative! Elementtyp Dimension

7 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 7 Felder / Definition einer Feldvariablen Unterscheidung zwischen den eigentlichen Felder und den Feldvariablen Feldvariablen speichern die Adresse des eigentlichen Feldes Felder werden auf dem Heap angelegt bei der Definition einer Feldvariablen wird kein Speicherplatz für das Feld selbst angelegt vielmehr wird ein Speicherbereich reserviert, dem mittels des new-Operators Adressen zugewiesen werden können ( Zeiger, Felderzeugung) man kann die Adressen weder auslesen noch auf den Adressen Operationen ausführen (wie bspw. in C oder C++) Default-Initialisierung einer Feldvariablen mit dem Literal null auch explizite Initialisierung möglich: int[] zahlen = null;

8 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 8 Felder / Erzeugung eines Feldes ::= = new [ ] { [ ] } ; Nebenbedingung/Anmerkungen: –Elementyp und Dimension müssen mit der Definition der vorher definierten Feldvariablen übereinstimmen –int-Ausdrücke bestimmen die Anzahl an Elementen der jeweiligen Dimension –Feldelemente werden nicht implizit initialisiert! Beispiele: int[] vektor1; vektor1 = new int[8]; // Reservierung von 8 Speicherplätzen für int-Variablen int i = 3; float[][] vektor2 = new float[i][2]; // Reservierung von 3*2 Speicherplätzen für float-Variablen

9 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 9 Felder / Erzeugung eines Feldes Schema: Stack oder Heap Heap Zeiger

10 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 10 Felder / Zugriff auf Feldelemente ::= [ ] { [ ] } Nebenbedingungen / Anmerkungen: –Bezeichner muss gültige Feldvariable sein –int-Ausdruck muß Wert zwischen 0 und der Anzahl der Elemente - 1 der jeweiligen Dimension liefern ( Laufzeitfehler!) –Zugriff auf Feldelemente nennt man Indexierung Beispiele: int[] vek = new int[5]; vek[0] = -23; vek[1] = vek[0] + 25; vek[vek[1]] = -4; vek[5] = 56; // Laufzeitfehler! vek

11 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 11 Felder / Initialisierung der Feldelemente Explizite Initialisierung: int[] vektor = new int[5]; for (int i=0; i

12 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 12 Felder / Initialisierung der Feldelemente Implizite Erzeugung und Initialisierung: int i = 3; int[] vektor = {0, 1, 4, i*i, 16}; erzeugt Feld mit entsprechender Elementanzahl initialisiert die Elemente Initialisierungswerte können durch Ausdrücke des entsprechenden Elementtyps gebildet werden (i.a. Literale) vektor

13 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 13 Felder / Zerstörung eines Feldes Java: automatisches Garbage-Collection! Kein delete-Operator Speicherplatz wird automatisch freigegeben, wenn nicht mehr auf Heap- Speicherplatz referenziert (gezeigt) wird Beispiel: int[] vek = new int[3]; vek[0] = 4; //... vek = new int[5]; vek[2] = 45; vek[4] = -5; 012 vek 01234

14 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 14 Felder / Mehrdimensionale Felder Normalfall: Anzahl an Elementen pro Dimension ist identisch float[][] vektor = new float[2][3]; for (int z=0; z < vektor.length; z++) for (int s=0; s < vektor[z].length; s++) vektor[z][s] = z + s; 012 vektor vektor[0] vektor[1]

15 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 15 Felder / Mehrdimensionale Felder Möglich: Anzahl an Elementen pro Dimension ist unterschiedlich float[][] vektor = new float[2][]; vektor[0] = new float[2]; vektor[1] = new float[3]; for (int z=0; z < vektor.length; z++) for (int s=0; s < vektor[z].length; s++) vektor[z][s] = z + s; 012 vektor 0 1 vektor[0] vektor[1]

16 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 16 Felder / Mehrdimensionale Felder Implizite Erzeugung und Initialisierung: char[][] zeichen = { {a, b, c}, {A, B}, {0, 1, 2, 3, 4} }; zeichen a b c A B

17 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 17 Felder / Beispiel Berechnung der Summe zweier Vektoren: public static float min(float v1, float v2) { return v1 <= v2 ? v1 : v2; } public static float[] summe (float[] v1, float[] v2) { float[] summe = new float[min(vek1.length,vek2.length)]; for (int i=0; i

18 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 18 Referenzdatentypen Motivation –es existieren bestimmte Variablen, die lediglich Adressen (Referenzen, Zeiger) auf andere Speicherbereiche speichern können –die Kontrolle über die referenzierten Speicherbereiche liegt beim Programmierer bzw. Anwendungsprogramm, nicht beim Laufzeitsystem –das Anwendungsprogramm kann zur Laufzeit entscheiden, wieviel Speicherplatz denn tatsächlich benötigt wird; diese Menge fordert es sich mittels des new- Operators explizit an –ein Garbage Collector gibt automatisch nicht mehr benötigte Speicherbereiche frei Referenzdatentypen in Java sind Felder und Objekte es existieren einige Unterschiede zwischen normalen Speicherelementen (Variablen von einem Standarddatentyp) und referenzierten Speicherelementen (Variablen vom Referenzdatentyp): –Zuweisung –Parameterübergabe –Funktionswert –lokale Variablen

19 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 19 Referenzdatentypen / Zuweisung Adress-Zuweisung: int[] v = {1, 2, 3}; v[0] = -77; int[] w = {9, 8, 7, 6}; w[0] == -77 -> true! v = w; // Adress-Zuweisung bei der Adress-Zuweisung werden lediglich die Referenzen kopiert, nicht die referenzierten Elemente 012 v w v w 9876 v = w;

20 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 20 Referenzdatentypen / Zuweisung Element-Zuweisung (Wert-Zuweisung): int[] v = {1, 2, 3}; v[0] = -77; int[] w = {9, 8, 7, 6}; w[0] == 9 -> true for (int i=0; i

21 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 21 Referenzdatentypen / Parameterübergabe Sind bei einer Funktionsdefinition Referenzdatentypen als formale Parameter definiert, so werden als aktuelle Parameter die Referenzen als Wert übergeben in einer Funktionen können in diesem Fall die referenzierten Elemente manipuliert werden nicht manipuliert werden kann jedoch die Referenzvariable selbst public static void init(int[] vek, int value) { for (int i=0; i true } 012 werte 47 main Stack Heap vek init

22 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 22 Referenzdatentypen / Funktionswerte Funktionen können als Funktionswert Werte vom Referenztyp liefern public static int[] init(int[] vek, int value) { for (int i=0; i true } 012 w1 47 main Stack Heap vek init w2

23 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 23 Referenzdatentypen / lokale Variablen bzgl. des Gültigkeitsbereich von Variablen vom Referenztyp gilt dasselbe wie bei normalen Variablen die referenzierten Elemente werden durch Anwendung des new-Operators lebendig; sie sind solange lebendig, bis sie nicht mehr referenziert werden, also u.U. länger als die Funktion lebendig ist ( Garbage Collection) public static foat[] init(int[] vek) { float[] fvek = new float[vek.length]; for (int i=0; i true } 012 w main Stack Heap vek init w2 fvek

24 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 24 Referenzdatentypen / Beispiel Sortierung von Zahlen : public static void main(String[] args) { int[] feld = {2,5,3,7,1}; print(feld); bubbleSort(feld); print(feld); } public static void print(int[] vektor) { Terminal.out.print(Vektor: ); for (int i=0; i

25 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 25 Referenzdatentypen / Beispiel public static void bubbleSort(int[] vektor) { boolean veraendert = false; do { veraendert = false; for (int i=1; i vektor[i]) { int help = vektor[i-1]; vektor[i-1] = vektor[i]; vektor[i] = help; veraendert = true; } } while (veraendert); }

26 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 26 Verbunde / Motivation Definition: Datenstruktur/-typ zur Zusammenfassung von mehreren u.U. Elementen unterschiedlichen Typs zu einer Einheit. Der Wertebereich eines Verbundes ist das kartesische Produkt der Wertebereiche seiner einzelnen Elemente. Synomyme: Records, Strukturen, Datensätze Anmerkungen: –Verbunde gibt es in Java nicht; man kann sie aber mit Hilfe von Klassen bzw. Objekten nachbilden –Verbundtypen sind Referenzdatentypen!

27 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 27 Verbunde / Motivation Beispiel: Personaldatei Mitarbeiter: Name: char[] name; Alter: short alter; Geschlecht: boolean ist_mann; Gehalt: float gehalt; Java : Definition des Verbundtyps: class Mitarbeiter { char[] name; short alter; boolean maennlich; float gehalt = F; } Definition einer Verbundvariablen: Mitarbeiter dibo; Nutzung der Variablen: dibo.alter = 37;

28 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 28 Verbunde / Definition eines Verbundtyps ::= class { { } } Anmerkungen: –der Bezeichner legt den Namen für den neuen Typ fest –die Variablen nennt man auch Elemente –Ort der Definition: vor oder nach der Definition der public-Klasse: Beispiel: Datei Personalverwaltung.java class Mitarbeiter {...} public class Personalverwaltung {...}

29 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 29 Verbunde / Verbundvariablen Definition einer Verbundvariablen: Mitarbeiter dibo; Mitarbeiter[] personen; Erzeugung eines Verbundes: Mitarbeiter dibo = new Mitarbeiter(); Mitarbeiter[] personen = new Mitarbeiter[3]; for (int i=0; i<3; i++) personen[i] = new Mitarbeiter(); 210 personen name alter maennlich gehalt null 0 false

30 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 30 Verbunde / Zugriff auf Verbunde Zugriff auf Verbund: (via Punkt-Notation) dibo.name = {d, i, b, o}; dibo.alter = 37; dibo.gehalt = F * (dibo.alter / 10); personen[0] = dibo; personen[2].maennlich = true; personen[2].alter = personen[0].alter + 2; Initialisierung eines Verbundes: –bei der Definition des Verbundtyps (allgemeingültig) –explizit für jedes Element via Punkt-Notation

31 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 31 Verbunde / Beispiel class Mitarbeiter { String name; float gehalt = 2000.F; boolean maennlich = true; int alter; } public class Verwaltung { public static void main(String[] args) { Mitarbeiter karl = genM(Karl, 5000, true, 30); Mitarbeiter ute = genM(Ute, 4500, false, 34); print(karl); print(ute); }

32 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 32 Verbunde / Beispiel public static Mitarbeiter genM( String n, float gh, boolean gl, int a) { Mitarbeiter person = new Mitarbeiter(); person.name = n; person.gehalt = gh; person.maennlich = gl; person.alter = a; return person; } public static void print(Mitarbeiter person) { System.out.println(Name: + person.name); System.out.println(Geh: + person.gehalt); if (person.maennlich) System.out.println(maennlich); else System.out.println(weiblich); System.out.println(Alter: + person.alter); }

33 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 33 Beispielprogramm 1 import dibo.*; class Position { int zeile; int spalte; } public class SchiebeSpiel { public static void main(String[] args) { int[][] matrix = { {2, 14, 5, 7}, {3, 4, 15, 13}, {6, 1, 12, 11}, {3, 8, 9, 0} }; print(matrix); while (!korrekt(matrix)) { Position position = posEingabe(matrix); verschieben(matrix, position); print(matrix); } }

34 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 34 Beispielprogramm 1 public static void print(int[][] matrix) { for (int i=0; i

35 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 35 Beispielprogramm 1 public static boolean korrekt(int[][] matrix) { int vgl = 0; for (int i=0; i

36 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 36 Beispielprogramm 1 public static void verschieben(int[][] m, Position pos) { Position frei = freiesFeld(m); m[frei.zeile][frei.spalte] = m[pos.zeile][pos.spalte]; m[pos.zeile][pos.spalte] = 0; } public static Position freiesFeld(int[][] matrix) { for (int i=0; i

37 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 37 Beispielprogramm 2 import dibo.*; public class DamenProblem { public static void main(String[] args) { int[] zeile = new int[8]; boolean[] spalte = new boolean[8]; for (int k=0; k<8; k++) spalte[k] = true; boolean[] steidiag = new boolean[15]; for (int k=0; k<15; k++) steidiag[k] = true; boolean[] falldiag = new boolean[15]; for (int k=0; k<15; k++) falldiag[k] = true; int[] loesungen = {0}; setze(0, zeile, spalte, steidiag, falldiag, loesungen); Terminal.out.println(loesungen[0]); } eine Lösung

38 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 38 Beispielprogramm 2 public static void setze(int i, int[] zeile, boolean[] spalte, boolean[] steidiag, boolean[] falldiag, int[] loe) { for (int j=0; j<8; j++) { if (spalte[j] && falldiag[i+j] && steidiag[i-j+7]) { zeile[i] = j; spalte[j] = false; falldiag[i+j] = false; steidiag[i-j+7] = false; if (i < 7) { setze(i+1, zeile, spalte, steidiag, falldiag, loe); } else { print(zeile); loe[0]++; } spalte[j] = true; falldiag[i+j] = true; steidiag[i-j+7] = true; } } }

39 Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 39 Beispielprogramm 2 public static void print(int[] zeile) { for (int i=0; i<8; i++) { System.out.print(zeile[i] + " "); } System.out.println(); } } // end class zeile 0 zeile 7 0 spalte 7 spalte stei 7 stei 0 fall 7 fall 0


Herunterladen ppt "Programmierkurs Java Vorlesung 8 Dietrich Boles Seite 1 Programmierkurs Java Vorlesung am FB Informatik der Universität Oldenburg Vorlesung 8 Dietrich."

Ähnliche Präsentationen


Google-Anzeigen