Institute of Computer Science
  1. Courses
  2. 2020/21 spring
  3. Programming in C++ (MTAT.03.158)
ET
Log in

Programming in C++ 2020/21 spring

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

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 väärtusega, 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
  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment