6
HOCHSCHULE MUENCHEN FAKULTÄT ELEKTROTECHNIK UND INFORMATIONSTECHNIK BEREICH TECHNISCHE INFORMATIK Prof. Dr. A. Irber Stand: 22.08.2010 ---------------------------------------------------------------------------------- Übung zu OOP/C++ (3-1) Allgemeines Im vorliegenden Versuch soll schrittweise die folgende Klassenhierarchie entwickelt werden : Bei der Implementierung der einzelnen Klassen ist das Prinzip der Mehrfachverwendung von Code zu beachten, d.h. in der Definition der Memberfunktionen sind - wo immer möglich und sinnvoll - andere Memberfunktionen derselben Klasse oder Memberfunktionen von Basisklassen einzusetzen. Teil a) Im ersten Schritt ist eine Klasse Uhr zu entwickeln. Objekte dieser Klasse sollen die jeweilige Zeit ("Uhrzeit") in einer privaten Datenkomponente speichern. Hierfür ist die Klasse Zeit einzusetzen, deren Definition in der Header-Datei Zeit.h (s. Anlage 1) enthalten ist und deren Implementierung in der Objekt-Datei Zeit.cpp zur Verfügung steht. Die Klasse Uhr soll über die folgenden öffentlichen Memberfunktionen verfügen Default-Konstruktor, der die Zeit-Datenkomponente auf 00:00.00 (d.h. Stunde=0, Minute=0, Sekunde=0) setzt, Konstruktor, der die Zeit-Datenkomponente mit dem als Parameter übergebenen Zeit-Objekt initialisiert. void setTime(....); Setzen der Uhrzeit (Zeit-Datenkomponente) auf den als Parameter übergebenen Wert Zeit getTime() const; Rückgabe des Werts der Zeit-Datenkomponente (aktuelle Uhrzeit) als Funktionswert. int tickClock(int); Erhöhung der Uhrzeit um die durch den Parameter angegebene Anzahl Sekunden. (Defaultwert für Parameter = 1) Funktionswert : 0, wenn durch die Erhöhung der Uhrzeit kein Tagwechsel eingetreten ist 1, wenn durch die Erhöhung der Uhrzeit ein Tagwechsel eingetreten ist (23:59.00 00:00.00) Diese Funktion soll in abgeleiteten Klassen überschreibbar sein. void displayClock() const; Ausgabe der Uhrzeit in folgender Form in die Standard-Ausgabe : "Uhrzeit : hh:mm.ss" Diese Funktion soll in abgeleiteten Klassen überschreibbar sein. Formulieren Sie die Definition der Klasse Uhr in der Header-Datei Uhr.h und die Implementierung der Klasse in der C++-Quell-Datei Uhr.cpp. Zur Erzeugung eines kleinen Testprogramms steht das C++-Quell-Modul Ueb3a_main.cpp zur Verfügung. Uhr UhrMitDatum UhrMitWeckerUndDatum

Übung zu OOP/C++ (3-1) - lsw.ee.hm.edulsw.ee.hm.edu/~irber/oop/praktikum/oop_v3/oop_v3.pdf · hochschule muenchen fakultÄt elektrotechnik und informationstechnik bereich technische

Embed Size (px)

Citation preview

Page 1: Übung zu OOP/C++ (3-1) - lsw.ee.hm.edulsw.ee.hm.edu/~irber/oop/praktikum/oop_v3/oop_v3.pdf · hochschule muenchen fakultÄt elektrotechnik und informationstechnik bereich technische

HOCHSCHULE MUENCHEN FAKULTÄT ELEKTROTECHNIK UND INFORMATIONSTECHNIK BEREICH TECHNISCHE INFORMATIK Prof. Dr. A. Irber Stand: 22.08.2010 ----------------------------------------------------------------------------------

Übung zu OOP/C++ (3-1) Allgemeines Im vorliegenden Versuch soll schrittweise die folgende Klassenhierarchie entwickelt werden : Bei der Implementierung der einzelnen Klassen ist das Prinzip der Mehrfachverwendung von Code zu beachten, d.h. in der Definition der Memberfunktionen sind - wo immer möglich und sinnvoll - andere Memberfunktionen derselben Klasse oder Memberfunktionen von Basisklassen einzusetzen. Teil a) Im ersten Schritt ist eine Klasse Uhr zu entwickeln. Objekte dieser Klasse sollen die jeweilige Zeit ("Uhrzeit") in einer privaten Datenkomponente speichern. Hierfür ist die Klasse Zeit einzusetzen, deren Definition in der Header-Datei Zeit.h (s. Anlage 1) enthalten ist und deren Implementierung in der Objekt-Datei Zeit.cpp zur Verfügung steht. Die Klasse Uhr soll über die folgenden öffentlichen Memberfunktionen verfügen ▻ Default-Konstruktor, der die Zeit-Datenkomponente auf 00:00.00 (d.h. Stunde=0, Minute=0, Sekunde=0) setzt, ▻ Konstruktor, der die Zeit-Datenkomponente mit dem als Parameter übergebenen Zeit-Objekt initialisiert. ▻ void setTime(....); Setzen der Uhrzeit (Zeit-Datenkomponente) auf den als Parameter übergebenen Wert ▻ Zeit getTime() const; Rückgabe des Werts der Zeit-Datenkomponente (aktuelle Uhrzeit) als Funktionswert. ▻ int tickClock(int); Erhöhung der Uhrzeit um die durch den Parameter angegebene Anzahl Sekunden. (Defaultwert für Parameter = 1) Funktionswert : 0, wenn durch die Erhöhung der Uhrzeit kein Tagwechsel eingetreten ist 1, wenn durch die Erhöhung der Uhrzeit ein Tagwechsel eingetreten ist (23:59.00 � 00:00.00) Diese Funktion soll in abgeleiteten Klassen überschreibbar sein. ▻ void displayClock() const; Ausgabe der Uhrzeit in folgender Form in die Standard-Ausgabe : "Uhrzeit : hh:mm.ss" Diese Funktion soll in abgeleiteten Klassen überschreibbar sein. Formulieren Sie die Definition der Klasse Uhr in der Header-Datei Uhr.h und die Implementierung der Klasse in der C++-Quell-Datei Uhr.cpp. Zur Erzeugung eines kleinen Testprogramms steht das C++-Quell-Modul Ueb3a_main.cpp zur Verfügung.

Uhr

UhrMitDatum

UhrMitWeckerUndDatum

Page 2: Übung zu OOP/C++ (3-1) - lsw.ee.hm.edulsw.ee.hm.edu/~irber/oop/praktikum/oop_v3/oop_v3.pdf · hochschule muenchen fakultÄt elektrotechnik und informationstechnik bereich technische

HOCHSCHULE MUENCHEN FAKULTÄT ELEKTROTECHNIK UND INFORMATIONSTECHNIK BEREICH TECHNISCHE INFORMATIK Prof. Dr. A. Irber ----------------------------------------------------------------------------------

Übungen zu C++ (3- 2) Teil b) Von der Klasse Uhr ist eine Klasse UhrMitDatum abzuleiten. Diese Klasse soll neben der Zeit auch das jeweils aktuelle Datum enthalten und "darstellen". Das Datum ist in einer zusätzlichen privaten Datenkomponente abzulegen. Hierfür ist die Klasse Datum einzusetzen. Die Definition dieser Klasse ist in der Header-Datei Datum.h (s. Anlage 2) enthalten. Ihre Implementierung steht in der Objekt-Datei Datum.cpp zur Verfügung. Die Klasse UhrMitDatum soll die folgenden zusätzlichen öffentlichen Memberfunktionen besitzen : ▻ Default-Konstruktor, der die Zeit auf 00:00.00 und das Datum auf den 01.01.0000 setzt. ▻ Konstruktor, der die Zeit- und die Datums-Datenkomponente mit den als Parameter übergebenen Zeit- und Datum-Objekten (Zeit-Objekt als erster Parameter) initialisiert. ▻ void setClock(....,....); Setzen der Zeit- und der Datum-Datenkomponente auf dem jeweiligen als Parameter übergebenen Wert (Zeit als erster Parameter) ▻ void setDate(....); Setzen der Datum-Datenkomponente auf den als Parameter übergebenen Wert. ▻ void incDate(int); Erhöhung des Datums (Datum-Datenkomponente) um die als Parameter übergebene Anzahl von Tagen. Defaultwert für den Parameter = 1. ▻ Datum getDate() const; Rückgabe des Werts der Datum-Datenkomponente als Funktionswert. Die folgenden öffentlichen Memberfunktionen sollen die entsprechenden Memberfunktionen der Basisklasse Uhr überschreiben : ▻ int tickClock(int); Erhöhung der Uhrzeit um die durch den Parameter angegebene Anzahl Sekunden sowie Erhöhung des Datums wenn die Erhöhung der Uhrzeit den Übergang zu einem neuen Tag bewirkt (Übergang von 23:59.59 � 00:00.00) (Default-Wert für Parameter = 1) Funktionswert : 0, wenn durch die Erhöhung der Uhrzeit kein Tagwechsel eingetreten ist 1, wenn durch die Erhöhung der Uhrzeit ein Tagwechsel eingetreten ist. (wie Uhr::tickClock()) ▻ void displayClock() const; Ausgabe der Uhrzeit und des Datums in folgender Form in die Standard-Ausgabe : "Uhrzeit : hh:mm.sec Datum : tt.mm.jjjj" Formulieren Sie die Definition der Klasse UhrMitDatum in der Header-Datei Uhrmdat.h und die Implemen- tierung der Klasse in der C++-Quell-Datei Uhrmdat.cpp. Erstellen Sie ein kleines Testprogramm unter Verwendung des zur Verfügung stehenden C++-Quell-Moduls Ueb3b_main.cpp.

Page 3: Übung zu OOP/C++ (3-1) - lsw.ee.hm.edulsw.ee.hm.edu/~irber/oop/praktikum/oop_v3/oop_v3.pdf · hochschule muenchen fakultÄt elektrotechnik und informationstechnik bereich technische

HOCHSCHULE MUENCHEN FAKULTÄT ELEKTROTECHNIK UND INFORMATIONSTECHNIK BEREICH TECHNISCHE INFORMATIK Prof. Dr. A. Irber ----------------------------------------------------------------------------------

Übungen zu C++ (3 - 3) Teil c) Von der Klasse UhrMitDatum ist eine Klasse UhrMitWeckerUndDatum abzuleiten. Objekte dieser Klasse sollen beim Erreichen einer einstellbaren Zeit (Alarm- (Weck-)Zeit) einen Alarm erzeugen.

Zur Realisierung der Alarm-Funktionalität benötigen - UhrMitWeckerUndDatum Objekte zwei zusätzliche private Datenkomponenten :

▻ Komponente der Klasse Zeit (s. Teil a)) zur Speicherung der Alarm- (Weck-) Zeit ▻ Komponente vom Typ bool zur Aufnahme eines den Weckerbetrieb ein- bzw ausschaltenden Flags (Alarmflag) Weiterhin soll die Klasse die folgenden zusätzlichen öffentlichen Memberfunktionen besitzen : ▻ Default-Konstruktor, der sowohl die Uhrzeit (Zeit-Datenkomponente) als auch die Alarmzeit auf 00:00.00, das Alarmflag auf false (Weckerbetrieb ausgeschaltet) und das Datum auf den 01.01.0000 setzt. ▻ Konstruktor, der die Zeit- und die Datums-Datenkomponente mit den als Parameter übergebenen Zeit-und Datum-Objekten (Zeit-Objekt als erster Parameter) initialisiert, sowie die Alarmzeit auf 00:00.00 und das Alarm- flag auf false (Weckerbetrieb ausgeschaltet) setzt. ▻ void setAlert(....); Setzen der Alarmzeit auf den durch den Parameter bestimmten Wert und Einschalten der Weckerfunktion (Setzen des Alarmflags auf true) ▻ void onAlert(); Setzen des Alarmflags auf true (Einschalten des Weckerbetriebs) ▻ void offAlert(); Setzen des Alarmflags auf false (Ausschalten des Weckerbetriebs); ▻ Zeit getAlertTime() const; Rückgabe der Alarmzeit als Funktionswert ▻ bool getAlertFlag() const; Rückgabe des Werts des Alarmflags als Funktionswert ▻ void genAlert() const; Erzeugung eines Alarms. Die Funktion soll in abgeleiteten Klassen überschreibbar sein. Hier soll lediglich der Text "!!! Alarm !!!" mit vorangehendem und nachfolgendem Zeilenwechsel die Standardausgabe ausgegeben werden. ▻ void displayAlertInfo() const; Ausgabe der Werte der alarmfunktionsspezifischen Datenkomponeneten (Alarmzeit und Alarmflag) in die Standard-Ausgabe in folgendem Format : " Alarmzeit : hh:mm.ss an" bzw. " Alarmzeit : hh:mm.ss aus"

Die folgenden öffentlichen Memberfunktionen sollen die entsprechenden Memberfunktionen der indirekten Basisklasse UhrMitDatum überschreiben :

▻ int tickClock(int); Erhöhung der Uhrzeit um die durch den Parameter angegebene Anzahl Sekunden sowie Erhöhung des Datums wenn die Erhöhung der Uhrzeit den Übergang zu einem neuen Tag bewirkt (Übergang von 23:59.59 � 00:00.00) Erzeugung eines Alarms, wenn durch die Erhöhung der Uhrzeit die Alarmzeit erreicht bzw überschritten wird. Funktionswert : wie Uhr::tickClock()

Page 4: Übung zu OOP/C++ (3-1) - lsw.ee.hm.edulsw.ee.hm.edu/~irber/oop/praktikum/oop_v3/oop_v3.pdf · hochschule muenchen fakultÄt elektrotechnik und informationstechnik bereich technische

HOCHSCHULE MUENCHEN FAKULTÄT ELEKTROTECHNIK UND INFORMATIONSTECHNIK BEREICH TECHNISCHE INFORMATIK Prof. Dr. A. Irber ----------------------------------------------------------------------------------

▻ void displayClock() const; Ausgabe der Uhrzeit sowie der Alarmzeit und des Zustands des Alarmflags in folgendem Format (Beispiel für eingeschaltete Weckerfunktion) : "Uhrzeit : hh:mm.ss Alarmzeit : hh:mm.ss an"

Formulieren Sie die Definition der Klasse UhrMitWeckerUndDatum in der Header-Datei UhrMitWeckerUndDatum.h und die Implementierung der Klasse in der C++-Quell-Datei UhrMitWeckerUndDatum.cpp.

Erstellen Sie ein kleines Testprogramm unter Verwendung des zur Verfügung stehenden C++-Quell-Moduls Ueb3c_main.cpp.

Page 5: Übung zu OOP/C++ (3-1) - lsw.ee.hm.edulsw.ee.hm.edu/~irber/oop/praktikum/oop_v3/oop_v3.pdf · hochschule muenchen fakultÄt elektrotechnik und informationstechnik bereich technische

HOCHSCHULE MUENCHEN FAKULTÄT ELEKTROTECHNIK UND INFORMATIONSTECHNIK BEREICH TECHNISCHE INFORMATIK Prof. Dr. A. Irber ----------------------------------------------------------------------------------

Übungen zu C++ (3 - 4) Anlage 1 : Inhalt der Header-Datei "Zeit.h"

// Header-Datei Zeit.h // Definition der Klasse Zeit #ifndef ZEIT_H #define ZEIT_H class Zeit { public : Zeit(int=0, int=0, long=0); // Initialisierung mit Stunde, Min, Sek void setTime(int, int, long); // Setzen von Stunde, Min, Sek void resetTime(); // Setzen von Std=0, Min=0, Sek=0 void printTime() const; // Ausgabe Zeit hh:mm:ss --> stdout long timeAsSecs() const; // Rückgabe der Zeit in Sekunden Zeit& operator++(); // Increment um 1 Sek (Prefix) Zeit operator++(int); // Increment um 1 Sek (Postfix) Zeit& operator--(); // Decrement um 1 Sek (Prefix) Zeit operator--(int); // Decrement um 1 Sek (Postfix) Zeit operator+(const Zeit&); Zeit operator+(long); // Addition von Sekunden Zeit operator-(const Zeit&); Zeit operator-(long); // Subtraktion von Sekunden Zeit& operator+=(const Zeit&); Zeit& operator+=(long); // Erhoehung der Zeit um Sekunden Zeit& operator-=(const Zeit&); Zeit& operator-=(long); // Erniedrigung der Zeit um Sekunden bool operator>=(const Zeit&) const; // Vergleich von Zeiten bool operator>(const Zeit&) const; bool operator<=(const Zeit&) const; bool operator<(const Zeit&) const; bool operator==(const Zeit&) const; bool operator!=(const Zeit&) const; private : long m_lSek; int m_iMin; int m_iStd; int normalize(); }; #endif

Page 6: Übung zu OOP/C++ (3-1) - lsw.ee.hm.edulsw.ee.hm.edu/~irber/oop/praktikum/oop_v3/oop_v3.pdf · hochschule muenchen fakultÄt elektrotechnik und informationstechnik bereich technische

HOCHSCHULE MUENCHEN FAKULTÄT ELEKTROTECHNIK UND INFORMATIONSTECHNIK BEREICH TECHNISCHE INFORMATIK Prof. Dr. A. Irber ----------------------------------------------------------------------------------

Übungen zu C++ (3 - 5) Anlage 2 : Inhalt der Header-Datei "Datum.h"

// Header-Datei Datum.h // Definition der Klasse Datum #ifndef DATUM_H #define DATUM_H class Datum { public: Datum(); // Initialisierung mit 01.01.0000 // (Tag=1, Monat=1, Jahr=0) Datum(int, int, int); // Initialisierung mit // (Tag, Monat, Jahr) void setDate(int, int, int); // Setzen von (Tag, Monat, Jahr) void printDate() const; // Ausgabe Tag.Monat.Jahr --> stdout bool getSchJahr() const; // Rueckgabe true, wenn Schaltjahr int dayOfTheYear() const; // Tag und Monat als "day of the year" Datum& operator++(); // Increment um 1 Tag (Prefix) Datum operator++(int); // Increment um 1 Tag (Postfix) Datum& operator--(); // Decrement um 1 Tag (Prefix) Datum operator--(int); // Decrement um 1 Tag (Postfix) Datum& operator+=(int); // Erhoehung des Datums um Tage Datum& operator-=(int); // Erniedrigung des Datums um Tage Datum operator+(int); // Addition von Tagen Datum operator-(int); // Subtraktion von Tagen bool operator>=(const Datum&) const; // Vergleich zweier Daten bool operator>(const Datum&) const; bool operator<=(const Datum&) const; bool operator<(const Datum&) const; bool operator==(const Datum&) const; bool operator!=(const Datum&) const; private: int m_iTag; int m_iMonat; int m_iJahr; bool m_bSchJahr; void adjustDate(); }; #endif