Klausur Pr22 SS'06

Unterlagen und Hilfsmittel sind nicht zugelassen. Kommunikation während der Klausur ist nur mit dem Dozenten erlaubt, der Missverständnisse und Unklarheiten klären kann. Schreiben Sie die Lösungen auf diese Blätter, bzw. auf ein nummeriertes leeres Blatt mit Ihrem Namen; kennzeichnen Sie die Aufgabennummer eindeutig. Geben Sie alle Blätter ab. Für falsche oder nicht einleuchtende Lösungen bekommen Sie grundsätzlich keine Punkte. Wenn aber aus Ihren Notizen oder Bemerkungen ersichtlich ist, dass Ihr Gedankengang richtig war, können Sie Teilpunkte bekommen. Sie verlieren jedoch diese Möglichkeit, wenn Abschreiben oder Kommunikation während der Klausur nachgewiesen werden kann. Der Kern der Fragen wurde kursiv gesetzt. Bei manchen Aufgaben steht als Orientierung der Anzahl der Programmzeilen in der Musterlösung. In den letzten 15 Minuten werden keine Fragen mehr beant­wor­tet.

Klausurtermin: 6. Juli 2006 ● Rückgabe: 13. Juli 2006 in der Vorlesung

Die Klausurnote (rot) wird abwärts gerundet. Sie ergibt mit der Übungsnote (blau) gemittelt die Endnote (gelb):


Aufgabe 1: Schreiben Sie eine Methode, die feststellt, ob ein Collection-Objekt ein gegebenes Objekt enthält oder nicht. Die hierzu nötige Methode aus der Schnittstelle Collection ist:

Iterator iterator();
interface Iterator { Object next(); boolean hasNext(); void remove(); }

Schreiben eine alte und eine neue Version der Methode: eine nicht-generische mit konventioneller for-Schleife und eine generische für Java 5 mit verbesserter for-Schleife. Ihre Syntax ist:

for (Elementyp element : sammlung) { … }

Das Profil einer generischen Methode sieht allgemein folgendermaßen aus:

static Ergebnistyp <Typparameter>methodenname(Parametertyp parameter, …)

Aufgabe 2: Eine doppelt verkettete Liste ist sowohl vorwärts wie auch rückwärts verkettet:

class DoppeltVerketteteListe { private Knoten anker; … }

anker referenziert hierbei einen beliebigen Knoten (am Ende oder irgendwo mitten in der Liste). Die Enden der Liste sind mit null in der Verbindung des Knoten gekennzeichnet. Zeichnen Sie nun eine solche Liste mit 3 Elementen (anker referenziert das mittlere), und fügen Sie ein neues Element nach dem von anker referenzierten Element ein. anker referenziert zum Schluß das neue Element.

Programmieren Sie die Klasse Knoten und die Methode einfügen.


Aufgabe 3.: Die Methode entleeren ist eine (parameterlose) monadische Operation. In der Vorlesung und in der Übung haben wir sie als Mutator programmiert. Wir haben jedoch gelernt, dass eine monadische Operation auch als Objektfunktion oder als Klassenfunktion entworfen werden kann.

Programmieren Sie nun die Methoden entleerenO (als Objektfunktion) und entleerenK (als Klassenfunktion) der Klasse Stapel. Sie können davon ausgehen, dass


Aufgabe 4. (40 Punkte, 15 Min): Kreuzen Sie die richtigen Antworten an und geben Sie Ihre Begründung mit Stich­worten dazu. Ohne Begründung gilt Ihre Antwort als falsch.

(     )     Richtig            Bessere Zeitkomplexität eines Sortierverfahrens muss immer
(     )     Falsch             mit schlechterer Speicherkomplexität erkauft werden.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Die Reihenfolge der Eintragungen in einen Standard-Multibehälter
(     )     Falsch             ist immer relevant (wichtig).

Grund:                                                                                                                                                                                                        

(     )     Richtig            Ein Brückenstrom verbindet Ein- und Ausgabeströme miteinander
(     )     Falsch            

Grund:                                                                                                                                                                                                        

(     )     Richtig            Nebenläufige Prozesse in Java werden immer
(     )     Falsch             mit der Implementierung der Schnittstelle Runnable programmiert.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Es gibt Schleifen in Java,
(     )     Falsch             deren Endlichkeit vom Compiler garantiert wird.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Ein generischer Multibehälter kann Objekte
(     )     Falsch             beliebiger Klassen aufnehmen.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Die Darstellung eines XML-Dokuments kann entweder in einem DTD
(     )     Falsch             oder in einem CSS defiiert werden.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Wenn die flache Gleichheit false liefert,
 (    )     Falsch             liefert auch die tiefe Gleichheit false.

Grund:                                                                                                                                                                                                        


Aufgabe 5: Skizzieren Sie eine Klasse KonsolOberflaeche so, dass der Taschenrechner (aus der Übungsaufgabe) auch von der Konsole (statt mit swing-Oberfläche) bedient werden kann. Sie können hierzu die MVC-Klassen entweder aus Ihrer Übungslösung oder von der Vorlesung nehmen. Die Schnittstellen der letzteren sind:

interface Lauscher { }
interface Rechenwerk {
   void ziffer(char ziff); // Lauscher
   void operation(char op); // Lauscher
   String getZahl(); } // Oberflaeche
interface Oberflaeche {
   void registrieren(ActionListener ziffernLauscher, ActionListener opLauscher); 
   void anzeigen(); } // Lauscher

Benutzen Sie dazu die Klasse

class Console {
   void println(String s) {…} // zeigt s an der Konsole an
   void addActionListener(ActionListener listener) {…} }
   // Eingabe an der Konsole ruft listener.actionPerformed auf