1 adatok = [] # mátrix: listák listája a forrásfájl alapján
2
3 # -----------------------------------------------------------------------------------------------
4 # 1. Olvassa be a bedat.txt állomány tartalmát, tárolja el az abban szereplő adatokat, és annak
5 # felhasználásával oldja meg a következő feladatokat! Feltételezheti, hogy az állomány
6 # legfeljebb 2000 adatsort tartalmaz.
7 # -----------------------------------------------------------------------------------------------
8 fbe = open('bedat.txt','r')
9 for sor in fbe:
10 sor = sor.strip().split()
11 adatok.append(sor)
12 fbe.close()
13 # -----------------------------------------------------------------------------------------------
14 # 2. Határozza meg, hogy mikor lépett be az épületbe az első tanuló, és mikor távozott az utolsó!
15 # Az időpontokat a mintához hasonlóan jelenítse meg a képernyőn!
16 # IDÉZET A FELADATLEÍRÁSBÓL:
17 # "A fájlban az első esemény egy belépés, az utolsó egy kilépés a főkapun."
18 # -----------------------------------------------------------------------------------------------
19 print('2. feladat')
20 print(f'Az első tanuló {adatok[0][1]}-kor lépett be a főkapun.')
21 print(f'Az utolsó tanuló {adatok[-1][1]}-kor lépett ki a főkapun.')
22 # -----------------------------------------------------------------------------------------------
23 # 3. Készítsen listát a kesok.txt nevű állományba, amely megadja, hogy mely tanulók léptek
24 # be a nagykapun 07:50 után, de legkésőbb 08:15-kor! A fájlban a belépések a mintának
25 # megfelelően külön sorban szerepeljenek, az időpontot egy szóköz válassza el a tanuló
26 # azonosítójától! Ha egy tanuló ezalatt többször is belépett, minden belépése jelenjen meg a
27 # fájlban!
28 # -----------------------------------------------------------------------------------------------
29 start = '07:50' # az óó:pp formátum miatt szövegesen is relációba hozhatók az adatok
30 vege = '08:15' # pl. '07:51' < '07:53'
31 fki = open('kesok.txt','w')
32 for adat in adatok:
33 if adat[2] == '1' (adat[1] > start and adat[1] <= vege):
34 print(f'{adat[1]} {adat[0]}', file = fki)
35 fki.close()
36 # -----------------------------------------------------------------------------------------------
37 # 4. Határozza meg, hány tanuló ebédelt aznap a menzán! Írassa ki az eredményt a képernyőre
38 # a mintának megfelelően!
39 # IDÉZET A FELADATLEÍRÁSBÓL:
40 # "...a menzán legfeljebb egyszer ebédelhetnek..."
41 # -----------------------------------------------------------------------------------------------
42 print('4. feladat')
43 # ebéd esemény kódja: '3'
44 ebedelok=0
45 for adat in adatok:
46 if adat[2] == '3':
47 ebedelok += 1
48 print(f'A menzán aznap {ebedelok} tanuló ebédelt.')
49 # -----------------------------------------------------------------------------------------------
50 # 5. Szeretnénk tudni, hogy a könyvtári kölcsönzés vagy a menza a népszerűbb-e ezen a napon.
51 # 1. Határozza meg, hány tanuló kölcsönzött aznap a könyvtárban! Ha egy tanuló
52 # többször is kölcsönzött, akkor azt csak egyszer vegye figyelembe! Írassa ki az
53 # eredményt a képernyőre a mintának megfelelően!
54 # 2. A könyvtárosok szerint több tanuló kölcsönöz egy nap a könyvtárban, mint
55 # ahányan a menzán ebédelnek. Így volt-e ez ezen a napon is? A választ („Többen
56 # voltak, mint a menzán.” vagy „Nem voltak többen, mint a menzán.”) a mintának
57 # megfelelő formában írassa ki a képernyőre!
58 # -----------------------------------------------------------------------------------------------
59 print('5. feladat')
60 konyvtar = set() # halmaz, mert lehet valaki többször is kölcsönzött...
61 for adat in adatok:
62 if adat[2] == '4': # '4': kölcsönzés...
63 konyvtar.add(adat[0]) # a diák kódját tesszük a halmazba, ismétlés így kizárva
64 print(f'Aznap {len(konyvtar)} tanuló kölcsönzött a könyvtárban.')
65 menza = [] # itt lehet lista is, de lehet halmaz is, lsd. 4. feladat idézetét
66 for adat in adatok:
67 if adat[2] == '3': # '3': menza...
68 menza.append(adat[0]) # a diák kódját tesszük a listába
69 if len(konyvtar) > len(menza):
70 print('Többen voltak, mint a menzán.')
71 else:
72 print('Nem voltak többen, mint a menzán.')
73 # -----------------------------------------------------------------------------------------------
74 # 6. A portás reggel elfelejtette a hátsó kaput bezárni, ezért a 10:45-kor kezdődő szünetben
75 # néhány tanuló kiment a hátsó kijáraton át a szemközti pékségbe tízórait venni. A portás csak
76 # 10:50-kor zárta be a hátsó kaput, így 10:50 után a korábban a hátsó kapun át távozott
77 # tanulóknak a főbejáraton át kellett visszajönniük. Írassa ki a képernyőre egy-egy szóközzel
78 # elválasztva ezeknek a tanulóknak az azonosítóját! (A szünet 11:00-ig tartott, és
79 # feltételezheti, hogy azt megelőzően valamennyi érintett tanuló visszaért.) Vegye
80 # figyelembe, hogy a tanulók egy része aznap csak 11:00-ra jött iskolába, illetve szabályosan
81 # lépett ki!
82 # -----------------------------------------------------------------------------------------------
83 # Fordítsuk le a feladatot: Olyan diákokat keresünk, akiknek a "normál"
84 # ... BE - KI - BE ... sorozatuk helyett
85 # ... BE - BE sorozatuk van,
86 # és a "második" vagy "többlet" BE a kérdéses időintervallumra esik...
87 # -----------------------------------------------------------------------------------------------
88 print('6. feladat')
89 print('Az érintett tanulók:')
90 diakok = set()
91 for adat in adatok:
92 diakok.add(adat[0])
93
94 for diak in diakok:
95 tmp=[]
96 for adat in sorted(adatok):
97 # egy adott diák be- vagy kilépés esetén a tmp listába kerül
98 if adat[0] == diak and (adat[2] == '1' or adat[2] == '2'):
99 tmp.append(adat[2])
100 be = tmp.count('1')
101 ki = tmp.count('2')
102 if be > ki:
103 print(diak,end=' ')
104 print()
105 # Úgy tűnik, hogy nincs szükség az időpontok vizsgálatára! (Minta alapján, jó a fenti megoldás!)
106 # A többi diák "szabályosan" közlekedik a főkapun keresztül, lehetőség a szabályok "kijátszására"
107 # csak a megadott időpontig (10:50) lehetett. De ha feltételezzük, hogy volt olyan diák, aki
108 # 10:45 előtt (tehát nem a szünetben) már a hátsó kapun ment ki, és még a szünet előtt bejött a
109 # főkapun, akkor a fenti megoldás őt is beleveszi a "szabálytalankodó" diákok közé!
110 # Egészítsük ki a megoldást az időpontok vizsgálatával: 10:50 < BE < 11:00 legyen!
111 # (A probléma az, hogy a szabálytalan kilépést nem rögzítik, így csak a bejövetel vizsgálható!)
112 print('Az érintett tanulók:')
113 start = '10:50' # hátsó kapu zárása
114 vege = '11:00' # szünet vége
115 # szünet vége: "feltételezheti, hogy azt megelőzően valamennyi érintett tanuló visszaért."
116
117 # diakok = set()
118 # for adat in adatok:
119 # diakok.add(adat[0])
120
121 for diak in diakok:
122 tmp=[]
123 szabalytalan = False
124 for adat in sorted(adatok):
125 # egy adott diák be- vagy kilépés esetén a tmp listába kerül
126 if adat[0] == diak and (adat[2] == '1' or adat[2] == '2'):
127 tmp.append(adat[2])
128 if adat[2] == '1' and (adat[1] > start and adat[1] < vege): # Itt az idővizsgálat!
129 # van egy belépése a kérdéses időben...
130 szabalytalan = True # tehát feltételezhetően a szünetben ment ki
131 # bár persze akármikor kimehetett...
132 be = tmp.count('1')
133 ki = tmp.count('2')
134 if be > ki and szabalytalan: # több be volt, és a kérdéses időben volt egy belépése
135 print(diak,end=' ')
136 print()
137 # -----------------------------------------------------------------------------------------------
138 # 7. Kérje be egy tanuló azonosítóját, és írassa ki a minta szerinti formátumban, hogy mennyi
139 # idő telt el az iskolába való első belépése és utolsó távozása között! Feltételezheti, hogy
140 # 19:00-ig minden tanuló elhagyta az iskolát. Ha aznap az adott azonosítójú tanuló nem járt
141 # az iskolában, akkor írassa ki az Ilyen azonosítójú tanuló aznap nem volt az
142 # iskolában. üzenetet!
143 # -----------------------------------------------------------------------------------------------
144 def ido(k, v): # érdemes egy külön függvényben megoldani az időszámítást...
145 k_ora = int(k[0:2])
146 v_ora = int(v[0:2])
147 k_perc = int(k[3:5])
148 v_perc = int(v[3:5])
149 ora = ((v_ora * 60 + v_perc) - (k_ora * 60 + k_perc)) // 60
150 perc = ((v_ora * 60 + v_perc) - (k_ora * 60 + k_perc)) % 60
151 return (ora, perc) # egy tuple-t ad vissza
152
153 print('7. feladat')
154 diak=input('Egy tanuló azonosítója = ')
155 van = False # feltesszük, hogy nem találjuk meg
156 # diák keresése a mátrix elejétől kezdve ---> első előfordulása a belépés lesz
157 i=0
158 while i < len(adatok) and adatok[i][0]!=diak:
159 i += 1
160 if i < len(adatok):
161 # van találat
162 van = True
163 be = adatok[i][1]
164
165 # diák keresése a mátrix végétől visszafelé ---> első találat csak a kilépése lehet
166 i=len(adatok)-1
167 while i >=0 and adatok[i][0]!=diak:
168 i -= 1
169 if van: # jó lenne az if i >= 0: is
170 ki = adatok[i][1]
171 oraperc = ido(be, ki)
172 print(f'A tanuló érkezése és távozása között {oraperc[0]} óra {oraperc[1]} perc telt el.')
173 else:
174 print('Ilyen azonosítójú tanuló aznap nem volt az iskolában.')
175
176