1 def f(ssz):2 print(f'{ssz}. feladat:')3 #-----------------------------------------------------------------------------4 # 1. Olvassa be a kiadas.txt vagy a kiadas2.txt bemeneti állományt, és tárolja5 # el annak tartalmát a memóriában úgy, hogy azokat a későbbi feladatok6 # megoldása során használni tudja!7 #-----------------------------------------------------------------------------8 def F1(fn):9 konyvek = [] # mátrix: minden könyv, mint lista szerepel majd benne10 # Ne feledjük, hogy UTF-8 kódolásúa forrásállomány (ez itt ékezetes)11 with open('kiadas.txt', 'r', encoding = 'utf-8') as fbe:12 for sor in fbe:13 sor = sor.strip().split(';') # "szeparáló" jel a ; nem a szóköz14 sor[0:2] = map(int, sor[0:2]) # első kettő és utolsó adat integer 15 sor[-1] = int(sor[-1])16 konyvek.append(sor)17 return konyvek18 #-----------------------------------------------------------------------------19 # 2. Kérje be a felhasználótól egy szerző nevét, majd adja meg, hány alkalom-20 # mal adtak ki a szerzőtől művet az adatok szerint! Amennyiben a szerző21 # neve nem szerepel az adatok között, úgy a „Nem adtak ki” szöveget jele-22 # nítse meg!23 #-----------------------------------------------------------------------------24 def F2(konyvek):25 # kihasználjuk, hogy egy szerző más művében semmiképpen sem szerepel26 szerzo = input('Szerző: ')27 konyvkiadas = 0 # számláló28 for konyv in konyvek: # sorban vesszük a mátrixból a listákat (konyv)29 if szerzo in konyv[3]: # in művelet: szerző benne van-e a leírásban (I/H) 30 konyvkiadas += 131 print(f'{konyvkiadas} könyvkiadás')32 #-----------------------------------------------------------------------------33 # 3. Határozza meg és írja ki, hogy mennyi volt a legnagyobb kiadott példány-34 # szám, és ez hány könyv kiadása esetén fordult elő!35 #-----------------------------------------------------------------------------36 def F3(konyvek):37 # rendezéssel oldjuk meg, így könnyebb lesz a "hányszor van ez a maximum"38 # kérdésre válaszolni39 # RENDEZÉS - lambda kifejezés lényege: egy adott könyv utolsó eleme (példányszám)40 # alapján rendez. A mínusz előjel csökkenő rendezést ad, így az első elem a41 # maximális példányszámot tartalmazó könyv lesz...42 rendezett = sorted(konyvek, key = lambda konyv: -konyv[-1])43 mp = rendezett[0][-1] # maximális példányszám: első könyv utolsó adata44 i = 1 # addig haladunk a rendezett mátrixban, amíg maximális példányszám van...45 while rendezett[i][-1] == mp:46 i += 147 print(f'Legnagyobb példányszám: {mp}, előfordult {i} alkalommal')48 #-----------------------------------------------------------------------------49 # 4. Határozza meg, hogy melyik volt az első olyan külföldi szerzőtől származó50 # mű, amely legalább 40 000 példányban jelent meg! Tudjuk, hogy volt ilyen51 # könyv. Írja ki a kiadás évét és negyedévét, valamint a mű leírását a52 # mintának megfelelő formátumban: az évszám után perjel következzen,53 # a negyedév után pont álljon!54 #-----------------------------------------------------------------------------55 def F4(konyvek):56 # tudjuk, hogy volt ilyen könyv... Ez fontos!57 # azt is kihasználjuk, hogy időrendben vannak a könyvek...58 59 # while ciklus: indexet léptetjük a mátrixban, amíg egy megfelelő könyvet60 # nem találunk. A megfelelő könyv feltételrendszere van a NOT után.61 # (külföldi és legalább 40ezer példányszámú)62 i = 063 while not (konyvek[i][2] == 'kf' and konyvek[i][-1] >= 40000):64 i += 165 konyv = konyvek[i]66 print(f'{konyv[0]}/{konyv[1]}. {konyv[3]}')67 #-----------------------------------------------------------------------------68 # 5. Készítsen statisztikát az olyan évekről, amelyekben szerepel, hogy hány69 # alkalommal és összesen mekkora példányszámban adtak ki magyar, illetve70 # külföldi könyvet!71 # a. Az eredményeket a mintához hasonlóan táblázatos formában jelenítse72 # meg a képernyőn: az első sorban a táblázat fejléce, a többi sorban73 # az adatok következzenek, soron belül tabulátorokkal elválasztva,74 # a mintának megfelelően!75 # b. Írja az eredményeket egy tabla.html szöveges állományba, amely egy76 # HTML-táblázatban helyesen tartalmazza a fejlécet és az eredmény-77 # sorokat! A kimeneti állományba csak a táblázat kódját írja a78 # program, más HTML-elemet ne!79 #-----------------------------------------------------------------------------80 def F5(konyvek):81 # Év Magyar kiadás Magyar példányszám Külföldi kiadás Külföldi példányszám82 # 2020 45 834005 29 41600083 evek = [2020, 2021, 2022, 2023] # 4 év van: négyszer ismételjük az adatgyűjtést84 adatok = [] # ebben tárolom az összegyűjtött adatokat85 for ev in evek: # évek listáján haladunk (4 év, ugye...)86 madb, ma = 0, 0 # magyar könyvek darabszáma, és összpéldányszáma87 kfdb, kf = 0, 0 # ugyanaz a külföldi könyvekre88 for konyv in konyvek: # konyvek mátrix bejárása89 if konyv[0] == ev: # megfelelő évben vagyunk...90 if konyv[2] == 'ma': # magyar...91 madb += 192 ma += konyv[-1]93 else: # külföldi adatgyűjtés94 kfdb += 195 kf += konyv[-1]96 adatok.append([ev, madb, ma, kfdb, kf]) # adatok listába kerül az adott év97 # 4 adata98 99 # html100 with open('tabla.html', 'w', encoding = 'utf-8') as fki:101 print('<table>', file = fki)102 print('<tr><th>Év</th><th>Magyar kiadás</th><th>Magyar példányszám</th><th>Külföldi kiadás</th><th>Külföldi példányszám</th></tr>', file = fki)103 print(f'Év\tMagyar kiadás\tMagyar példányszám\tKülföldi kiadás\tKülföldi példányszám')104 for adat in adatok:105 print(f'{adat[0]}\t\t{adat[1]}\t\t{adat[2]}\t\t{adat[3]}\t\t{adat[4]}')106 print(f'<tr><td>{adat[0]}</td><td>{adat[1]}</td><td>{adat[2]}</td><td>{adat[3]}</td><td>{adat[4]}</td></tr>', file = fki)107 print('</table>', file = fki)108 #-----------------------------------------------------------------------------109 # 6. Szeretnénk tudni, hogy melyek voltak azok a könyvek, amelyeket az első 110 # kiadás után még legalább kétszer, az első kiadásnál nagyobb példányszám-111 # ban adtak ki újra. Keresse meg a megfelelő könyveket, és mindegyiket 112 # külön sorban jelenítse meg!113 #-----------------------------------------------------------------------------114 def F6(konyvek):115 print('Legalább kétszer, nagyobb példányszámban újra kiadott könyvek:')116 # a leírásokat egy halmazba gyűjtjük - a többször kiadott könyvek miatt117 leirasok = {konyv[3] for konyv in konyvek} 118 for leiras in leirasok: # végigmegyünk az egyedi leírásokon119 adatok = [] # ebben a listában tároljuk a szükséges adatokat majd120 for konyv in konyvek: # bejárjuk a mátrixot könyvenként121 if konyv[3] == leiras: # ha az adott könyv leírása egyezik a halmaz adott elemével, akkor122 adatok.append([leiras, konyv[0], konyv[-1]]) # adatok tárolása (leírás, év, példányszám)123 # könyvek bájárása után, ha az adott leírás esetén legalább 3 adatgyűjtés volt, akkor124 if len(adatok) >= 3:125 peldanyszam = adatok[0][-1] # időrend van --> első adat az első kiadás --> első példányszám126 eset = 0 # megszámláljuk, hány esetben volt, hogy a következő kiadások példányszáma127 # nagyobb az első példányszámnál128 for adat in adatok: # kigyűjtott adatok bejárása129 if adat[-1] > peldanyszam: # példányszám nagyobb az elsőnél130 eset += 1 # számláló növekszik131 if eset >= 2: # ha minimum 2 eset volt, akkor képernyőre írjuk132 print(leiras) # a leírást133 # és a ciklus folytatódik a következő leírással... lsd. 118. sor134 135 if __name__ == '__main__':136 kiadasok = F1('kiadas.txt')137 f(2)138 F2(kiadasok)139 f(3)140 F3(kiadasok)141 f(4)142 F4(kiadasok)143 f(5)144 F5(kiadasok)145 f(6)146 F6(kiadasok)147 148 149