11. praktikumi harjutused
1. Valuutad
Kirjuta funktsioon, mis võtab argumendiks sõnastiku, mis sisaldab valuutakursse euro suhtes: sõnastiku iga kirje näitab, kui palju saab vastavat valuutat ühe euro vastu. Funktsioon peab tagastama uue sõnastiku, kus iga valuuta kohta on näidatud sõnastikuna tema kurss iga teise valuuta suhtes. Valuutade tähistamiseks tuleb kasutada etteantud sõnastikus olevaid lühendeid. Näiteks argumendi
{'USD': 1.1095, 'GBP': 0.8633, 'PLN': 4.2693}
korral peaks funktsioon tagastama järgneva sõnastiku (siin antud ümardatult):
{'USD': {'GBP': 0.7781, 'PLN': 3.8479, 'EUR': 0.9013}, 'GBP': {'USD': 1.2852, 'PLN': 4.9453, 'EUR': 1.1583}, 'PLN': {'USD': 0.2599, 'GBP': 0.2022, 'EUR': 0.2342}, 'EUR': {'USD': 1.1095, 'GBP': 0.8633, 'PLN': 4.2693}}
Lisaks antud funktsiooni defineerimisele peab programm tegema järgmist.
- Lugema sisse failis valuutad.txt olevad valuutakursid ja moodustama nendest ülalkirjeldatud sõnastiku. NB! Veergude eraldajaks on failis tabulaator, mida saab Pythoni literaalina esitada kujul '\t'.
- Koostama loodud funktsiooni abil kõikide kursside sõnastiku.
- Küsima kasutajalt lähte- ja sihtvaluuta lühendid ning rahasumma, ning teisendama antud summa lähtevaluutast sihtvaluutasse, kasutades selleks kõikide kursside sõnastikku.
2. Kontaktid
Ülesandeks on kirjutada programm kontaktide andmebaasi haldamiseks.
Esmalt kirjuta funktsioon loe_sisse olemasoleva andmebaasi sisselugemiseks, mis võtab argumendiks failinime ja tagastab listi, mille iga element on sõnastik, mis sisaldab faili ühest reast loetud andmeid.
Näide
Kui faili sisu on selline:
eesnimi=Kalmer;perenimi=Koopaorav;e-mail=kalko@gmail.com;telefon=56785678 eesnimi=Pets;telefon=54342211 perenimi=Mushkin;telefon=234234234234;e-mail=igor.mushkin@mail.ru eesnimi=Malle;e-mail=malleke@ups.com;perenimi=Maadeuurija;lisainfo=lemmik
siis tagastatav list peaks olema sellisel kujul:
[{'e-mail': 'kalko@gmail.com', 'perenimi': 'Koopaorav', 'telefon': '56785678', 'eesnimi': 'Kalmer'}, {'telefon': '54342211', 'eesnimi': 'Pets'}, {'e-mail': 'igor.mushkin@mail.ru', 'perenimi': 'Mushkin', 'telefon': '234234234234'}, {'e-mail': 'malleke@ups.com', 'perenimi': 'Maadeuurija', 'lisainfo': 'lemmik', 'eesnimi': 'Malle'}]
NB! Faili igas reas olevate semikooloniga eraldatud attribuutide arv pole teada, samuti pole fikseeritud võimalikud attribuutide nimed.
Teiseks kirjuta funktsioon kirjuta_faili, mis võtab argumendiks ülalpool näidatud kujul oleva sõnastike listi ja failinime, ning kirjutab listi sisu faili samas vormingus nagu näiteks toodud failis. Attribuutide järjekord real pole oluline. Näiteks lause
kirjuta_faili( [{'e-mail': 'kalko@gmail.com', 'perenimi': 'Koopaorav', 'telefon': '56785678', 'eesnimi': 'Kalmer'}, {'telefon': '54342211', 'eesnimi': 'Pets'}, {'e-mail': 'igor.mushkin@mail.ru', 'perenimi': 'Mushkin', 'telefon': '234234234234'}, {'e-mail': 'malleke@ups.com', 'perenimi': 'Maadeuurija', 'lisainfo': 'lemmik','eesnimi': 'Malle'}], "kontaktid.txt")
peaks tekitama umbes sellise faili, nagu ülalpool näidatud.
Loodud funktsioonide abil koosta programm, mis loeb failist kontaktid.txt sisse andmed, näitab iga kontakti andmeid kasutajale ning lubab kasutajal iga kontakti juures lisada vastavasse sõnastikku 0 või rohkem atribuuti (st võtme ja väärtuse paari). Pärast kõigi kontaktide läbikäimist tuleb muudetud andmed salvestada tagasi samasse faili, kust nad sisse loeti.
3. Lennud (raskem ülesanne)
Oletame, et meil sõnastik, mis kujutab endast lennuliinide andmebaasi – iga kirje võtmeks on mingi linna nimi ja väärtuseks nende linnade nimede hulk, kuhu saab sellest linnast otse lennata. Näiteks:
lennud = { 'Pariis' : {'London', 'Berliin', 'Nice'}, 'London' : {'Berliin', 'Pariis'}, 'Berliin' : {'London', 'Pariis', 'Tallinn'}, 'Tallinn' : {'Berliin'} }
Kirjuta funktsioon saab_lennata, mis võtab argumentideks lähtelinna nime, sihtlinna nime ja lendude andmebaasi, ning tagastab True, kui selle andmebaasi järgi on lähtelinnast võimalik otse või ümberistumistega lennata sihtlinna, ning False vastasel juhul.
>>> saab_lennata('Tallinn', 'Nice', lennud) True
4. Maatriksi transponeerimine kõrvaldiagonaali järgi
Kirjuta funktsioon transponeeriK, mis võtab argumendina ette maatriksi ning tagastab selle transponeeritud kuju kõrvaldiagonaali järgi.
Transponeerimine tähendab, et maatriksi read muudetakse veergudeks ja veerud muudetakse ridadeks (https://et.wikipedia.org/wiki/Transponeeritud_maatriks). Tavaliselt transponeeritakse maatriksit peadiagonaali järgi, aga mõnes olukorras on seda vaja teha ka kõrvaldiagonaali järgi. Kõrvaldiagonaal on see diagonaal, mis ulatub ülemisest paremast nurgast alumisse vasakusse nurka.
Võib eeldada, et etteantud maatriks on transponeeritav, ehk siis kõik read on sama pikad ning kõik veerud on sama pikad.
>>> transponeeriK([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) [[9, 6, 3], [8, 5, 2], [7, 4, 1]]
>>> transponeeriK([[1, 2], [3, 4], [5, 6], [7, 8]]) [[8, 6, 4, 2], [7, 5, 3, 1]]
>>> transponeeriK([[4, 31, 67, 99]]) [[99], [67], [31], [4]]
Kui oled juba hulk aega proovinud ülesannet iseseisvalt lahendada ja see ikka ei õnnestu, siis võib-olla saad abi murelahendajalt
. Püütud on selgitada tüüpilisemaid probleemseid selgitada ja anda vihjeid.