I-PROGR2-HOME

Klausur PROGRAMMIEREN 2

Dozent: Döben-Henisch

25.Juni 2003, 11:45 - 13:15 h, Raum AudiMax
MATRIKELNUMMER:__________________
NAME: ________________________________________________
PUNKTE INSGESAMT: ______
NOTE: ____

1. Regularien

  1. Teilnehmer an der Klausur müssen sich durch Lichtbildausweis identifizieren.
  2. Es dürfen nur leere Blätter, Schreibgeräte und Taschenrechner benutzt werden. Alle Blätter müssen mit Name und Matr.Nummer gekennzeichnet sein. Blätter ohne Kennzeichen werden nicht berücksichtigt.
  3. Die Klausurzeit für PROGR2 beträgt 90 Min. Man darf seinen Platz erst verlassen, wenn der Prüfungsleiter die Klausurarbeit in Empfang genommen hat.
  4. Es gilt folgende Punktetabelle:
    1. >69
    2. 55-69
    3. 40-54
    4. 25-39
    5. <25

  5. Das aktive Abschreiben wie auch das Zulassen von Abschreiben wird als Täuschungsversuch bewertet.

START



2. Aufgaben

  1. MODELLIERUNG EINER SIMULATION
    PKT. MAXIMAL: 41
    PKT. ERREICHT: ______

    Im folgenden wird eine vereinfachte Variante des Forschungs-Ubootes DELTA beschrieben (2 Mann Besatzung; Einsatz-Tauchtiefe 365 m). Ihre Aufgabe ist es, für die Schulung mit diesem UBoot einen kleinen SW-Simulator zu bauen. Dazu sollen sie objektorientierte Konzepte von UML und der Sprache C++ benutzen.
    Aus Sicht des UBoot-Schülers sollen Sie ein Menü zur Verfügung stellen, bei dem man folgende Eingaben machen kann: Generell Abbruch oder Eingabe oder Fortsetzung mit bisherigen Eingaben. Falls Eingabe, dann werden folgende Parameter abgefragt:
    1. Fahrtrichtung in Grad: {0o, 45o,90o, 135o, 180o,225o,270o, 315o} /* Interpretation siehe Bild unten */
    2. Motor: {0,1,2} /* '0' := keine Fahrt; '1' := Fahrt vorwärts; '2' := Fahrt rückwärts */
    3. Tauchrichtung: {0,1,2} /* '0' := Tiefe halten, '1' := auftauchen; '2' := abtauchen */
    4. /* Zusammenhang zwischen Motor und Richtung: bei Vorwärtsfahrt kann die Richtung um maximal +/- 45o in Fahrtrichtung geändert werden, ebenso bei Rückwärtsfahrt. */
    Nachdem diese Eingaben gemacht wurden, werden diese vom Uboot ausgeführt. Alle Aktionen des Ubootes, die seine aktuelle Position und Lage in der Umgeung verändern, werden an die Umgebung ('environment') weitergegeben. Die jeweiligen Zustände der Umgebung werden in einer einfachen Anzeige der Umgebung auf einfache Weise sichtbar gemacht.
    Die Anzeige repräsentiert eine Aufsicht auf die Umgebung mit gleichmässig unterteilten Feldern, die entweder nichts anzeigen oder die aktuelle Position des UBootes. Dasjenige Feld, das die aktuelle Position des Ubootes anzeigt, enthält die aktuelle Richtung des UBoots bezogen auf seinen Bug (:= Spitze des UBootes) mittels einer Zahl sowie seine aktuelle Tauchtiefe. Eine Abfrage entspricht der Zeit von 1 sec. 1 Feld in der Anzeige repräsentiert eine Fläche von 10 x 10 m. Es wird angenommen, dass sich das UBoot mit seiner Länge von 5 m in der Mitte des Feldes befindet. Bei voller Fahrt kann sich das UBoot von einem Feld in das Nachbarfeld bewegen; ausserdem kann es in dieser Simulation idealisierend pro 1 sec jeweils 10m auf- oder abtauchen. Beispiel 1: angenommen das UBoot befindet sich in einem Feld mit aktueller Richtung 45o und 100m Tiefe. Wenn der Motor auf 'Fahrt vorwärts' steht und die Fahrtrichtung mit 90o angegeben wird, dann bewegt sich das UBoot eine Zelle weiter und zwar in diejenige Zelle, die in Richtung 90o liegt (siehe Bild).
    Beispiel 2: angenommen das UBoot befindet sich in einem Feld mit aktueller Richtung 0o und 100m Tiefe. Wenn der Motor auf 'Fahrt rückwärts' steht und die Fahrtrichtung mit 225o angegeben wird, dann bewegt sich das UBoot eine Zelle weiter und zwar in diejenige Zelle, die in Richtung 225o liegt (siehe Bild). Die anschliessende Richtung des UBoots orientiert sich nach dem Bug, und dieser zeigt nach der Rückwärtsfahrt in die Richtung 45o!

    Beispiel: Vorwärts 90o und Rückwärtsfahrt 225o


    1. Teilaufgabe - MAX.PKT: 2
      Zeichnen Sie einen Usecase aus Sicht des UBoot-Schülers
    2. Teilaufgabe- MAX.PKT: 6
      Zeichnen Sie UML-Klassendiagramme für die Klassen 'UBoot', 'Umwelt' und 'Anzeige'.
    3. Teilaufgabe - MAX.PKT: 6
      Zeichnen Sie ein UML-Sequenzendiagramm für die Interaktion zwischen den Objekten vom Typ 'UBoot', 'Umwelt' und 'Anzeige' sowie dem Benutzer
    4. Teilaufgabe - MAX.PKT: 9
      Übersetzen Sie die UML-Klassen in C++-Klassen
    5. Teilaufgabe - MAX.PKT: 12
      Geben Sie eine mögliche C++-Implementierung für die Klassen 'UBoot', 'Umwelt' und 'Anzeige' an.
    6. Teilaufgabe - MAX.PKT: 6
      Geben Sie in C++ eine mögliche Usage-Datei an, die die Benutzerschnittstelle beinhaltet.

  2. Konstruktoren
    PKT. MAXIMAL: 6
    PKT. ERREICHT: ______

    Im Kontext des zuvor geschilderten UBoot-Simulators besteht grundsätzlich die Möglichkeit, auch mehr als ein UBoot in die Simulation einzuführen. Geben Sie eine explizite Definition eines Copy-Konstruktors und eines Copy-Assignment-Operators in der Klassendefinition der Klasse UBoot an, geben Sie zusätzlich die Implementierung an und zeigen Sie, wie Sie mittels Copy-Konstruktor und Copy-Assigment-Konstruktor von schon eingeführten UBoot-Objekten Kopien im Rahmen der Usage-Datei erstellen können.
  3. Vererbung
    PKT. MAXIMAL: 13
    PKT. ERREICHT: ______

    Im Simulator soll mehr als ein UBoot zugelassen werden. Dazu soll ein Koordinatensystem eingeführt (siehe Bild).

    cart

    Koordinatensystem für Umgebung2 mit offenen Rändern


    Konstruieren Sie die Klasse 'Umgebung2' als abgeleitete Klasse von der Klasse 'Umgebung'. Gestalten Sie das Interface der neuen Klasse 'Umgebung2' so, dass folgende Leistungen abgerufen werden können:
    1. Bei Einführung eines neuen UBootes kann für dieses neue UBoot eine Startposition gewählt werden.
    2. Eingeführte UBoote können ihre Positionen verändern.
    3. Die Klasse 'Anzeige' kann alle notwendigen Informationen zur Anzeige aller UBoote anfordern.
    Ferner soll gelten, dass die Klasse 'Umgebung2' Kollisionen zwischen UBooten identifiziert und diese dann sinken lässt.
      Teilaufgabe - MAX.PKT: 4
      Geben sie ein UML-Diagramm für die Vererbung der neuen Klasse 'Umgebung2' von der Klasse 'Umgebung an; schreiben Sie die C++Klassendefinition für die neue Klasse 'Umgebung2' auf.
    1. Teilaufgabe - MAX.PKT: 6
      Schreiben Sie die Implementierung für die neue Klasse 'Umgebung2' auf.
    2. Teilaufgabe - MAX.PKT: 3
      Zeigen sie, wie man Objekte und Elementfunktionen der neuen Klasse 'Umgebung2' in der Usage-Datei nutzen kann.

  4. Friend-Funktion/ Gloable Funktion
    PKT. MAXIMAL: 6
    PKT. ERREICHT: ______

    Wenn sie im Simulator ein Koordinatensystem implementiert haben, dann können Sie auch die Abstände zwischen UBooten ermitteln. Die Formel für den Abstand zwischen zwei Punkten a = (ax,ay,az) und b = (bx,by,bz ) im 3-dimensionalen euklidischen Raum lautet:

    Abstand(a,b) = sqrt((ax - bx)^2 + (ay - by)^2 + (az - bz)^2)
    1. Teilaufgabe - MAX.PKT: 3
      Realisieren Sie die Abstandfunktion als eine friend-Funktion und zeigen Sie, wie man sie anwendet.
    2. Teilaufgabe - MAX.PKT: 3
      Realisieren Sie die Abstandfunktion als eine globale Funktion und zeigen Sie, wie man sie anwendet.

  5. Ein-Ausgabe mit Dateien
    PKT. MAXIMAL: 16
    PKT. ERREICHT: ______

    Damit der UBoot-Schüler sein Lernverhalten besser auswerten kann, soll während jedes Simulationslaufes eine Log-Datei geschrieben werden. Auf Wunsch kann diese dann anschliessend gelesen werden.
    1. Teilaufgabe - MAX.PKT: 8
      Schreiben Sie eine Funktion, die eine neue Datei zum Schreiben öffnet. Bauen Sie in diese Funktion eine Fehlerbehandlung für den Fall ein, dass bei diesem Vorgang Fehler auftreten. Bauen Sie diese Funktion so in in das UBoot-Beispiel ein, dass man die Funktion zum Schreiben einer Log-Datei nutzen kann.
    2. Teilaufgabe - MAX.PKT: 8
      Schreiben Sie eine Funktion, die eine bestehende Datei zum Lesen öffnet. Bauen Sie in diese Funktion eine Fehlerbehandlung für den Fall ein, dass bei diesem Vorgang Fehler auftreten. Bauen Sie diese Funktion so in in das UBoot-Beispiel ein, dass man die Funktion zum Lesen einer Log-Datei nutzen kann.

  6. Ausnahmebehandlung
    PKT. MAXIMAL: 12
    PKT. ERREICHT: ______


    Die Sprache C++ bietet einen eigenen Mechanismus für die Ausnahmebehandlung ('exception handling').
    1. Teilaufgabe - MAX.PKT: 6
      Geben Sie anhand einer Programmskizze die drei Schlüsselwörter an, die für die Ausnahmebehandlung wichtig sind und erläutern Sie kurz, wie diese drei Elemente zusammenwirken können, um eine Ausnahmebehandlung zu realisieren.
    2. Teilaufgabe - MAX.PKT: 6
      Erläutern Sie anhand einer Programmskizze, wie Sie in C++ ihre eigene Ausnahmebehandlung realisieren könnten, die immer dann aktiviert wird, wenn eine Ausnahme auftritt.

  7. Templates
    PKT. MAXIMAL: 18
    PKT. ERREICHT: ______

    In C++ gibt es die Möglichkeit, parametrisierte Klassen (:= Templates) zu definieren.
      Teilaufgabe - MAX.PKT: 3
      Geben Sie eine Klassendefinition für eine Klasse Stack ('Stapel') für Objekte vom Typ 'int' an; der Stack soll über die Elementfunktionen 'push()' und 'pop()' verfügen. Benutzen Sie für die Definition Elemente aus der C++-Standard-Bibliothek STL.
    1. Teilaufgabe - MAX.PKT: 4
      Geben sie die Implementierung für die Klasse 'Stack' an.
    2. Teilaufgabe - MAX.PKT: 3
      Schreiben Sie die Definition für die Klasse 'Stack' als eine Definition für ein Template.
    3. Teilaufgabe - MAX.PKT: 4
      Geben Sie die Implementierung für die parametrisierteKlasse 'Stack' an.
    4. Teilaufgabe - MAX.PKT: 4
      Geben sie eine Usage-Datei an, in der Sie ein Objekt von der Klasse Stack vom Typ 'int' einführen, dazu eine Kopie des Objektes, sowie ein Objekt des Templates Stack mit einer Kopie sowie einigen push()- und pop()-Operationen mit diesen Objekten.

START



3. Anhang



iofunctions I/O-Basisklassen-Funktionen



filefunctions I/O-Basisklassen-Funktionen für Dateioperationen



START