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