12. hét: összetett adatszerkezetek

Czirkos Zoltán, Ress Sándor · 2023.12.07.

Gyakorlófeladatok az előadás anyagához kapcsolódóan.

1. List comprehension

Nézd végig eddigi labor megoldásaidat, hol tudnád alkalmazni ezt a rövidítést és írd át megfelelően!

2. Összetett adatszerkezetek

Alice in Wonderland

Írj programot, ami halmaz (set) segítségével, megszámolja, hogy hány különböző szó található a szövegben! Teszteld a programot szabadon elérhető hosszabb szövegeken, mint pl. Alice csodaországban. (angol nyelven érdemes kipróbálni)

Módosítsd a programot úgy, hogy szótár segítségével szótár (dict) mindenfajta statisztikát készítsen el, ami elképzelhető: a betűk és írásjelek előfordulását, a szavak előfordulását, a mondatok átlagos hosszát, stb.

Minta házi feladat

Alakítsd át úgy a minta házi feladatot, hogy Python halmazt és halmazműveleteket használjon!

Konyha

Egy konyhán különféle ételeket készítenek. Van egy raktáruk, rengeteg élelmiszerrel, és adott többféle étel receptje, amiből most a hozzávalók listája érdekes csak.

A raktárkészletet egy Python szótár tartja nyilván (dict). Ebben a kulcs az élelmiszer neve, az érték pedig a rendelkezésre álló mennyiség. Például: liszt: 6, paprika: 3, tojás: 5, só: 1. Egy konkrét recepthez a hozzávalók szintén egy szótárban tárolhatóak, pl. nokedlihez liszt: 0.4, tojás: 1 stb. Ezekhez tartozna mértékegység is (liszt: kg, tojás: db és így tovább), de ezeket elhagyjuk, nem lényegesek most.

Írj függvényt, amelyik egy étel elkészítését kezeli! Vegye át ez paraméterként a készletet és a hozzávalókat, továbbá egy mennyiséget, hogy hány adagot kell főzni (ennyivel kell megszorozni az egyes hozzávalókat). Ha van minden hozzávalóból elég, akkor vonja le a függvény a készletből a felhasznált élelmiszereket, és adjon igazat. Ha bármelyikből hiány van, vagy egyáltalán nincs olyan hozzávaló, akkor ne csináljon semmit, hanem adjon hamisat (mivel felesleges belekezdeni a főzésbe, ha nincs mindenből elegendő.)

Írj függvényt, amelyik fájlba írja a paraméterként adott raktárkészletet! Minden tételhez a fájl egy sora tartozzon. A sorok elején legyen a mennyiség, utána pedig az élelmiszer neve, vesszővel elválasztva.

Írj függvényt, amelyik a paraméterként megadott nevű fájlból beolvas egy teljes raktárkészletet, és visszaadja azt!

Statisztika szótárral

Ebben a szövegfájlban egész számok találhatók, soronként egy darab. Készíts programot, amely szótár (dict) használatával statisztikát készít, azaz megszámolja, hogy a parancssori argumentumként megadott fájlban melyik egész szám hány százalékban fordult elő. Ha nincs parancsorban fájl megadva, adjon hibajelzést! A beolvasás legyen hibabiztos, az egész számként nem értelmezhető bemenetet a program hagyja figyelmen kívül!

Az eredményt hisztogramként, a példához hasonlóan ábrázold! (tipp: a leggyakoribb számhoz tartozó oszlop legyen 50 karakter széles)

statisztika.py adatok.txt

  3816:  0.00%
  3817:  0.02%
  3818:  0.04%
  3819:  0.25%
  3820:  0.55% #
  3821:  1.40% ####
  3822:  2.84% #########
  3823:  5.00% ################
  3824:  8.27% ##########################
  3825: 11.87% ######################################
  3826: 13.26% ###########################################
  3827: 15.38% ##################################################
  3828: 11.98% ######################################
  3829: 11.25% ####################################
  3830:  7.67% ########################
  3831:  5.03% ################
  3832:  2.70% ########
  3833:  1.49% ####
  3834:  0.61% #
  3835:  0.26%
  3836:  0.09%
  3837:  0.03%
  3838:  0.01%

Vigyázz! A dict alapvetően nem rendezve tárolja a kulcsokat, használd a sorted függvényt!

Névnapok

Ez a fájl a névnapokat tartalmazza: (forrás: https://people.inf.elte.hu/csa/nevnap.txt)

01.01 Fruzsina
01.02 Ábel
01.03 Benjámin
01.04 Titusz Leona
01.05 Simon
01.06 Boldizsár
01.07 Attila Ramóna
...

Olvassa be ezt a fájlt a beolvas() függvényed! A paramétere legyen a fájlnév, visszatérési értéke pedig egy általa létrehozott dict objektum. Az utóbbi kulcsai a napok (hónapot és napot, két egész számot tartalmazó tuple), értékei pedig listák, hiszen egy napon több névnap is lehet. Pl. nevnapok[(1,7)] értéke ["Attila","Ramóna"].

Írj ezután egy másik, megfordit() nevű függvényt, amelyik megfordítja ezt a dict-et! Vagyis hozzon létre egy másikat, amelyet névvel lehet indexelni, és úgy dátumokat kapunk, hogy mikor vannak az ahhoz tartozó névnapok. Például datumok["Péter"] értéke [(6,2),(6,29)] lesz a fenti adatokkal. A függvény paramétere az eredeti dict, értéke pedig az új dict legyen.

Írj főprogramot, amelyik beolvassa a nevnapok.txt fájlt az első függvénnyel, megfordítja a másikkal; végül pedig kér egy nevet a felhasználótól, és kiírja, hogy mikor tarthatja a névnapjait! (Vagy hogy nincs olyan név.)

3. Deque

Bejárások

A bináris fák algoritmusait rekurzívan írtuk meg. Alakítsd át ezeket az algoritmusok iteratívvá a sor (deque) segítségével! Készíts szélességi bejárást, amikor a fát szintenként járjuk be! A wikipédián megtalálod ezeknek az algoritmusoknak a pszeudókódjait.

szélességi bejárás

Kifestés

Itt található a rekurzív kifestő algoritmus. Alakítsd át ezt az algoritmust úgy, hogy rekurzió helyett sort használjon!