Klausur PR39 im SS '95


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: Mittwoch, den 28.6.1995 um 10:00 im Raum B-301

Ergebnisse: Mittwoch, den 5.7.1995 um 10:00 im Vorlesungsraum
Letzte Reklamationsmöglichkeit: Montag, den 10.7.1995 um 14:15 im Übungsraum
Die Klausurnote (rot) wird abwärts gerundet vergeben. Übungsnote (blau), Semesternote (gelb):


Aufgabe 1. (40 Punkte, 10 Min): Das Modul mit der Schnittstelle in der Datei FOURIER.H ist geeignet, Fourier-Kurven auf dem Bildschirm darzustellen. Es stellt ein abstraktes Datenobjekt zur Verfügung, in dem eine Fourier-Kurve gespeichert werden kann. Dazu muß seine Methode speichern() aufgerufen werden. Die Methode anzeigen() läßt die gespeicherte Kurve auf dem Bildschirm sichtbar werden. Die Methode loeschen() entfernt die Fourier-Kurve aus dem Datenbehälter.

Das Modul stellt nicht nur ein abstraktes Datenobjekt für Fourier-Kurven zur Verfügung, sondern exportiert auch den abstrakten Datentyp tfourier, um eine beliebige Anzahl von Fourier-Objekten anlegen zu können. Sie können mit den parametrisierten Versionen der obigen Methoden manipuliert werden.

Entwickeln Sie nun eine C-Hauptprozedur, die zwei Fourier-Kurven, eine abstrakte (namenlose) und eine konkrete (benannte) bedient. Machen Sie zuerst die erste sichtbar; nachdem Sie diese gelöscht haben, machen Sie die zweite sichtbar. Löschen Sie schließlich auch die zweite.

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


Aufgabe 2. (30 Punkte, 20 Min): Finden Sie zehn Fehler im folgenden C-Programmausschnitt aus der Musterlösung für die 2. Aufgabe. Notieren Sie die Zeilennummer, schreiben Sie die Zeile richtig und beschreiben Sie kurz den Fehler auf einem Extrablatt:

cout << "\tx\ty\n"
float dx := (b-a) / n;
int x = a; --float
for (int i = 0; i++; i <= n) {
cout << '\t' << x << '\t';
if (x = k)
cout << 1/(x-k) << endl;
else
cout << "undefiniert";
x =+ dx;
cout << "Auf Wiederrechnen\n";

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


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 Datenabstraktionsmodule exportieren immer einen abstrakten Datentyp.
( ) Falsch
Grund:
( ) Richtig Die Anzahl der aktuellen Parameter (Argumente) einer C-Funktion muß nicht immer
( ) Falsch mit der Anzahl der formalen Parameter übereinstimmen.
Grund:
( ) Richtig Rückrufprozeduren werden in C mit Prozedurzeiger-Parametern programmiert.
( ) Falsch
Grund:
( ) Richtig Referenzparameter werden verwendet, wenn das übergebene Objekt innerhalb der Funktion
( ) Falsch nicht verändert werden soll.
Grund:
( ) Richtig Mit Hilfe eines Konstruktors werden nicht unbedingt alle Felder eines Objekts
( ) Falsch mit Anfangswert versehen.
Grund:
( ) Richtig Der Name eines Feldobjekts (array) darf nicht auf der linken Seite einer Zuweisung stehen.
( ) Falsch
Grund:
( ) Richtig Alle dynamischen Datentypen arbeiten an der Halde.
( ) Falsch
Grund:
( ) Richtig Alle Verweisobjekte, die einen Namen haben, befinden sich in C++ auf dem Stapel.
( ) Falsch
Grund:

( 0 5 10 15 20 25 30 35 40 )


Aufgabe 4. (20 Punkte, 10 Min): Die Klasse Boden mit der folgenden Schnittstelle implementiert einen Datenbehälter, in dem Zeichen gespeichert werden können.

class Boden {
public:
Boden (); // Konstruktor
void speichern (char); // Mutator
char holen (); // Informator
void loeschen (); // Mutator
bool leer (); // Informator
bool voll (); // Informator
protected: ... // Implementierung der Datenstruktur

Leiten Sie aus dieser Klasse eine weitere durch Vererbung ab (inkl. Implementierung), die ihren Benutzer auch über die Anzahl der gespeicherten Zeichen informieren kann.

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


Aufgabe 5. (20 Punkte, 5 Min): Schreiben Sie die C-Anweisungen auf, die die folgende Zeichenkette kopieren:

char * quelle = "Zeichenkette kopieren";
char * ziel;

Lösung: ( 0 5 10 15 20 )


Aufgabe 6. (50 Punkte, 30 Min): Die folgende Methode trägt ein Element in eine doppelt verkettete Datenstruktur ein:

void Liste::eintragen (Typ x, Knoten * anker) {
Knoten * hilfe = anker;
anker = new Knoten;
anker -> wert = x;
anker -> zurueck = hilfe;
anker -> vor = hilfe->vor;
}

Zeichnen Sie die Datenstruktur (mit mindestens 3 Elementen) auf. Tragen Sie die Veränderungen in Ihre Zeichnung ein und versehen Sie sie mit den Nummern der Programmzeilen, die sie bewirken. Sie müssen dabei Randsituationen wie erstes/letztes Element nicht beachten.
Schreiben Sie die Methode austragen (Knoten * anker) für diese Klasse.

Lösung: ( 0 5 10 15 20 25 30 35 40 45 50 )