autok202410_em_DK_SZOTAR.py
1    # ----------------------------------------------------------------------------------------------
2    # 2024.10.22 emelt szintű digitális kultúra érettségi programozási feladat
3    # ----------------------------------------------------------------------------------------------
4    autok = dict()          # az adatokat tároló szótár: KULCS a rendszám, ÉRTÉKEK a további adatok 
5    kulcsok = list()        # segédlista, melyben az egyedi rendszámokat tároljuk
6    # ----------------------------------------------------------------------------------------------
7    # 1. Olvassa be és tárolja el a további feldolgozáshoz a jeladas.txt állomány tartalmát!
8    # ----------------------------------------------------------------------------------------------
9    fbe = open('jeladas.txt','r')
10   for sor in fbe:
11       adatsor = sor.strip().split('\t')       # lista a négy adattal (rendszám, óra, perc, sebesség)
12       kulcs = adatsor[0]                      # tehát a kulcs a beolvasott adatsor legelső eleme
13       ertek = list(map(int, adatsor[1:]))     # kulcshoz tartozó értékek 3 elemű listák lesznek
14       if kulcs not in kulcsok:                # ha ez a kulcs még nem volt, akkor
15           kulcsok.append(kulcs)               # kulcsokhoz hozzáadjuk
16           autok[kulcs] = [ertek]              # szótárbejegyzés a kulcshoz (mátrix "elkezdése")
17       else:    
18           autok[kulcs].append(ertek)          # ha már volt ilyen kulcs, akkor a bejegyzésének bővítése
19   fbe.close()
20   # ----------------------------------------------------------------------------------------------
21   # 2. Állapítsa meg, hogy milyen időpontban történt a legutolsó jeladás, és írja a képernyőre
22   #    az időpontot, valamint az utoljára jelet adó autó rendszámát!
23   # ----------------------------------------------------------------------------------------------
24   print('2. feladat:')
25   utolso_adat = adatsor    # itt van egy kis "csalás", az előző for ciklus utolsó adatával dolgozunk :)
26   ora = utolso_adat[1]
27   perc = utolso_adat[2]
28   rendszam = utolso_adat[0]
29   print(f'Az utolsó jeladás időpontja {ora}:{perc}, a jármű rendszáma {rendszam}')
30   # ----------------------------------------------------------------------------------------------
31   # 3. Írja ki a bemeneti állományban elsőként szereplő jármű rendszámát, valamint azt, hogy
32   #    milyen időpontokban adott jelzést! Az időpontokat óra:perc formátumban, szóközzel
33   #    elválasztva, egy sorban jelenítse meg!
34   # ----------------------------------------------------------------------------------------------
35   print('3. feladat:')
36   elso_rendszama = kulcsok[0]         # itt használjuk a segédlistát, mert abban a forrással 
37                                       # megegyező sorrendben vannak a rendszámok
38   print(f'Az első jármű: {elso_rendszama}')
39   print('Jeladásainak időpontjai:', end = ' ')
40   [print(f'{adatok[0]}:{adatok[1]}',end = ' ') for adatok in autok[elso_rendszama]]   
41   print()
42   # ----------------------------------------------------------------------------------------------
43   # 4. Kérje be a felhasználótól egy időpont óra és perc értékét, és adja meg, hogy hány jeladás
44   #    történt az adott időpontban! Ha nem történt jeladás, akkor 0-t írjon ki!
45   # ----------------------------------------------------------------------------------------------
46   print('4. feladat:')
47   ora = int(input('Kérem, adja meg az órát: '))           # 6
48   perc = int(input('Kérem, adja meg a percet: '))         # 54
49   jeladasok_szama = 0
50   for ertekek in autok.values():          # a szótár egy bejegyzése egy lista, melyben
51       for ertek in ertekek:               # 3 elemű listák vannak, ezen a három elemen is végig megyünk
52           if ertek[0] == ora and ertek[1] == perc:
53               jeladasok_szama +=1
54   print(f'A jeladások száma: {jeladasok_szama}')
55   # ----------------------------------------------------------------------------------------------
56   # 5. Állapítsa meg, hogy mennyi az adatok szerint a legnagyobb sebesség, amellyel egy jármű
57   #    a jeladáskor haladt, illetve adja meg az összes autó rendszámát, ami haladt ilyen
58   #    sebességgel! Amennyiben egy jármű többször is haladt a legnagyobb sebességgel, akkor a 
59   #    rendszámát többször is megjelenítheti. A rendszámokat egy sorban, szóközzel elválasztva 
60   #    jelenítse meg a minta szerint!
61   # ----------------------------------------------------------------------------------------------
62   print('5. feladat:')
63   max_sebesseg = max((max(ertekek, key=lambda x: x[2])[2] for ertekek in autok.values()))
64   rendszamok_hozza = [kulcs for kulcs, ertekek in autok.items() if any(elem[2] == max_sebesseg for elem in ertekek)]
65   print(f'A legnagyobb sebesség km/h: {max_sebesseg}')        # 154
66   print('A járművek:', end = ' ')
67   [print(rendszam, end = ' ') for rendszam in rendszamok_hozza]   
68   print()
69   # ---------------------------
70   # FENTIEK "KIBONTVA:"
71   # ---------------------------
72   maxok=[]
73   for ertekek in autok.values():                              # szótárbejegyzések bejárása
74       maxi = max(ertekek, key = lambda ertek:ertek[2])        # maxi: egy olyan 3 elemű lista a bejegyzésből, amelyben
75       maxok.append(maxi)                                      # a 3. elem (2-es index) a legnagyobb, és ezeket "gyűjtöm"
76   
77   max_sebesseg = max(maxok, key = lambda ertek:ertek[2])      # a kigyűjtött "kis" listákból kivesszük a legnagyobb 
78                                                               # 3. elemmel rendelkezőt
79   max_sebesseg = max_sebesseg[2]                              # a kiválasztottból pedig a konkrét maximális értéket a 3. helyről
80   
81   rendszamok_hozza = []                                       # kik tartoznak a maximális sebességhez, keressük a kulcsokat
82   for kulcs, ertekek in autok.items():
83       for elem in ertekek:
84           if elem[2] == max_sebesseg:
85               rendszamok_hozza.append(kulcs)
86   print(f'A legnagyobb sebesség km/h: {max_sebesseg}')        # 154
87   print('A járművek:', end = ' ')
88   [print(rendszam, end = ' ') for rendszam in rendszamok_hozza]   
89   print()
90   # ----------------------------------------------------------------------------------------------
91   # 6. Kérje be a felhasználótól egy jármű rendszámát, és jelenítse meg a jármű jeladásainak
92   #    időpontját és az adott rendszámú autó távolságát az útszakasz kezdetétől! A bevezető
93   #    példában az első jármű esetén a 6:04-kor a jármű távolsága az útszakasz kezdetétől 0,0 km,
94   #    míg 6:14-kor 15,8 km, mivel a jármű az eltelt 10 perc (10/60 óra) alatt 95 km/h-val haladt.
95   #    A kimenetet a mintának megfelelőn alakítsa ki, a távolságot minden esetben egy
96   #    tizedesjegyre kerekítve írja ki km mértékegységben! Ha nem szerepel a bekért rendszámmal
97   #    jármű, akkor azt egy rövid mondatban jelezze a felhasználónak!
98   # ----------------------------------------------------------------------------------------------
99   def eltelt_ido(elozo, aktualis):
100      return (aktualis[0] * 60 + aktualis[1]) - (elozo[0] * 60 + elozo[1])
101  
102  print('6. feladat:')
103  rendszam = input('Kérem, adja meg a rendszámot: ')          # ZVJ-638
104  if rendszam not in kulcsok:         # megint a segédlista, ugye :)
105      print('Nincs ilyen rendszám!')
106  else:
107      auto = autok[rendszam]          # adott kulcshoz tartozó adatlista az "auto"
108      tavolsag = 0.0
109      print(f'{auto[0][0]}:{auto[0][1]} {tavolsag:.1f} km')
110      for i in range(1,len(auto)):            # legelső 3 elemű listát kihagyjuk (azt már feldolgoztuk)
111          ido = eltelt_ido(auto[i-1],auto[i]) # i-1. az előző, i. az aktuális "kis" lista
112          tavolsag += auto[i-1][2] * (ido / 60)     # s = v * t, az előző sebességgel (i-1) jön eddig
113          print(f'{auto[i][0]}:{auto[i][1]} {tavolsag:.1f} km')   # adott időpontban eddig jutott
114  # ----------------------------------------------------------------------------------------------
115  # 7. Készítsen egy ido.txt szöveges állományt, amelynek mindegyik sorában egy-egy jármű 
116  # rendszáma, illetve első és utolsó jeladásának óra és perc értéke szerepeljen! 
117  # Az állományban minden jármű pontosan egyszer forduljon elő tetszőleges sorrendben!
118  # ----------------------------------------------------------------------------------------------
119  fki = open('ido.txt','w')
120  for kulcs, ertekek in autok.items():
121      print(f'{kulcs} {ertekek[0][0]} {ertekek[0][1]} {ertekek[-1][0]} {ertekek[-1][1]}', file = fki)
122  fki.close()
123  
124  
125  
126  
127  
128  
129  
130  
131  
132  
133  
134  
135  
136  
137  
138  
139  
140  
141