6. praktikum - kontrolltöö näidisülesanne
NB! Näidisülesande lahendamine on küllaltki töömahukas. Tegelikult tuleb kontrolltöös lühem ülesanne, milles kõiki näidisülesandes toodud asju ei nõuta.
Automaattestimise võimaldamiseks peavad kõik klassid asuma kindlas paketis ja kõik Java failid peavad olema kindla kodeeringuga. Antud juhul lepime kokku, et klassid asuvad vaikepaketis (st. failide alguses ei ole package
direktiivi) ja failide kodeering on UTF-8. Kodeeringu määramise juhise leiate 4. praktikumi materjali algusest.
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 ja 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. Tavaliselt tuuakse kõik teosed tähtajaks tagasi, aga mõned tegelased kipuvad tähtaegu täielikult ignoreerima. Kirjutame programmi, mis otsib laenutuste nimekirjast väga suurte viivistega laenutusi ja kõige suurema viivisega laenutaja ja väljastab neile hoiatusi.
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 kirjeldus, teose tähis, laenutaja nimi ja laenutatud päevade arv. Eraldajaks on semikoolon koos tühikuga. Raamatute puhul on kirjelduseks autori nimi, koma koos tühikuga ja raamatu pealkiri. Ajakirjade puhul on kirjelduseks pealkiri, kaldkriips, aasta number, koma ja ajakirja number. Võib eeldada, et kui kirjelduses kaldkriipsu pole, siis tegu on raamatuga.
Kontrolltöö seisneb teoste tagastamist arvestava programmi koostamises. Programm peab vastama alltoodud nõuetele (isegi kui need kummalised tunduvad). Programm peab sisaldama abstraktse klassi Teos
, liidest Kontrollija
, klasse Ajakiri
, Raamat
, ViiviseHoiataja
, SuurimaViiviseLeidja
ning peaklassi. Peaklassis loetakse sisse teoste nimekiri ja kasutatakse viivise kontrollijaid, et hilinejatele hoiatusi saata. Peaklassis testitakse ka erinevate isendimeetodite tööd. Kõikide klasside kõik isendiväljad peavad olema privaatsed.
1. Liides Kontrollija
sisaldab void
-tüüpi meetodit salvestaViivis
, mis võtab parameetriteks laenutaja nime (String
), teose kirjelduse (String
) ja viivise suuruse (double
).
2. Klass ViiviseHoiataja
realiseerib liidest Kontrollija
.
- Klassis peab olema ühe
double
argumendiga konstruktor, mille abil saab määrata lubatud viivise. - Meetod
salvestaViivis
peab argumendiks saadud laenutaja nime meelde jätma, kui viivis ületab lubatud viivise piiri ja kui seda nime pole veel salvestatud. - Meetod
getHoiatatavadLaenutajad
peab tagastama listi kõigi nende laenutajate nimedega, kelle viivise suurus ületab lubatud piiri.
3. Klass SuurimaViiviseLeidja
realiseerib liidest Kontrollija
.
- Klassis peab olema
void
-tüüpi parameetriteta meetodsaadaHoiatus
, mis prindib ekraanile kõige suurema viivisega laenutaja nime ja tema poolt laenutatud teose kirjelduse. - Mälu kokkuhoiu mõttes ei tohiks
SuurimaViiviseLeidja
jätta meelde rohkem andmeid, kui on tarvis suurima viivisega inimesele hoiatuse saatmiseks (see tähendab, etViiviseHoiataja
ningSuurimaViiviseLeidja
peaks meetodisalvestaViivis
realiseerima erinevalt.) (Vihje: jäta alati meelde vaid suurima viivise andmed.)
4. Abstraktsel klassil Teos
peab olema konstruktor teose kirjelduse (String
), teose tähise (String
), laenutaja (String
) ja päevade arvu (int
) määramiseks.
- Klassis on abstraktne
boolean
-tüüpi meetodkasHoidlast
, mis näitab, kas teost on vaja tellida hoidlast. - Samuti on parameetriteta
int
-tüüpi isendimeetodlaenutusaeg
, mis tagastab selle teose laenutusaja (ehk mitmeks päevaks teost tähise järgi on lubatud laenutada). Kui tähis on erinev kuiroheline
,kollane
,sinine
,puudub
, siis tagastatakse 0. - Samuti on klassis
double
-tüüpi parameetriteta meetodpäevaneViivis
, mis tagastab vastavalt tähisele sobiva viivise ühe tähtaega ületanud päeva kohta. - Samuti on klassis
void
-tüüpi meetodarvutaViivis
, mis võtab parameetriksKontrollija
isendi. Tähtaja ületanud laenutuse korral arvutab meetod viivise suuruse ja laseb kontrollijal selle salvestada (salvestaViivis
). - Samuti on klassis
Teos
meetodtoString
, mis aitab kogu teadaolevat infot teose ja selle laenutamise kohta sobivalt kujundada. Muuhulgas peab olema näidatud, kas teost on vaja tellida hoidlast. - Klass
Teos
realiseerib liidestComparable<Teos>
, kusjuurescompareTo
meetod realiseeritakse nii, et teoseid võrreldakse kirjelduse alusel.
5. Klass Raamat
on klassi Teos
alamklass. Klassis on konstruktor vajaliku info määramiseks ja vähemalt järgmised meetodid.
- Meetod
kasHoidlast
, mis tagastabtrue
, kui raamatu tähis on kollane või sinine, vastasel juhul tagastataksefalse
. - Meetod
toString
, mis tagastab ülemklassitoString
tulemuse 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 meetodid.
- Meetod
kasHoidlast
, mis tagastabtrue
, kui ajakiri ilmus aastal 2000 või varem, vastasel juhul tagastataksefalse
. - Meetod
toString
, mille ülekatmisel on rakendatud ülemklassi meetodittoString
lisades märkuse selle kohta, et tegemist on ajakirjaga.
7. Peaklass peab olema nimega Peaklass
. Klassis peab olema staatiline avalik meetod loeTeosed
tagastustüübiga List<Teos>
, mis võtab argumendiks failinime ja tagastab selles failis olevad laenutuste andmed. Meetod võib visata erindi (st. meetodi signatuuris võib olla throws Exception
). Teoste faili formaat on ülalpool toodud. Teoste arv failis ei ole teada (programm peaks töötama suvalise (ka tühja) failiga). Kui failist lugemist ei õnnestu programmeerida, siis kirjutatagu selles meetodis vastav list programmi sisse (vähendab tulemust 2 punkti võrra).
Peameetodis tehakse järgmised tegevused.
- Rakendatakse vastavat staatilist meetodit, et lugeda failist teoste andmed.
- Sorteeritakse teoseid vastavalt meetodis
compareTo
kirjeldatud järjekorrale (listi sorteerida saab kasutades meetoditjava.util.Collections.sort(List<T> list)
). - Luuakse
ViiviseHoiataja
(lubatud viivis 0.2€) jaSuurimaViiviseLeidja
isendid. - Kutsutakse iga teose peal
arvutaViivis
, andes parameetriksViiviseHoiataja
isendi. Pärast kõigi viiviste arvutamist prindi väljaViiviseHoiatajasse
kogunenud laenutajate nimed. - Kutsutakse iga teose peal
arvutaViivis
, andes parameetriksSuurimaViiviseLeidja
isendi. Pärast kõigi viiviste arvutamist saada suurima viivise omanikule hoiatus (kasutades vastavatSuurimaViiviseLeidja
meetodit). - Sobivates kohtades näidata isendite infot ja meetodite töö tulemusi ekraanil.
Andmete fail on aadressil http://kodu.ut.ee/~marinai/laenutus.txt
. Salvestage see oma arvutisse. Fail on kodeeringus UTF-8. Vajadusel tutvuge klassi Scanner
konstruktoriga, mis võimaldab kodeeringut näidata.
Mittekompileeruva programmi eest punkte ei saa.