Wir begrüßen Sie zur Klausur zum Kurs 1618 " Einführung in die objektorientierte Programmierung. Beachten Sie: Dies ist NICHT die Klausur zum Kurs 1814. Bitte lesen Sie die folgenden Hinweise sorgfältig und vollständig durch, bevor Sie mit der Bearbeitung der Klausur beginnen! 1. Prüfen Sie die Vollständigkeit Ihrer Unterlagen. Die Klausur umfasst: 1 Deckblatt, diese Hinweise und 4 Aufgaben auf Blatt 1 bis Blatt 5 (nur einseitig bedruckt). Geben Sie diese Unterlagen zusammen mit Ihren Lösungen später bitte vollständig ab, einschließlich Aufgabenstellung! 2. Füllen Sie jetzt bitte zuerst das Deckblatt aus! 3. Schreiben Sie Ihre Lösungen mit Kugelschreiber oder Füllfederhalter (kein Bleistift)! Sie können eigenes Papier benutzen. Schreiben Sie unbedingt auf jedes Blatt, auf dem sich Teile Ihrer Lösungen befinden, die Aufgabennummer und Ihre Matrikelnummer! Kreuzen Sie die bearbeiteten Aufgaben auf dem Deckblatt an! 4. Als Hilfsmittel sind beliebige schriftliche Unterlagen (z.b. Basistext, Leittexte, Einsendeaufgaben, Lösungsvorschläge) zugelassen, dagegen keinerlei elektronische (z.b. Laptops, Taschenrechner, Mobiltelefone!). 5. Lesen Sie vor der Bearbeitung einer Aufgabe den gesamten Aufgabentext sorgfältig durch. 6. Achten Sie darauf, dass Sie bei Programmieraufgaben Ihre Lösungen ausführlich und sinnvoll (keine bloße Beschreibung der Sprachkonstrukte) kommentieren! Bei fehlender Kommentierung oder Unleserlichkeit der Programme werden Punkte abgezogen. 7. Es sind maximal 100 Punkte erreichbar. Wenn Sie mindestens 40 Punkte erreichen, haben Sie die Klausur mit Sicherheit bestanden. 8. Leider können wir noch nicht abschätzen, wann die Korrektur abgeschlossen sein wird. Falls Sie die Klausur Ende September noch nicht zurück erhalten haben, sollten Sie bei uns nachfragen. 9. Legen Sie jetzt noch Ihren Studentenausweis und einen amtlichen Lichtbildausweis bereit, dann kann die Arbeit beginnen. Wir wünschen Ihnen viel Spaß und viel Erfolg beim Bearbeiten der Klausur!
Matrikelnummer: 1 Aufgabe 1: Quickies (30 Punkte) a) Wird das folgende Programm von einem Java-Übersetzer ohne Beanstandungen übersetzt? Falls nicht, warum? Begründen Sie Ihre Antwort! (3 Punkte) class Peter void Arnd(String Wilfried) /*... */ class Joerg extends Peter private void Arnd(String Monika) /*... */ b) Beschreiben Sie möglichst genau, aus welchen Teilen die folgende Java-Anweisung aufgebaut ist und was diese Teile bedeuten! System.err.print(); (3 Punkte) c) Zeichnen Sie das Objektgeflecht, das entstanden ist, wenn die Ausführung der main- Methode die markierte Stelle erreicht hat! (6 Punkte) class Geflecht Geflecht a,b,c; public synchronized static void main(string[] Ute) Geflecht u = new Geflecht(); Geflecht v = new Geflecht(); Geflecht w = new Geflecht(); u.a = v; v.a = w; w.a = u.a; v.b = u; u.b = v; v.c = v.a; w.c = u; u.c = v.b; /* Markierung */
Matrikelnummer: 2 d) Betrachten Sie das folgende Java-Programm: class A void m() if(this instanceof A) System.out.println("Ich bin ein A Objekt"); if(this instanceof B) System.out.println("Ich bin ein B Objekt"); class B extends A void m() super.m(); public static void main(string[] s) A a = new B(); a.m(); Was wird bei der Ausführung der main-methode ausgegeben? Begründen sie Ihre Antwort! e) Was wird ausgegeben, wenn die main-methode des folgenden Programms ausgeführt wird? Begründen Sie ihre Antwort! class K K() System.out.println("K"); public static void main(string[] oho) new M(); class L extends K L() System.out.println("L"); class M extends L M() System.out.println("M"); f) Schreiben Sie ein kleines Programmbeispiel, bei dessen Ausführung dynamisch gebunden wird! Erklären Sie genau, an welcher Stelle der Programmausführung dynamisch gebunden wird! Ihr Beispiel soll übersetzbar und ausführbar sein. (5 Punkte) g) Schreiben Sie ein kleines Programmbeispiel, an dessen Ausführung man man erkennen kann, dass der Attributzugriff in Java nicht dynamisch gebunden wird! Ihr Beispiel soll übersetzbar und ausführbar sein. (5 Punkte)
Matrikelnummer: 3 Aufgabe 2: Ein Aufzählungstyp (25 Punkte) a) Betrachten Sie das folgende Programmfragment eines Aufzählungstypen für Wochentage: public class Wochentag private int tag; public Wochentag()... public void settag(int i) throws KeinTagException... public int gettag()... public void naechstertag()... public void vorhergehendertag()... public String tostring()... Aufgabe: Vervollständigen Sie die Implementierung so, dass die folgenden Eigenschaften gelten! Vereinbaren Sie bei der Implementierung in der Klasse Wochentag keine neuen Attribute! 1. Der Konstruktor soll ein Wochentag-Objekt erzeugen und den aktuellen Wochentag auf Montag setzen. (1 Punkte) 2. Die Methode naechstertag() soll ein Wochentag-Objekt auf den folgenden Wochentag setzen. (Die Wochentage werden zyklisch behandelt!) (2 Punkte) 3. Die Methode vorhergehendertag() soll ein Wochentag-Objekt auf den vorhergehenden Wochentag setzen. (2 Punkte) 4. Die Methode settag(int i) soll den Wochentag des Wochentag-Objektes setzen (0 für Montag, 1 für Dienstag, usw.). Falls ein int-wert kleiner Null oder größer sechs übergeben wird, soll eine KeinTagException geworfen werden. Vereinbaren Sie eine Klasse KeinTagException. KeinTagException soll Subtyp von Exception sein und die gesamte Funktionalität von Exception erben. 5. Die Methode gettag() soll den Tag codiert als int-wert als Ergebnis liefern. (2 Punkte) 6. Die tostring()-methode soll den Namen des Wochentages als String zurückliefern. b) Leiten sie von der Klasse Wochentag eine Klasse Werktag mit den unten angegebenen Eigenschaften ab, deren Objekte nur die Tage von Montag bis Samstag aufzählen! (d.h. nach einem Samstag folgt ein Montag und vor einem Montag ist ein Samstag.) (10 Punkte) ffl Die Klasse Werktag soll keine weiteren Attribute vereinbaren. ffl Sorgen Sie dafür, dass Sie die Methoden naechstertag(),vorhergehendertag() und settag(int i) entsprechend arbeiten!
Matrikelnummer: 4 Aufgabe 3: OO-Programmierung (25 Punkte) Gegeben sei das folgende Programmfragment: interface Container public void replaceelementat(int i, Object o) throws ContainerException; public Object getelementat(int i) throws ContainerException; public int getlength(); interface Comparable public int compareto(object o); class ContainerException extends Exception class Sort public static void sort(container c) /* hier erweitern */ Objekte des Typs Container können Referenzen auf Objekte speichern. In einem Container- Objekt c sind c.getlength()-viele Objekte an den Stellen 0 bis c.getlength()-1 gespeichert. ffl Die replaceelementat(int i, Object o)-methode ersetzt das Objekt an der Stelle i des Containers durch o. Eine Ausnahme wird erzeugt, falls i nicht gültig ist. ffl Die getelementat(int i)-methode liefert das in einem Container an Stelle i gespeicherte Objekt. Eine Ausnahme wird erzeugt, falls i nicht gültig ist. ffl getlength() liefert die Anzahl der im Container enthaltenen Objekte. Objekte des Typs Comparable können mit der compareto-methode verglichen werden. Seien o1 und o2 Variablen mit Referenzen auf Objekte von Typ Comparable. Es gilt ffl o1.compareto(o2) < 0, falls o1 < o2, ffl o1.compareto(o2) == 0, falls o1 = o2 und ffl o1.compareto(o2) > 0, falls o1 > o2. Aufgabe: Ergänzen Sie an der gekennzeichneten Stelle die Methode sort der Klasse Sort so, dass die sort-methode die in dem übergebenen Container-Objekt enthaltenen Objekte nach einem beliebigen Verfahren aufsteigend sortiert! Sie können davon ausgehen, dass in dem übergebenen Container-Objekt nur Objekte des Typs Comparable enthalten sind.
Matrikelnummer: 5 Aufgabe 4: Threads (20 Punkte) a) Jedes Thread-Objekt hat eine public void run() und eine public void start()- Methode. Beschreiben Sie die unterschiedliche Bedeutung der beiden Methoden! (5 Punkte) b) Betrachten Sie das folgende Programm, das die Implementierung einer Speicherzelle für int-werte darstellt: class Speicherzelle private int wert; public synchronized void setwert(int w ) wert = w; public synchronized int getwert() return wert; public synchronized void swapwert(speicherzelle s) int h = s.getwert(); s.setwert(wert); setwert(h); Führen mehrere Threads den obigen Programmcode gleichzeitig aus, so kann es zu einer Verklemmung kommen. Beschreiben Sie eine solche Situation anhand eines konkreten Beispiels, in dem nur die swapwert-methode aufgerufen wird! (15 Punkte)