Kodused ülesanded
Sellel nädalal on koduülesannete temaatika on sarnane 5. nädala kodutööga. Kirjuta uued klassid ja kasuta isendiväljadeks objektide korral tarku viitasid (smart pointers), vajadusel lisa klassidesse koopia- ja teisalduskonstruktorid ning koopia- ja teisaldusomistamise operaatorid.
Esita järgmised failid: point2.h
, point2.cpp
, line2.h
, line2.cpp
, circle2.h
, circle2.cpp
. Päisefailides peavad olema deklaratsioonid ja lähtekoodifailides definitsioonid (kui vähegi võimalik).
1. Punkt tasandil
Failides point2.h
ja point2.cpp
on klassi Point2
definitsioon. Point2
määrab kahemõõtmelises ruumis punkti, millel on kaks float
tüüpi koordinaati mx
ja my
(privaatsed isendiväljad).
Funktsioon | Eesmärk |
---|---|
Point2() | Vaikekonstruktor, algväärtustab koordinaadid nullidega |
Point2(float x, float y) | Parameetritega konstruktor – väärtustab koordinaadid |
getMx() , setMx() , getMy() , setMy() | Piilufunktsioonid koordinaatide jaoks |
Realiseerida funktsioon distanceFrom
ja operaator operator<<
.
Funktsioon | Eesmärk |
---|---|
float distanceFrom(Point2 p) | Tagastab punkti kauguse mingist teisest punktist tasandil |
operator << | Võimaldab kuvada punkti koordinaadid kujul (x, y) |
Näide 1. ülesande testimise kohta
Point2 p1{1, 2}; Point2 p2{3, 4}; cout << "p1 = " << p1 << '\n'; cout << "p2 = " << p2 << '\n'; cout << "p1.distancefrom(p2) = " << p1.distanceFrom(p2) << '\n'; p2.setMx(5); p2.setMy(6); cout << "p2 = " << p2 << '\n'; cout << "p1.getMx) = " << p1.getMx() << "; p1.getMy) = " << p1.getMy() << '\n'; | p1 = (1, 2) p2 = (3, 4) p1.distancefrom(p2) = 2.82843 p2 = (5, 6) p1.getMx) = 1; p1.getMy) = 2 |
2. Sirglõik
Loo klass Line2
(päisefail koos lähtekoodifailiga), mis kirjeldab sirglõiku kahe otspunkti mp1
ja mp2
abil. Klassi isendimuutujad on privaatsed (shared_ptr<Point2> mp1
ja shared_ptr<Point2> mp2
).
Funktsioon | Eesmärk |
---|---|
Line2() | Vaikekonstruktor – loob tipud (Point2 vaikekonstruktoriga) |
Line2(shared_ptr<Point2> mp1, shared_ptr<Point2> mp2) | Parameetritega konstruktor – väärtustab klassi elemendid |
Line2(const Line2& lr) | Koopiakonstruktor – väärtustab klassi elemendid |
Line2(Line2&& lr) | Teisalduskonstruktor – väärtustab klassi elemendid ja nullib originaali |
Line2& operator=(const Line2& l) | Koopiaomistamise operaator |
Line2& operator=(Line2&& l) | Teisaldusomistamise operaator, nullib originaali |
float length() | Tagastab sirglõigu pikkuse (kasuta funktsiooni distanceFrom ) |
operator << | Võimaldab kuvada sirglõigu andmed kujul (p1 - p2) koos sirglõigu pikkusega |
getMp1() , setMp1() , getMp2() , setMp2() | Piilufunktsioonid punktide jaoks |
Näide 2. ülesande testimise kohta
shared_ptr<Point2> p1{make_shared<Point2>()}; shared_ptr<Point2> p2{make_shared<Point2>(1, 2)}; shared_ptr<Point2> p3{make_shared<Point2>(3.5, 6.2)}; shared_ptr<Point2> p4{make_shared<Point2>(5, 6)}; Line2 l1{p1, p2}; Line2 l2{p2, p3}; Line2 l3{p3, p4}; cout << "l1: " << l1 << '\n'; cout << "l2: " << l2 << '\n'; cout << "l3: " << l3 << '\n'; Line2 l4{l2}; cout << "l4: " << l4 << '\n'; Line2 l5{move(l2)}; cout << "l5: " << l5 << '\n'; cout << "l2: " << l2 << '\n'; l2 = l3; cout << "l2: " << l2 << '\n'; cout << "l3: " << l3 << '\n'; l2 = move(l3); cout << "l2: " << l2 << '\n'; cout << "l3: " << l3 << '\n'; l2.setMp1(p1); cout << "l2: " << l2 << '\n'; | l1: (0, 0) - (1, 2) pikkus = 2.23607 l2: (1, 2) - (3.5, 6.2) pikkus = 4.88774 l3: (3.5, 6.2) - (5, 6) pikkus = 1.51327 l4: (1, 2) - (3.5, 6.2) pikkus = 4.88774 l5: (1, 2) - (3.5, 6.2) pikkus = 4.88774 l2: Vähemalt üks otspunkt on nullptr l2: (3.5, 6.2) - (5, 6) pikkus = 1.51327 l3: (3.5, 6.2) - (5, 6) pikkus = 1.51327 l2: (3.5, 6.2) - (5, 6) pikkus = 1.51327 l3: Vähemalt üks otspunkt on nullptr l2: (0, 0) - (5, 6) pikkus = 7.81025 |
3. Ring
Loo klass Circle2
(päisefail koos lähtekoodifailiga), mis esitab tasandil asuvat ringi keskpunktiga mp
ja mittenegatiivse raadiusega mr
. Raadiuse mittenegatiivsust tuleb jälgida kõikides funktsioonides (konstruktor, skaleerimine). Kui kasutaja annab ette negatiivse raadiuse konstruktoris, siis asenda see nulliga. Kui kasutaja soovib skaleerida negatiivse väärtusega, siis ei tee midagi. Klassi isendimuutujad on privaatsed (shared_ptr<Point2> mp
ja float mr
).
Funktsioon | Eesmärk |
---|---|
Circle2() | Vaikekonstruktor – loob punkti (0, 0) ja paneb raadiuseks nulli |
Circle2(shared_ptr<Point2> p, float r) | Parameetritega konstruktor – väärtustab klassi elemendid |
Circle2(const Circle2& c) | Koopiakonstruktor – väärtustab klassi elemendid |
Circle2(Circle2&& c) | Teisalduskonstruktor – väärtustab klassi elemendid ja nullib originaali |
float circumference() | Tagastab ringi ümbermõõdu |
float area() | Tagastab ringi pindala |
bool contains(shared_ptr<Point2> p) | Tagastab true , kui antud punkt on ringjoone peal või sees, vastasel juhul false (kasuta funktsiooni distanceFrom ) |
bool contains(shared_ptr<Line2> l) | Tagastab true , kui antud lõik on ringjoone sees (sh otspunkt võib olla joone peal), vastasel juhul false (kasuta funktsiooni distanceFrom ) |
void scale(float kordaja) | Korrutab ringi raadiuse antud kordajaga (negatiivse kordaja korral ei tee midagi) |
operator << | Võimaldab kuvada ringi andmed kujul (mp, mr) |
getMp() , setMp() , getMr() , setMr() | Piilufunktsioonid klassi liikmete jaoks |
Näide 3. ülesande testimise kohta
shared_ptr<Point2> p1{make_shared<Point2>(1, 2)}; shared_ptr<Point2> p2{make_shared<Point2>(2, 3)}; shared_ptr<Point2> p3{make_shared<Point2>(5, 6)}; shared_ptr<Line2> l2{make_shared<Line2>(p1, p2)}; shared_ptr<Line2> l3{make_shared<Line2>(p1, p3)}; Circle2 c1{}; Circle2 c2{p1, 2}; cout << "c1: " << c1 << '\n'; cout << "c2: " << c2 << '\n'; Circle2 c3{c2}; c3.scale(1.5); Circle2 c4{move(c2)}; cout << "c3: " << c3 << '\n'; cout << "c4: " << c4 << '\n'; cout << "c2: " << c2 << '\n'; cout << "c3: ümbermõõt = " << c3.circumference() << "; pindala = " << c3.area() << '\n'; cout << boolalpha << "p2 on c3 sees - " << c3.contains(p2) << '\n'; cout << boolalpha << "p3 on c3 sees - " << c3.contains(p3) << '\n'; cout << boolalpha << "l2 on c3 sees - " << c3.contains(l2) << '\n'; cout << boolalpha << "l3 on c3 sees - " << c3.contains(l3) << '\n'; | c1: ((0, 0), 0) c2: ((1, 2), 2) c3: ((1, 2), 3) c4: ((1, 2), 2) c2: ((0, 0), 0) c3: ümbermõõt = 18.8496; pindala = 28.2743 p2 on c3 sees - true p3 on c3 sees - false l2 on c3 sees - true l3 on c3 sees - false |