Übungsklausur - Hochschule Darmstadt
Transcription
Übungsklausur - Hochschule Darmstadt
Programmieren / Algorithmen und Datenstrukturen 1 Autor: Datum: Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt 7. Oktober 2010 Nachklausur Programmieren / Algorithmen und Datenstrukturen 1 1 Spielregeln zur Klausur Allgemeines Die Bearbeitungszeit beträgt 3 Zeitstunden. Bitte halten Sie Ihren Studenten- und Personalausweis bereit Erfüllen Sie die Aufgabenstellung genau: machen Sie nicht weniger, aber auch nicht mehr! Arbeiten Sie zügig in der Reihenfolge der Aufgaben Implementieren Sie in kleinen Schritten und sorgen Sie dafür, dass Sie jederzeit eine lauffähige Anwendung haben Speichern Sie regelmäßig Als Ergebnis der Klausur sind abzugeben … alle zum System gehörigen Dateien durch Kopieren auf den Server (genauere Informationen zu Beginn der Klausur). Zugelassene Hilfsmittel Ausgedruckte Vorlesungsunterlagen und Bücher Persönliche Notizen auf Papier C++ Referenz (auf Klausurrechner) Vorlesungsfolien (auf Klausurrechner) Seite 1 Klausur: Programmieren / Algorithmen und Datenstrukturen 1 Verboten ist Die Benutzung eigener Datenträger (USB-Stick etc.); insbesondere dürfen keine Programme oder sonstige Daten auf Datenträger mitgebracht werden. Die Benutzung eines anderen Rechners (Smartphone, Notebook, ...) als des zur Verfügung gestellten Jegliche Kommunikation (mündlich, schriftlich, elektronisch, per Mobiltelefon, über das Netz, wie auch immer...) mit anderen Personen, ausgenommen die Aufsichtführenden Login unter einem anderen Account als dem für die Klausur angegebenen Zugriff auf andere Verzeichnisse eines Servers, als die ausdrücklich zugelassenen. Beurteilungskriterien (in Reihenfolge der Wichtigkeit) 1. Funktion des Systems: das Programm soll fehlerfrei kompilieren und alle Tests erfolgreich durchlaufen 2. Qualität des Programmcodes: Übersichtlichkeit, gute Klassen-, Methoden- und Variablennamen, Einhaltung der Namenskonventionen, sinnvolle Dokumentation etc. 2 Vorbereitung 1. Melden Sie sich am Klausurrechner an 2. Legen Sie ein neues NetBeans Projekt benannt nach Ihrem Nachnamen an. Tipp: File New Project … C/C++ C/C++ Application 3. Kopieren Sie die Datei UnitTesting.h in das NetBeans Projektverzeichnis und fügen Sie die Datei zum Projekt hinzu. Tipp: Source Files Add Existing Item … 4. Stellen Sie den C++11 Standard ein. Tipp: Project Properties Build C++ Compiler C++Standard C++11 3 Übersicht Online Shop In dieser Klausur werden Sie prototypisch einen Online Shop entwickeln. Das folgende UML Diagramm gibt eine Übersicht über die gesamte zu erstellende Anwendung. Seite 2 Klausur: Programmieren / Algorithmen und Datenstrukturen 1 OnlineShop -products_: vector<shared_ptr<Product>> -customers_: vector<shared_ptr<Customer>> -orders_: vector<shared_ptr<Order>> +addProduct(number: int, price: float): shared_ptr<Product> +addCustomer(name: string): shared_ptr<Customer> +buy(customer: Customer, product: Product): shared_ptr<Order> +totalPrice(customer: shared_ptr<Customer>): float +numberOfSales(product: shared_ptr<Product>): int +bestSeller(): shared_ptr<Product> +topCustomer(): shared_ptr<Customer> +getAllProductsSortedByPrice(): vector<shared_ptr<Product>> 1 1 1 orders_ * customers_ products_ Order -customer_: shared_ptr<Customer> -product_: shared_ptr<Product> <<create>>-Order(customer: shared_ptr<Customer>, product: shared_ptr<Product>) +getCustomer(): shared_ptr<Customer> +getProduct(): shared_ptr<Product> * * * 1 Customer -name_: string <<create>>-Customer(name: string) +getName(): string customer_ product_ 1 * Product -number_: int -price_: float <<create>>-Product(number: int, price: float) +getNumber(): int +getPrice(): float Entwickeln Sie die Anwendung Schritt für Schritt in der angegebenen Reihenfolge. Seite 3 Klausur: Programmieren / Algorithmen und Datenstrukturen 1 4 Klasse Customer (10 Punkte) 1. Erstellen Sie eine neue Klasse Customer (Kunde). Tipp: File New File… C++ C++ Class 2. Erstellen Sie eine private Instanzvariable name_ vom Typ string. Tipp: #include <string> using namespace std; 3. Entwickeln Sie die Funktion string getName() mit der üblichen Getter-Semantik (Rückgabe des Werts der Variablen). 4. Entwickeln Sie einen Konstruktor Customer(string name), in dem die Instanzvariable (= Membervariable oder Attribut) name_ initialisiert wird. 5. Stellen Sie sicher, dass Ihr Code fehler- und warnungsfrei kompiliert. 5 Klasse Product (10 Punkte) 1. Erstellen Sie eine neue Klasse Product (Produkt). Tipp: File New File… C++ C++ Class 2. Erstellen Sie die privaten Instanzvariablen number_ vom Typ int und price_ vom Typ float. 3. Entwickeln Sie die Funktionen int getNumber() und float getPrice()mit der üblichen Getter-Semantik. 4. Entwickeln Sie einen Konstruktor Product(int number, float price), in dem die Instanzvariablen number_ und price_ initialisiert werden. 5. Stellen Sie sicher, dass Ihr Code fehler- und warnungsfrei kompiliert. 6 Klasse Order (10 Punkte) 1. Erstellen Sie eine neue Klasse Order (Bestellung). Tipp: File New File… C++ C++ Class 2. Erstellen Sie die privaten Instanzvariablen customer_ als Zeiger auf ein Customer Objekt und product_ als Zeiger auf ein Product Objekt. 3. Entwickeln Sie die Funktionen sharedPtr<Product> getProduct()und sharedPtr<Customer> getCustomer() mit der üblichen Getter-Semantik. Seite 4 Klausur: Programmieren / Algorithmen und Datenstrukturen 1 4. Entwickeln Sie einen Konstruktor Order(sharedPtr<Customer> customer, sharedPtr<Product> product), in dem die Instanzvariablen customer_ und product_ initialisiert werden. 5. Stellen Sie sicher, dass Ihr Code fehler- und warnungsfrei kompiliert. 7 Klasse OnlineShop (70 Punkte) 1. Erstellen Sie eine neue Klasse OnlineShop. Tipp: File New File… C++ C++ Class 2. (2,5 Punkte) Erstellen Sie die privaten Instanzvariablen products_, customers_ und orders_ als Vektoren von Zeigern auf Product, Customer, bzw. Order Objekte. Tipp: #include <vector> #include <memory> using namespace std; 3. (2,5 Punkte) Entwickeln Sie die Funktion sharedPtr<Product> addProduct(int number, float price) (Produkt hinzufügen). In ihr wird ein neues Product Objekt angelegt und number und price gesetzt. Das Order Objekt wird dem Vektor orders_ hinzugefügt und zurückgegeben. Tipp: verwenden Sie vector::push_back 4. (2,5 Punkte) Entwickeln Sie die Funktion sharedPtr<Customer> addCustomer(string name) (Kunde hinzufügen). In ihr wird ein neues Customer Objekt angelegt und name gesetzt. Das Customer Objekt wird dem Vektor customers_ hinzugefügt und zurückgegeben. Tipp: verwenden Sie vector::push_back 5. (2,5 Punkte) Entwickeln Sie die Funktion sharedPtr<Order> buy(sharedPtr<Customer> customer, sharedPtr<Product> product) (kaufen). In ihr wird ein neues Order Objekt angelegt, welches auf die als Parameter übergebenen Customer und Product Objekte verweist. Das Order Objekt wird dem Vektor orders_ hinzugefügt und zurückgegeben. Tipp: verwenden Sie vector::push_back 6. (10 Punkte) Entwickeln Sie die Funktion float totalPrice(sharedPtr<Customer> customer) (Gesamtpreis). Sie liefert die Summe der Preise aller Produkte, die customer gekauft hat. Seite 5 Klausur: Programmieren / Algorithmen und Datenstrukturen 1 7. (10 Punkte) Entwickeln Sie die Funktion int numberOfSales(sharedPtr<Product> product) (Anzahl Verkäufe). Sie liefert die Anzahl, wie oft product bisher verkauft wurde. 8. (10 Punkte) Entwickeln Sie die Funktion sharedPtr<Product> bestSeller() Sie liefert einen Zeiger auf das Produkt, welches am häufigsten verkauft wurde. Wurden mehrere Produkte gleich häufig verkauft, wird irgend eines davon zurückgeliefert. Tipp: verwenden Sie numberOfSales 9. (10 Punkte) Entwickeln Sie die Funktion sharedPtr<Customer> topCustomer() (bester Kunde). Sie liefert einen Zeiger auf den Kunden, der bisher den größten Umsatz gemacht hat. Haben mehrere Kunden denselben Umsatz gemacht, wird irgend einer davon zurückgeliefert. 10. (15 Punkte) Entwickeln Sie die Funktion vector<shared_ptr<Product>> getAllProductsSortedByPrice() (Produkte nach Preisen sortiert). Sie sortiert alle Produkte im Vektor products_ aufsteigend nach Preisen und gibt den sortierten Vektor als Ergebnis zurück. 11. Ermitteln Sie die Komplexitätsklasse der Funktion getAllProductsSortedByPrice (O-Notation) und dokumentieren Sie diese im Kommentar (Außensichtdokumentation – siehe letzte Aufgabe). 12. Stellen Sie sicher, dass Ihr Code fehler- und warnungsfrei kompiliert. 8 Tests (15 Punkte) 1. Erstellen Sie im Hauptprogramm die folgenden Testobjekte und speichern Sie diese in entsprechenden Variablen: a. Ein OnlineShop Objekt b. Product Objekte via addProduct: number 1 / price 2.50 und number 2, price 1.50 c. Customer Objekte via addCustomer mit Namen "Huber" und "Müller" 2. Führen Sie die folgenden Bestellungen mittels buy durch und speichern Sie die Order Objekte in entsprechenden Variablen: a. "Huber" kauft Produkt 1 b. "Huber" kauft Produkt 1 c. "Huber" kauft Produkt 2 Seite 6 Klausur: Programmieren / Algorithmen und Datenstrukturen 1 Entwickeln Sie die nachfolgenden Tests unter Verwendung von testEqual: 3. Kunde Huber hat für 6.50 Euro gekauft Tipp: testen Sie auf 6.50f (das f steht für float Wert und muss angegeben werden) 4. Kunde Müller hat für 0 Euro gekauft 5. Produkt 1 wurde 2 mal verkauft (numberOfSales) 6. Produkt 2 wurde 1 mal verkauft 7. Produkt 1 ist am häufigsten verkauft worden (bestSeller) 8. Kunde Huber ist der beste Kunde (topCustomer) 9. Das erste Produkt nach Preisen sortiert (getAllProductsSortedByPrice) hat den Wert number_ gleich 2, das zweite Produkt den Wert number_ gleich 1. 10. Stellen Sie sicher, dass Ihr Code fehler- und warnungsfrei kompiliert. 11. Führen Sie alle Tests aus. Alle Tests sollten „OK“ liefern. 9 Dokumentation (10 Punkte) Dokumentieren Sie die Außensicht Ihrer Anwendung, also alle öffentlichen Operationen in den *.h-Dateien gemäß den Vorgaben aus der Vorlesung. Verwenden Sie entweder Deutsch oder Englisch. Tipp: fügen Sie jeweils über der Signatur /** ein und drücken Sie <Enter>. NetBeans komplettiert den Kommentar mit passenden Parametern. Viel Erfolg! Seite 7