Name: _____________________________________________ Matrikel-Nr.: __________

Platz: _______ erster ( ) zweiter ( ) letzter ( ) Versuch

Pseudonym: ___________________ (nur wenn Sie möchten, daß Ihr Klausurergebnis im Internet veröffentlicht wird)

Unterlagen und Hilfsmittel sind nicht zugelassen. Kommunikation während der Klausur ist nur mit dem Dozenten erlaubt, der Mißverständnisse und Unklarheiten klären kann. Schreiben Sie die Lösungen auf diese Blätter, gegebenenfalls auf ein numeriertes 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, daß 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. Neben der Punktzahl der einzelnen Aufgaben steht als Orientierung ein geschätzter maximaler Zeitaufwand (insg. 90 Minuten). In den letzten 15 Minuten werden keine Fragen mehr beantwortet.

Klausurtermin: 3. April 1998 um 10:00 im Raum B-101


Aufgabe 1. (40 Punkte, 20 Min):

Der geschützte Teil der Klassenvereinbarung GWarteschlange (Ringpuffer) aus der Musterlösung ist folgende:

template <class TElement>
class GWarteschlange {
protected:
        TElement* speicher; // wird im Konstruktor mit einem Feld besetzt 
        int groesse, leseindex, schreibindex, zaehler;

Implementieren Sie nun für diesen Datentyp die Operation

void austragen() throw(ESchlange_leer);

Fertigen Sie auch eine Zeichnung an, die die Aktionen Ihrer Implementierung illustriert.


Aufgabe 2. (20 Punkte, 5 Min): Erweitern Sie die Klasse

class CQuadrat { protected:
        float seitenlaenge;
        int farbe;
public: ...

um eine neue Komponente naechstes (die einen Verweis auf ein anderes Quadrat darstellt), um Quadrate verketten zu können. Erzeugen Sie 3 Quadrate und fügen Sie sie in eine Kette zusammen.


Aufgabe 3. (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 Bei Klassen, die als verkettete Listen implementiert wurden,

( ) Falsch muß der Benutzer mit Zeigern arbeiten.

Grund:

( ) Richtig Abstrakte Datentypen können zwar in C programmiert wurden,

( ) Falsch sie sind jedoch nicht wirklich abstrakt.

Grund:

( ) Richtig Es gibt keinen Destruktor, der nie aufgerufen wird.

( ) Falsch

Grund:

( ) Richtig Die Typvererbung erweitert die Schnittstelle einer Klasse immer um mindestens

( ) Falsch eine Methode, die auf die Datenstruktur der Vaterklasse zugreift.

Grund:

( ) Richtig Rückruf kann in C++ mit Schablonen implementiert werden.

( ) Falsch

Grund:

( ) Richtig Zeiger in C++ sind typisiert, d.h. sie können Datenobjekte

( ) Falsch von genau einem Typ (oder Klasse) referieren.

Grund:

( ) Richtig Ausnahmen können in C++ entweder abgefangen oder ignoriert werden.

( ) Falsch

Grund:

( ) Richtig Verweise referieren in C++ ausschließlich Objekte auf der Halde.

( ) Falsch

Grund:


Aufgabe 4. (30 Punkte, 10 Min): Eine Prozedur für Ereignissteuerung reagiert auf Ankommen von Daten vom Typ CFourier über die serielle Schnittstelle. Ihr Prototyp in der Datei FOURIER.HPP ist:

void fourier(void rueckruf(CFourier* daten), void ende());

Schreiben Sie ein Hauptprogramm, das diese Daten entgegennimmt und sie in einer Datei speichert. Die Verschiebeoperationen << und >> für die Klasse CFourier können Sie dabei voraussetzen.


Aufgabe 5. (20 Punkte, 10 Min): Der private Teil der Klasse CFarbenmenge definiert ihre Daten als

bool* vorhanden; // zeigt auf das erste Element; wird vom Konstruktor mit einem Feld geladen

Implementieren Sie nun die Methoden austragen (löscht eine Farbe aus der Menge) und ist_vorhanden (sagt, ob eine Farbe in der Menge vorhanden ist) (ca. 4 Zeilen).


Aufgabe 6. (30 Punkte, 15 Min): Legen Sie ein Objekt der Klasse mit der Schnittstelle

class CVirtuell { public:
        CVirtuell();
        ~CVirtuell();
        void fuellen(char);
        virtual void ausgabe() = 0;
}

in einem Hauptprogramm an, rufen Sie zuerst die Methode fuellen, dann die Methode ausgabe, schließlich den Destruktor auf.


Aufgabe 7. (20 Punkte, 15 Min): Implementieren Sie einen abstrakten Datentyp für float-Objekte mit Hilfe der Klasse GBehaelter aus der Musterlösung mit der Schnittstelle

template <class TElement>
class GBehaelter { protected:
        TElement inhalt; bool gefuellt;
public: GBehaelter(): gefuellt (false) {};
        void fuellen(const TElement) throw(EBehaelter_voll);
        void entleeren() throw(EBehaelter_leer);
        TElement inhalt() throw(EBehaelter_leer);
        bool gefuellt();
};