1
2 # -----------------------------------------------------------------------------------------------
3 # 1. A konyv.txt szöveges állomány egy könyvet ábrázoló ASCII-ábrát tartalmaz. Olvassa be
4 # ezt az állományt, és jelenítse meg a tartalmát a képernyőn!
5 # -----------------------------------------------------------------------------------------------
6 def beolvas(fajl):
7 abra = []
8 with open(fajl, 'r') as fbe:
9 for sor in fbe: # a fájl minden sorát szövegként (enterek nélkül) olvassuk be
10 sor = sor.strip('\n')
11 abra.append(sor) # ezekkel a szöveggel töltjuk fel a listánkat (ábra)
12 return abra
13 # -----------------------------------------------------------------------------------------------
14 # 2. Jelenítse meg többször egymás mellett a konyv.txt állományban található ábrát! Kérje be
15 # a felhasználótól az ábra ismétlődéseinek számát! Az ábrák után elválasztásként a „ | ”
16 # karakterláncot jelenítse meg! Ügyeljen arra, hogy az egyes sorok különböző hosszúságúak
17 # is lehetnek. Azt nem kell ellenőriznie, hogy az ábra az adott ismétlésszámmal valóban elfére
18 # egymás mellett a képernyőn.
19 # -----------------------------------------------------------------------------------------------
20 def kiir(abra, ism, fajl): # kiiras paraméterezése: lista, ismétlésszám, fájlba is kell-e írni?
21 if fajl != '':
22 fki = open(fajl, 'w')
23 if ism == 1:
24 ende = ''
25 else:
26 ende = ' | ' # ha van ismétlés, akkor ez az "elválasztó" karaktersorozat
27 # max fv. megadja azt a szöveget, ami a leghosszabb, lambda kifejezéssel szabályozzuk, hogy
28 # mit vizsgáljon maximumkereséskor - itt most a szövegek hosszát (len)
29 # len fv. a végén --> a leghosszabb szöveg karakterszáma (hossza)
30 maxhossz = len(max(abra, key = lambda x: len(x)))
31 for sor in abra:
32 for i in range(ism):
33 # ljust() fv. szóközökkel tölti fel a szöveget, úgy hogy a szöveg balra kerül, a szóközök jobbra
34 sor = sor.ljust(maxhossz) # ez azért kell, hogy a ' | ' jó helyre kerüljön a képernyőn
35 print(sor, end = ende)
36 if fajl != '':
37 print(sor, end = ende, file = fki)
38 print() # minden sor után soremelés kell
39 if fajl != '':
40 print(file = fki)
41 if fajl != '':
42 fki.close()
43 # -----------------------------------------------------------------------------------------------
44 # 3. Készítsen függvényt atalakit néven, amely egy tömörített ábra egy sorát tömörítetlen
45 # formára alakítja! (Egy tömörített sor legfeljebb 200 karakterből állhat.)
46 # -----------------------------------------------------------------------------------------------
47 def atalakit(blokkok):
48 tomoritetlen = '' # egy szöveget építünk fel
49 for i in range(len(blokkok)):
50 if i % 2 == 0: # a blokkok szöveget indexeljük, páros indexen vannak a számok
51 x = int(blokkok[i]) # x db jelet kell majd ismételni
52 else:
53 # blokkok[i] karakter ismétlése x-szer
54 tomoritetlen += blokkok[i] * x # így a legegyszerűbb Pythonban a megfelelő ismétlés
55 return tomoritetlen
56 # -----------------------------------------------------------------------------------------------
57 # 4. Az szg_t.txt állomány tömörített formában tartalmaz egy rajzot. Alakítsa a tömörített
58 # ábrát tömörítetlen formába az atalakit függvény használatával, és szg.txt néven mentse el az
59 # eredményt, valamint jelenítse meg azt a képernyőn!
60 # -----------------------------------------------------------------------------------------------
61 def szg(fajlin, fajlout):
62 print('4. feladat')
63 forras = beolvas(fajlin) # beolvas modul itt is felhasználható
64 abra = [] # abra uj lista
65 for sor in forras:
66 abra.append(atalakit(sor)) # tömörített "szövegsorok" átalakítása az atalakit modullal
67 kiir(abra, 1, fajlout) # "általánosított" kiir modul fájlba írással
68 # -----------------------------------------------------------------------------------------------
69 # 5. Izgalmas kérdés, hogy egy-egy ábrát milyen mértékben sikerült tömöríteni a fenti
70 # módszerrel. Kérje be a felhasználótól a tömörített, valamint tömörítetlen adatokat
71 # tartalmazó fájl neveit majd írja ki, hogy az egyes állományok hány karaktert tartalmaznak!
72 # A sorvégjel karaktereket (\r\n) ne vegye figyelembe! A következő sorban jelenítse meg
73 # a tömörítési arányt két tizedesjegyre kerekítve! A tömörítési arány a tömörített ábra
74 # karakterszáma osztva a tömörítetlen ábra karaktereinek számával.
75 # -----------------------------------------------------------------------------------------------
76 def tomorites_vizsgalat():
77 print('5. feladat')
78 # szöveges fájlok esetén a read() művelet a teljes fájltartalmat egy szövegbe olvassa be
79 t1 = open(input('Kérem adja meg a tömörített ábra fájlnevét: '), 'r').read() # konyv_t.txt
80 t2 = open(input('Kérem adja meg a tömörítetlen ábra fájlnevét: '), 'r').read() # konyv.txt
81 t1_hossz = len(t1) - t1.count('\n') # szöveg esetén is használhatjuk a count metódust
82 t2_hossz = len(t2) - t2.count('\n') # az enterek megszámlálására
83 print(f'A karakterek száma a tömörített állományban: {t1_hossz}') # enterek nélküli szöveghosszak
84 print(f'A karakterek száma a tömörítetlen állományban: {t2_hossz}')
85 print(f'A tömörítési arány: {t1_hossz/t2_hossz:.2f}') # valós szám, két tizedesjeggyel
86 # -----------------------------------------------------------------------------------------------
87 # 6. Készítsen statisztikát a konyv_t.txt állományban található ábráról! A képernyőn jelenjen
88 # meg, hogy az ábra hány sorból áll, hány blokkot tartalmaz, valamint hogy mekkora az ábra
89 # szélessége karakterekben. Utóbbi adat a leghosszabb sor karakterszámát jelenti.
90 # -----------------------------------------------------------------------------------------------
91 def statisztika(fajl):
92 print('6. feladat')
93 abra = beolvas(fajl) # ez az előnye a modulok használatának
94 print(f'Az ábra magassága sorokban: {len(abra)}')
95 hosszak = [] # az egyes sorok milyen hosszúak lesznek, azt tároljuk...
96 blokkok = 0 # hány blokk van összesen a tömörített dormulában...
97 for sor in abra: # abra lista szövegeinek bejárása
98 hossz = 0 # egy aktuális sor hány karakteres lesz a blokkok alapján
99 for i in range(len(sor)):
100 if i % 2 == 0: # páros indexeken vannak a számok (lsd. 3. feladat is)
101 hossz += int(sor[i]) # hossz "akkumulálása"
102 blokkok += 1 # blokkok számolása
103 hosszak.append(hossz) # hosszak lista bővítése
104 maxhossz = max(hosszak)
105 print(f'Az ábra szélessége karakterekben: {maxhossz}') # a válasz a leghosszabb érték
106 print(f'A blokkok száma: {blokkok}')
107 # -----------------------------------------------------------------------------------------------
108 # FŐMODUL
109 # -----------------------------------------------------------------------------------------------
110 if __name__ == '__main__':
111 print('1. feladat')
112 konyv = beolvas('konyv.txt')
113 kiir(konyv, 1, '')
114 print('2. feladat')
115 ism = int(input('Kérem adja meg az ismétlések számát: '))
116 kiir(konyv, ism, '')
117 szg('szg_t.txt', 'szg.txt')
118 tomorites_vizsgalat()
119 statisztika('konyv_t.txt')