Lösung der Klausur Pr31 WS'01/'02


Aufgabe 1.

class ErwGanzWS : GanzWS {
   public void posit() {
     Knoten* knoten = anker;
     while (knoten != NULL) {
        if (knoten -> wert < 0) knoten -> wert = - knoten -> wert; 
        knoten = knoten -> verb;
     }
   }
}

Aufgabe 2


Aufgabe 3

bool Kreuzgang::flachGleich(const Kreuzgang& that) const {
   return aeusseresQuadrat == that.aeusseresQuadrat &&
     inneresQuadrat == that.inneresQuadrat;
}
bool Kreuzgang::istGleich(const Kreuzgang& that) const {
   return aeusseresQuadrat->linksOben.x == aeusseresQuadrat->linksOben.x &&
     aeusseresQuadrat->linksOben.x == that.aeusseresQuadrat->linksOben.x &&
     aeusseresQuadrat->rechtsUnten.x == that.aeusseresQuadrat->rechtsUnten.x &&
     aeusseresQuadrat->rechtsUnten.y == that.aeusseresQuadrat->rechtsUnten.y &&
     inneresQuadrat->linksOben.x == inneresQuadrat->linksOben.x &&
     inneresQuadrat->linksOben.x == that.inneresQuadrat->linksOben.x &&
     inneresQuadrat->rechtsUnten.x == that.inneresQuadrat->rechtsUnten.x &&
     inneresQuadrat->rechtsUnten.y == that.inneresQuadrat->rechtsUnten.y;
}
bool Kreuzgang::tiefGleich(const Kreuzgang& that) const {
   return istGleich(that) &&
     aeusseresQuadrat->sichtbar == that.aeusseresQuadrat->sichtbar &&
     inneresQuadrat->sichtbar == that.inneresQuadrat->sichtbar;
}

Aufgabe 4:

·    Die Konvertierung von Zeigern geschieht in C++ immer automatisch.

Falsch: nur bei Aufwärtskompatibilität; bei Abwärtskompatibilität muss explizit konvertiert werden.

·    cout ist eine Stromklasse, die in der Datei iostream.h definiert wurde.

Falsch: cout ist ein Objekt

·    Ein Datenabstraktionsmodul kann parameterlose Operationen enthalten, während ein ADT nicht.

Richtig: Das Modul enthält die Daten selbst; einer ADT-Operation muss das ADT-Objekt mitgegeben werden.

·    Die Implementierung einer Schablone (.cpp) muss dem Benutzer zur Verfügung gestellt werden.

Richtig: Schablonen werden erst bei der Ausprägung übersetzt.

·    Ein new-Aufruf in einem Destruktor produziert immer eine Speicherleiche.

Falsch: Nicht, wenn das Objekt im selben Destruktor mit delete gelöscht wird.

·    Dynamisches Binden ist nur in Java möglich; in C++ wird immer statisch gebunden.

Falsch: .dll in C++ möglich

·    Eine geerbte Variable kann in einem Objekt doppelt vorhanden sein.

Richtig: z.B. wenn zwei Oberklassen dieselbe Oberklasse haben.

·    Die Reihungsimplementierung braucht weniger Speicherplatz als die Listenimplementierung.

Richtig/Falsch: weniger, weil keine Knoten-Referenzen benötigt werdenM; mehr, weil es leere Plätze gibt.


Aufgabe 5

mit virtual:  1 2 3  1 2 3  2 3  1 1  1 3

ohne virtual: 1 2 3  1 2 3  1 1  1 1  1 1

Begründung: Der Zeigerzugriff und Referenzparameter mit virtual ist polymorph (Ausgabe der Unterklasse, weil Unterklassenobjekt), ohne virtual nicht (Ausgabe der Oberklasse, weil Oberklassenzeiger).