Kontrolltöö näidisülesanne
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.
Ülesanne on kirjutada programm kinopiletite ostmiseks. Programmi sisendiks on järgmisel kujul fail, kus on kirjas kinoseansid:
Rokikoer;2017-05-16T11:00:00;1;5,6,7,35,36,37 Tulnukas: Covenant;2017-05-16T20:50:00;2;1,6,9,16,51 Galaktika valvurid Vol.2;2017-05-16T14:15:00;1;40,42,44,46,65,110,115 Ring;2017-05-18T18:40:00;3;1,2,3,4,5,6,7,8,9,10
Esimesel kohal on filmi pealkiri, siis seansi algusaeg, saali number ja müüdud kohtade numbrid (kohad on nummerdatud ilma ridasid arvestamata). Eraldajaks on semikoolon, müüdud kohtade numbrite eraldajaks on koma.
Programm loeb failis olevate seansside nimekirja sisse, loob 3 saali (1. saalis on 150 kohta, 2. saalis on 68 kohta ja 3. saalis on 10 kohta) ja alustab töötsükliga. Töötsükli igal kordusel küsitakse kasutajalt, kas ta tahab piletit osta (O
), seansi infot vaadata (V
) või seansside infot salvestada (S
) (seansside info salvestamine lõpetab programmi töö).
Näide
Kasutamise sessioon võiks näha välja kuidagi nii (kasutaja sisend on siin näidatud kaldkirjas):
Kas soovid piletit (O)sta, seanssi (V)aadata või seansid (S)alvestada? O On olemas järgmised seansid: 1. Rokikoer 2017-05-16T11:00 2. Tulnukas: Covenant 2017-05-16T20:50 3. Galaktika valvurid Vol.2 2017-05-16T14:15 4. Ring 2017-05-18T18:40 Sisesta seansi number: 4 Sisesta koha number: 5 Kõik kohad on välja müüdud! Kas soovid piletit (O)sta, seanssi (V)aadata või seansid (S)alvestada? O On olemas järgmised seansid: 1. Rokikoer 2017-05-16T11:00 2. Tulnukas: Covenant 2017-05-16T20:50 3. Galaktika valvurid Vol.2 2017-05-16T14:15 4. Ring 2017-05-18T18:40 Sisesta seansi number: 3 Sisesta koha number: 44 See koht on juba hõivatud! Sisesta koha number: 43 Pilet on ostetud! Info: Galaktika valvurid Vol.2 2017-05-16T14:15 Pilet: koht: 43, tehingID: 2017-05-16T14:15/0/1494924593266 Kas soovid piletit (O)sta, seanssi (V)aadata või seansid (S)alvestada? V On olemas järgmised seansid: 1. Rokikoer 2017-05-16T11:00 2. Tulnukas: Covenant 2017-05-16T20:50 3. Galaktika valvurid Vol.2 2017-05-16T14:15 4. Ring 2017-05-18T18:40 Sisesta seansi number: 3 Galaktika valvurid Vol.2 2017-05-16T14:15 Saal nr. 1 Vabu kohti: 142 Kas soovid piletit (O)sta, seanssi (V)aadata või seansid (S)alvestada? S Seansside info on salvestatud!
Peaklass
Programmi peaklass peab olema nimega Kino
ja asuma vaikepaketis.
Klass Pilet
Pileti hoidmiseks tuleb koostada vaikepaketti klass Pilet
. Selle klassi isenditel peavad olema järgnevad meetodid töö kohta käiva info küsimiseks:
int getKoht()
String getTehinguID()
NB! Nende meetodite nähtavus ei tohiks olla piiratud, st. neid peaks saama välja kutsuda suvalisest klassist.
Klass Saal
Saali hoidmiseks tuleb koostada vaikepaketti klass Saal
. Selle klassi isenditel peavad olema järgnevad meetodid töö kohta käiva info küsimiseks:
int getNumber()
int getKohtadeArv()
NB! Nende meetodite nähtavus ei tohiks olla piiratud, st. neid peaks saama välja kutsuda suvalisest klassist.
Klass Seanss
Seansi hoidmiseks tuleb koostada vaikepaketti klass Seanss
. Selle klassi isenditel peavad olema järgnevad meetodid töö kohta käiva info küsimiseks:
String getFilm()
LocalDateTime getAlgusaeg()
Saal getSaal()
Set<Pilet> getMüüdud()
Seansi loomisel peab määrama filmi, algusaja ja saali. Äsjaloodud seansil ei ole ühtegi müüdud piletit. Piletite müümiseks peab olema meetod müüPilet
, mis võtab argumendina soovitud koha numbri. Võib eeldada, et soovitud koht on lubatud piirides. Kui antud seansile kõik kohad on juba välja müüdud, siis peab meetod müüPilet
viskama erindi VabadKohadPuuduvadErind
(see tuleb ise defineerida; erindiklassis peab olema konstruktor, mille parameetriga saab veateate täpsustada). Kui soovitud koht on juba hõivatud, siis peab meetod müüPilet
viskama erindi KohtHõivatudErind
(see tuleb ise defineerida; erindiklassis peab olema konstruktor, mille parameetriga saab veateate täpsustada). Kui soovitud koht on vaba, siis luuakse pilet, lisatakse see müüdud piletite hulka ja see pilet ka tagastatakse. Pileti loomisel tuleb genereerida tehingu id järgmisel kujul: seansi algusaeg / juhuslik arv lõigust [0,9] / hetkeaeg millisekundites.
Vihje: kasuks tuleb meetod currentTimeMillis
klassist System
.
Klassis peab olema meetod vabuKohti
, mis tagastab selle seansi vabade kohtade arvu.
NB! Nende meetodite nähtavus ei tohiks olla piiratud, st. neid peaks saama välja kutsuda suvalisest klassist.
Abimeetod Kino.loeSeansid
Klassis Kino peab olema meetod loeSeansid
(võib olla staatiline) tagastustüübiga
Map<Integer, Seanss>
, mis võtab argumendiks failinime ja tagastab selles failis olevad seansside andmed (võtmeks on seansi järjekorra number failis). Seansside faili formaat on ülalpool toodud. Erinevad sisendfailid võivad sisaldada erineva arvu seansse. Saalide loomisel võib eeldada, et kinos on ainult 3 saali ning 1. saalis on 150 kohta, 2. saalis on 68 kohta ja 3. saalis on 10 kohta. Müüdud kohtade numbrid peavad jõudma seansi müüdud piletite hulka.
Vihje: kasuks tuleb meetod parse
klassist LocalDateTime
.
Kui failist lugemisel tekib erind (nt faili ei leitud), siis peab laskma sellel erindil programmi töö katkestada.
NB! Kuna loeSeansid
puhul on tegemist abimeetodiga, mida läheb vaja vaid peaklassis, siis ei tohiks olla võimalik seda teistest klassidest välja kutsuda.
Andmete näidisfail on aadressil http://kodu.ut.ee/~marinai/kino.txt. Salvestage see oma arvutisse.
Pileti ostmine seansile
Kui kasutaja valib pileti ostmise, siis kasutajale tuleb näidata seansside nimekirja ja kasutaja peab saama sisestada, mitmendale seansile ta tahab piletit osta. Seejärel peab kasutaja sisestama soovitud koha numbri. Kui sellele seansile on kõik kohad välja müüdud, siis tuleb minna töötsükli põhiküsimuse juurde. Kui soovitud koht on hõivatud, siis tuleb koha küsimust korrata niikaua, kuni kasutaja sisestab sobiva koha (mis ei ole veel hõivatud). Ostmise/müümise õnnestumisel programm peab näitama ostu info: filmi pealkirja, seansi algusaega, ostetud koha numbrit ja tehingu id-t.
Seansi info vaatamine
Kui kasutaja valib seansi info vaatamise, siis kasutajale tuleb näidata seansside nimekirja ja kasutaja peab saama sisestada, mitmenda seansi infot ta tahab näha. Programm näitab valitud seansi filmi pealkirja, algusaega, saali numbrit ja vabade kohtade arvu.
Seansside info salvestamine
Programmi lõpus tuleb seansside info salvestada faili seansid.dat, kasutades selleks klassi java.io.DataOutputStream
. Fail peab olema järgnevas formaadis: seansside arv (int
), iga seansi kohta filmi pealkiri (String
), seansi algusaeg (String
), saali number (int
) ja selleks seansiks müüdud piletite arv (int
), millele järgneb iga müüdud pileti jaoks pileti koha number (int
). Seansside info salvestamine lõpetab programmi töö.
NB! Kui sellise nimega fail juba eksisteerib, siis kirjutada selle sisu üle.
Kontrolltöö ajal on Moodle’s kättesaadav automaatne test, mis kontrollib, kas lahendus sisaldab nõutud komponente. Meetodite sisu see test ei kontrolli.
Mittekompileeruva programmi eest punkte ei saa.