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). Bei manchen Aufgaben steht als Orientierungder Anzahl der Programmzeilen in der Musterlösung. In den letzten 15 Minuten werden keine Fragen mehr beantwortet.

Klausurtermin: 3. Februar 1998 um 12:15 im Raum B-101

Ergebnisse: 10. Februar 1998 um 10:00 im Vorlesungsraum


Aufgabe 1. (40 Punkte, 20 Min, ca. 9 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 der Größe groesse besetzt 
	int groesse, leseindex, schreibindex, zaehler;

Implementieren Sie nun für diese Klasse die Methode

int anzahl(const TElement&);

Sie informiert den Aufrufer darüber, wie oft das Element, das er als Parameter übergeben hat, in der Warteschlange vorhanden ist. Die Syntax einer Suchschleife in C ist:

for (int i = 0; i < feldgroesse; i++) if (feld[i] == suchwert) { aktionen; };

Aufgabe 2. (20 Punkte, 5 Min, ca. 5 Programmzeilen): Erweitern Sie die Ausprägung der Klassenschablone für int

template <class TElement> class CKlasse { protected:
	TElement wert;
public:
	CKlasse(const TElement& w) : wert(w);
	TElement lesen() { return wert; };
}

um einen neuen Mutator schreiben, mit dessen Hilfe der Wert eines Klassenobjekts verändert werden kann (mit Klassenvererbung, inklusive Implementierung).


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, muß die Zuweisung überladen werden.

( ) Falsch

Grund:

( ) Richtig Klassen in C++ sind besser geeignet für denselben Zweck, wie die Implementierung von abstrakten Datentypen mit Hilfe von Moduln in C.

( ) Falsch

Grund:

( ) Richtig Ein Element des Stapels ist lesbar, nachdem alle jüngeren Elemente entfernt wurden.

( ) Falsch

Grund:

( ) Richtig Prozeduren und Datentypen können als Argumente für Prozeduraufrufe benutzt werden.

( ) Falsch

Grund:

( ) Richtig Das Profil einer Menüprozedur definiert, welche Rückrufprozeduren als Argumente geeignet sind.

( ) Falsch

Grund:

( ) Richtig Durch die Verwendung von Zuweisung zwischen ADT-Obejkten (in C)

( ) Falsch können Inkonsistenzen entstehen.

Grund:

( ) Richtig Klassen werden immer von Modulen exportiert.

( ) Falsch

Grund:

( ) Richtig Es gibt Module, die ohne den Aufruf einer ihrer Operationen etwas tun.

( ) Falsch

Grund:


Aufgabe 4. (30 Punkte, 10 Min, ca. 5 Programmzeilen): Eine Prozedur für Ereignissteuerung reagiert auf das Ankommen von e-mail über das Internet. Ihr Prototyp in der Datei EMAIL.HPP ist:

void email(void rueckruf(char*)); // aktiviert rueckruf und übergibt ihm den Text

Schreiben Sie ein Hauptprogramm, das die erhaltene Botschaft (Parameter der Rückrufprozedur) auf dem Bildschirm ausgibt (cout).


Aufgabe 5. (20 Punkte, 10 Min, ca. 3 Programmzeilen): Implementieren Sie den Operator ++ (erhöht jede Komponente um 1) für die Klasse CFeld mit der folgenden Datenstruktur (die Syntax einer Zählschleife in C entnehmen Sie aus der Aufgabe 1):

class CFeld { protected:
int groesse;
int* speicher; // wird im Konstruktor als Feld der Größe groesse angelegt
...


Aufgabe 6. (30 Punkte, 15 Min): Der geschützte Teil der Klassenvereinbarung GWarteschlange (verkettete Liste) aus der Musterlösung ist folgende:

template <class TElement> class GWarteschlange { protected:
	class CKnoten { public:
		TElement wert; // Schablonentyp
		CKnoten* verbindung; // Rückwärtsverbindung
		CKnoten(CKnoten* v, const TElement& e): wert(e), verbindung(v) {};
		~CKnoten() { delete verbindung; };
	};
	CKnoten* juengster; CKnoten* aeltester;
}

Zeichnen Sie nun alle Stapel- und Haldenobjekte (inklusive ihrer Struktur, insbesondere die Zeiger), die nach der Ausführung des folgenden Programmstücks entstehen:

GWarteschlange<int> w1, w2;
w1.eintragen(5); w1.eintragen(6); w1.eintragen(7); w1.entfernen();

Aufgabe 7. (20 Punkte, 15 Min, ca. 6 Programmzeilen): Implementieren Sie ein abstraktes Datenobjekt (Datenabstraktionsmodul mit .HPP und .CPP) für Zeichenketten (vom Typ char*) 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();
};