Arvutiteaduse instituut
  1. Kursused
  2. 2024/25 kevad
  3. Programmeerimine keeles C++ (LTAT.03.025)
EN
Logi sisse

Programmeerimine keeles C++ 2024/25 kevad

  • Pealeht
  • 1. Muutujad ja andmetüübid
  • 2. Keele põhikonstruktsioonid I
  • 3. Keele põhikonstruktsioonid II
  • 4. Klass, struktuur, mallid
  • 5. Dünaamiline mäluhaldus I
  • 6. Dünaamiline mäluhaldus II
  • 7. Kontrolltöö 1

Seitsmendal nädalal toimub 1. kontrolltöö

1. kontrolltöö näidis on Moodles

  • 8. Dünaamiline mäluhaldus III
  • 9. STL andmestruktuurid I
  • 10. STL andmestruktuurid II
  • 11. OOP I Klassid
11 OOP I Klassid
11.1 Kodutöö
11.2 Harjutused
11.3 Videolingid
  • 12. OOP II Pärilus ja polümorfism
  • 13. Erindite töötlemine
  • 14. Täiendavad teemad
  • 15. Kontrolltöö 2

Viieteistkümnendal nädalal toimub 2. kontrolltöö

2. kontrolltöö näidis on Moodles

  • 16. Projekti esitlus
  • Mõned viited - vajalikud kaaslased
  • Vanad materjalid
  • Juhendid
  • Viited

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).

FunktsioonEesmä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<<.

FunktsioonEesmä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).

FunktsioonEesmä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).

FunktsioonEesmä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
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused