Programmiermethodik 3. Klausur Lösung

Ähnliche Dokumente
Programmiermethodik 1. Klausur

Programmiermethodik 2. Klausur Lösung

Programmiermethodik 1. Klausur Lösung

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

II.4.5 Generische Datentypen - 1 -

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

1 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren in Java -Eingangstest-

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Algorithmen und Datenstrukturen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

3 Objektorientierte Konzepte in Java

Java Vererbung. Inhalt

Programmieren in Java

Programmieren in Java

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

12 Abstrakte Klassen, finale Klassen und Interfaces

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete. II.4.2 Abstrakte Klassen und Interfaces - 1 -

Informatik II Übung 06. Benjamin Hepp 5 April 2017

3 Objektorientierte Konzepte in Java

Allgemeine Informatik II SS :30-13:30 Uhr

Einstieg in die Informatik mit Java

1 Klassen anlegen und Objekte erzeugen

1 Klassen anlegen und Objekte erzeugen

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Klausur Grundlagen der Programmierung

14 Abstrakte Klassen, finale Klassen, Interfaces

Kapitel 4: Klassen und Unterklassen

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Objektorientierte Programmierung Studiengang Medieninformatik

Programmieren in Java

Vererbung und Polymorphie

Objektorientierte Programmierung Studiengang Medieninformatik

Einstieg in die Informatik mit Java

Probeklausur: Programmierung WS04/05

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Programmierkurs Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack).

Vererbung, Polymorphie

Algorithmen und Datenstrukturen

Einstieg in die Informatik mit Java

Theorie zu Übung 8 Implementierung in Java

Einführung in die Programmiersprache Java II

Einstieg in die Informatik mit Java

Erzeugungsmuster. Kapselung der Objekt-Erzeugung

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Einstieg in die Informatik mit Java

Java Einführung Vererbung und Polymorphie. Kapitel 13

Javakurs für Anfänger

6. Globalübung (zu Übungsblatt 8)

Javakurs für Anfänger

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Exceptions und Vererbung

Algorithmen und Datenstrukturen. Übersicht. Interfaces und Generics. InsertionSort für Punkte. InsertionSort für Punkte

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Java für Computerlinguisten

Prof. Dr. Uwe Schmidt. 30. Januar 2017

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Programmieren 2 Java Überblick

Javakurs für Anfänger

Java I Vorlesung Collections

Interfaces und Generics

Softwaretechnik WS 16/17. Übungsblatt 01

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Java für Bauingenieure

Objektorientierte Programmierung Studiengang Medieninformatik

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

int x = 3; int y = 11; public A () { this.x = z; y *= z;

JAVA für Nichtinformatiker - Probeklausur -

Einstieg in die Informatik mit Java

Höhere Programmierkonzepte Testklausur

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Schein-/Bachelorklausur Teil 2 am Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock.

Java-Schulung Grundlagen

Fragenkatalog ESOP WS 16/17

AuD-Tafelübung T-B5b

Wiederholung zur Vorlesung Programmieren

Programmierkurs C++ Abstrakte Klassen und Methoden

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010

14. Java Klassen. Klassen (Java) vs. Records (Pascal) Klassen - Konzeptuell. Klassen - Technisch

Vererbung & Schnittstellen in C#

Klausur Software-Entwicklung März 01

Vererbung und Traits

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Informatik II Übung 6 Gruppe 7

Transkript:

Programmiermethodik 3. Klausur Lösung 9. 1. 2014 Name Matrikelnummer Aufgabe mögliche Punkte erreichte Punkte 1 20 2 16 3 45 4 19 5 20 Gesamt 120 1

Seite 2 von 10 Aufgabe 1) Objekt-Orientierung und Vererbung (20 Punkte) 1. Welche Zugriffsattribute gibt es in Java, und wie unterscheiden Sie sich? Erläutern Sie anhand eines Beispiels, warum es sinnvoll ist, Zugriffsattribute einzusetzen. 6 Punkte Lösung private (nur gleiche Klasse), default (gleiches Paket), protected (alle Subklassen), public (alle Klassen); je 1 Punkt Beispiel: mit Zugriffsattributen kann zwischen internen/externen Variablen/Methoden unterschieden werden. -> Invarianten können garantiert werden, Überprüfungen fallen weg, etc. 2 Punkte 2. Erklären Sie die Begriffe Kohäsion und Kopplung. Welche Qualitäten sollte ein gutes Programm haben? 6 Punkte Lösung Kohäsion: Zusammenhalt einer Klasse. Eine Klasse für eine Aufgabe, bzw. auch eine Methode für eine Aufgabe. 2 Punkte Koppelung: Wie stark sind die Abhängigkeiten zwischen Klassen? 2 Punkte Guter Code: Hohe Kohäsion, Lose Koppelung. 2 Punkte 3. Betrachten Sie folgende Problemstellung: Sie möchten eine Klasse Point2D implementieren, die Punkte in einem zweidimensionalen Koordinatensystem repräsentiert. Um Objekte anzulegen werden kartesische Koordinaten (double x, double y) oder Polarkoordinaten (double r, double phi) übergeben. Erklären Sie, warum es nicht möglich ist, einfach zwei Konstruktoren Point2D(double x, double y) und Point2D(double r, double phi) zu verwenden. Nennen Sie zwei sinnvolle Möglichkeiten, dieses Problem zu lösen. 8 Punkte Lösung Die Konstruktoren hätten die gleiche Signatur, was liefert dann ein Aufruf new Point2D(1,1)? 2 Punkte Möglichkeit 1: Ein Objekt Point2D anlegen, und erst dann mit Settern die Werte entsprechend setzen (bzw. mit Methoden setcoordinatespolar/setcoordinatescartesian o.ä.) Möglichkeit 2: Mit Hilfe einer statischen Factory Method, die ein Objekt vom Typ Point2D zurückgibt. Beispiel Point2D.cartesian(x, y) oder Point2D.polar(r, phi) Möglichkeit 3: boolscher Parameter zum Konstruktor hinzufügen, der entscheidet, ob die Doubles polare oder kartesische Koordinaten sind. je 3 Punkte

Seite 3 von 10 Aufgabe 2) Schnittstellen und Abstrakte Klassen (16 Punkte) 1. Erklären Sie die Unterschiede zwischen einer abstrakten Klasse und einem Interface in Java, sowie die Unterschiede zwischen einer abstrakten und einer konkreten Klasse. Skizzieren Sie einen Anwendungsfall, in dem es jeweils besser ist ein Interface bzw. eine abstrakte Klasse zu verwenden. 10 Punkte 2. Beantworten Sie folgende Fragen kurz in Stichworten. (a) Wenn ein Interface von einer abstrakten Klasse erbt, müssen die Methoden implementiert werden? Wenn nicht, warum? (b) Kann ein Interface mehrere Interfaces implementieren? Wenn nicht, warum? (c) Muss ein Interface einen Konstruktor implementieren? Wenn nicht, warum? (d) Kompiliert ein Interface, wenn es keine Methoden und Konstanten enthält? Wenn nicht, warum? 6 Punkte Lösung 1. Abstrakte Klassen können Attribute haben und Methoden implementieren, während Interfaces nur Konstante und abstrakte Methoden definieren können. Abstrakte Klassen werden mit dem Schlüsselwort abstract markiert, abstrakte Klassen können abstrakte Methoden beinhalten, von Interfaces geerbte Methoden müssen nicht implementiert werden, man kann nicht direkt von einer abstrakten Klasse eine Instanz erzeugen (nur von konkreten Unterklassen der abstrakten Klasse) Interfaces werden dort benötigt, wo sonst Mehrfachvererbung gebraucht wird, während man abstrakte Klassen besser dort einsetzt, wo viele Subklassen die gleiche Funktionalität implementieren und somit Code Reuse sinnvoll ist. 2. (a) Nein. Interfaces können nicht von abstrakten Klassen erben. (b) Ja. (c) Nein. Es geht sogar nicht, da es keine Instanzen eines Interfaces gibt. (d) Ja.

Seite 4 von 10 Aufgabe 3) Ausnahmen, Vererbung, Delegation (45 Punkte) Betrachten Sie das folgenden vereinfachte Map-Interface. public interface Map <K, V > { void put (K key, V value ); V get (K key ); Bitte beachten Sie in der folgenden Aufgabenstellung, dass viele der Aufgaben unabhängig voneinander gelöst werden können! Lediglich 2(b) und 3(a) hängen von 1 ab. 1. Entwickeln Sie eine Listen-basierte Implementierung des Map-Interfaces in einer Klasse ListMap, so dass das folgende Test-Programm ohne Fehler compiliert und ausgeführt wird. 20 Punkte 1 public class Test { 2 public static void main ( String [] args ) { 3 Map < Integer, String > map = new ListMap < >(); 4 map. put (2, " zwei "); 5 map. put (3, " III "); 6 map. put (2, "II"); 7 String s = map. get (2) ; 8 System. out. println (s); 9 10 Sie können davon ausgehen, dass sämtliche Schlüssel nicht null sind. Falls ein Schlüssel nicht vorhanden ist, sollte get den Wert null liefern. Zu jedem Schlüssel darf es maximal einen Eintrag in der Liste geben. Ein put überschreibt die alte Zuordnung, falls diese existiert. Berücksichtigen Sie das Prinzip der Datenkapselung. 2. Es soll nun sichergestellt werden, dass nur Schlüssel ungleich null verwendet werden: Falls get oder put mit key = null aufgerufen werden, sollte keine NullPointerException auftreten, sondern eine speziellere Ausnahme geworfen werden. 17 Punkte (a) Definieren Sie eine Ausnahme KeyNullException. (b) Erstellen Sie eine Klasse SafeKeyMapInheritance, die die oben gewünschten Eigenschaften hat, die auf der Klasse ListMap basiert, und die dabei das Prinzip der Vererbung verwendet. Müssen Sie hierzu die Datenkapselung aufweichen? (c) Erstellen Sie eine Klasse SafeKeyMapDelegate mit gleicher Funktionalität, die aber das Prinzip der Delegation verwendet (und ListMap als Delegat verwendet). (d) Man sollte nun im Test-Programm den Aufruf new ListMap... in Zeile 3 durch new SafeKeyMap... ersetzen können. Müssen Sie dazu noch weitere Änderungen durchführen? Wenn ja, welche? 3. Nun soll unterschieden werden können, ob ein null beim Aufruf von get(key) bedeutet, dass es keinen Eintrag zu key in der Map gibt, oder ob der zu key gehörige Wert eben null ist. Im ersten Fall soll eine NoSuchKeyException geworfen werden, wobei Sie davon ausgehen können, dass es die Klasse NoSuchKeyException schon gibt und das diese eine Unterklasse von RuntimeException ist. 8 Punkte

Seite 5 von 10 (a) Erstellen Sie, wenn möglich, eine Klasse SafeGetMapInheritance, die die oben gewünschten Eigenschaften hat, die auf der Klasse ListMap basiert, und die dabei das Prinzip der Vererbung verwendet. Wenn es nicht möglich ist, diese Implementierung so durchzuführen, erläutern Sie kurz den Grund. (b) Lösen Sie dieselbe Aufgabenstellung wie in (b) in einer Klasse SafeGetMapDelegate, wobei nun jedoch das Prinzip der Delegation anstelle der Vererbung verwendet werden soll.

Seite 6 von 10 Lösung 1. public class ListMap <K, V > implements Map <K, V > { private Node head = null ; public void put ( K key, V value ) { Node n = this. find ( this.head, key ); if (n == null ) { this. head = new Node (key, value, this. head ); else { n. value = value ; public V get ( K key ) { Node n = this. find ( this.head, key ); if (n == null ) { return null ; else { return n. value ; private Node find ( Node node, K key ) { while ( node!= null ) { if ( node. key. equals ( key )) { return node ; return null ; private class Node { K key ; V value ; Node next ; private Node ( K key, V value, Node next ) { this. key = key ; this. value = value ; this. next = next ; 2. (a) public class KeyNullException extends RuntimeException { (b) public class SafeKeyMapInheritance <K, V > extends ListMap <K, V > { protected Node find ( Node n, K key ) { if ( key == null ) { throw new KeyNullException (); else {

Seite 7 von 10 return super. find (n, key ); (c) 3. (a) Damit man find weiterverwenden und überschreiben kann, muss man für Node und find den Zugriff von private auf protected abschwächen. public class SafeKeyMapDelegate <K, V > implements Map <K, V > { private final Map <K, V > map ; public SafeKeyMapDelegate () { this. map = new ListMap < >(); public void put ( K key, V value ) { if ( key == null ) { throw new KeyNullException (); else { this. map. put (key, value ); public V get ( K key ) { if ( key == null ) { throw new KeyNullException (); return this. map. get ( key ); (d) Da wir unsere Ausnahme als RuntimeException definiert haben, brauchen wir das Test-Programm und auch das Interface nicht ändern. public class SafeGetMapInheritance <K, V > extends ListMap <K, V > { public V get ( K key ) { Node n = this. find ( this.head, key ); if (n == null ) { throw new NoSuchKeyException (); else { return n. value ; Wie in Aufgabe 2(b) muss man den Zugriff von private auf protected abschwächen, hier insbesondere für head (und wie zuvor auch für Node). (b) Diese Aufgabe ist so nicht mittels Delegation lösbar, wenn man davon ausgeht, dass man das öffentliche Interface von ListMap nicht erweitert. Da man bei der Delegation nur das Ergebnis von get abfragen kann, ist es an dieser Stelle nicht mehr entscheidbar, welcher der Fälle vorliegt.

Seite 8 von 10 Aufgabe 4) Generische Programmierung (19 Punkte) 1. Betrachten Sie nachfolgendes Codefragement. Welche Aussage(n) trifft/treffen zu? 4 Punkte List < Integer > list = new ArrayList (); list. add (89) ; int i = list. get (0) ; System. out. println (i); (a) Das Codefragment kompiliert ohne Warnung und liefert als Ergebnis 89. (b) Das Codefragment kompiliert mit Warnung und liefert als Ergebnis 89. (c) Das Codefragment kompiliert nicht. (d) Das Codefragment führt zu einer Runtime Exception. 2. Was ist/sind (ein) zulässige(r) generische(r) Parameter in Java? 3 Punkte (a) Klassen (b) Primitive Typen (c) Interfaces (d) Literale 3. Ist es in Java erlaubt, eine ArrayList ohne entsprechenden Typparameter anzulegen? 3 Punkte 4. Was ist die Ausgabe des nachfolgenden Codefragments? 4 Punkte public static void before () { Set < String > set = new TreeSet < String >() ; set. add ("2"); set. add (3) ; set. add ("1"); Iterator it = set. iterator (); while (it. hasnext ()) System. out. print (it. next () + " "); 5. Betrachten Sie nachfolgendes Codefragment. Erlaubt Java die Verwendung solch generischer Exceptions? Begründen sie Ihre Antwort! 5 Punkte try {... catch ( MyException <Byte >){... catch ( MyException < Integer >){...

Seite 9 von 10 Lösung 1. (b) 2. (a) + (c) 3. Ja 4. Kompilierfehler 5. Nein, Java erlaubt es nicht. Begründung: JVM könnte, dank Type-Erasure, zur Laufzeit nicht unterscheiden, ob es sich um eine MyException<Byte> oder MyException<Integer> handelt. Für die JVM sind beides einfach nur Isntanzen von MyException.

Seite 10 von 10 Transition -incoming : List<Step> -outgoing : List<Step> +addincoming( Step ) : voi d +addoutgoing( Step ) : voi d «enumeration» TransitionType STRAIGHT AND OR SYNC Proces MessageCenter -instance : MessageCenter -MessageCenter() +getinstance() : MessageCenter +update() : void Step -Name : String -incoming : Transition -outgoing : Transition Activity -lasts : long +register( Observer ) : voi d +unregister( Observer ) : voi d +notifymessagecenter() : void 1 * Observer +update() Abbildung 1: Lösung Aufgabe 5) Modellierung (20 Punkte) 1. Es soll ein Prozessmanagementtool implementiert werden (In Form eines gerichteten Graphen). Ein Prozess besteht aus mehreren Arbeitsschritten. Ein Arbeitsschritt kann entweder eine einzelne Aktivität sein, oder wieder selber ein (Unter-)Prozess. Prozesse und Aktivitäten haben einen Namen. Aktivitäten haben dazu noch eine Dauer, sowie Kosten. Um einzelne Arbeitsschritte verbinden zu können, braucht es zwischen den Arbeitsschritten Übergänge. Da die Übergänge auch Verzweigungen oder Synchronisationen sein können, gibt es hier 4 Typen (STRAIGHT, AND, OR, SYNC). In dem Tool gibt es ein Nachrichtencenter, das den Benutzer informiert, wenn eine Aktivität abgeschlossen ist. Das Nachrichtencenter gibt es genau einmal. Weiters informieren nicht alle Aktivitäten das Nachrichtencenter, sondern nur die, die eine Benutzereingabe erfordern. 15 Punkte 2. Erläutern Sie, welche Designpattern Sie verwendet haben, und wie Sie diese angewendet haben. 5 Punkte Lösung 1. Siehe Abbildung 1 2. Identifizierte Pattern: (a) Composite Pattern Pattern: Das unterschiedliche Aussehen der Items (b) Observer Pattern (Push): Nachrichtencenter (c) Singleton Pattern: Nachrichtencenter