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