Name: _____________________________________________ Matrikel-Nr.: __________

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

Pseudonym: __________________ (nur wenn Sie möchten, daß Ihr Klausurergebnis als Aushang 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). Bei manchen Aufgaben steht als Orientierungder Anzahl der Programmzeilen in der Musterlösung. In den letzten 15 Minuten werden keine Fragen mehr beantwortet.

Klausurtermin: 23. Juni 1997 um 14:15 im Raum B-301

Ergebnisse: 30. Juni 1997 um 14:15 im Vorlesungsraum

Die Klausurnote (rot) wird abwärts gerundet vergeben. Übungsnote (blau), Semesternote (gelb):

5 15 25 35 45 55 65 75 85 95 105 115 125 135 145 155 165 175 185 195

0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200

6,0 5,7 5,3 5,0 4,7 4,3 4,0 3,7 3,3 3,0 2,7 2,3 2,0 1,7 1,3 1,0

_______________________________________________________________________________________

Aufgabe 1. (40 Punkte, 20 Min, ca. 11 Programmzeilen):

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 eintragen(const TElement&) throw(ESchlange_voll);

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

Lösung auf dem Extrablatt Nr. _________ ( 0 5 10 15 20 25 30 35 40 )

_______________________________________________________________________________________

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

class CFahrzeug { protected:

char* Kennzeichen;

int Mietpreis; // in DM

public: ...

um eine neue Komponente Ersatz, der ein Verweis auf ein anderes Fahrzeug darstellt.

Lösung:

( 0 5 10 15 20 )

Name: _____________________________________________ Matrikel-Nr.: __________

_______________________________________________________________________________________

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 Für Klassen, die als verkettete Listen implementiert wurden,

( ) Falsch sollte die Zuweisung überladen werden.

Grund:

( ) Richtig Abstrakte Datentypen können sowohl in C, wie auch in C++ programmiert werden.

( ) Falsch

Grund:

( ) Richtig Ein Konstruktor wird für ein Klassenobjekt wiederholt ausgeführt,

( ) Falsch wenn er wiederholt aufgerufen wird.

Grund:

( ) Richtig Die Modulvererbung 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 Es gibt Zeiger, die Objekte unterschiedlicher, aber nicht aller Datentypen referieren können.

( ) Falsch

Grund:

( ) Richtig Wenn eine Ausnahme in C++ ausgelöst aber nicht abgefangen wird,

( ) Falsch muß sie in der Schnittstelle deklariert werden.

Grund:

( ) Richtig Polymorphie kann auch in einem Programm benutzt werden,

( ) Falsch das keine Zeiger enthält.

Grund:

( 0 5 10 15 20 25 30 35 40 )

_______________________________________________________________________________________

Aufgabe 4. (30 Punkte, 10 Min, ca. 7 Programmzeilen): Eine Prozedur für Ereignissteuerung reagiert auf das Drücken der linken und der rechten Maustaste. Ihr Prototyp in der Datei STEUER.HPP ist:

void steuerung(void linkeTaste(), void rechteTaste());

Schreiben Sie ein Hauptprogramm, das nach dem Drücken der linken Taste eine Ganzzahl einliest (cin), die nach dem Drücken der rechten Maustaste ausgegeben wird (cout).

Lösung:

Fortsetzung auf dem Extrablatt Nr. _________ ( 0 5 10 15 20 25 30 )

Name: _____________________________________________ Matrikel-Nr.: __________

_______________________________________________________________________________________

Aufgabe 5. (20 Punkte, 10 Min, ca. 8 Programmzeilen): Implementieren Sie den Verschiebeoperator << für die Klasse CMultibehaelter mit der folgenden Datenstruktur:

template <class TElement>

class CMultibehaelter { protected:

int index, groesse;

TElement* speicher; // wird im Konstruktor als Feld der Größe groesse angelegt

...

Lösung auf dem Extrablatt Nr. ________________ ( 0 5 10 15 20 )

_______________________________________________________________________________________

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

class CAufgschoben { public:

CAufgeschoben();

~CAufgeschoben();

void fuellen (int);

virtual void ausgabe = 0;

}

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

( 0 5 10 15 20 25 30 )

_______________________________________________________________________________________

Aufgabe 7. (20 Punkte, 15 Min, ca. 8 Programmzeilen): Implementieren Sie ein abstraktes Datenobjekt (Datenabstraktionsmodul) mit Hilfe der Klasse GBehaelter aus der Musterlösung mit der Vereinbarung

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();

};

Lösung :

(5 10 15 20 )