10. praktikum. Harjutused
NB! Praktikumiülesandeid antakse alati varuga, et ka kõige kiirematel/kogenumatel lahendajatel jätkuks tegevust. Seega pole mõtet kurvastada, kui te ei jõua kõiki lahendada. Vaadake ülesanded rahulikult üle ja lahendage ära just need, mis tunduvad teile huvitavad ja/või parajalt jõukohased/väljakutsuvad (kui just teie praktikumijuhendaja pole teile soovitanud mingit konkreetset ülesannet).
1. Arvelduskonto kontrollimine
Koostada erindiklass RahaEiJätkuErind
. Koostada erindiklass NegatiivneSummaErind
. Luua klass Konto
, mis sisaldab String
-tüüpi isendivälja konto omaniku nime jaoks ning double
-tüüpi isendivälja rahasumma jaoks. Klassis on set
-meetodid kõigi isendiväljade jaoks. Kui rahasummaks antav arv on negatiivne, siis tuleb visata erind NegatiivneSummaErind
. Klassis on konstruktor, mis väärtustab vastavad väljad kasutades set
-meetodeid. Peab olema ka meetod toString
. Klassis on meetod osta
, mis võtab argumendiks ostetava asja maksumuse (double
-tüüpi) ja vähendab kontol raha (isendivälja) selle võrra. Kui kontol raha ei jätku, siis tuleb visata erind RahaEiJätkuErind
. Klassis on ka meetod paneJuurde
, mis võtab argumendiks juurde paneva rahasumma (double
-tüüpi) ja liidab selle kontol oleva summa juurde, kasutades set
-meetodit. Peaklassi peameetodis luua klassi Konto
isend, sooritada vähemalt kaks ostu, panna raha juurde, püüda tekkinud erindid kinni ning kuvada nende (konto, erindite) info.
2. CSV-lugeja
CSV on failiformaat, mis esitab tabeli kujul andmeid. Iga faili rida tähistab ühte tabeli rida ja veerud on komadega eraldatud. Koostada klass CSVLugeja
, mille konstruktor võtab parameetriks faili nime. Klassis on privaatne isendiväli BufferedReaderi
jaoks, mis väärtustatakse konstruktoris ette antud failinime põhjal. Konstruktori alguses on ka failinime kontroll - kui nimi ei lõppe laiendiga “.csv”, tuleb visata IOException
(suuri ja väikseid tähti mitte eristada). Lisada parameetriteta meetod tabelist rea lugemiseks - meetod loeb failist järgmise rea ja tagastab sõnemassiivi, kus iga element on ühe veeru väärtus (faili lõpu korral tagasta null
). Lisaks realiseerib klass liidest AutoCloseable
- close
meetodis tuleb voog sulgeda. Katsetada klassi tööd testklassi peameetodis. Kasutada try-with-resources süntaksit, et CSVLugeja
sulgeda.
3. Palindroomid
Koostada erindiklass PalindroomiErind
. Luua klass Fraas
, mis sisaldab String
-tüüpi isendivälja fraasi jaoks. Samuti on klassis konstruktor, mis väärtustab vastava välja. Peab olema ka meetod toString
. Konstruktoris visatakse PalindroomiErind
, kui fraas on palindroom (ehk on päri- kui ka tagurpidi lugedes täpselt samasugune, nt. aias sadas saia). Peaklassi peameetodis luua vähemalt kaks klassi Fraas
isendit, püüda tekkinud erindid kinni ning kuvada nende (fraaside, erindite) info. Kasuks tuleb meetod reverse
klassist StringBuilder
.
4. Lohisevam KopeeriFail
Otsida välja voogude praktikumist klass KopeeriFail
ja selle kopeeri
meetod. Muuta meetodit nii, et try-with-resources asemel kasutatakse try-finally plokke. Kui meetodi töö käigus visatakse erind, siis peab ka meetod erindiga töö katkestama. Igal juhul peab proovima mõlemat voogu sulgeda (ka siis, kui kummagi voo sulgemise käigus tekib erind). Kasutada võib mitut try-finally plokkide paari, mida võib vajadusel ka üksteise sisse paigutada.
5. Tühikupedant
Koostada erindiklass TühikuErind
, mis visatakse siis, kui sõnes eelneb tühik vahetult lauselõpumärgile (punktile, hüüumärgile või küsimärgile). Lisada peaklassi programmilõik, mis laseb kasutajal ridahaaval teksti sisestada ja valesse kohta kirjutatud tühiku korral jooksutab programmi TühikuErindiga
kokku.
6. Tühjad numbrid
Koostada erindiklass TühjaArvuErind
, mis on NumberFormatException
alamklass. Luua klass ArvuLugeja
, kus on meetod, mis võtab parameetriks sõne ja tagastab int
-massiivi. Argumendiks oodata sõne, mis sisaldab komadega eraldatud täisarve. Tükeldada sõne, teisendada kõik jupid täisarvudeks ja tagastada need. Kui sõnes on komade vahel arv puudub (nt 1,2,,4
), siis visata TühjaArvuErind
. Koostada peameetod, mis võtab käsurealt parameetri, käivitab sellega arvulugeja meetodi ja prindib tulemuse välja. Kui kasutaja sisestas arvude asemel sõnu, püüda arvulugejas Integer.parseInt
poolt visatav erind ja kuvada hoiatus "Sisestada saab ainult arve". TühjaArvuErindi
puhul kuvada hoiatus "Kontrolli, et arvud tühjad ei oleks".
7. Ohtlik PrintWriter
Varasemalt oleme õppinud, kuidas PrintWriter
abil teksti faili kirjutada:
static void kirjuta(String failiNimi, String tekst) throws IOException { PrintWriter writer = new PrintWriter(failiNimi, "UTF-8"); writer.write(tekst); }
Paneme tähele, et PrintWriter
konstruktor võib erindi visata, aga erinevalt tavalistest voogudest ei saa tema write
ja close
meetodid kunagi IOExceptionit
visata. Erindid süüakse selle asemel lihtsalt ära. See on mõnikord mugav, aga samas väga ohtlik, sest me ei tea, kas meie kood reaalselt toimis.
Muuta meetodit nii, et PrintWriter
suletakse pärast kasutamist. Lisada enne voo sulgemist kontroll, kus küsitakse voolt, kas töö käigus tekkis vigasid (checkError
meetod) ja vea tuvastamisel visatakse IOException
(voog tuleb sulgeda ka vea korral).
8. Pitsatellimus
Veebist saab koju erinevaid pitsasid tellida. Ühe tellimusega saab tellida ka mitu erinevat pitsat. Teenuse pakkuja lubab, et tellija saab pitsad kätte maksimaalselt poole tunniga. Kui tellija peab rohkem ootama, siis ei ole vaja tellimuse eest maksta. Pitsad saadetakse välja tellimuste saabumise järjekorras. Ülesanne seisneb pitsatellimusi käsitleva programmi koostamises. Programm peab vastama alltoodud nõuetele (isegi kui need kummalised tunduvad). Programm peab sisaldama klasse Pitsa
, Tellimus
, erindiklassi LiigaPikkOotamineErind
ning peaklassi. Peaklassis luuakse pitsad ja tellimused ning simuleeritakse tellimuste vastuvõttu ja pitsade vedu.
- Klass
Pitsa
sisaldab privaatsetString
-tüüpi isendivälja pitsa nimetuse jaoks ning privaatsetdouble
-tüüpi isendivälja pitsa hinna jaoks. Klassis on konstruktor, mis väärtustab vastavad väljad. Kõigi isendiväljade jaoks on vastavadget
-meetodid. Peab olema ka meetodtoString
. - Klassis
Tellimus
on privaatsed isendiväljad järgmise info jaoks: tellija (String
), list kõigi pitsade jaoks, ootamise aeg (int
). Klassis on konstruktor, mis väärtustab vastavad väljad. Peab olema ka meetodtoString
. Klassis on meetodmaksumus
, mis tagastab tellitud pitsade maksumuse. Kui oli vaja oodata rohkem kui 30 minutit, siis selles meetodis tuleb visata erindLiigaPikkOotamineErind
(koostada erindiklassLiigaPikkOotamineErind
). - Luua peameetodis tellimuste väljasaatmise järjekorra tarbeks üks list.
- Failis
tellimused.txt
on igal real iga tellimuse jaoks kirjas tellija ning tellitud pitsad koos hindadega. Eraldajaks on semikoolon. Pitsa ja hinna eraldajaks on /. Nt. "Eduard Ennatlik;Mafioso/6.30;Al Tonno/4.00". Fail on veebis https://kodu.ut.ee/~marinai/tellimused.txt (UTF-8). Kopeerige see oma arvutisse. Peaklassi peameetodis lugeda sellest failist need tellimuste andmed. Luua pitsad (Pitsa
-tüüpi objektid) ja tellimused (Tellimus
-tüüpi objektid, ootamise aeg genereerida juhuslikult vahemikust [10-35]) ning „paigutada“ tellimused väljasaatmise järjekorda. - Väljastada ekraanile tellimuste andmed. Iga tellimuse korral väljastada ekraanile tellimuse maksumus. Liiga aeglase veo korral (erindi
LiigaPikkOotamineErind
püüdmisel) kirjutada tellimuste andmed tekstifaililiigaAeglased.txt
. Arvutada ja väljastada ekraanile kõigi tellimuste eest saadud raha.
9. Erindlik Runnable
Luua klass JooksutatavLugeja
, mis realiseerib liidest Runnable
. Klassil on konstruktor, mis võtab parameetriks faili nime. Meetodis run
tuleb lugeda kõik failis olevad tekstiread ja need ekraanile väljastada. Koostada testklass, mis run
meetodi tööd testib. Kasutada korrektselt veahaldust (mitte süüa erindeid ära, vajadusel mähkida RuntimeExceptionisse
).