22 Kontrolltöö näidisülesanne 1: Pakiautomaat
Oleme jõudmas “Tarkvaraarenduse” kursusega lõpule. Selles osas uusi asju enam ei tutvustata, see-eest püüame õpitu kokku võtta.
Järgnevate ülesannete läbilahendamine annab teatud kindlustunde, et õpitud oskutes on vajalik tase saavutatud. Siiski ei kata need ülesanded päris kõike õpitut.
Ülesanne. Pakiautomaat
Pakiautomaadi kapid on määratud kahe koordinaadiga — esimene näitab korrust ja teine näitab, mitmes kapp see korrusel on. Nummerdamine algab nullist ja korruste loendamine ülalt.
Näiteks
00 01 01 03 04 10 11 12 13 14 20 21 22 23 24
Kappide sisu on kirjas tekstifailis kapid.txt. Tühja kappi tähistab -. Eraldajaks on koma.
-,kiri,-,pakk,kiri pakk,-,-,-,pakk -,-,-,-,pakk
Tekstifailis uksekoodid.txt on neljakohalised kordumatud uksekoodid ning vastavate kappide koordinaadid. Eraldajaks on koma.
0132,0,1 9142,0,3 8112,0,4 4444,1,0 5131,1,4 0000,2,4
Kirjuta programm, mis teeb järgnevat.
Kõigepealt koostab programm kapisisude faili kapid.txt põhjal kahemõõtmelise järjendi ning väljastab selle ekraanile. Ülaltoodud faili korral:
[['-', 'kiri', '-', 'pakk', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']]
Järjend on siin mitmel real illustreerimiseks, programm võib selle ühes reas väljastada.
Uksekoodide failist uksekoodid.txt loeb programm andmed sõnastikku, kus võtmeteks on uksekoodid (sõnedena) ja väärtusteks vastavate kappide koordinaadid (andmestruktuur on lahendaja valida).
Seejärel küsib programm kasutajalt tegevuse, mis sisestatakse numbri abil.
Võimalikud valikud on järgmised.
- Saadetise kättesaamine
- Kasutajalt küsitakse uksekood.
- Kui selline uksekood on olemas, siis „avatakse” vastav kapp ning teatatakse, mis on selle sisu. Vastav kirje eemaldatakse sõnastikust ja kapi sisude järjendis määratakse vastavale kohale väärtus -.
- Kui sellist uksekoodi ei ole, väljastatakse ekraanile vastav teade.
- Tühjade kappide arvu küsimine
- Ekraanile väljastatakse tühjade kappide arv.
- Saadetise saatmine
- Kui tühje kappe pole, siis väljastatakse vastav teade.
- Kui tühje kappe on, siis küsitakse kasutajalt, mida ta tahab saata. Saadetis paigutatakse ükskõik millisesse tühja kappi ja tehakse muudatus kappide sisu järjendis. Uksekood (nelja numbrimärgiga sõne) genereeritakse juhuslikult ning kui sellist uksekoodi veel pole, täiendatakse uksekoodide sõnastikku. Uksekoodi genereeritakse senikaua, kuni saadakse selline, mida veel pole.
- Kasutajalt küsitakse, kellele ta tahab paki saata.
- Postifirmale „saadetakse” (ekraanile väljastatakse) sõnum uue saadetise andmete ja kapi uksekoodiga.
Pärast tegevust väljastatakse kappide sisu järjend ning uksekoodide sõnastik ekraanile.
Järgnevad näited on üksteisest sõltumatud. Kõik lähtuvad ülaltoodud failidest.
Näide 1 a
[['-', 'kiri', '-', 'pakk', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']] Palun valige tegevus: 1 Palun sisestage uksekood: 3232 Sellist uksekoodi ei ole. [['-', 'kiri', '-', 'pakk', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']] {'0132': (0, 1), '9142': (0, 3), '8112': (0, 4), '4444': (1, 0), '5131': (1, 4), '0000': (2, 4)}
Näide 1 b
[['-', 'kiri', '-', 'pakk', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']] Palun valige tegevus: 1 Palun sisestage uksekood: 9142 Avaneb kapp (0, 3), milles on pakk [['-', 'kiri', '-', '-', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']] {'0132': (0, 1), '8112': (0, 4), '4444': (1, 0), '5131': (1, 4), '0000': (2, 4)}
Näide 2
[['-', 'kiri', '-', 'pakk', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']] Palun valige tegevus: 2 Praegu on 9 tühja kappi [['-', 'kiri', '-', 'pakk', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']] {'0132': (0, 1), '9142': (0, 3), '8112': (0, 4), '4444': (1, 0), '5131': (1, 4), '0000': (2, 4)}
Näide 3
[['-', 'kiri', '-', 'pakk', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']] Palun valige tegevus: 3 Mida tahate saata? kiri Kellele tahate saata? Lottele Sõnum postifirmale: Kapis (0, 0) on kiri, mis saadeti Lottele. Uksekood on 5465. [['kiri', 'kiri', '-', 'pakk', 'kiri'], ['pakk', '-', '-', '-', 'pakk'], ['-', '-', '-', '-', 'pakk']] {'0132': (0, 1), '9142': (0, 3), '8112': (0, 4), '4444': (1, 0), '5131': (1, 4), '0000': (2, 4), '5465': (0, 0)}