메인 콘텐츠로 건너뛰기
Učilnica FRI 23/24
  • 홈
  • 더 보기
닫기
검색 입력 전환
한국어 ‎(ko)‎
English ‎(en)‎ Slovenščina ‎(sl)‎ Македонски ‎(mk)‎ Русский ‎(ru)‎ 한국어 ‎(ko)‎
손님 계정으로 접속
로그인
홈
Course Activities
과제물들 포럼모음 학습자료
Recent Courses
You are not enrolled in any courses
  1. pn
  2. Miklavževa pisma

Miklavževa pisma

완료 조건
Due: 수요일, 6 12월 2023, 3:15 PM

Ta naloga se ocenjuje in vam ne sme manjkati. Da lahko pristopite k izpitu, jo morate rešiti najmanj za oceno 6.

Prišel je čas, da pomagamo Miklavžu.

Nalogi so priloženi podatki. Programiraj tako, da se bodo nahajali v podimeniku "podatki" imenika, v katerem je tvoj program. Če je tvoj program v imeniku /Users/benjamin/programiranje/naloga, morajo biti podatki v /Users/benjamin/programiranje/naloga/podatki. (Pisma, recimo, bodo v /Users/benjamin/programiranje/naloga/podatki/pisma).

Pri reševanju ne smeš predpostaviti, kako je ime otrokom, ponudnikom, darilom. Z drugimi besedami, v tvojem programu se ne sme pojaviti nobeno ime otroka, nobeno ime ponudnika, nobeno konkretno darilo. Program mora biti uporaben tudi prihodnje leto, ko bo Miklavž obdaroval druge otroke z drugimi darili drugih dobaviteljev.

Za oceno 6

V delu za oceno 6 bomo pripravili funkcije, s katerimi bomo kasneje lahko razbirali sopomenke (oziroma, predvsem različne oblike besed), ki pomenijo isto darilo.

  • sopomenke_besede(s) prejme niz s z različnimi oblikami neke besede. Oblike so ločene s presledki, "osnovna" beseda je označena z zvezdico. Funkcija mora vrniti par (terko), ki vsebuje "osnovno besedo" in množico vseh besed (vključno z osnovno). Klic sopomenke_besede("sladkarije bombončki *bomboni liziko") vrne ("bomboni", {"sladkarije", "bombončki", "bomboni", "liziko"}).

  • preberi_sopomenke() prebere "sopomenke" iz datoteke podatki/sopomenke.txt. Vrniti mora slovar, katerega ključi so vse besede, ki se pojavijo v datoteki, pripadajoče vrednosti pa "osnovne oblike" te besede. Če bi bila datoteka videti tako

    sladkarije bombončki *bomboni
    *zemljevid
    *vlak *vlakec
    

    bi funkcija vrnila

    {"sladkarije": "bomboni", "bombončki": "bomboni", "bomboni": "bomboni",
     "zemljevid": "zemljevid", "vlak": "vlak", "vlakec": "vlak"}
    
  • Ko napišeš drugo funkcijo, dodaj v program vrstico sopomenke = preberi_sopomenke() (postavi jo pod to funkcijo in na začetek vrstice). Slovar sopomenk se nikoli ne spreminja, torej ni nič narobe, če si poenostavimo delo tako, da ga uporabljamo kar kot globalno spremenljivko.

  • Napiši funkcijo prevod_besede(beseda), ki prejme besedo in vrne njeno "osnovno obliko". Če besede ni v slovarju sopomenk, pa naj funkcija vrne None. Klic prevod_besede("vlakec") vrne "vlak". Klic prevod_besede("vlak") prav tako vrne "vlak". Klic prevod_besede("avtobus") vrne None, ker te besede ni v slovarju.

    V funkciji lahko uporabiš spremenljivko sopomenke (da ne boš stalno klical branja sopomenk).

Za oceno 7

V nalogah za oceno 7 bomo brali pisma Miklavžu. Nahajajo se v imeniku podatki/pisma in so videti, na primer, tako

Dragi Miklavž,

Pozdravljen! Kako kaj? Jaz sem v redu. Letos sem bila pridna (vsaj večino časa).
Prosim, prosim, prinesi mi kakšno knjigo, ki jo lahko prebiram pred spanjem. In
če lahko, dodaj še mehkega plišastega medvedka, da bova lahko skupaj brala.
Obljubljam, da bom vedno pospravljala svojo sobo.

Lepo se imej,
Ema

Opomba: večino pisem mi je prijazno sestavil chatGPT. :))))

  • poenostavi_besedilo(s) prejme niz. Vrniti mora niz, ki je enak podanemu, vendar vsebuje le črke, presledke in znake za novo vrstico. Poleg tega spremeni vse črke v male črke. Klic poenostavi_besedilo("Dragi Miklavž,\n\npišem ti (kot vsako leto): lep božič!") vrne "dragi miklavž\n\npišem ti kot vsako leto lep božič".

  • izlusci_avtorja(ime_dat) prejme ime datoteke s pismom in vrne ime njenega avtorja. Ime je tisto, kar je zapisano v zadnji neprazni vrstici. Avtor gornjega pisma je očitno Ema.

  • izlusci_darila(ime_dat) vrne množico vseh daril, omenjenih v pismu v datoteki s podanim imenom. Beseda predstavlja darilo, če je enaka kateri od besed, ki se pojavijo med sopomenkami; v vrnjeni množici mora biti osnovna oblika besede. Za gornje pismo vrne {"knjiga", "medvedek"}

    Pazi: če se v besedilu pojavi beseda "navlaka" ali pa otrok piše, kako je videti "gozdna vlaka", to še ne pomeni, da bi rad vlak! Ne išči delov besed!

    Program bo seveda nenatančen: če otrok napiše "lani si mi prinesel piškote", jih bo pač dobil tudi letos; če napiše "na kolesu vedno nosim čelado", utegne dobiti kolo in čelado.

  • darila_po_otrocih() ne prejme nobenih argumentov. Vrniti mora slovar, katerega ključi so avtorji pisem, pripadajoče vrednosti pa darila, ki so v pismu omenjena. Vrnjeni slovar se začne tako:

    {'Albert': {'žoga'},
     'Ana': {'knjiga', 'pisalo', 'zvezek'},
     'Benjamin': {'čelada', 'kolo'},
     'Berta': {'čokolada', 'piškoti'},
     'Cilka': {'barvice', 'bomboni'},
     'Dani': {'kocke', 'bomboni'},
     'Daniela': {'knjiga', 'blazina', 'medvedek'},
     'Dudley': {'vlak', 'zvezek', 'pero', 'čokolada', 'bomboni', 'žoga', 'knjiga', 'kolo'},
     ...
    
  • zbirnik_daril() ne prejme nobenih argumentov. Vrniti mora slovar, katerega ključi so darila, vrednosti pa število "naročenih" kosov tega darila. Tako ključu "barvice" pripada vrednost 7, saj si barvice želi 7 otrok.

Ocena 8

Miklavž nabavlja darila pri dolgoletnih dobaviteljih: Godler s.p., Klemenčič s.p., Lampič s.p., Pavlič s.p. in Dežman s.p. Njihovi ceniki so v podatki/dobavitelji. V kakšni obliki so, si oglej sam.

  • preberi_cenik(ime_ponudnika) prejme ime ponudnika, na primer "Lampic" (brez šumnikov, da ni komedij na MS Windows). Vrniti mora slovar, katerega ključi so vse, kar ponuja podani s.p., pripadajoče vrednosti pa cene. Klic preberi_cenik("Lampic") vrne

    {'avtomobilček': 15.0,
     'barvice': 9.0,
     'bomboni': 3.0,
     'knjiga': 12.0,
     'medvedek': 15.0,
     ... in tako naprej
    
  • ceniki() vrne slovar, katerega ključi so imena ponudnikov, vrednosti pa slovarji z njihovimi ceniki (torej tem, kar vrača prejšnja funkcija.) Za primer poglej kar v teste, funkcija test_ceniki.

  • najcenejsi_ponudnik(ceniki, darilo) prejme cenike v enaki obliki, kot jih vrača prejšnja funkcija in ime darila. Vrniti mora par (terko) z imenom najcenejšega podudnika in ceno. (Pravni oddelek inštitucije svetega Miklavža ima še bolj preplašene pravnike kot UL in fakultete; ker je sv. Miklavž javna oseba, jih skrbi, da morda sodi pod javno upravo in mora vedno nabavljati pri najcenejšem ponudniku, ne glede na (ne)kvaliteto.)

    V primeru, da ima najcenejšo ponudbo več ponudnikov, mora vrniti tistega, ki je kasneje po abecedi.

    Klic najcenejsi_ponudnik(ponudbe, "žoga") vrne ("Dezman", 20): žoge so najcenejše pri Dežmanu in sicer stanejo 20.

    Klic najcenejsi_ponudnik(ponudbe, "medvedek") vrne ("Pavlic", 15). Medvedki po enaki ceni, 15, se dobijo tudi drugod, vendar je Pavlič zadnji po abecedi.

  • ponudniki_in_cene(ceniki, darila) je podobna prejšnji funkciji, le da prejme množico daril. Vrniti mora slovar, katerega ključi so podana darila, vrednosti pa pari, kakršne vrača prejšnja funkcija.

    Klic ponudniki_in_cene(ponudbe, {"medvedek", "kolo", "glina", "žoga"}) vrne

    {'glina': ('Godler', 3.0),
     'kolo': ('Pavlic', 210.0),
     'medvedek': ('Pavlic', 15.0),
     'žoga': ('Dezman', 20.0)}
    

    Ta funkcija nam torej pove, kje bo Miklavž dobil našteta darila in po koliko.

Ocena 9

  • vrednost_daril(otrok) vrne skupno vrednost daril, ki si jih želi otrok ob predpostavki, da bomo vsako od njih kupili pri najcenejšem ponudniku. Predpostaviti smeš, da je otrokovo pismo v datoteki podatki/pisma/{otrok}.txt.

  • preberi_tockovalnik() prebere datoteko, v kateri Miklavž vodi evidenco o tem, kateri otrok je bil priden in poreden. Vsaka vrstica vsebuje ime otroka, ki mu sledi dvopičje. Sledijo pozitivne točke za dobra in negativna za slaba dela. Funkcija mora vrniti slovar, katerega ključi so imena otrok, ki se pojavijo v točkovalniku, pripadajoče vrednosti pa vsota njihovih točk.

  • dolocitev_daril(proracun, darila, ponudniki_cene) prejme skupno ceno daril, ki jih lahko dobi nek otrok, množico daril, ki si jih želi, in slovar, kakršnega vrne funkcija ponudniki_in_cene. Funkcija vrne množico daril, ki jih bo ta otrok dejansko dobil. Določi jih na naslednji način.

    • Uredi darila od dražjih proti cenejšim, enako draga darila uredi padajoče po abecedi.
    • Za vsako darilo po vrsti pogleda, ali je njegova cena manjša od preostalega zneska, ki ga je na voljo. Če je, doda darilo med darila, ki jih bo prejel in ustrezno zmanjša znesek. Če je darilo dražje od preostale količina denarja, pa ga preskoči.
    • Nato nadaljuje z naslednjim darilom...

    Pomoč: če Pythonu damo urediti seznam terk, recimo parov, jih bo uredil po prvem elementu, tiste, pri katerih je prvi element enak, pa po drugem. Če hočemo nek seznam urediti padajoče, podamo funkciji za urejanje dodatni argument reverse=True

  • darila_za_otroka(otrok, tockovalnik, otroci_darila, ponudniki_cene) prejme ime otroka, točkovalnik (kot ga vrača funkcija preberi_tockovalnik), slovar, kot ga vrača darila_po_otrociih in slovar, kot ga vrača ponudniki_in_cene. Vrniti mora množico daril, ki jih bo dobil otrok glede na to, katera darila si želi in koliko denarja mu je Miklavž pripravljen nameniti.

    Skupna vrednost daril, ki jih bo dobil otrok, ne more preseči števila točk, deljenega z 10. Katera darila bo dobil, je določeno v opisu prejšnje funkcije.

Ocena 10

Napiši funkcijo narocila(), ki sestavi naročila za dobavitelje: funkcija mora sestaviti datoteke z imeni Dezman.txt, Godler.txt in tako naprej z vsebino v naslednji obliki:

Spoštovani dobavitelj,

pri vas bi rad naročil naslednja darila:

                     kosov
barvice..................6
blazina..................2
kocke....................2

Lep pozdrav,
Sveti Miklavž

Konkretna vsebina je za vsakega dobavitelja seveda drugačna. Datoteka mora biti oblikovana do pike in presledka tako, kot kaže vzorec. Predmeti naj bodo urejeni po abecedi. Datoteke naj bodo shranjene v trenutnem direktoriju (torej tam, kjer je program).

Funkcija mora prej seveda ugotoviti, katera darila dobi kateri otrok in pri kom bodo nabavljena.

Test in podatki

  • testi-in-podatki.zip testi-in-podatki.zip
    26 11월 2023, 10:43 AM
◄ Vaje
Testi in podatki ►
손님 계정으로 접속 (로그인)
Get the mobile app Obvestilo o avtorskih pravicah
Moodle 제공