Arvutiteaduse instituut
  1. Kursused
  2. 2018/19 kevad
  3. Programmeerimine keeles C++ (MTAT.03.158)
EN
Logi sisse

Programmeerimine keeles C++ 2018/19 kevad

  • Pealeht
  • Praktikumid
    • Lahenduste esitamine
    • Tulemused
  • Eksamiajad
  • Juhendid
  • Viited

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: 10.03.2019 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.

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

MeetodEesmä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 raadiusega, siis keelduge skaleerimast. Järgmises praktikumis vaatame, kuidas selliseid veaolukordi erinditega töödelda, soovi korral võite erindeid kasutada ka siin.

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

  1. Punkti klassile lisage kolmas koordinaat z ning täiendage vastavaid konstruktoreid. Tekkival klassil on siis kolm koordinaati.
  2. Sirglõik ja kera peavad olema määratud Point3 abil. Täiendage vastavalt meetodeid.
  3. Sirglõigu ja kera klassides realiseerige samad meetodid, mis põhiülesandes. Vajadusel asendage Point2 Point3-ga
  4. Lisage kera klassile meetod float volume(), mis tagastab kera ruumala. NB! Jätke ümbermõõdu meetod alles, arvutage nagu ringi ümbermõõtu.

Vihjeid

  1. Ruutjuure funktsioon on sqrt.
  2. Pii kasutamise kohta leiate info siit: http://c-faq.com/fp/mpi.html
  3. Tõrjuge kiusatust Point3 klass pärida Point2 klassist. See ei ole otstarbekas optimisatsioon.
  4. << operaatori ülelaadimisel võiks deklaratsiooni kirjuta klassi sisse (abiks märksõna friend). Siis on järgmises praktikumis õige pisut kergem.
  5. Klasside konstruktoreid tehes soovitame kasutada klassimuutujate algväärtustamiseks initsialiseerimisnimekirju. Täpsemalt vaata http://en.cppreference.com/w/cpp/language/initializer_list
  6. make clean käsk peaks dokumentatsiooni kustutama.
  7. Kui tahad Makefile'is vähem kopeerimist kasutada, siis abiks link: http://www.cprogramming.com/tutorial/makefiles_continued.html
  • 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