11. kodutöö
1. Lapsed ja vanemad
Failis lapsed.txt on igal real vanema isikukood, tühik ja lapse isikukood. Failis nimed.txt on igal real ühe inimese isikukood, tühik ja tema nimi. Võib eeldada, et korduvaid nimesid failis ei esine. Võib eeldada, et iga failis lapsed.txt oleva isikukoodi jaoks on failis nimed.txt välja toodud vastav nimi.
Kirjuta programm, mis väljastab ekraanile iga lapse kohta ühe rea: tema nimi, koolon, tühik ning seejärel koma ja tühikuga eraldatuna tema ema ja isa nimi. Näiteks antud failide korral peaks ekraanile ilmuma järgnevad read (laste ega nende vanemate järjekord pole seejuures tähtis):
Robert Peedumets: Madli Peedumets, Peeter Peedumets Maria Peedumets: Madli Peedumets, Peeter Peedumets Liisa-Maria Jaaniste: Kadri Kalkun Peeter Peedumets: Karl Peedumets
Põhitöö tuleks delegeerida funktsioonile seosta_lapsed_ja_vanemad, mille parameetriteks on laste faili nimi ja nimede faili nimi ning mis tagastab sõnastiku, kus kirje võtmeks on lapse nimi ja väärtuseks tema vanemate nimede hulk.
Näiteks antud failide korral peaks tulemus olema järgmine.
>>> seosta_lapsed_ja_vanemad("lapsed.txt","nimed.txt") {'Robert Peedumets': {'Madli Peedumets', 'Peeter Peedumets'}, 'Maria Peedumets': {'Madli Peedumets', 'Peeter Peedumets'}, 'Liisa-Maria Jaaniste': {'Kadri Kalkun'}, 'Peeter Peedumets': {'Karl Peedumets'}}
Automaatkontroll. Programm ei tohiks kasutajalt midagi küsida. Andmefailide nimed lapsed.txt ja nimed.txt peaksid olema kirjutatud programmi sisse, st põhiprogramm pöördub nendega funktsiooni seosta_lapsed_ja_vanemad poole.
2. 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]]
3. Hulgateooria
Enne ülesande juurde asumist loe läbi õpiku kümnenda peatüki esimene lõik hulkade kohta: https://progeopik.cs.ut.ee/10_andmestruktuurid.html.
NB! Pythonis on küll olemas funktsioonid hulkade ühendi, ühisosa ja alamhulga leidmiseks, kuid palume neid oma lahenduses mitte kasutada. Samuti palume lahenduses mitte kasutada mitmesuguseid hulgaoperaatoreid, nagu & ja |.
Ühisosa
Kirjuta funktsioon ühisosa mille parameetriteks on kaks hulka ning mis tagastab hulga, mis sisaldab täpselt neid elemente, mis kuuluvad MÕLEMASSE argumendiks antud hulka.
>>> ühisosa({1, 2, 3}, {2, 3, 4, 5}) {2, 3}
Ühend
Kirjuta funktsioon ühend, mille parameetriteks on kaks hulka ning mis tagastab hulga, mis koosneb elementidest, mis kuuluvad esimesse või teise argumentideks antud hulka.
>>> ühend({1, 2, 3}, {2, 3, 4, 5}) {1, 2, 3, 4, 5}
On alamhulk
Kirjuta funktsioon on_alamhulk, mille parameetriteks on kaks hulka ning mis kontrollib, kas üks nendest hulkadest on teise alamhulk, tagastades vastava teksti. Hulk A on hulga B alamhulk, kui kõik elemendid, mis kuuluvad hulka A, kuuluvad ka hulka B.
>>> on_alamhulk({1, 2}, {1, 2, 3, 4}) Esimene hulk on teise hulga alamhulk
>>> on_alamhulk({1, 2, 3, 4}, {1, 3, 4}) Teine hulk on esimese hulga alamhulk
>>> on_alamhulk({1, 3, 4}, {1, 3, 4}) Need hulgad on võrdsed, seega on hulgad teineteise alamhulgad
>>> on_alamhulk({1, 2, 3, 20}, {1, 2, 3, 4, 5, 6}) Kumbki hulk pole teise hulga alamhulk
Võrdle hulki
Kirjuta funktsioon võrdle_hulki, mille parameetriteks on kaks hulka ning mis kuvab informatsiooni nende hulkade kohta. Funktsioon peaks:
- printima mõlemad hulgad ekraanile
- teavitama, kas tegu on võrdsete hulkadega
- printima hulkade ühisosa
- printima hulkade ühendi
- teavitama, kas kumbki hulk on teise hulga alamhulk.
NB! Selles funktsioonis oleks mõistlik kasutada funktsioone ühisosa, ühend ja on_alamhulk.
>>> võrdle_hulki({1, 2, 3}, {1, 2, 3, 4, 5}) 1. hulk: {1, 2, 3} 2. hulk: {1, 2, 3, 4, 5} Hulgad pole võrdsed Nende hulkade ühisosa on {1, 2, 3} Nende hulkade ühend on {1, 2, 3, 4, 5} Esimene hulk on teise hulga alamhulk
Automaatkontroll. Kaks esimest funktsiooni tagastavad hulga, kolmas tagastab sõne ja neljas ei tagasta midagi (vaid väljastab ekraanile).