konyvek_202505_emelt.py
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árolja
5    #    el annak tartalmát a memóriában úgy, hogy azokat a későbbi feladatok
6    #    megoldása során használni tudja!
7    #-----------------------------------------------------------------------------
8    def F1(fn):
9        konyvek = []    # mátrix: minden könyv, mint lista szerepel majd benne
10       # 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öz
14               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 konyvek
18   #-----------------------------------------------------------------------------
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 szerepel
26       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 += 1
31       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álaszolni
39       # 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 a
41       # 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ó adata
44       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 += 1
47       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 ilyen
51   #    könyv. Írja ki a kiadás évét és negyedévét, valamint a mű leírását a
52   #    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önyvet
60       # 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 = 0
63       while  not (konyvek[i][2] == 'kf' and konyvek[i][-1] >= 40000):
64           i += 1
65       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ány
69   #    alkalommal és összesen mekkora példányszámban adtak ki magyar, illetve
70   #    külföldi könyvet!
71   #       a. Az eredményeket a mintához hasonlóan táblázatos formában jelenítse
72   #          meg a képernyőn: az első sorban a táblázat fejléce, a többi sorban
73   #          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 egy
76   #          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 a
78   #          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ám
82       # 2020  45              834005              29              416000
83       evek = [2020, 2021, 2022, 2023]   # 4 év van: négyszer ismételjük az adatgyűjtést
84       adatok = []                       # ebben tárolom az összegyűjtött adatokat
85       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áma
87           kfdb, kf = 0, 0               # ugyanaz a külföldi könyvekre
88           for konyv in konyvek:         # konyvek mátrix bejárása
89               if konyv[0] == ev:        # megfelelő évben vagyunk...
90                   if konyv[2] == 'ma':  # magyar...
91                       madb += 1
92                       ma += konyv[-1]
93                   else:                 # külföldi adatgyűjtés
94                       kfdb += 1
95                       kf += konyv[-1]
96           adatok.append([ev, madb, ma, kfdb, kf])     # adatok listába kerül az adott év
97                                                       # 4 adata
98   
99       # html
100      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 miatt
117      leirasok = {konyv[3] for konyv in konyvek}  
118      for leiras in leirasok:     # végigmegyünk az egyedi leírásokon
119          adatok = []             # ebben a listában tároljuk a szükséges adatokat majd
120          for konyv in konyvek:   # bejárjuk a mátrixot könyvenként
121              if konyv[3] == leiras:  # ha az adott könyv leírása egyezik a halmaz adott elemével, akkor
122                  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, akkor
124          if len(adatok) >= 3:
125              peldanyszam = adatok[0][-1]     # időrend van --> első adat az első kiadás --> első példányszám
126              eset = 0        # megszámláljuk, hány esetben volt, hogy a következő kiadások példányszáma
127                              # nagyobb az első példányszámnál
128              for adat in adatok:     # kigyűjtott adatok bejárása
129                  if adat[-1] > peldanyszam:      # példányszám nagyobb az elsőnél
130                      eset += 1                   # számláló növekszik
131              if eset >= 2:                       # ha minimum 2 eset volt, akkor képernyőre írjuk
132                  print(leiras)                   # a leírást
133      # és a ciklus folytatódik a következő leírással... lsd. 118. sor
134  
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