jelado202210.py
1    from math import sqrt as negyzetgyok    # 6. feladathoz kell
2    
3    #---------------------------------------------------------
4    # 1. Olvassa be a jel.txt állomány tartalmát, tárolja el a
5    #    rögzített jelek adatait, és azok felhasználásával 
6    #    oldja meg a következő feladatokat!    
7    #---------------------------------------------------------
8    jelek=[]    # ez lesz a "mátrix", globális adat
9    
10   def F1():   # első feladat modulja
11       
12       fbe=open('jel.txt','r')
13       for sor in fbe:     # fájl sorainak ciklikus feldolgozás
14           sor=sor.strip().split()  # pl. sor: ['3', '11', '19', '122', '644']
15           for i in range(len(sor)):   # sor elemeinek integerekké alakítása
16               sor[i]=int(sor[i])
17           jelek.append(sor)       # mátrix feltöltése a "kis" listákkal
18       fbe.close()
19       
20       # a fenti 7 sor röviden így is lehetne:
21       global jelek2
22       jelek2=[list(map(int,sor.strip().split())) for sor in open('jel.txt','r')]
23       # így a további feladatokat a jelek2-vel kell elképzelni...
24   
25   #---------------------------------------------------------
26   # 2. Kérje be a felhasználótól egy jel sorszámát
27   #    (a sorszámozás 1-től indul), és írja a képernyőre
28   #    az adott jeladáshoz tartozó x és y koordinátát!
29   #---------------------------------------------------------
30   def F2():
31       print('2. feladat')
32       sorszam=int(input('Adja meg a jel sorszámát! '))
33       x=jelek[sorszam-1][3]       # -1 az index és sorszám különbsége miatt
34       y=jelek[sorszam-1][4]
35       print(f'x={x} y={y}\n')     # \n, hogy legyen egy plusz soremelés
36   
37   #---------------------------------------------------------    
38   # 3. Készítsen függvényt eltelt néven, amely megadja, hogy
39   #    a paraméterként átadott két időpont között hány
40   #    másodperc telik el! A két időpontot, mint paramétert
41   #    tetszőleges módon átadhatja. Használhat három-három
42   #    számértéket, két tömböt vagy listát, de más, a célnak
43   #    megfelelő típusú változót is. Ezt a függvényt később
44   #    használja fel legalább egy feladat megoldása során!
45   #---------------------------------------------------------
46   def eltelt(o1,p1,m1,o2,p2,m2):
47       eltelt_mp=(o2*3600+p2*60+m2)-(o1*3600+p1*60+m1)
48       return eltelt_mp
49   
50   #---------------------------------------------------------
51   # 4. Adja meg, mennyi idő telt el az első és az utolsó
52   #    észlelés között! Az időt óra:perc:mperc alakban írja
53   #    a képernyőre!
54   #---------------------------------------------------------
55   def F4():
56       print('4. feladat')
57       elso=jelek[0]
58       e_o = elso[0]
59       e_p = elso[1]
60       e_mp= elso[2]
61       
62       utolso=jelek[-1]
63       u_o = utolso[0]
64       u_p = utolso[1]
65       u_mp= utolso[2]
66       eltelt_ido=eltelt(e_o,e_p,e_mp,u_o,u_p,u_mp)
67       
68       # másodpercben adott idő óra:perc:másodperc alakra bontása:
69       ora=eltelt_ido//3600        # // osztás egész részét adja
70       perc=(eltelt_ido%3600)//60  # % osztás maradékát adja
71       masodperc=(eltelt_ido%3600)%60
72       print(f'Időtartam: {ora}:{perc}:{masodperc}\n')
73   
74   #---------------------------------------------------------
75   # 5. Határozza meg azt a legkisebb, a koordináta-rendszer
76   #    tengelyeivel párhuzamos oldalú téglalapot, amelyből
77   #    nem lépett ki a jeladó! Adja meg a téglalap bal alsó
78   #    és jobb felső sarkának koordinátáit!
79   #---------------------------------------------------------
80   def F5():
81       print('5. feladat')
82       x_koord=[jel[3] for jel in jelek]
83       y_koord=[jel[4] for jel in jelek]
84   
85       bal_also_x=min(x_koord)
86       bal_also_y=min(y_koord)
87       jobb_felso_x=max(x_koord)
88       jobb_felso_y=max(y_koord)
89   
90       # a \ csak azért, hogy itt a kódban sortörés legyen
91       # a kimentben ez nem "látszik" majd...
92       print(f'Bal alsó: {bal_also_x} {bal_also_y}, \ 
93   jobb felső: {jobb_felso_x} {jobb_felso_y}\n')
94   
95   #---------------------------------------------------------
96   # 6. Írja a képernyőre, hogy mennyi volt a jeladó elmozdu-
97   #    lásainak összege! Úgy tekintjük, hogy a jeladó két
98   #    pozíciója közötti elmozdulása a pozíciókat összekötő
99   #    egyenes mentén történt.
100  #    Az összeget három tizedes pontossággal jelenítse meg!
101  #    A kiírásnál a tizedesvessző és tizedespont kiírása is
102  #    elfogadott. Az i-edik és az i+1-edik pontok távolsá-
103  #    gát a megadott képlet segítségével határozhatja meg. 
104  #---------------------------------------------------------
105  def F6():
106      print('6. feladat')
107      szumma_elmozdulas=0
108      # az i. és i+1. jel feldolgozásához index kell, ezért
109      # a "range-típusú for" ciklust használjuk:
110      for i in range(len(jelek)-1):   # -1, mert...
111          x=jelek[i][3]   # i. lista 3. eleme
112          y=jelek[i][4]
113          kov_x=jelek[i+1][3]   # ...így i+1-gyel a végén nem lesz baj
114          kov_y=jelek[i+1][4]
115          elmozdulas=negyzetgyok(pow(x-kov_x,2)+pow(y-kov_y,2))
116          szumma_elmozdulas+=elmozdulas
117  
118      print(f'Elmozdulás: {szumma_elmozdulas:.3f} egység\n')
119  
120  #---------------------------------------------------------
121  # 7. Írja a kimaradt.txt fájlba a kimaradt észlelésekkel
122  #    kapcsolatos adatokat! A kimeneti fájlban azok a beme-
123  #    neti állományban rögzített vételi időpontok jelenje-
124  #    nek meg, amelyek előtt közvetlenül egy vagy több
125  #    észlelés kimaradt! Az időpont mellett – a mintának
126  #    megfelelően – jelenjen meg, hogy legalább hány jel
127  #    maradt ki, és az is, hogy miből következtet a hiányra!
128  #    Ha idő- és koordináta-eltérésből is adódik jelkimara-
129  #    dás, akkor a nagyobb értéket írja ki! Ha az időelté-
130  #    rés és a koordináták eltérése alapján is ugyanannyi
131  #    jelkimaradásra következtetünk, akkor bármelyiket
132  #    kiírhatja.
133  #---------------------------------------------------------
134  def F7():
135      # jeladó 5 percenként jelet küld, illetve ha bármely
136      # koordináta 10 egységgel megváltozik!
137      # figyeljük az i. és i+1. jelsorozatokra, hogy ez a
138      # szabály sérült-e, és ha igen melyik miatt, illetve
139      # milyen mértékben: azaz hány jeladás maradt ki... stb.
140      ot_perc=300     # mp-ben az 5 perc
141      fki=open('kimaradt.txt','w')
142  
143      # Elég hosszú, meg bonyolult, meg sok változó van,
144      # de így talán követhetőbb a logika!?
145      # Később ez egyszerűsíthető!
146      for i in range(len(jelek)-1):
147          j1=jelek[i]     # aktuális jel adatai
148          j2=jelek[i+1]   # következő jel adatai
149          elter=0         # koordináták eltérést mutatnak-e
150          elter_x,elter_y=0,0
151          ido=0           # időbeli eltérés van-e
152          van=False       # lesz-e a normálisnál nagyobb eltérés
153  
154          # eltelt idő meghatározása:
155          eltelt_ido=eltelt(j1[0],j1[1],j1[2],j2[0],j2[1],j2[2])
156          if eltelt_ido>ot_perc:
157              van=True
158              ido=(eltelt_ido-ot_perc)//ot_perc
159              if eltelt_ido%ot_perc>0:
160                  ido+=1
161          # elmozdulások vizsgálata:
162          elmozdulas_x=abs(j2[3]-j1[3])       # abszolútérték, mert
163          elmozdulas_y=abs(j2[4]-j1[4])       # bármerre lehet elmozdulás
164          if elmozdulas_x>10:
165              van=True
166              elter_x=(elmozdulas_x-10)//10
167              if elmozdulas_x%10>0:
168                  elter_x+=1
169          if elmozdulas_y>10:
170              van=True
171              elter_y=(elmozdulas_y-10)//10
172              if elmozdulas_y%10>0:
173                  elter_y+=1
174  
175          # végül is van a normálistól eltérő kimaradás:
176          if van:
177              elter=max(elter_x,elter_y)
178              mennyiseg=max(ido,elter)
179              ok='időeltérés' if ido>=elter else 'koordináta-eltérés'
180              print(f'{j2[0]} {j2[1]} {j2[2]} {ok} {mennyiseg}',file=fki)
181  
182      fki.close()      
183      
184  #********************** F Ő M O D U L **********************
185  F1()
186  F2()
187  F4()
188  F5()
189  F6()
190  F7()
191  
192  
193  
194