Verbunddatentypen Die bisher besprochenen Datenstrukturen Array, Liste und Baum dienen zur Verwaltung größerer Mengen gleichartiger Daten. Nun werden wir die Speicherung von zusammengehörigen, verschiedenartigen Daten behandeln. Beispiel: Adressdaten einer Person bestehen aus: Vorname (Zeichenkette) Nachname (Zeichenkette) PLZ (Integer oder Zeichenkette) Ort (Zeichenkette) Straße (Zeichenkette) Wenn wir also von einer Adresse sprechen, setzen wir die oben gelisteten Detaildaten voraus. In der Programmierung haben wir bisher Variablen als Speicherstellen kennen gelernt. Der Datentyp der Variable bestimmt die Größe des reservierten Speichers und ermöglicht den Compiler Überprüfung und Optimierungen. Grundlegende (elementare) Datentypen, die in vielen Programmiersprachen verfügbar sind, lauten: Zeichen (Character, Char) Zeichenketten (String) Ganzzahl (Byte, Integer, Long) Fließkommazahl (Float, Double) Wahrheitswerte (Boolean) Datum und Zeit Ziel ist es nun, Variablen zu verwenden, die (wie im Adressbeispiel) mehrere zusammengehörige Werte speichern. Grundlage dafür ist die Definition neuer Datentypen, die mehrere Speicherstellen umfassen. Dies erfolgt durch die Benennung der Speicherstellen und der Vereinbarung des Datentyps. Ein derart definierter Datentyp wird dann als Verbunddatentyp bezeichnet. Dieser kann dann bei der Deklaration einer Variablen (Verbundvariable) wie gewohnt verwendet werden. In Java gibt es keine eigenständigen Verbunddatentypen, stattdessen werden Klassen verwendet, welche neben Daten auch Methoden beinhalten können. In C werden diese als Structures bezeichnet (in Pascal als Record). Beispiel: Definition des Verbunddatentyps adresse Name des Verbunddatentyps Java C / C++ class Adresse { String vorname; String nachname; int plz; String ort; String strasse; } struct adresse { string vorname; string nachname; int plz; string ort; string strasse; }; Speicherstelle vom Typ string mit Bezeichner strasse Beispiel: Deklaration einer Variablen vom Typ adresse Java C / C++ Adresse name; adresse name; name= new Adresse(); Der Speicher wird erst beim Erstellen des Objektes (new) reserviert. Die Variable enthält nur einen Verweis auf den Speicherbereich. name Bei der Deklaration wird automatisch der Speicher für den gesamten Verbunddatentyp reserviert. reserviert Speicher für alle Speicherstellen Der „Wert“ einer Verbundvariable setzt sich aus den Werten zusammen, die den einzelnen Speicherstellen zugewiesen werden ist. Um einen einzelnen Wert abzufragen, bzw. zu setzen ist der Name der Verbundvariable und der Bezeichner der Speicherstelle anzugeben. Beispiel: Setzen Sie den Vornamen und den Ort für die Variable „name“! neuner.plz = 6460; Die Verbunddatentypen können wie elementare Datentypen auch in: Deklaration von Arrays Definition neuer Verbunddatentypen verwendet werden. Beispiel: Array mit 5 Adressen in Java Adresse[] kartei = new Adresse[5]; // Erzeugen des kartei-Arrays kartei[2] = new Adresse(); // Erzeugen einer Adresse im kartei-Array Damit kann der Vorname der dritten Adresse in kartei ausgegeben werden durch: System.out.println(kartei[2].vorname); Variante: dritte Adresse Adresse a; a = kartei[2]; System.out.println(a.vorname); davon der Vorname Beispiel: Verbunddatentyp „Schueler“, der den Verbunddatentyp „Adresse“ verwendet. Java C / C++ class Schueler { Adresse person; String klasse; } struct schueler { adresse person; string klasse; }; Der Speicher wird hier erst wieder beim Erstellen des Objektes (new) reserviert. Die Variable enthält nur einen Verweis auf den Speicherbereich. Dasselbe gilt für die Variable person. Bei der Deklaration wird automatisch der Speicher für den gesamten Verbunddatentyp reserviert. Schueler name = new Schueler(); name.klasse = „Klasse“; schueler name; name.klasse = „Klasse“; name.person = new Adresse(); name.person.vorname = „Name“; name.person.vorname = „Name“; Übungen 1. Erstellen Sie einen Verbunddatentyp (Klasse) „Koordinate“ mit X- und Y-Integer-Werten. Implementieren Sie einen Kontruktor Koordinate(int x, int y), eine toString()- und jeweils Getter- und Setter-Methoden. 2. Erstellen Sie einen Verbunddatentyp (Klasse) „Rechteck“ mit zwei Koordinaten (linksOben, rechtsUnten) und einem String farbe. Implementieren Sie einen Konstruktor Rechteck(Koordinate linksOben, Koordinate rechtUnten), eine String toString()- und eine verschiebeX(int x, int y)-Methode welche das Rechteck um x/y verschiebt. 3. Erstellen und befüllen Sie ein Array mit drei Rechtecken.