Klausur Pr31 SS'05

Unterlagen und Hilfsmittel sind nicht zugelassen. Kommunikation während der Klausur ist nur mit dem Dozenten erlaubt, der Missverständnisse und Unklarheiten klären kann. Schrei­ben Sie die Lösungen auf diese Blätter, bzw. auf ein nummeriertes lee­res Blatt mit Ihrem Namen; kennzeichnen Sie die Aufgabennummer eindeutig. Geben Sie alle Blät­ter (auch die Schmier­blät­ter) ab. Für falsche oder nicht einleuchtende Lösungen be­kommen Sie grund­sätz­lich kei­ne Punk­te. Wenn aber aus Ihren Notizen oder Be­merkungen er­sicht­lich ist, dass Ihr Gedankengang richtig war, kön­nen Sie Teil­punkte bekommen. Sie ver­lie­ren jedoch diese Möglichkeit, wenn Abschreiben oder Kommu­ni­ka­ti­on wäh­rend der Klau­­sur nachgewiesen werden kann. Der Kern der Fragen (was von Ihnen erwartet wird) wurde kursiv gesetzt. Bei manchen Aufgaben steht als Orientierung der Anzahl der Programmzeilen in der Musterlösung. In den letzten 15 Minuten werden keine Fragen mehr beant­wor­tet.

Klausurtermin: 6. Juli 2005 ● Rückgabe: 13. Juli 2005 in der Vorlesung


Aufgabe 1: Der Operator += bei einer verketten Liste hat die Aufgabe, einen Knoten (seinen rechten Operand) an einen anderen Knoten (seinen linken Operand) anzuketten. Der linke Operand wird als Ergebnis zurückgegeben, um „Kettenverkettung” (a += b += c) zu ermöglichen.

Schreiben Sie nun die Definition dieses Operators (Methodenkopf und return-Anweisung, nicht aber den Algorithmus im Rumpf) und einen Aufruf mit 3 Knoten (CKnoten a, b, c; … a += b += c;), aber nicht mit Operatorsyntax sondern Methodensyntax.

Schreiben Sie dieselbe Definition und denselben Aufruf auch in C, wo es keine Referenz- (nur Zeiger-) Parameter gibt.


Aufgabe 2: Fälschungsklassen werden benutzt, um reduziertes Verhalten „quick and dirty” zu simulieren. Schreiben Sie nun eine gefälsche Warteschlangenklasse FakeWS, die nur eine Methode iterator() exportiert. Das von ihr gelieferte Iteratorobjekt (mit den Methoden akutellesElement(), naechstesElement() und mehrElemente(), wie in der letzten Übung) soll nacheinander die drei string-Objekte "Technische", "Fachhohschule" und "Berlin" liefern.

Tipp: Die innere Iteratorklasse braucht einen globalen Zähler, der von 0 bis 2 läuft. Dementsprechend holt akutellesElement() holt aus der globalen string-Reihung die Werte.


Aufgabe 3: Zeichnen Sie das Objektdiagramm mit einem WarteschlangeR-Objekt (Ringpuffer mit 5 Plätzen, wie in der Übung), in das 3 Color-Objekte eingetragen, 2 entfernt, und dann 3 eingetragen worden sind:
struct Color { int komp[3]; } // red, green, blue 
class WarteschlangeR { Color* inhalt; int juengster, aeltester, anzahl } 

Aufgabe 4. (40 Punkte, 15 Min): Kreuzen Sie die richtigen Antworten an und geben Sie Ihre Begründung mit Stich­worten dazu. Ohne Begründung gilt Ihre Antwort als falsch.

(     )     Richtig            Eine Java-Referenz kann nur auf die Halde (heap) zeigen,
(     )     Falsch             ein C++-Zeiger kann auch auf den Stapel (stack) zeigen.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Stromoperatoren für eine Klasse können nur programmiert werden,
(     )     Falsch             wenn sie für alle Komponenten (Attributen) der Klasse zur Verfügung stehen.

Grund:                                                                                                                                                                                                        

(     )     Richtig            Java-Programme werden ausschließlich dynamisch gebunden,
(     )     Falsch             C++-Programme werden ausschließlich statisch gebunden

Grund:                                                                                                                                                                                                        

 (    )     Richtig            Wenn flache Gleichheit true ergibt,
(     )     Falsch             ergibt die tiefe Gleichheit auch true.

Grund:                                                                                                                                                                                                        

 (    )     Richtig            Der Destruktor einer C++-Klasse wird nur bei delete aufgerufen
(     )     Falsch            

Grund:                                                                                                                                                                                                        

(     )     Richtig            Ein Kopierkonstruktor hat immer genau einen Parameter.
(     )     Falsch            

Grund:                                                                                                                                                                                                        

(     )     Richtig            Mehrfachvererbung in C++ verursacht Namenskonflikte.
(     )     Falsch            

Grund:                                                                                                                                                                                                        

(     )     Richtig            Der %-Operator in der Implementierung des Ringpuffers sorgt dafür,
 (    )     Falsch             dass ein belegter Platz im Puffer nicht überschrieben wird.

Grund:                                                                                                                                                                                                        


Aufgabe 5.: Die Klasse CRandom hat eine einzige Methode float random(), die beim Aufruf Zufallszahlen zwischen 0 und 1 produziert. Schreiben Sie ein Datenabstraktionsmodul (mit Spezifikation und Rumpf), dessen einzige Funktion int zufall() mit Hilfe dieser Klasse Zufallszahlen zwischen 0 und 1000 produziert.