4. Übung Abgabe bis 17.11.2008, 10:00 Uhr Aufgabe 4.1: Sichtbarkeit und Referenzen 20 Punkte Geben Sie ihre Antworten als Sichtbarkeit.pdf ab. a) Betrachten Sie folgenden Code: 1 public class Vis { 26 public static void main( 2 public static int f(int x) { 27 String[] args) { 3 int y = x * x - 1; 28 int a = 1; 4 // *** 1 *** 29 double b = 2; 5 return 4 * y; 30 // *** 6 *** 6 } 31 int c = f(a); 7 32 int d = f(b); 8 public static int f(double x) { 33 System.out.println(c + d); 9 double y = x * x - 1; 34 int e = g(3); 10 int k = (int) y; 35 System.out.println(e); 11 // *** 2 *** 36 // *** 7 *** 12 return f(k); 37 } 13 } 38 } 14 15 public static int g(int n) { 16 // *** 3 *** 17 int sum = 0; 18 for (int i = 1; i <= n; i++) { 19 int sqr = i * i; 20 sum += sqr; 21 // *** 4 *** 22 } 23 // *** 5 *** 24 return sum; 25 } Simulieren Sie den Aufruf des obigen Programms in einem Schreibtischlauf. In welcher Reihenfolge werden die mit // *** x *** markierten Stellen erreicht (Mehrfachausführung möglich)? Geben Sie in einer Tabelle an, welche Variablen beim Erreichen dieser Stellen sichtbar sind und welchen Typ und Wert diese haben. Die Tabelle sollte folgendermaßen aussehen (die ersten zwei Zeilen sind bereits eingetragen, die Variable args können Sie ignorieren): Position sichtbare Variablen *** 6 *** a = 1 (int), b = 2 (double) *** 1 *** x = 1 (int), y = 0 (int)...... - 1 -
b) Betrachten Sie nun folgenden Code: 1 class Punkt { 2 public int x, y; 3 4 Punkt(int a, int b) { 5 x = a; 6 y = b; 7 } 8 9 public String tostring() { 10 return "(" + x + "," 11 + y + ")"; 12 } 13 } 12 public class Ref { 13 public static Punkt add(punkt a, 14 Punkt b) 15 { 16 return new Punkt(a.x + b.x, 17 a.y + b.y); 18 } 19 20 public static void main( 21 String[] args) 22 { 23 Punkt p,q,r; 24 p = new Punkt(1, 2); 25 // *** 1 *** 26 q = new Punkt(3, 4); 27 // *** 2 *** 28 r = add(p,q); 29 // *** 3 *** 30 p = new Punkt(5, 6); 31 // *** 4 *** 32 r = add(p, q); 33 // *** 5 *** 34 p = r; 35 // *** 6 *** 36 r = q; 37 // *** 7 *** 38 System.out.println(p); 39 System.out.println(q); 40 System.out.println(r); 41 } 42 } Beim Ausführen des obigen Codes werden insgesamt fünf Objektinstanzen vom Typ Punkt erzeugt. Geben Sie für jede der mit //*** x *** markierten Stellen an, welche Objektinstanzen dort bekannt sind, welche Werte sie besitzen und auf welche Objektinstanzen die Referenzen p, q und r zeigen. Verwenden Sie dazu eine Tabelle der folgenden Art (Die ersten beiden Zeilen sind wieder vorgegeben): Position p q r Objekt1 Objekt2 Objekt3 Objekt4 Objekt5 *** 1 *** Objekt1 null null (1,2) undef undef undef undef *** 2 *** Objekt1 Objekt2 null (1,2) (3,4) undef undef undef........................... c) Welche Objektinstanzen sind am Ende der main-methode von b) nicht mehr referenziert? d) Wie lautet die Ausgabe der drei println-anweisungen in dn Zeilen 38 bis 40? - 2 -
Aufgabe 4.2: Klassenhierarchien Begriffsklärung 5 Punkte Erklären Sie kurz die folgenden Begriffe: Kapselungsprinzip, Oberklasse, Unterklasse, Vererbung, Überschreiben von Methoden (method overriding), Überladen von Methoden (method overloading), Abstrakte Klasse, Polymorphe Variable, Statischer Typ, Dynamischer Typ. Geben Sie Ihre Antworten als Begriffe.pdf ab. Aufgabe 4.3: UML Unfallmanagementsystem FRIEND 15 Punkte UML-Diagramme können bei der Analyse komplexer Systeme helfen. Im folgenden werden Sie aus der unpräzisen textuellen Beschreibung, die sich ein lokaler Politiker ausgedacht hat, ein Anwendungsfalldiagramm und ein Klassendiagramm für das Unfallmanagementsystem FRIEND erstellen. Geben Sie Ihre Diagramme in UML.pdf ab. Das Unfallmanagementsystem FRIEND soll es Außenbeamten ermöglichen, mittels eines drahtlosen Rechners mit ihrem Dienstleiter zu interagieren. Der Dienstleiter kann den augenblicklichen Stand aller Ressourcen wie Polizeiautos oder Löschzüge auf einem Bildschirm visualisieren und eine freie Ressource entsenden, indem er von seiner Workstation aus einen Befehl erteilt. Also z.b.: Der Außenbeamte aktiviert das Terminal, um dem Dienstleiter einen neue Notfall- Meldung zu übermitteln. Der Dienstleiter prüft die übermittelten Informationen und eröffnet einen neuen Vorfall im System, wo er die Notfallmeldung ablegt und einen ersten Ereignisbericht schreibt. Dann teilt er dem Vorfall zusätzliche Betriebsmittel zu, schickt also z.b. weitere Einheiten zum Unfallort... a) Identifizieren Sie die zwei Akteure und drei Anwendungsfälle für FRIEND im obigen Szenario und stellen Sie diese als UML-Anwendungsdiagramm grafisch dar. b) Auf Nachfragen erhalten Sie vom Kunden die folgenden Informationen: Ja, der Außenbeamte und der Dienstleiter sind freilich beide Polizeibeamte. Jeder hat einen Namen und eine Dienstellen-Nummer... Also der Außenbeamte muss angeben können, was passiert ist und wo es passiert ist... Einen Polizeibeamten ohne genaue Diensbezeichnung gibt es bei uns nicht... Erstellen Sie ein UML-Klassendiagramm für die vier Klassen, die an dem beschriebenen Szenario teilnehmen. Verwenden Sie abstrakte Klassen, Vererbung, Aggregation und Assoziation wo es sinnvoll ist. Für weitere Informationen zu FRIEND, UML und Objektorientierter Softwaretechnik empfehlen wir Ihnen das gleichnamige Buch von Prof. Bernd Brügge (ISBN-13: 978-3-8273-7261-1). Aufgabe 4.4: Vererbung Vierecke 20 Punkte In dieser Aufgabe soll Vererbung an einem einfachen, geometrischen Beispiel demonstriert werden, und zwar an einer Vererbungshierarchie zwischen Viereck, Parallelogramm, Trapez, Rechteck und Quadrat. Gegeben ist dazu eine einfache Klasse Vec2D zur Darstellung von 2D-Koordinaten mit Komponenten x und y. Außerdem ist die Klasse Quadrangle gegeben, mit der ein allgemeines Viereck aus vier Eckpunkten angelegt werden kann. Quadrangle benutzt die vier Eckpunkte als Attribute und hat Methoden zum Zeichnen (draw()) und zum Berechnen seines Flächeninhalts (getarea()). - 3 -
Abbildung 1: Definition der Vierecke, die Sie implementieren werden. Desweiteren können Sie die Klasse QuadrangleTest herunterladen, mit der Sie ein Viereck erzeugen, seinen Flächeninhalt berechnen und das Viereck in einem Fenster zeichnen können. a) Leiten Sie von Quadrangle zwei spezialisierte Klassen Trapezoid (gleichschenkliches Trapez) und Parallelogram ab. Der Einfachheit halber seien die Basisseiten parallel zur x-achse (siehe Abbildung). Das Trapez soll als Attribute p, d1, d2 und h besitzen, das Parallelogramm p, d, h und alpha (in Grad). Die Konstruktoren sollen eben diese Werte entgegennehmen, also z.b.: public class Trapezoid extends Quadrangle { Vec2D p; double d1, d2, h; } Trapezoid(Vec2D p, double d1, double d2, double h) { super(...);... }... b) Die Methode getarea() von Quadrangle ist sehr allgemein und daher nicht sehr effizient. Überschreiben Sie daher in beiden neuen Klassen die Methode getarea() mit einer effizienten, spezialisierten Variante. Der Flächeninhalt beim Trapez ist h(d 1 + d 2 )/2, beim Parallelogram hd. c) Leiten Sie nun analog zu a) eine neue Klasse Rectangle ab und überschreiben Sie wieder getarea(). Sie können dabei von Trapezoid oder Parallelogramm ableiten, s.a. http://de.wikipedia.org/wiki/wer_wird_millionär? d) Leiten Sie nun analog zu a) und c) die Klasse Square ab. Geben Sie die Dateien Trapezoid.java, Parallelogram.java, Rectangle.java und Square.java im EST ab. - 4 -
Zusatzaufgabe 4.5: Interface für die Kommandozeile In dieser Aufgabe sollen Sie ein Interface entwickeln, welches es ermöglicht, Objekte für die in Aufgabe 4.4 entwickelten geometrischen Klassen zu erzeugen. Dazu finden Sie auf der Übungswebseite ein Beispielprogramm, welches das Einlesen und Zeichen der Objekte am Beispiel der Klasse Rectangle übernimmt. Vervollständigen Sie die gegebene main-methode für alle geometrischen Objekte aus der Aufgabe 4.4. Nehmen Sie dazu an, dass Ihnen die Werte auf der Kommandozeile in folgender Reihenfolge übergeben werden: Rectangle <p.x> <p.y> <d> <h> Square <p.x> <p.y> <d> Quadrangle <a.x> <a.y> <b.x> <b.y> <c.x> <c.y> <d.x> <d.y> Parallelogram <p.x> <p.y> <d> <h> <alpha> Trapezoid <p.x> <p.y> <d1> <d2> <h> Zwei Beispieldateien mit Ein- und Ausgabe finden Sie auf der Übungswebseite. Sie können (nach dem Kompilieren) ihr Programm testen, indem Sie das Interface folgendermaßen mit dem Befehl java CommandLineInterface < input > meinoutput ausführen. Mit dem Programm diff können Sie Ihre Ausgabe mit der vorgegebenen Ausgabe vergleichen. Geben Sie die Datei CommandLineInterface.java über EST ab. - 5-60 Punkte