Naloga

V nalogi se bomo igrali s slovarji, ki opisujejo, kje se nahaja kakšen kraj. Slovar lahko izgleda, recimo, tako

svet = { "Evropa": { "Slovenija": { "Gorenjska": { "Kranj": {}, "Radovljica": {}, "Zali log": {}, }, "Štajerska": { "Maribor": {}, "Celje": {} }, "Osrednja": { "Ljubljana": { "Vič": { "FRI": { "P1": { "tretja vrsta desno": { "peti stol z desne": { "Benjamin": {} } } } } }, "Šiška": {} } } }, "Nemčija": { "Bavarska": { "Munchen": {} }, "Berlin": {} }, }, "Amerika": { "ZDA": { "Teksas": { "Houston": {}, "Austin": {} }, "Kalifornija": { "San Francisco": {} }, "Anchorage": {} }, "Kanada": {} }, "Azija": { "Osaka": {} } }

Ali pa tako:

hisa = { "Klet": { "kurilnica": { "peč": {}, "metla": {} }, "shramba": { "spodnja polica": { "kisle kumare": {}, "rdeča pesa": {} }, "zgornja polica": { "škatla piškotov": { "crknjena miš": {}, "pol piškota": {} } } }, }, "Prvo nadstropje": { "soba": { "računalnik": {}, "jaz": {} }, "otroška soba": { "Martin": { "ostali piškoti": {} } } } }

Ogrevalna naloga

Napiši funkcijo izpisi_vse(kraji), ki kot argument dobi slovar, kakršen je gornji, in izpiše vse kraje v njem.

>>> izpisi_vse(hisa) Prvo nadstropje otroška soba Martin ostali piškoti soba računalnik jaz Klet shramba zgornja polica škatla piškotov crknjena miš pol piškota spodnja polica kisle kumare rdeča pesa kurilnica peč metla

Vrstni red v izpisu bo morda nekoliko premešan, saj slovarji, kot vemo, ne poznajo (vrstnega) reda.

Obvezna naloga

Napiši funkcijo prestej(kraji), ki vrne število vseh krajev in reči, ki se pojavijo v podanem slovarju.

Kot sem povedal tudi na predavanjih: pri reševanju je prepovedana uporaba globalnih spremenljivk! Vse spremenljivke morajo biti definirane znotraj funkcij in nobena ne smet biti definirana kot globalna.

>>> prestej(hisa) 19 >>> prestej(svet) 33

19, recimo, je ravno število vrstic, ki jih za slovar hisa izpiše funkcija izpisi_vse.

Dodatna naloga

Napiši funkcijo kje_je(kraj, kraji), ki kot argument dobi kraj ali stvar (na primer "kisle kumare") in slovar krajev in stvari, kot rezultat pa vrne pot do tega kraja ali reči, in sicer v obliki seznama.

Če kraja ne najde, naj vrne None. (Namig: če boste prav programirali, s tem ne boste imeli dodatnega dela; to se bo zgodilo kar "samo od sebe".)

Kot sem povedal tudi na predavanjih: pri reševanju je prepovedana uporaba globalnih spremenljivk! Pri tej nalogi pa je z njimi tako ali tako težje kot brez njih.

Testni primeri so razdeljeni v dva testa. Prvi so preprostejši in preglednejši, drugi iščejo po večji strukturi. Rešitev mora seveda prestati oboje.

>>> kje_je("Osaka", svet) ['Azija', 'Osaka'] >>> kje_je("Ljubljana", svet) ['Evropa', 'Slovenija', 'Osrednja', 'Ljubljana'] >>> kje_je("Evropa", svet) ['Evropa'] >>> kje_je("Benjamin", svet) ['Evropa', 'Slovenija', 'Osrednja', 'Ljubljana', 'Vič', 'FRI', 'P1', 'tretja vrsta desno', 'peti stol z desne', 'Benjamin'] >>> kje_je("Nara", svet) >>> print(kje_je("Nara", svet)) None

Rešitev

Rešitev tokrat ni kaj komentirati: preberite si vse, kar smo napisali o Karlu Velikem. Tole je isto.

def izpisi_vse(kraji): for k in kraji: print(k) izpisi_vse(kraji[k]) def prestej(kraji): s = 0 for k in kraji: s += 1 + prestej(kraji[k]) return s def kje_je(kraj, kraji): for k in kraji: if k == kraj: return [k] pot = kje_je(kraj, kraji[k]) if pot: return [k] + pot
Last modified: Wednesday, 20 November 2013, 11:05 PM