menetrend202005idny.py
1    menetrend=[]        #mátrix: "táblázatszerűen a fájlban lévő adatok (listák listája)
2    
3    # Az első szám a vonatazonosító, a második az állomásazonosító, a harmadik és 
4    # negyedik egy időpont órája és perce. A karakter pedig azt jelzi, hogy a vonat
5    # az adott állomásra érkezik (E) vagy éppen indul (I) a megadott időben. 
6    
7    #------------------------------------------------------------------------------------------
8    # 1. Olvassa be és tárolja el a vonat.txt fájl tartalmát!
9    #------------------------------------------------------------------------------------------
10   def F1():
11       fbe=open('vonat.txt','r')
12       allomasok=set()
13       vonatok=set()
14       global m2,vegallomas
15       
16       m=[]
17       for sor in fbe:
18           sor=[int(adat) if adat.isdigit() else adat for adat in sor.strip().split('\t')]
19           vonatok.add(sor[0])
20           allomasok.add(sor[1])
21           menetrend.append(sor)
22           # m - egy újabb mátrix, csak ebben az óra és perc helyett percekben van az idő
23           m.append([sor[0],sor[1],sor[2]*60+sor[3],sor[4]])
24       m2=sorted(m) #rendezni kell a 3. feladat miatt - a rendezés a vonatszámok
25                    #alapján történik
26       fbe.close()
27       F2(allomasok, vonatok)
28       vegallomas=max(allomasok)
29   #------------------------------------------------------------------------------------------
30   # 2. Írja a képernyőre a fájlban tárolt vonatok és állomások darabszámát – a kezdő és 
31   #    végállomást is beleértve!
32   #------------------------------------------------------------------------------------------
33   def F2(allomasok, vonatok):
34       print('2. feladat')
35       print('Az állomások száma: %d' %len(allomasok))
36       print('A vonatok száma: %d' %len(vonatok))
37   #------------------------------------------------------------------------------------------
38   # 3. Határozza meg, hogy melyik állomáson állt legtöbbet vonat! Adja meg a vonat és az
39   #    állomás azonosítóját, valamint az állás idejét! Ha több ilyen volt, elég csak az
40   #    egyiket megadnia.
41   #------------------------------------------------------------------------------------------
42   def F3():
43       # Az adatok időrendben szerepelnek, azon belül pedig 
44       # – az induló állomás kivételével – az érkezés mindig megelőzi az indulást
45       print('3. feladat')
46       print(m2)
47       maxido=0
48       for i in range(1,len(m2)-2):
49           if m2[i][0]==m2[i+1][0]:
50               if m2[i+1][2]-m2[i][2]>maxido:
51                   #érkezik-indul egy adott állomás esetén
52                   maxhely=i
53                   maxido=m2[i+1][2]-m2[i][2]
54       vonat=m2[maxhely][0]
55       allomas=m2[maxhely][1]
56       print('A(z) %d. vonat a(z) %d. állomáson %d percet állt.' %(vonat,allomas,maxido))
57   #------------------------------------------------------------------------------------------
58   # 4. Olvassa be egy vonat azonosítóját, valamint egy időpont óra és perc értékét! A későbbi 
59   #    feladatokban használja ezeket!
60   #------------------------------------------------------------------------------------------
61   def F4():
62       print('4. feladat')
63       global vonatszam,idopont,idopont_percben
64       vonatszam=int(input('Adja meg egy vonat azonosítóját! '))
65       idopont=input('Adjon meg egy időpontot (óra perc)! ').strip().split()
66       idopont_percben=int(idopont[0])*60+int(idopont[1])
67   #------------------------------------------------------------------------------------------
68   # 5. Ezen a vonalon az előírt menetidő 2 óra 22 perc. Írja a képernyőre, hogy a beolvasott 
69   #    azonosítójú vonat hány perccel tért el ettől! Például: „A(z) 5. vonat útja 2 perccel
70   #    rövidebb volt az előírtnál.”, „A(z) 5. vonat útja pontosan az előírt ideig tartott.”
71   #    vagy „A(z) 5. vonat útja 3 perccel hosszabb volt az előírtnál.”
72   #------------------------------------------------------------------------------------------
73   def F5():
74       print('5. feladat')
75       # előírt menetidő 2 óra 22 perc
76       eloirt=2*60+22
77       # keressük meg az  adott vonat indulását, a vonatszám biztosan szerepel az adatok között
78       i=0
79       while menetrend[i][0]!=vonatszam:
80           i+=1
81       indulas=menetrend[i][2]*60+menetrend[i][3]
82       # keressük meg az adott vonat végállomásra érkezését
83       i=len(menetrend)-1
84       while menetrend[i][0]!=vonatszam:
85           i-=1
86       erkezes=menetrend[i][2]*60+menetrend[i][3]
87       menetido=erkezes-indulas
88       elter=eloirt-menetido  # <0: hosszabb; >0: rövidebb; ==0: pont oké
89       if elter>0:
90           print(f'A(z) {vonatszam}. vonat útja {elter} perccel rövidebb volt az előírtnál.')
91       elif elter==0:
92           print(f'A(z) {vonatszam}. vonat útja pontosan az előírt ideig tartott.')
93       else:
94           print(f'A(z) {vonatszam}. vonat útja {abs(elter)} perccel hosszabb volt az előírtnál.')
95   #------------------------------------------------------------------------------------------
96   # 6. Írja a haladX.txt fájlba, hogy a beolvasott azonosítójú vonat melyik állomásra mikor 
97   #    érkezett! A fájlnévben az X helyére a beolvasott vonatazonosító kerüljön!
98   #------------------------------------------------------------------------------------------   
99   def F6():
100      fnev='halad'+str(vonatszam)+'.txt'
101      fki=open(fnev,'w')
102      for adat in menetrend:
103          if adat[0]==vonatszam and adat[4]=='E':
104              print(str(adat[1])+'. állomás: '+str(adat[2])+':'+str(adat[3]),file=fki)
105      fki.close()
106  #------------------------------------------------------------------------------------------
107  # 7. Adja meg, hogy a beolvasott időpontban úton lévő, azaz a már elindult, de a
108  #    végállomást még el nem érő vonatok közül melyik hol tartott! A tesztelés során a
109  #    következő időpontokra érdemes figyelni: 6:50, 8:45, 9:05, 10:04, 10:20.
110  #------------------------------------------------------------------------------------------
111  def F7():
112      print('7. feladat')
113      for i in range(0,len(m2)-1):
114          akt=m2[i]
115          kov=m2[i+1]
116          elindult=(i%2==0)
117          if akt[0]==kov[0]:  #ugyanarról a vonatról van szó
118              if akt[2]<=idopont_percben and idopont_percben<kov[2]:
119                  #úton van (illetve éppen elindult) vagy éppen áll
120                  if elindult:
121                      print(f'A(z) {akt[0]}. vonat a(z) {akt[1]}. és a(z) {kov[1]}. állomás között járt.')
122                  else:
123                      print(f'A(z) {akt[0]}. vonat a(z) {akt[1]}. állomáson állt.')
124  
125  #------------------------------F Ő M O D U L-----------------------------------------------    
126  F1()
127  F3()
128  F4()
129  F5()
130  F6()
131  F7()
132