Home | Lehre | Videos | Texte | Vorträge | Software | Person | Impressum, Datenschutzerklärung | Blog
Aufgabe 1
Schreiben Sie in C++ die unten aufgeführten Klassen für
das Datenmodell des späteren Terminplaners. Angegeben sind jeweils
die public-Methoden und -Attribute; hinzu kommen Destruktor, Zuweisungsoperator
und Copy-Konstruktor. Schreiben Sie zusätzlich (vorab?) eine main-Funktion
von ca. 50 Zeilen, die Ihre Klassen demonstriert. (Zum Testen werden Sie
eine längere, aber ggf. nicht präsentable Funktion verwenden
wollen.)
Kapseln Sie Ihre Klassen weitmöglichst mit private- und/oder protected-Elementen.
Schreiben Sie eine Klasse pro cpp-Datei. Lagern Sie die Schnittstellen
in Header-Dateien aus. Streben Sie an, einmal geschriebene Methoden in
anderen Klassen zu benutzen. Verwenden Sie const überall, wo möglich.
Kommentieren Sie jede nicht unmittelbar verständliche Stelle, jede
Klasse (ca. 400 Zeichen, abgeleitete Klassen ca. 200 Zeichen) und jede
nichttriviale Methode (ca. 200 Zeichen).
Wenn Sie ungarische
oder schwäbische
Notation verwenden wollen, tun Sie das, aber dann durchgängig. Wenn
Sie das vorgegebene Objektmodell verbessern können, tun Sie das ebenfalls;
kommentieren Sie dann die Abweichungen von der Vorgabe und begründen
Sie, worin der Vorteil Ihrer Lösung liegt.
Klasse Zeitpunkt
-
Konstruktor mit Minuten, Stunden, Tag des Monats, Monat, Jahr (alles Zahlen).
Das interne Speicherformat ist Ihnen überlassen; den Unterschied zwischen
Sommer- und Winterzeit sowie Ortszeit und Weltzeit können Sie (hier)
ignorieren. Unmögliche Termine (auch 29. Februar außerhalb Schaltjahr)
sollen zu einer Exception führen.
-
Alle diese Angaben sollen sich über Methoden nachträglich einzeln
abfragen und ändern lassen.
-
Operatoren ==, >, <, >= und <= mit der offensichtlichen Bedeutung
-
Methode mit fünf Parametern, die einen Zeitpunkt um eine angegebene
Zahl an Minuten, Stunden, Tagen, Monaten, Jahren verschiebt. Die Zahl der
Minuten darf dabei größer als 59 sein etc. Verschiebt man z.B.
um einen Monat, wird aus dem 28. Januar der 28. Februar (Tag mit gleicher
Zahl existiert), aus dem 29. Januar 2001 der 1. März 2001 (Tag mit
gleicher Zahl existiert nicht, dann den nächstspäteren existierenden
Tag nehmen). Führen Sie erst die Verschiebung um Jahre, dann die um
Monate, dann die um Tage etc. aus, um Überraschungen zu verhindern.
Überlauf, Jahr-2038-Problem etc. können Sie (hier) ignorieren.
-
eine Methode, um die Zahl der Minuten bei herkömmlicher Darstellung
(13. März 2001, 14:34 h) abzufragen, eine Methode, um die Zahl der
Stunden abzufragen, etc. bis zur Jahreszahl
-
eine Methode, um den Wochentag als String abzufragen („Mo“, „Di“ etc.)
-
eine Methode, welche die Differenz an Minuten zu einem anderen Zeitpunkt
bestimmt
Klasse Person
-
Konstruktor mit Name, Vorname, Geburtsdatum (als Zeitpunkt-Objekt übergeben)
-
Name, Vorname und Geburtsdatum sind öffentliche Attribute.
-
ein Methode, die einen String nach dem Muster „Müller, Heinz, geb.
7.6.1954“ liefert (Vorsicht mit Rückgabe lokaler Objekte!)
-
Um falsche Bezüge zu verhindern, sollen Objekte der Klasse Person
sollen nicht dupliziert werden können. Treffen Sie geeignete Maßnahmen,
was den Zuweisungsoperator und den Kopierkonstruktor angeht.
Klasse Termin
-
Konstruktor mit zwei Zeitpunkt-Objekten für Anfang und Ende. Liegt
das Ende vor dem Anfang, wird eine Exception geworfen.
-
Eine Methode soll einen Zeiger auf das Anfangs-Zeitpunkt-Objekt zurückliefern,
eine andere einen Zeiger auf das End-Zeitpunkt-Objekt. Verwenden Sie dabei
const, um zu erschweren, dass die Zeitpunkte von außen geändert
werden.
-
Methode mit fünf Parametern, die einen Termin um die angegebene Zahl
an Minuten, Stunden, Tagen, Monaten, Jahren verschiebt. Die Rechenregel
für den verschobenen Anfangs-Zeitpunkt (nicht den End-Zeitpunkt) soll
dabei wie für die Klasse Zeitpunkt sein. Bestimmung des neuen End-Zeitpunkts:
Die Länge des Termins soll in allen Fällen erhalten bleiben.
Tipp: Kopierkonstruktor, Differenz- und Verschieben-Methode der Klasse
Zeitpunkt benutzen.
-
Methode mit fünf Parametern, die einen Termin um eine angegebene Zahl
an Minuten, Stunden, Tagen, Monaten, Jahren verlängert (positive Werte)
bzw. verkürzt (negative Werte). Liegt nach dem Verkürzen der
Endzeitpunkt vor dem Anfangszeitpunkt, werden die Rollen von beiden getauscht.
-
Methode, die eine Überschneidung mit einem anderen Termin-Objekt feststellt
-
eine virtuelle Methode, die den String „Termin“ zurückliefert
Klasse PrivatTermin erbt public von Termin
-
Konstruktor mit zwei Zeitpunkt-Objekten und Textkommentar
-
überschriebene virtuelle Methode liefert den String „Privattermin:“
plus den Text des Kommentars zurück
Klasse KonferenzTermin erbt public von Termin
-
Konstruktor mit zwei Zeitpunkt-Objekten, Textkommentar und Zeigern auf
ein Objekt oder mehrere Objekte der Klasse Person. Finden Sie eine saubere
Lösung dafür, dass die dabei übergebene Anzahl an Personen-Zeigern
eine beliebige Zahl zwischen 1 und (sagen wir) 100.000.000 sein kann.
-
überschriebene virtuelle Methode liefert einen String zurück:
„Konferenz:“ plus den Text des Kommentars, dann „Teilnehmer:“ und den Namen
der übergebenen Personen mit abgekürzten Vornamen: „A. Hinz,
B. Kunz“. Vorsicht, wenn die Vornamen-Strings leer sind!