belepteto.py
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