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.
In den letzten 15 Minuten werden keine Fragen mehr beantwortet.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 Stichworten 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(); } // Oberflaecheinterface 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