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

Programmeerimine keeles C++ 2023/24 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
  • 12. OOP II Pärilus ja polümorfism
12 OOP II Pärilus ja polümorfism
12.1 Kodutöö
12.2 Harjutused
12.3 Videolingid
  • 13. Erindite töötlemine
  • 14. Täiendavad teemad
  • 15. Kontrolltöö 2

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

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

Harjutusülesanne

1. Võistlused

Ülesande lahenduses peavad kõik deklaratsioonid olema päisefailis osalejad_tulemused.h ja kogu lähtekood peale main funktsiooni failis osalejad_tulemused.cpp.

Igal aastal toimuvad erinevad spordivõistlused. Täiskasvanute üritustel saavad osalejad mingi koha. Laste üritustel võitjaid ei selgitata, lapsed on alati võitjad. Kõikide tulemuste andmed on failis järgmisel kujul:

38002055060;4. Tartu Linnamaraton;4
37806135649;34. Tartu Rattaralli;2
60212243307;9. Tartu Rulluisumaraton
34501234215;18. Tartu Rattamaraton;1

Failis on igal real andmed järjekorras: osaleja isikukood, võistluse nimi, saadud koht (lapsosaleja puhul kohta pole). Eraldajaks on semikoolon.

Programm peab sisaldama abstraktset klassi Osalenud, klasse Tulemus, Osaleja ja Lapsosaleja. Funktsioonis main luuakse tulemuste vektor ja osalejad ning testitakse ka erinevate liikmefunktsioonide tööd. Kõikide klasside kõik isendiväljad peavad olema privaatsed.

Klassis Tulemus peavad olema privaatsed isendiväljad järgmise info jaoks: osaleja isikukood (string), võistluse nimi (string) ja saadud koht (int). Klassis peab olema kolme parameetriga konstruktor osaleja isikukoodi , võistluse nime ja saadud koha määramiseks, samuti vajalikud get-funktsioonid. Klass peab üle defineerima operaatori <<, mille abil saab tulemust ekraanile kuvada.

Abstraktne klass Osalenud sisaldab int-tüüpi virtuaalseid funktsioone voite ja tulemusi (kummalgi ei ole argumente).

Klass Osaleja on klassi Osalenud alamklass. Klassis on privaatsed isendiväljad järgmise info jaoks: osaleja nimi (string), isikukood (string) ja tulemuste nimekiri (vector<Tulemus>). Klassis peab olema konstruktor osaleja nime ja isikukoodi määramiseks ja vajalikud get-funktsioonid.

Ühel osalejal võib olla mitu tulemust. Äsjaloodud osalejal ei ole ühtegi tulemust. Tulemuste lisamiseks peab olema funktsioon lisaTulemused, mis saab argumendiks tulemuste vektori ja jätab meelde selle osaleja tulemused (ehk valib argumendina antud tulemuste vektorist ainult need tulemused, mis on seotud antud osalejaga). Funktsioon voite tagastab osaleja võitude arvu (ehk saavutatud koht peab olema 1). Funktsioon tulemusi tagastab osaleja tulemuste arvu (ka võit on tulemus). Klass peab üle defineerima operaatori <<, mille abil saab osaleja infot ekraanile kuvada.

Klass Lapsosaleja on klassi Osaleja alamklass. Klassi konstruktor võtab lisaks osaleja nimele ja isikukoodile ka vanema isikukoodi. Funktsioon voite tagastab võitude arvu, mis lapsosaleja puhul ühtlasi ka tulemuste arv. Klass peab üle defineerima operaatori <<, mille abil saab lapsosaleja infot ekraanile kuvada.

Programmis on funktsioon loe_failist, mis võtab argumendiks failinime ja viite vektorile vector<Tulemus>. Funktsioon täidab vektori failist saadud infoga. Tulemuste arv failis ei ole teada (programm peaks töötama suvalise arvu tulemustega).

Funktsioonis main loetakse failist tulemused. Luua kolm osalejat ja kaks lapsosalejat. Osalejate isikukoodid saab valida näitefailist. Nimed ja lapsosaleja vanemate isikukoodid on vaja ise välja mõelda. Iga osaleja (ka lapsosaleja) korral rakendada tulemuste lisamise funktsiooni kasutades argumentidena tulemuste vektorit. Osalejate ja tulemuste info kuvada ekraanile. Näide tulemuse osaleja info kuvamisest

isikukood: 38002055060 võistlus: 34. Tartu Rattaralli koht: 3

Näide tulemuse osaleja info kuvamisest

Osaleja nimi: Mait isikukood: 37806135649 tulemusi: 2 võite: 1

2. Raamatulaenutus

NB! Klasside ja funktsioonide deklaratsioonid panna faili raamat.h ja definitsioonid faili raamat.cpp.

Raamatukogust saab laenutada erinevaid teoseid - raamatuid ja ajakirju. Teoseid laenutatakse erinevateks tähtaegadeks vastavalt tähisele:

  • roheline tähis – 24 tunniks (ehk 1 päevaks)
  • tähis puudub – 14 päevaks
  • kollane – 30 päevaks
  • sinine – 60 päevaks.

Kui teoseid tähtajaks tagasi ei vii, tuleb hakata maksma viivist vastavalt korraldusele:

  • 30 ja 60 päeva laenutus – 0.05 eurot teose kohta iga ületatud päeva eest
  • 14 päeva laenutus – 0.15 eurot teose kohta iga ületatud päeva eest
  • 24 tunni laenutus – 2 eurot teose kohta iga ületatud päeva eest.

Kirjuta programm, mis otsib laenutuste nimekirjast suurte viivistega laenutusi ja kõige suurema viivisega laenutaja ja väljastab talle hoiatuse.

Laenutuste andmed on kirjas failis järgmises formaadis:

Aksel Telgmaa, Matemaatika VI klassile; kollane; Joosep Kask; 125
Kodu ja aed/2013,10; kollane; Teele Tamm; 59
Oskar Luts, Kevade; sinine; Teele Tamm; 39
Artur Jürisson, Eesti-inglise õigussõnaraamat; puudub; Jaan Aruhein; 224
Juhani Püttsepp, Peipsimaa kaart; roheline; Joosep Kask; 22
Kroonika/2010,15; puudub; Joosep Kask; 4

Failis on igal real teose nimi, teose tähis, laenutaja nimi ja laenutatud päevade arv. Eraldajaks on semikoolon koos tühikuga. Raamatute puhul on autori nimi, koma koos tühikuga ja raamatu pealkiri. Ajakirjade puhul on pealkiri, kaldkriips, aasta number, koma ja ajakirja number. Võib eeldada, et kui enne esimest semikoolonit kaldkriipsu ei ole, siis on tegemist raamatuga.

Ülesanne seisneb teoste viivist arvestava programmi koostamises.

Programm peab sisaldama:

  • abstraktseid klasse Teos ja Kontrollija
  • klasse Ajakiri, Raamat, ViiviseHoiataja ja SuurimaViiviseLeidja
  • funktsiooni loeTeosed teoste nimekirja sisselugemiseks (parameetriks faili nimi) vektorisse vector <shared_ptr<Teos>>

Funktsioonis main loetakse sisse teoste nimekiri ja kasutatakse viivise kontrollijaid, et hilinejatele hoiatusi saata. Samuti testitakse ka erinevate isendifunktsioonide tööd. Kõikide klasside kõik isendiväljad peavad olema privaatsed.

1. Abstraktne klass Kontrollija sisaldab void-tüüpi funktsiooni salvestaViivis järgmise signatuuriga: virtual void salvestaViivis(std::shared_ptr<std::string> laenutajaNimi, std::string teoseNimi, float viivis)

2. Klass ViiviseHoiataja on Kontrollija alamklass.

  • Klassis peab olema ühe float argumendiga konstruktor, mille abil saab määrata lubatud viivise.
  • Funktsioon salvestaViivis peab argumendiks saadud laenutaja nime meelde jätma, kui viivis ületab lubatud viivise piiri ja kui seda nime pole veel salvestatud. Hoidmiseks sobib vektor std::vector<std::shared_ptr<std::string>>*
  • funktsioon getHoiatatavadLaenutajad peab tagastama viite vektorile kõigi nende laenutajate nimedega, kelle viivise suurus ületab lubatud piiri.

3. Klass SuurimaViiviseLeidja on Kontrollija alamklass.

  • Klassis peab olema void-tüüpi parameetriteta funktsioon saadaHoiatus, mis kuvab ekraanile kõige suurema viivisega laenutaja nime ja tema poolt laenutatud teose nime.
  • SuurimaViiviseLeidja jätab meelde ainult suurima viivise andmed (laenutaja nimi, teose nimi ja viivis).

4. Abstraktsel klassil Teos peab olema konstruktor teose nime (string), teose tähise (string), laenutaja nime (std::shared_ptr<std::string>) ja päevade arvu (int) määramiseks.

  • Klassis on virtuaalne boolean-tüüpi funktsioon kasHoidlast, mis tagastab, kas teost on vaja tellida hoidlast.
  • Klassis on parameetriteta int-tüüpi isendifunktsioon laenutusaeg, mis tagastab selle teose laenutusaja (ehk mitmeks päevaks teost tähise järgi on lubatud laenutada). Kui tähis on erinev kui roheline, kollane, sinine, puudub, siis tagastatakse 0.
  • Klassis on float-tüüpi parameetriteta funktsioon paevaneViivis, mis tagastab vastavalt tähisele sobiva viivise ühe tähtaega ületanud päeva kohta.
  • Klassis on void-tüüpi funktsioon arvutaViivis, mis võtab parameetriks jagatud viida (shared pointer) Kontrollija isendile. Tähtaja ületanud laenutuse korral arvutab funktsioon viivise suuruse ja laseb kontrollijal selle salvestada (kasuta salvestaViivis).
  • Klass Teos peab üle defineerima operaatori <<, mille abil saab teose infot ekraanil kuvada. Muuhulgas peab olema näidatud, kas teost on vaja tellida hoidlast.
  • Klass Teos peab üle defineerima operaatori <, mille abil saab teoseid võrrelda teose nime alusel.

5. Klass Raamat on klassi Teos alamklass. Klassis on konstruktor vajaliku info määramiseks ja vähemalt järgmised funktsioonid.

  • funktsioon kasHoidlast, mis tagastab true, kui raamatu tähis on kollane või sinine, vastasel juhul tagastatakse false.
  • funktsioon operaatori << üle defineerimiseks, mille abil saab raamatu infot ekraanil kuvada koos märkusega, et tegemist on raamatuga.

6. Klass Ajakiri on klassi Teos alamklass. Klassis on konstruktor vajaliku info määramiseks ja vähemalt järgmised funktsioonid.

  • funktsioon kasHoidlast, mis tagastab true, kui ajakiri ilmus aastal 2000 või varem, vastasel juhul tagastatakse false.
  • funktsioon operaatori << üle defineerimiseks, mille abil saab ajakirja infot ekraanil kuvada koos märkusega, et tegemist on ajakirjaga.

7. Funktsioonis main

  • Loetakse failist funktsiooni loeTeosed abil teoste andmed vektorisse vector <shared_ptr<Teos>> ja vektor tagastatakse viida abil.
  • Luuakse jagatud viida abil ViiviseHoiataja (lubatud viivis 0.2€) ja SuurimaViiviseLeidja isendid.
  • Kutsutakse iga teose peal arvutaViivis, andes parameetriks ViiviseHoiataja viida. Pärast kõigi viiviste arvutamist kuva ekraanile ViiviseHoiatajasse kogunenud laenutajate nimed.
  • Kutsutakse iga teose peal arvutaViivis, andes parameetriks SuurimaViiviseLeidja viida. Pärast kõigi viiviste arvutamist saada suurima viivise omanikule hoiatus (kasutades vastavat SuurimaViiviseLeidja funktsiooni).
  • Sobivates kohtades näidata isendite infot ja funktsioonite töö tulemusi ekraanil.
  • Sorditakse teoseid funktsiooniga sort(teosed.begin(), teosed.end()) vastavalt üle defineeritud operaatorile operator< Siin teosed on vektor teostega.

Lõpuks uuri oma lahendust ja analüüsi, kus saab kasutada jagatud viida asemel unikaalset viita. Tee vastavad asendused.

  • 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