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