Ubungen zur Vorlesung EidP (WS 2014) Blatt 8
Transcrição
Ubungen zur Vorlesung EidP (WS 2014) Blatt 8
Amer Krivošija Informatik II, OH14/R.309; Tel.: 4762 Florian Schmoll Informatik XII, OH16/R.E08; Tel.: 6310 Jan Bessai Informatik XIV, OH14/R.129; Tel.: 7764 Sebastian Sudholt Informatik XII, OH16/R.109; Tel.: 4643 Dortmund, den 4. Dezember 2014 Übungen zur Vorlesung EidP (WS 2014) Blatt 8 Block rot Es können 7 Punkte erreicht werden. Abgabedatum: 11. Dezember 2014 23:59 Uhr Hinweise 1) Bitte beachten Sie die aktuellen Hinweise unter http://ls11-www.cs.tu-dortmund.de/teaching/ep1415uebung 2) 3) 4) 5) Für die Abgabe sind die Dateien: Aufgabe 08 0.txt, Punkt.h, Punkt.cpp, Kugel.h, Kugel.cpp, Aufgabe 08 1.cpp und bei Bedarf Aufgabe 08 2.cpp zu erstellen. In der optionalen Datei Anmerkungen.txt können Sie allgemeine Anmerkungen bezüglich Ihrer Lösungen notieren. Es ist ratsam, die Programme vor der Abgabe zu kompilieren und auszuführen. Verwenden Sie für die Textaufgaben reine Texteditoren. Das Abgabesystem erkennt keine Word- oder PDF-Dateien!!! Nutzen Sie die UTF-8 Codierung, um die ASSESS-Abgabeprobleme zu vermeiden. Solche Textdateien können Sie in Notepad erstellen und speichern. Sie sollten auch in Ihrer Programmierungsumgebung die Codierungseinstellungen dazu anpassen. 1 Aufgaben Aufgabe 0: Grundlagen (1 Punkt) Legen Sie für Ihre Antworten eine Text-Datei Aufgabe 08 0.txt an. a) Welche Ziele werden bei der Verwendung von Klassen verfolgt? (0,2 Punkte) b) Was ist der Unterschied zwischen einer Klasse und einem Objekt? (0,2 Punkte) c) Welches ist der wesentliche Unterschied zwischen einer struct- und class-Definition? (0,1 Punkte) d) Erklären Sie das Prinzip des information hiding“. (0,1 Punkte) ” e) Welche Aufgaben haben Konstruktoren? (0,2 Punkte) f) Welche Aufgaben haben Destruktoren? (0,2 Punkte) Speichern Sie Ihre Ergebnisse in der Ergebnisdatei Aufgabe 08 0.txt. Aufgabe 1: Klassen (3 Punkte) a) Schreiben Sie eine Klasse Punkt, die einen mehrdimensionalen Punkt mit Koordinaten vom Typ double repräsentieren soll. Halten Sie die Definition der Klasse in der Datei Punkt.h und ihre Implementierung in der Datei Punkt.cpp fest. Die Klasse soll folgende Eigenschaften haben: 1) Die Dimension d muss bei Erzeugung eines Objekts angegeben werden und kann anschließend nicht mehr geändert werden. 2) Die Koordinaten sollen sinnvoll initialisiert werden und einzeln abruf- und veränderbar sein. 3) Folgende Operationen sollen unterstützt werden: • Addition mit einem Punkt, der die gleiche Anzahl an Dimensionen hat. Danach sind die neuen Koordinaten des Punktes das Ergebnis der Addition. • Addition von Punkt und Zahl vom Typ double, wobei die Zahl auf alle Koordinaten des Punktes addiert wird. qP d 2 • Berechnung des euklidischen Abstands d(p, q) = i=1 (pi − qi ) zwischen zwei Punkten p, q mit Dimension d. • Berechnung des Abstands eines d-dimensionalen Punktes zum Ursprung. Hinweis: In der C++-Bibliothek cmath befindet sich die Funktion sqrt(double x), √ welche für die Variable x den Wert x berechnet. Legen Sie eine Datei Aufgabe 08 1.cpp an. Schreiben Sie ein Programm, bei dem zwei Punkte A = ( 2.5, 3.8, -2.2 ) und B = ( 0.8, -1.2, 3.1 ) erzeugt werden. Dann soll Punkt B zu Punkt A addiert werden. Geben Sie anschließend den Abstand der Punkte zum Ursprung aus. Kompilieren Sie ihr Programm und führen Sie es anschließend aus. Kopieren Sie die Ergebnisse als Block-Kommentar an das Ende der Datei Aufgabe 08 1.cpp. (2 Punkte) 2 b) Eine Kugel mit Mittelpunkt c und Radius r ≥ 0 enthält alle Punkte, deren Abstand zum Mittelpunkt c höchstens r ist. Schreiben Sie nun eine Klasse Kugel, die eine Kugel im mehrdimensionalen Raum beschreiben soll, und eine Methode besitzt, die überprüft, ob ein gegebener Punkt außerhalb der Kugel ist. Notieren Sie die Definition und Implementierung der Klasse Kugel in den Dateien Kugel.h und Kugel.cpp. Erweitern Sie ihr Programm in der Datei Aufgabe 08 1.cpp aus Aufgabenteil a) um die Erzeugung einer Kugel mit Mittelpunkt M = ( 4.2, 5.6, 0.7 ) und Radius 5. Geben Sie anschließend für die Punkte A und B aus Aufgabenteil a) aus, ob sie innerhalb der Kugel liegen. Kompilieren Sie ihr Programm und führen Sie es anschließend aus. Kopieren Sie die Ergebnisse als weiteren Block-Kommentar an das Ende der Datei Aufgabe 08 1.cpp. (1 Punkt) Hinweis: Falls Sie in der Datei Kugel.h die Datei Punkt.h inkludieren, so müssen Sie in der Datei Aufgabe 08 1.cpp nur #include "Kugel.h" einfügen. Die Datei Punkt.h wird dann bereits indirekt inkludiert, d. h. in der Datei Aufgabe 08 1.cpp steht dann auch die Definition der Klasse Punkt zur Verfügung. Sollten Sie beim Kompilieren die Fehlermeldung erhalten, dass die Klasse Punkt mehrfach definiert wurde (redefinition of ’class Punkt’ ), so kann dies daran liegen, dass Ihre Datei sowohl die Direktive #include "Punkt.h" als auch die Direktive #include "Kugel.h" enthält. Entfernen Sie in diesem Fall #include "Punkt.h". (Bonus-)Aufgabe 2: Klassen (3 Punkte) Bei dem Spiel Bingo besitzt jeder Spieler ein oder mehrere Spielkarten. Auf jeder Spielkarte stehen Zahlen, die in einer quadratischen Matrix angeordnet sind. Diese Zahlen stammen aus einem vorab festgelegten Zahlenbereich und unterscheiden sich von Karte zu Karte. Nach und nach werden zufällig Zahlen gezogen. Die Spieler überprüfen jeweils, ob die gezogene Zahl auf einer ihrer Karten vorkommt. Falls dies der Fall ist, streichen sie die Zahl durch. Derjenige Spieler, der zuerst auf einer seiner Spielkarten in einer Zeile oder Spalte alle Zahlen durchstreichen konnte, ruft lauf Bingo und gewinnt das Spiel. Ergänzen Sie das nachfolgende Programm um die Definitionen der Klassen Bingokarte und Spieler. Objekte der Klasse Bingokarte sollen Bingo-Spielkarten repräsentieren. Sie bestehen aus einem 3x3 großen Zahlenfeld. Wenn eine Zahl gezogen wird, soll mit Hilfe einer Methode überprüft werden können, ob diese Zahl in dem Zahlenfeld vorkommt. Falls ja, soll Treffer ausgegeben werden. Zusätzlich soll getestet werden, ob diese Zahl und alle zuvor getesteten Zahlen eine Reihe oder Spalte auf der Spielkarte bilden. Ein Spieler besitzt mehrere Spielkarten, die über die Methode neueKarte dem Spieler zugeordnet werden. Mit der Methode pruefeZahl überprüft ein Spieler alle seine Spielkarten auf eine gezogene Zahl. Sobald von einer Spielkarte alle Zahlen einer Reihe oder Spalte gezogen wurden, soll Bingo ausgegeben werden und pruefeZahl den Wahrheitswert true zurückgeben. Andernfalls soll diese Methode false zurückgeben. Beachten Sie bei ihrer Lösung der Aufgabe, dass Speicherplatz für dynamisch allokierte Objekte auch wieder freigegeben wird. Speichern Sie ihre Lösung für diese Aufgabe in der Datei Aufgabe 08 2.cpp. Kompilieren Sie ihr Programm und führen Sie es anschließend aus. Kopieren Sie die Ergebnisse als Block-Kommentar an das Ende der Datei Aufgabe 08 2.cpp. (3 Punkte) 3 #include <iostream> #include <stdlib.h> using namespace std; //***************************************** // Hier bitte die Klassendefinitionen // Bingokarte und Spieler ergaenzen //***************************************** int main( void ) { unsigned char belegungA[ 3 ][ 3 ] = { { 1, 8, 14 }, { 16, 2, 9 }, { 7, 12, 3 } }; unsigned char belegungB[ 3 ][ 3 ] = { { 15, 18, 8 }, { 4, 17, 3 }, { 11, 13, 5 } }; Bingokarte *spielkarteA, *spielkarteB; spielkarteA = new Bingokarte( belegungA ); spielkarteB = new Bingokarte( belegungB ); unsigned int maximaleSpielkartenanzahlProSpieler = 4; Spieler hugo( maximaleSpielkartenanzahlProSpieler ); hugo.neueKarte( spielkarteA ); hugo.neueKarte( spielkarteB ); srand( 2 ); unsigned int zufallszahl; do { zufallszahl = rand() / static_cast<double>( RAND_MAX ) * 20; cout << "Ziehe " << zufallszahl << endl; } while ( hugo.pruefeZahl( zufallszahl ) == false ); delete spielkarteA; delete spielkarteB; return 0; } 4