Harjutusülesanne
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
jaKontrollija
- klasse
Ajakiri
,Raamat
,ViiviseHoiataja
jaSuurimaViiviseLeidja
- funktsiooni
loeTeosed
teoste nimekirja sisselugemiseks (parameetriks faili nimi) vektorissevector <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 vektorstd::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 funktsioonsaadaHoiatus
, 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 isendifunktsioonlaenutusaeg
, 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 funktsioonpaevaneViivis
, mis tagastab vastavalt tähisele sobiva viivise ühe tähtaega ületanud päeva kohta. - Klassis on
void
-tüüpi funktsioonarvutaViivis
, mis võtab parameetriks jagatud viida (shared pointer)Kontrollija
isendile. Tähtaja ületanud laenutuse korral arvutab funktsioon viivise suuruse ja laseb kontrollijal selle salvestada (kasutasalvestaViivis
). - 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 tagastabtrue
, kui raamatu tähis on kollane või sinine, vastasel juhul tagastataksefalse
. - 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 tagastabtrue
, kui ajakiri ilmus aastal 2000 või varem, vastasel juhul tagastataksefalse
. - 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 vektorissevector <shared_ptr<Teos>>
ja vektor tagastatakse viida abil. - Luuakse jagatud viida abil
ViiviseHoiataja
(lubatud viivis 0.2€) jaSuurimaViiviseLeidja
isendid. - Kutsutakse iga teose peal
arvutaViivis
, andes parameetriksViiviseHoiataja
viida. Pärast kõigi viiviste arvutamist kuva ekraanileViiviseHoiataja
sse kogunenud laenutajate nimed. - Kutsutakse iga teose peal
arvutaViivis
, andes parameetriksSuurimaViiviseLeidja
viida. Pärast kõigi viiviste arvutamist saada suurima viivise omanikule hoiatus (kasutades vastavatSuurimaViiviseLeidja
funktsiooni). - Sobivates kohtades näidata isendite infot ja funktsioonite töö tulemusi ekraanil.
- Sorditakse teoseid funktsiooniga
sort(teosed.begin(), teosed.end())
vastavalt üle defineeritud operaatorileoperator<
Siinteosed
on vektor teostega.
Lõpuks uuri oma lahendust ja analüüsi, kus saab kasutada jagatud viida asemel unikaalset viita. Tee vastavad asendused.