Programmeerimine keeles C++
Praktikum 2: klassid ja objektid
Üldised tingimused
Tähtis! Loe läbi ülesannete vormistamise tingimused aine veebilehelt! Ülesandeid esitatakse läbi aine veebilehel asuva vormi. E-posti teel lahendusi vastu ei võeta. Küsimustega pöörduda aine listi või praktikumijuhendaja poole.
Lahendamiseks on aega 14 päeva.
Tähtaeg: 07.03.2021 23:59:59
Ülesanne – Lihtne geomeetriateek
Kodutöö eesmärk on luua lihtne geomeetriateek. Lahendusena peab kompileerimisel tekkima teek
nimega libgeometry.a
. Teegi päised peavad olema tehtud nii, et alusfailidega kaasasolev testprogramm geometrytest
kompileerub. Hindamisel kontrollin nii seda kui ka meetodite tööd.
Testprogrammi kompileerib make test
.
Sellest ülesandest alustame ka koodi struktureerimist kataloogidesse. Päised paigutage kausta
include
, teegi lähtekood kausta src
, valmis teek kausta lib
, testrakendus kausta tests
, dokumentatsioon kausta docs
. Failid Makefile
ja Doxyfile
jäävad juurkataloogi. Juhinduge alusfailides ette tehtud struktuurist. Palun ärge muutke klassi liikmete nimesid ja hoidke nad avalikud.
1. Punkt (2 punkti)
Kirjutada klass Point2
, mis määrab kahemõõtmelises ruumis punkti float
tüüpi koordinaatidega x
ja y
.
Meetod | Eesmärk |
---|---|
Point2 () | algväärtustab koordinaadid nullidega |
Point2 (float nx, float ny) | parameetritega konstruktor – väärtustab koordinaadid |
float distanceFrom (Point2 p) | tagastab punkti kauguse mingist teisest punktist tasandil |
operator << | väljastab punkti koordinaadid kujul (x, y) |
2. Sirglõik (2 punkti)
Luua klass Line2
, mis kirjeldab sirglõiku kahe otspunkti p1
ja p2
abil.
Meetod | Eesmärk |
---|---|
Line2 () | vaikekonstruktor – loob tipud (Point2 vaikekonstruktoriga) |
Line2 (Point2 np1, Point2 np2) | parameetritega konstruktor – väärtustab klassi elemendid |
float length () | tagastab sirglõigu pikkuse (kasutage punkti distanceFrom meetodit) |
operator << | väljastab sirglõigu andmed kujul (p1 - p2) |
3. Ring (4 punkti)
Luua klass Circle2
, mis esitab tasandil asuvat ringi keskpunkti p1
ja mittenegatiivse raadiuse r
abil. Raadiuse mittenegatiivsust tuleb jälgida kõikides meetodites (konstruktor, skaleerimine). Kui
kasutaja annab ette negatiivse raadiuse konstruktoris, siis asendage see nulliga. Kui kasutaja soovib
skaleerida negatiivse väärtusega, siis keelduge skaleerimast. Järgmises praktikumis vaatame, kuidas
selliseid veaolukordi erinditega töödelda, soovi korral võite erindeid kasutada ka siin.
Meetod | Eesmärk |
---|---|
Circle2 () | vaikekonstruktor – loob tipu ja paneb raadiuseks nulli |
Circle2 (Point2 np1, float nr) | parameetritega konstruktor – väärtustab klassi elemendid |
float circumference () | tagastab ringi ümbermõõdu |
float area () | tagastab ringi pindala |
bool contains (Point2 p) | tagastab true, kui antud punkt on ringjoone peal või sees, muidu false (kasutage punkti distanceFrom meetodit) |
bool contains (Line2 l) | tagastab true, kui antud lõik on ringjoone sees (sh tipud joone peal), muidu false (kasutage distanceFrom meetodit) |
void scale (float factor) | korrutab ringi raadiuse antud väärtusega |
operator << | väljastab ringi andmed kujul (p1, r) |
4. Kataloogistruktuuri järgiv Makefile ja dokumentatsioon (2 punkti)
Lahendus järgib korrektselt kataloogistruktuuri ning teek, testrakendus ja dokumentatsioon tekivad õigetesse kaustadesse.
Lisaülesanne – Kolmemõõtmeline geomeetria (1 lisapunkt)
Kirjutage põhiülesande klassidest kolmemõõtmelised versioonid (Point3
, Line3
, Sphere3
).
- Punkti klassile lisage kolmas koordinaat
z
ning täiendage vastavaid konstruktoreid. Tekkival klassil on siis kolm koordinaati. - Sirglõik ja kera peavad olema määratud
Point3
abil. Täiendage vastavalt meetodeid. - Sirglõigu ja kera klassides realiseerige samad meetodid, mis põhiülesandes. Vajadusel asendage
Point2
Point3
-ga - Lisage kera klassile meetod
float volume()
, mis tagastab kera ruumala. NB! Jätke ümbermõõdu meetod alles, arvutage nagu ringi ümbermõõtu.
Vihjeid
- Ruutjuure funktsioon on
sqrt
. - Pii kasutamise kohta leiate info siit: http://c-faq.com/fp/mpi.html
- Tõrjuge kiusatust
Point3
klass päridaPoint2
klassist. See ei ole otstarbekas optimisatsioon. - << operaatori ülelaadimisel võiks deklaratsiooni kirjuta klassi sisse (abiks märksõna
friend
). Siis on järgmises praktikumis õige pisut kergem. - Klasside konstruktoreid tehes soovitame kasutada klassimuutujate algväärtustamiseks initsialiseerimisnimekirju. Täpsemalt vaata http://en.cppreference.com/w/cpp/language/initializer_list
make clean
käsk peaks dokumentatsiooni kustutama.- Kui tahad
Makefile
'is vähem kopeerimist kasutada, siis abiks link: http://www.cprogramming.com/tutorial/makefiles_continued.html