Klausur Pr21 SS'05

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 (auch die Schmierblä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 (was von Ihnen erwartet wird) 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 beantwortet.

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


Aufgabe 1: Die Klasse WS (wie Ihre Warteschlange-Übungslösung) implementiert die Schnittstelle Iterable mit einer einzigen parameterlosen Funktionsmethode iterator, die ein Objekt liefert, dessen Klasse Iterator implementiert:

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

Implementieren Sie mit Hilfe dieses Iteratorobjekts die Methode

static boolean istGleich(WS links, WS rechts);

Aufgabe 2: Eine mögliche Implementierung der Schnittstelle Farbmenge (für ein enum Farbe{r, g, b}; ) ist:

public class FarbmengeImpl implements Farbmenge {
   protected boolean[] inhalt = new boolean[3];
   public void eintragen(final Farbe farbe) { inhalt[farbe.ordinal()] = true; }
    … } // weitere Methoden aus Farbmenge

Implementieren Sie nun die Schnittstelle

public interface PersFarbmenge extends Farbmenge {
   public void speichern(String dateiname); // const
   public void laden(final String dateiname); }

mit Hilfe der void-Methode writeObject (mit einem Object-Parameter) sowie der parameterlosen Methode readObject (liefert Object) aus den Standardklassen ObjectIn/OutputStream, deren Konstruktore je ein FileIn/OutputStream-Objekt (konstruierbar mit dem Dateinamen als String) brauchen.


Aufgabe 3: Die Methode entfernen der Klasse Sack (hier wurde sie ähnlich wie Stapel als Reihung für Elementtyp Object programmiert) ist:
public void entfernen(final Object element) { 
   for (int index = 0; index <= spitze; index++)
     if (inhalt[index] == element) {
        inhalt[index] = inhalt[spitze]; spitze--; return; }
private Object[] inhalt; private int spitze;

Zeichnen Sie ein Sack-Objekt mit vier Einträgen von denen der 2. und 4. ist element. Zeichen Sie den Zustand vor dem Ablauf und am Ende der Methode entfernen (entweder mit einer anderen Farbe oder mit einer zweiten Zeichnung). Vergessen Sie die lokale Variable index nicht.


Aufgabe 4. 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(); } // 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