Prof. Dr.-Ing. Andreas Simon Telefon +49 (0)5331 939 42630 Telefax +49 (0)5331 939 43634 E-Mail a.simon@ostfalia.de Objektorientierung Grundlagen Probeklausur 18. Mai 2015 Name: Mat.-Nr.: Vorname: Login: Aufgabe: 1 2 3 4 Summe erreichbare Punkte: -- 15 30 17 62 erreichte Punkte: Note: Hinweise: Bearbeitungszeit: 90-20=70 Minuten Erlaubte Hilfsmittel: keine, außer den zur Verfügung gestellten Daten auf dem V-Laufwerk. Sie finden die vorbereiteten C++-Dateien zu den Aufgaben auf Ihrem U-Laufwerk sowie in einer Read-Only-Variante auf dem V-Laufwerk. Speichern Sie rechtzeitig vor dem Ende der Klausur alle relevanten Daten auf dem U-Laufwerk ab, da sonst die Gefahr eines Datenverlustes besteht. Melden Sie Probleme mit dem Rechner sofort der Aufsicht. In die Bewertung der Aufgaben fließen u.a. die Vollständigkeit, Korrektheit, Programmlänge und Programmlesbarkeit ein. Die Projekteinstellungen des vorbereiteten Eclipse-Projektes dürfen nicht verändert werden. Wenn in den Aufgaben nicht anders angegeben, sind nur Sprachelemente der Standards ISO/IEC 14882:2003 und ISO/IEC 14882:2011 zulässig. Anmelden am Rechner: Zum Anmelden am Rechner ist unbedingt der spezielle Klausur-Account für diese Klausur zu verwenden, also Registrierung: Öffnen Sie die Datei U:\Registrierung.txt und tragen Sie in die vorgesehenen Zeilen Ihren Namen, Vornamen, Matrikelnummer und Anwendernamen ( ) ein. Speichern Sie diese Datei. Viel Erfolg!
Seite 2 von 8 Aufgabe 2: Modulare Programmierung (15 P) Gegeben ist ein C++-Programm in Form der Datei main.cpp. 2.1 Verlagern Sie alle Code-Fragmente zwischen der letzten Include Anweisung und der main-funktion in die Header-Datei aufgabe_2.hpp und die Source-Code-Datei aufgabe_2.cpp. (12 P) 2.2 Erzeugen Sie in der main-funktion jeweils ein lokales und ein dynamisches Objekt der Klasse Begruessung. (3 P) Geforderte Konsolenausgabe: Aufgabe 2: Hallo Du! HalloDu HalloDu Zähler = 2 Vorbereitete Datei main.cpp: * main.cpp #include <iostream> #include <string> using namespace std; #include "aufgabe_2.hpp" #include "aufgabe_2.hpp" //< Mehrfaches Inkludieren soll moeglich sein! typedef int sint32; sint32 zaehler = 1; string begruessungstext(string text) zaehler++; return "Hallo " + text + "!"; class Begruessung sint32 zaehler; Begruessung(string str)
Seite 3 von 8 cout << "Hallo" << str << endl; zaehler++; sint32 getcount() const return zaehler; int main() cout << "Aufgabe 2:" << endl; cout << begruessungstext("du") << endl; //> cout << "Zähler = " << zaehler << endl; return 0;
Seite 4 von 8 Aufgabe 3: Objektorientierung (30 P) Gegeben ist die Header-Datei der Klasse Puffer. Zu dieser Header-Datei soll die Klasse in der Datei Puffer cpp fertig implementiert werden. Die Klasse Puffer soll einen Container für double-werte nach dem LIFO-Prinzip (last in first out) realisieren. Mit der Methode push wird ein Wert in den Puffer geschrieben und mit pop ein Wert ausgelesen. 3.1 Implementieren Sie die private Methode init, die den Puffer erzeugen soll. (4 P) 3.2 Ergänzen Sie die beiden Konstrukoren, indem Sie u.a. die init-methode aufrufen. (6 P) 3.3 Fügen Sie den Destruktor hinzu. (3 P) 3.4 Implementieren Sie die Methode push, die einen double-wert in den Puffer schreibt, sofern noch Platz vorhanden ist. push soll false zurückgeben, falls der Puffer voll ist. (4 P) 3.5 Ergänzen Sie die Methode pop, die einen Wert aus dem Puffer zurückliest und diesen Wert löscht. pop soll false zurückgeben, falls der Puffer leer ist. (4 P) 3.6 Fügen Sie die Methode leere hinzu, die den Puffer leeren soll. (1 P) 3.7 Implementieren Sie die Methode leer, die prüfen soll, ob der Puffer leer ist. (1 P) 3.8 Ergänzen Sie in Puffer.hpp sinnvolle const-deklarationen. (2 P) 3.9 Legen Sie in der main-funktion ein Puffer-Objekt der Größe 5 an. (1 P) 3.10 Rufen Sie in einer Schleife 10-mal die push-methode mit verschiedenen Werten auf. (2 P) 3.11 Lesen Sie in einer Schleife mit der pop-methode alle Werte aus dem Puffer aus und geben Sie diese auf der Konsole aus. (2 P) Geforderte Konsolenausgabe: Aufgabe 3: pop: 3 pop: 2.5 pop: 2 pop: 1.5 pop: 1 Hinweise: Es sind keine Inline-Methoden erlaubt. Es dürfen keine weiteren Klassenelemente hinzugefügt werden.
Seite 5 von 8 Vorbereitete Dateien: * Puffer.hpp #ifndef PUFFER_HPP_ #define PUFFER_HPP_ class Puffer protected: double *daten; //< Zeiger auf die Daten des Puffers int groesse; //< Puffergroessse int schreibpos; //< Index des naechsten Schreibzugriffs void init (int groesse); Puffer(int groesse=0); Puffer(Puffer& other); ~Puffer(); bool push(double wert); bool pop(double& wert); void leere(); bool leer(); #endif PUFFER_HPP_ * main.cpp #include <iostream> #include <string> using namespace std; #include "Puffer.hpp" int main() cout << "Aufgabe 3:" << endl; //> return 0;
Seite 6 von 8 Aufgabe 4: Vererbung (17 P) Bei dieser Aufgabe wird ein Punkt durch seine x- und y-koordinate; eine Linie durch ihre Endpunkte; ein Kreis durch Mittelpunkt und Radius und ein Rechteck durch zwei Kanten beschrieben. Jedes dieser geometrischen Objekte (GeomObjekt) soll über die beiden Methoden giblaenge und gibflaeche verfügen. Ergänzen Sie die Datei Geometrie.hpp, so dass die unveränderte main-funktion die unten angegebene Konsolenausgabe erzeugt. Geforderte Konsolenausgabe: Aufgabe 4: Länge = 0 Fläche = 0 Länge = 4 Fläche = 0 Länge = 8 Fläche = 50.2655 Länge = 4 Fläche = 12 Hinweis: Sie können ausschließlich Inline-Methoden verwenden. * Geometrie.hpp #ifndef GEOMETRIE_HPP_ #define GEOMETRIE_HPP_ #include <math.h> class Punkt double x; double y; class Linie Punkt a; Punkt b; class Kreis
Seite 7 von 8 Punkt m; double r; class Rechteck Linie a; Linie b; #endif GEOMETRIE_HPP_ * main.cpp #include <iostream> using namespace std; #include "Geometrie.hpp" void zeigeobjekt(geomobjekt const& obj) cout << "Länge = " << obj.giblaenge() << endl; cout << "Fläche = " << obj.gibflaeche() << endl; int main() cout << "Aufgabe 4:" << endl; Punkt p1(0.0, 0.0); Punkt p2(4.0, 0.0); Punkt p3(4.0, 3.0); Linie l1(p1, p2); Linie l2(p2, p3); Kreis k(p1, 4.0); Rechteck r(l1, l2); zeigeobjekt(p1); zeigeobjekt(l1); zeigeobjekt(k);
Seite 8 von 8 zeigeobjekt(r); return 0;