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 )