FBMN – Programmieren II (Sommersemester 2007) Vorlesung + Praktikum: Prof. Dr. Steffen Lange (www.fbi.h-da.de/~slange/) 5. Praktikumsaufgabe Teilaufgabe (a) In dieser Praktikumsaufgabe geht es um die Repräsentation einfacher dreidimensionaler Objekte: achsenparalleler Quader und achsenparalleler Würfel. Ein achsenparalleler Quader ist durch einen Bezugspunkt p mit den Koordinaten (xp,yp,zp) (/* den Koordinaten des linken unteren Eckpunkts des Quaders */), die Länge der Kante a, die Länge der Kante b und die Länge der Kante c eindeutig bestimmt (/* siehe Bild */). Ein achsenparalleler Würfel ist ein achsenparalleler Quader, welcher die Eigenschaft hat, dass die Kanten a, b und c dieselbe Länge haben. 1. Definieren Sie eine Klasse Punkt zur Repräsentation von Punkten im R3. (/* Definieren Sie die Datenelemente der Klasse Punkt als private Datenelemente und führen Sie geeignete Zugriffsmethoden ein! Definieren Sie einen dreistelligen Konstruktor für die Klasse Punkt, dem die Koordinaten des Bezugspunkts als Parameter übergeben werden. */) 2. Definieren Sie eine Klasse Quader. (/* Hinweis: Zur Repräsentation des Bezugspunkts soll jedes Objekt vom Typ Quader ein Teilobjekt vom Typ Punkt haben. */) Die Klasse Quader soll mindestens die folgende Methoden besitzen: • • • einen vierstelligen Konstruktor, dem ein Objekt vom Typ Punkt sowie die Länge der Kanten a, b und c übergeben werden eine Methode koordinaten(), die die Koordinaten aller 8 Eckpunkte des Quaders auf den Bildschirm ausgibt eine Methode volumen() zur Berechnung des Volumens des Quaders 3. Deklarieren Sie mittels Vererbung eine Klasse Wuerfel, die eine Spezialisierung der Klasse Quader darstellt. Die Klasse Wuerfel soll folgende Methoden besitzen: • • einen zweistelligen Konstruktor, dem ein Objekt vom Typ Punkt und die Länge der Kante a übergeben wird eine eigene Version der Methode volumen(), die der Tatsache Rechnung trägt, dass sich das Volumen eines Würfels „einfacher“ berechnen lässt (/* Hinweis: Es wird für jede Klasse eine Header- und eine Quellcodedatei erwartet! */) Benutzen Sie folgendes Testprogramm, um Ihre Klassendefinitionen zu testen: FBMN – Programmieren II (Sommersemester 2007) Vorlesung + Praktikum: Prof. Dr. Steffen Lange (www.fbi.h-da.de/~slange/) int main () { double x, y, z; cout << "Gib die x-Koordinate des Bezugspunkts ein: "; cin >> x; cout << "Gib die y-Koordinate des Bezugspunkts ein: "; cin >> y; cout << "Gib die z-Koordinate des Bezugspunkts ein: "; cin >> z; Punkt my_p(x, y, z); double a, b, c; cout << "Gib die Laenge der Seite a ein: "; cin >> a; cout << "Gib die Laenge der Seite b ein: "; cin >> b; cout << "Gib die Laenge der Seite c ein: "; cin >> c; Quader my_q(my_p, a, b, c); cout << "Daten des Quaders:" << endl; my_q.koordinaten(); cout << "Volumen des Quaders: " << my_q.volumen() << endl; Wuerfel my_w(my_p, a); cout << "Daten des Wuerfels:" << endl; my_w.koordinaten(); cout << "Volumen des Wuerfels: " << my_w.volumen() << endl; return(0); } Teilaufgabe (b) In dieser Aufgabe geht es darum, die Artikel eines Supermarkts in einer einfach verketten Liste zu verwalten. Die folgende Klasse Artikel speichert die Daten für einen Artikel. class Artikel { private: string name_; string nummer_; double preis_; public: Artikel(string name, string nummer, double preis) : name_(name), nummer_(nummer), preis_(preis) {}; void display(); }; Die Methode display() der Klasse Artikel ist wie folgt definiert: void Artikel::display(){ cout << "Artikelname: " << name_ << endl; cout << "Artikelnummer: " << nummer_ << endl; cout << "Preis: " << preis_ << endl; FBMN – Programmieren II (Sommersemester 2007) Vorlesung + Praktikum: Prof. Dr. Steffen Lange (www.fbi.h-da.de/~slange/) Die folgende Klasse Element dient der Repräsentation der Elemente der einfach verketteten Liste. class Element { private: Artikel * data_; Element * next_; public: Element(Artikel * data): data_(data), next_(NULL){}; Artikel * get_data() { return(data_); }; Element * get_next() { return(next_); }; void set_next(Element * next) { next_ = next;}; }; Die von Ihnen zu definierende Klasse Liste ist wie folgt deklariert: class Liste { private: Element * first_; public: Liste(); void insert(Artikel * data); void display(); }; Die Methoden der Klasse Liste sollen folgende Funktionalität realisieren: • • • der Konstruktor soll eine leere Liste mit einem „dummy“-Element am Anfang der Liste erzeugen die Methode insert() soll ein neues Element am Anfang der Liste – also nach dem „dummy“Element – einfügen (/* dieser Methode wird die Adresse eines Objekts vom Typ Artikel übergeben */) die Methode display() soll für jeden Artikel, dessen Adresse in einem Element der Liste gespeichert ist, den Artikelnamen, die Artikelnummer und den Preis anzeigen (/* hierbei ist die oben definierte Methode display() der Klasse Artikel zu verwenden */) Das folgende Bild soll die Struktur eines Objekts vom Typ Liste mit dem Namen myliste veranschaulichen, welche die Adressen von zwei Objekten vom Typ Artikel speichert. FBMN – Programmieren II (Sommersemester 2007) Vorlesung + Praktikum: Prof. Dr. Steffen Lange (www.fbi.h-da.de/~slange/) 1. Übernehmen Sie die Deklarationen und Definitionen der Klassen Artikel, Element und Liste. 2. Definieren Sie die Methoden der Klasse Liste. (/* Hinweis: Es wird je Klasse eine Header- und eine Quellcodedatei erwartet! */) Benutzen Sie die das folgende Testprogramm, um Ihre Klassendefinitionen zu testen. Die im Testprogramm verwendeten Befehle system("CLS") und system("Pause") dienen dazu, den Bildschirm zu löschen bzw. Ihnen die Möglichkeit zu geben, die nach dem Aufruf der Methode display() der Klasse Liste angezeigten Informationen in Ruhe zu betrachten. int main ( ) { Liste myliste; int wahl = 0; string name, nummer; double preis; while ( wahl != 3 ) { system( "CLS" ); cout << "(1) Artikel eintragen" << endl; cout << "(2) Liste anzeigen" << endl; cout << "(3) Programm beenden" << endl << endl; cout << "Bitte geben Sie 1, 2 oder 3 ein: "; cin >> wahl; if ( wahl = = 1 ) { cout << "Artikelname (ohne Leerzeichen): "; cin >> name; cout << "Artikelnummer (ohne Leerzeichen): "; cin >> nummer; cout << "Preis: "; cin >> preis; Artikel * data = new Artikel( name, nummer, preis ); myliste.insert( data ); } else if ( wahl = = 2 ) { myliste.display( ); system( "Pause" ); } else { cout << "ENDE" << endl; } } return(0); } Viel Spaß ☺.