Kuuenda praktikumi ülesanded
Järgmisest kolmest ülesandest tuleb lahendada vähemalt üks. Lahendused tuleb esitada Moodle'is, kus need kontrollitakse automaatselt.
Kontrollülesanne 6.4a Täiendatud peo eelarve
Ülesandes 5.3 pidite kirjutama programmi, mis arvutab peo maksimaalse ja minimaalse eelarve küsides inimeste arvu kasutajalt. Selles ülesandes tuleb inimeste arv saada failist.
Juubelile on kutsutud hulk inimesi, kellest osa on teatanud, et nad tulevad ja ülejäänute kohta ei ole midagi teada.
Juubelikorraldaja paneb nimekirja faili järgmisel kujul:
? Anna
+ Peeter
+ Ülle
? Eva
? Juhan
+ Maria
+ Epp
+ Anu
Faili igal real on märk + (tuleb) või ? (ei tea veel) ja inimese nimi. Tehke see fail ise mingi tekstiredaktoriga (võib ka Thonnyga). Faili kodeeringuks kasutage UTF-8.
Peo eelarve koosneb kahest osast: söök ja ruumi rent. Söögi peale arvestatakse iga osaleja kohta 10 eurot. Ruumi rent maksab sõltumata osalejate arvust 55 eurot. Planeerimiseks on vaja programmi, mis arvutab
- maksimaalse eelarve (arvestades, et kõik kutsutud inimesed tulevad kohale) ja
- minimaalse eelarve (arvestades, et kohale tulevad ainult need, kes on juba seda teatanud).
Programmi loomisel on mõistlik aluseks võtta ülesande 5.3 lahendus, sh funktsioon eelarve
, mis võtab argumendiks külaliste arvu ning arvutab ja tagastab eelarve (10 euro iga külalise jaoks ja 55 eurot ruumi rendiks). Programm
- küsib kasutajalt failinime;
- loeb sellest failist informatsiooni külaliste kohta;
- arvutab ja väljastab ekraanile kutsutud inimeste arvu;
- arvutab ja väljastab ekraanile inimeste arvu, kes on juba tulemisest teatanud;
- arvutab ja väljastab ekraanile maksimaalse eelarve, kasutades koostatud funktsiooni
eelarve
; - arvutab ja väljastab ekraanile minimaalse eelarve, kasutades koostatud funktsiooni
eelarve
.
Näide programmi tööst:
Näiteks, kui faili nimekiri.txt sisu on ülaltoodu, siis programm peab andma tulemuse :
Kui olete juba hulk aega proovinud ülesannet iseseisvalt lahendada ja see ikka ei õnnestu, siis võib-olla saate abi murelahendajalt
. Püütud on tüüpilisemaid probleemseid kohti selgitada ja anda vihjeid.
Kontrollülesanne 6.4b Nimepäev
Kui aadressile https://courses.cs.ut.ee/MTAT.TK.012/2015_fall/uploads/Main/ lisada kuunimi (nt. https://courses.cs.ut.ee/MTAT.TK.012/2015_fall/uploads/Main/jaanuar), siis sellelt aadressilt võib leida lehe, kus on kirjas selle kuu nimepäevalised nii, et igal real on ühe päeva nimepäevalised (esimesel real on selle kuu esimese päeva nimepäevalised, teisel real on selle kuu teise päeva nimepäevalised jne.). "märts" asemel tuleb kasutada ilma täpitähtedeta versiooni "marts".
NB! Kui ülaltoodud aadressilt andmeid ei saa kätte (nt Macide kasutajad), siis palun proovida http://kodu.ut.ee/~eno/mooc/jaanuar jt.
Kirjutada programm, mis
- küsib kasutajalt kuunime (võib eeldada, et kasutaja sisestab kuunime õigesti ja "märts" asemel kirjutab "marts"),
- küsib kasutajalt päeva (võib eeldada, et sisestatud kuus leidub sellise järjekorranumbriga päev),
- loeb vastavalt aadressilt selle kuu nimepäevad (kasulik oleks nendest koostada järjend, abiks võib olla meetod
splitlines()
) ja - väljastab ekraanile sisestatud kuupäevale vastavad nimepäevalised.
Näide programmi tööst:
Kui olete juba hulk aega proovinud ülesannet iseseisvalt lahendada ja see ikka ei õnnestu, siis võib-olla saate abi murelahendajalt
. Püütud on tüüpilisemaid probleemseid kohti selgitada ja anda vihjeid.
Kontrollülesanne 6.4c Elutee number
Numeroloogias peetakse tähtsaks elutee numbrit, mille arvutamiseks tuleb liita kokku sünnikuupäeva ja -aasta numbrid nii, et jõutakse lõpuks ühe numbrini.
Näiteks, oletame, et sünnikuupäev on 15.05.1975. Teha tuleb niisiis järgnev tehe: 1+5+5+1+9+7+5 = 33, 3+3 = 6, seega on elutee number 6.
Aga kui sünnikuupäevaks on nt. 17.11.1981, siis arvutada tuleb järgmiselt: 1+7+1+1+1+9+8+1 = 29, 2+9 = 11, 1+1=2.
Elutee numbrit arvutab järgmine (rekursiivne) funktsioon, mis võtab argumendiks sünnikuupäeva:
#argument s on sõne, esialgu see on kuupäev, edasi juba arvutatud arv def elutee(s): #abimuutaja numbri arvutamiseks n = 0 # tsükkel, mis vaatab iga sümboli sõnes for i in s: if i != ".": n += int(i) # arvutame summat # kui saadud arv on väiksem kui 10, siis ongi elutee number käes if n < 10: return n # kui saadud arv on 10 või suurem, siis on vaja uuesti arvutada, #selleks kasutame jälle sama funktsiooni else: return elutee(str(n))
Failis sunnikuupaevad.txt on mingi hulk sünnikuupäevi, iga sünnikuupäev eraldi real. Kirjutada programm, mis tekitab selle faili põhjal 9 tekstifaili nimedega eluteenumber1.txt, eluteenumber2.txt, ..., eluteenumber9.txt ning jagab sünnikuupäevad nendesse failidesse vastavalt elutee numbrile (elutee numbri arvutamiseks kasutada funktsiooni elutee). Näiteks sünnikuupäev 15.05.1975 tuleb kirjutada faili eluteenumber6.txt.
Näide programmi tööst:
Kui faili sunnikuupaevad.txt sisu on
07.02.1969 17.11.1981 29.03.1955
siis faili eluteenumber7.txt sisu peab olema
07.02.1969 29.03.1955
ja faili eluteenumber2.txt sisu peab olema
17.11.1981
Kõik ülejäänud 7 faili peavad selle näite korral küll tekkima, aga jääma tühjaks.
Kui olete juba hulk aega proovinud ülesannet iseseisvalt lahendada ja see ikka ei õnnestu, siis võib-olla saate abi murelahendajalt
. Püütud on tüüpilisemaid probleemseid kohti selgitada ja anda vihjeid.