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