1 class ido:
2 def __init__(self,o,p,mp,t):
3 self.o=o
4 self.p=p
5 self.mp=mp
6 self.t=t # ez az áthaladás ideje
7 self.masodperc=self.o*3600+self.p*60+self.mp+t # minden másodpercben
8 def __str__(self):
9 return f'{self.o}:{self.p}:{self.mp}' # kiírásokhoz jól jöhet, de nem fontos
10
11 #-------------------------------------------------------------------------------------
12 # 1. Olvassa be a forgalom.txt állományban talált adatokat, s azok felhasználásával
13 # oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni, akkor az
14 # első 10 sorának adatait jegyezze be a programba és dolgozzon azzal!
15 #-------------------------------------------------------------------------------------
16 def F1():
17 print('1. feladat ---------------------------------------------------------')
18 print('Adatok beolvasása...')
19 fbe=open('forgalom.txt','r')
20 global jarmuvek_szama # ezt nem fogjuk használni
21 jarmuvek_szama=int(fbe.readline().strip()) # lista elemszámát mindg tudjuk :)
22
23 for sor in fbe: # fájl további sorai
24 sor=sor.strip().split()
25 sor[0:4]=map(int,sor[0:4]) # első 4 adat int típusú lesz
26 forgalom.append(sor)
27
28 #-------------------------------------------------------------------------------------
29 # 2. Írja ki a képernyőre, hogy az n-edikként belépő jármű melyik város felé haladt!
30 # Ehhez kérje be a felhasználótól az n értékét!
31 #-------------------------------------------------------------------------------------
32 def F2():
33 print('\n2. feladat ---------------------------------------------------------')
34 n=int(input('Kérem egy jármű sorszámát: '))
35 # feltételes értékadás
36 varos='A' if forgalom[n-1][-1]=='F' else 'F' # indexek, ugye... :)
37 print(f'Az {n}. jármű {varos} város felé haladt.')
38
39 #-------------------------------------------------------------------------------------
40 # 3. Írja a képernyőre, hogy a Felső város irányába tartó utolsó két jármű hány másod-
41 # perc különbséggel érte el az útszakasz kezdetét!
42 #-------------------------------------------------------------------------------------
43 def F3():
44 print('\n3. feladat ---------------------------------------------------------')
45 utolsoF=[] # utolsó F-be tartó járművekhez kell
46 i=-1 # a forgalom lista végétől visszafelé keressük az A-ból indulókat
47 N=0 # ebben számoljuk, hogy meglegyen a kettő jármű
48 while N<2: # addig keresünk, amíg a kettő össze nem jön (biztos, hogy összejön)
49 if forgalom[i][-1]=='A':
50 utolsoF.append(forgalom[i])
51 N+=1
52 i-=1 # index csökkentése (fontos), hátulról előre haladva
53 u=utolsoF[0] # utolsó adatainak listája
54 ue=utolsoF[1] # utolsóelőtti adatainak listája
55 u_ido=ido(u[0],u[1],u[2],u[3]) # ido objektum (itt használjuk a Class-t)
56 ue_ido=ido(ue[0],ue[1],ue[2],ue[3])
57 kulonbseg=u_ido.masodperc-ue_ido.masodperc
58 print('Felső város irányába tartó utolsó két jármű')
59 print(f'{kulonbseg} mp különbséggel éri el az út kezdetét')
60
61 #-------------------------------------------------------------------------------------
62 # 4. Határozza meg óránként és irányonként, hogy hány jármű érte el a szakaszt! Soron-
63 # ként egy-egy óra adatait írja a képernyőre! Az első érték az órát, a második ér-
64 # ték az Alsó, a harmadik a Felső város felől érkező járművek számát jelentse!
65 # A kiírásban csak azokat az órákat jelenítse meg, amelyekben volt forgalom vala-
66 # mely irányban!
67 #-------------------------------------------------------------------------------------
68 def F4():
69 print('\n4. feladat ---------------------------------------------------------')
70 # https://odorpeter.hu/tippek_trukkok.html#9
71 # itt jön be a fenti linken elérhető lista "anomália" téma...
72 # illetve az alábbi linken elérhető adatok közötti kapcsolatok téma:
73 # https://odorpeter.hu/tippek_trukkok.html#2
74
75 # 1. megoldás
76 orankent=[]
77 for i in range(24):
78 orankent.append([0,0])
79
80 for jarmu in forgalom:
81
82 if jarmu[4]=='A':
83 orankent[jarmu[0]-1][0]+=1
84 else:
85 orankent[jarmu[0]-1][1]+=1
86
87 print('óra\tA-ból\tF-ből') # "fejléc" - csak úgy...
88 for ora in range(24):
89 if orankent[ora][0]+orankent[ora][1]>0:
90 print(f'{ora+1}\t{orankent[ora][0]}\t{orankent[ora][1]}')
91
92 # 2. megoldás
93 orankent=[] # óránkénti adatok listája
94 ora=forgalom[0][0] # az első adatot kiemeljük, annak az óráját
95 db_A=0 # számlálók nullázása
96 db_F=0
97 for jarmu in forgalom:
98 if jarmu[0]==ora: # aktuális óra azonos a kiemelttel
99 if jarmu[4]=='A': # megfelelő számláló növelése
100 db_A+=1
101 else:
102 db_F+=1
103 else:
104 # "óraváltás" van
105 orankent.append([ora,db_A,db_F]) # előző óra összesítése mehet a listánkba
106 ora=jarmu[0] # új kiemelt óra
107 if jarmu[4]=='A': # ezt már számolni kell!!!
108 db_A=1
109 db_F=0
110 else:
111 db_A=0
112 db_F=1
113 orankent.append([ora,db_A,db_F]) # az utolsó órát nem követi "óraváltás".
114 # ezért "manuálisan" helyezzük a listánkba
115 print('óra\tA-ból\tF-ből') # "fejléc" - csak úgy...
116 for ora in orankent:
117 if ora[1]!=0 or ora[2]!=0: # ez az if igazából nem kellene, de így korrekt...
118 print(f'{ora[0]}\t{ora[1]}\t{ora[2]}')
119
120 #-------------------------------------------------------------------------------------
121 # 5. A belépéskor mért értékek alapján határozza meg a 10 leggyorsabb járművet! Írassa
122 # ki a képernyőre ezek belépési idejét, a várost (Alsó, illetve Felső), amely felől
123 # érkezett, és m/s egységben kifejezett sebességét egy tizedes pontossággal, sebes-
124 # ségük szerinti csökkenő sorrendben! Ha több azonos sebességű járművet talál, bár-
125 # melyiket megjelenítheti. Soronként egy jármű adatait jelenítse meg, és az egyes
126 # adatokat szóközzel tagolja! (A feladat megoldásakor figyeljen arra, hogy a követ-
127 # kező feladatban az adatok eredeti sorrendjét még fel kell használni!)
128 #-------------------------------------------------------------------------------------
129 def F5():
130 print('\n5. feladat ---------------------------------------------------------')
131 rendezett=sorted(forgalom,key=lambda x:x[3]) # rendezés az áthaladás ideje szerint
132 for i in range(10): # a rendezés miatt a kiírás már nem gond...
133 jarmu=rendezett[i]
134 ido_obj=ido(jarmu[0],jarmu[2],jarmu[2],jarmu[3]) # itt is Class-t használunk
135 print(ido_obj,end=' ')
136 # a km/h óra csak úgy...
137 print(f'{jarmu[4]} {1000/jarmu[3]:.1f} m/s {1000/jarmu[3]*3.6:.1f} km/h')
138
139 #-------------------------------------------------------------------------------------
140 # 6. Írassa ki az also.txt állományba azokat az időpontokat, amikor az Alsó város felé
141 # tartók elhagyták a kérdéses útszakaszt! Ha egy jármű utolér egy másikat, akkor a
142 # kilépésük időpontja a lassabb kilépési ideje legyen! A fájl minden sorába egy-egy
143 # időpont kerüljön óra perc másodperc formában! A számokat pontosan egy szóköz
144 # válassza el egymástól!
145 #-------------------------------------------------------------------------------------
146 def F6():
147 print('\n6. feladat ---------------------------------------------------------')
148 print('Adatok kiírása...')
149 fki=open('also.txt','w')
150 elozo=0 # ha esetleg utóléri(k) az adott járművet a következő(k)...
151 for jarmu in forgalom:
152 if jarmu[4]=='F': # A-ba tart
153 ido_obj=ido(jarmu[0],jarmu[1],jarmu[2],jarmu[3])
154 # mikor lépne ki a jármű a szakaszról...
155 kilep=max(elozo,ido_obj.masodperc) # utoléri-e vagy nem az előzőt
156 o=kilep//3600 # óra perc mp váltások
157 p=kilep%3600//60
158 mp=kilep%3600%60
159 print(o,p,mp,file=fki)
160 elozo=kilep # ez fontos, ugye...
161 fki.close()
162 #------------------------------- F Ő M O D U L -------------------------------
163 forgalom=[]
164 F1()
165 F2()
166 F3()
167 F4()
168 F5()
169 F6()
170