Technische Informatik für Ingenieure (TIfI) WS 2006/2007, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Rekursion Datenstrukturen Merge S ( split, s, merge ) Beispiel: Merge S a1 b1 a 9 6 8 7 4 5 9 6 8 a2 7 4 5 s 6 8 9 b2 4 5 7 c split merge 4 5 6 7 8 9 s public static int[] merge(int[] a, int[] b) { int[] ergebnis = new int[a.length + b.length]; int posa = 0, posb = 0, pos = 0; while ( posa < a.length && posb < b.length ) { if (a[posa] <= b[posb]) { ergebnis[pos] = a[posa]; posa = posa + 1; else { ergebnis[pos] = b[posb]; posb = posb + 1; // hier sind alle Elemente eines Arrays kopiert; // die des anderen Arrays müssen wir noch kopieren! : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 4 Beispiel: Merge S (Fs. ) Beispiel: Merge S (Fs. ) // restlichen Elemente des laengeren Arrays einfuegen while ( posa < a.length ) { ergebnis[pos] = a[posa]; posa = posa + 1; while ( posb < b.length ) { ergebnis[pos] = b[posb]; posb = posb + 1; return ergebnis; public static int[] s(int[] a) { if (a.length > 1) { int[] a1 = new int[a.length/2]; int[] a2 = new int[a.length - a1.length]; System.arraycopy(a, 0, a1, 0, a1.length); System.arraycopy(a, a1.length, a2, 0, a2.length); int[] b1 = s(a1); int[] b2 = s(a2); int[] c = merge(b1,b2); return c; else { return a; : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 5 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 6 1
Bemerkung 9. Datenstrukturen Die hier vorgestellte Variante des MergeS- Algorithmus ist sehr ineffizient (dafür ist sie etwas leichter zu verstehen). Im richtigen MergeS-Algorithmus, werden die Arrays nicht so oft kopiert. Motivation Daten zusammenfassen, die logisch zusammen gehören (nächste Folie); Bezüge zwischen Daten herstellen (später) In der Praxis wird ohnehin der QuickS- Algorithmus eingesetzt; z.b. für die in Java eingebaute Sierfunktion (siehe Unterlagen zur Vorlesung im WWW) Logisch zusammengehörige Daten nennen wir im folgenden ein Objekt. : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 7 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 8 Daten zusammenfassen Beispiel: Eine besteht aus Vor Name Straße Hausnummer PLZ Ort In Java: String = ""; String strasse = ""; String nr = ""; String plz = ""; : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 9 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 10 In Java (Fs.): In Java (Fs.): Ein Datentyp definiert die Struktur gleichartiger Objekte. Der Datentyp legt insbes. den Namen und den Typ aller gemeinsamen Attribute der Objekte fest. Der Datentyp selbst erhält ebenfalls eine Bezeichnung, unter der er im Programm benutzt werden kann. In Java wird ein Datentyp durch das Schlüsselw class gefolgt von dem Namen des Datentyps und einer Deklaration aller zugehörigen Attribute definiert. Es sind auch Deklarationen ohne Initialisierung möglich. (Eine Klasse ist eine Verallgemeinerung des Datentyps, die wir erst später kennenlernen werden; das Schlüsselw class benutzen wir jetzt schon) : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 11 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 12 2
Im folgenden... Beispiel: Adressverwaltung reduzieren wir der Einfachheit halber unser Beispiel auf drei Attribute: String = ""; String = ""; public class Adressverwaltung { : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 1 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 14 public static readadr() { = new (); "# $ %! Out.println("Bitte der Reihe nach Name, Vor " + "und Ort eingeben:"); public static void printadr( ) { Out.println(.); Out.println(.); Out.println(.); Out.println(); '!! % (). = In.readLine();. = In.readLine();. = In.readLine();! return ; & " : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 15 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 16 public static void main(string[] args) { [] essen = new [100]; int anzahladr = 0; int option; do { Out.println("Wählen Sie 1, 2 oder :"); option = In.readInt(); In.readLine(); *+,, if (option == 1) { // Neue einlesen (wenn noch Platz) if ( anzahladr < 100 ) { essen[anzahladr]= readadr(); anzahladr = anzahladr + 1; else if (option == 2) { // suchen Out.println("Geben Sie einen Namen ein"); String = In.readLine(); // Suche in der Tabelle for (int i = 0; i < anzahladr; i++) { if (.equals(essen[i].)) { printadr(essen[i]); : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 17 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 18
else if (option == ) { // Gib alle n aus for (int i = 0; i < anzahladr; i++) { printadr(essen[i]); while ( option >= 1 && option <= ); Ein selbstdefinierter Datentyp kann in Java wie jeder vordefinierte Datentyp benutzt werden! Es können Felder über diesem Datentyp definiert werden. $- ')... : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 19 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 20 Beispiel Der Datentyp kann als Parametertyp und als Ergebnistyp von Funktionen und Prozeduren benutzt werden. Der Datentyp kann insbesondere als Datentyp eines Attributs eines anderen Datentyps benutzt werden (nächste Folie). class Name { String ; String familien; class Anschrift { String strasse; String nr; String ; class Person { int nr; Name ; Anschrift anschrift; /01!)2 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 21 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 22 Selbstdefiniere Datentypen Wie bei Feldern muß ein neues Objekt eines selbstdefinierten Datentyps explizit mit new angelegt werden. Bsp: = new (); 4 Wie bei Feldern ist die Variable ein Verweis auf ein Objekt vom Typ (später mehr) Auf ein Attribut eines Objekts obj kann mit obj. zugegriffen werden. obj. kann überall d stehen, wo eine Variable entsprechenden Typs stehen darf (wie bei Feldern gilt dies auch für Zuweisungen und Operationen wie ++ und --) Bei verschachtelten Datentypen kann man über mehrere Stufen auf ein Attribut zugreifen: person.. oder person.anschrift. : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 2 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 24 4
Weitere Beispiele: 2. Objektvariablen als Verweise class Punkt { double x; double y; class Rechteck { Punkt lo; Punkt ru; class Complex { double re; double im; class PseudoString { char[] zeichenfolge; int length; Für einen selbstdefinierten Datentyp kann man Variablen dieses Typs deklarieren! Eine solche Variable ist ein Verweis (Pointer) auf ein Objekt dieses Typs! : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 25 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 26 Beispiel Objektvariable als Verweise Beispiel: ; = new ();. = Egon ; String Egon Objektvariable verhalten sich analog zu Array-Variablen: Ein Parameter mit selbstdefiniertem Datentyp ist ein Referenzparameter! Alle Attribute eines mit new neu angelegten Objekts erhalten zunächst den vordefinierten Wert des entsprechenden Datentyps (Zur Erinnerung: Zahlen: 0 bzw. 0.0, Zeichen: \u0000, Wahrheitswerte: false, sonst null) : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 27 : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 28 null: Der undefinierte Verweis. Rekursive Datentypen Der vordefinierte Wert für alle nicht-primitiven Datentypen ist null null kann jeder Variablen mit nicht-primitivem Datentyp zugewiesen werden ( null hat jeden Typ ; Genaueres später) Wenn == null gilt; führt der Zugriff. zu einem Laufzeitfehler!! Achtung: Beim Programmieren aufpassen! Exception in thread "main" java.lang.nullpointerexception at Test.main(Compiled Code) : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn VL 9 29 class { ; ; : Technische Informatik für Ingenieure, WS 2006/07, Universität Paderborn Adress VL 9 0 nam vornam or 5 6 null 5