metjelentes202005.py
1    from statistics import mean
2    #-----------------------------------------------------------------------
3    # 1. Olvassa be és tárolja el a tavirathu13.txt állomány adatait!
4    #-----------------------------------------------------------------------
5    print('1. feladat - adatok beolvasása')
6    
7    adatok=[]  # ez lesz a mátrixunk (listák listája)
8               # [település, idő_óra, idő_perc, szélirány és -erősség, hőmérséklet]
9               
10   telepulesek=set()   #az 5. feladat miatt kell ez (utólag tértem ide vissza én is)
11   
12   fbe=open('tavirathu13.txt','r')
13   for sor in fbe:
14       sor=sor.strip().split()
15       temp=[]
16       for i,elem in enumerate(sor):
17           if i==1:    #ezen az indexen van az idő óópp formátumban
18               temp.append(elem[0:2])              #óó rész
19               temp.append(elem[2:4])              #pp rész
20           else:
21               temp.append(elem)
22               
23       telepulesek.add(temp[0] )   
24       adatok.append(temp)
25   fbe.close()
26   #csak úgy, a rend kedvéért:
27   telepulesek=sorted(list(telepulesek))
28   
29   #-----------------------------------------------------------------------
30   # 2. Kérje be a felhasználótól egy város kódját! Adja meg, hogy az
31   #    adott városból mikor érkezett az utolsó mérési adat! A kiírásban
32   #    az időpontot óó:pp formátumban jelenítse meg!
33   #-----------------------------------------------------------------------
34   print('\n2. feladat\n')
35   
36   tkod=input('Adja meg egy település kódját! Település: ')
37   #település kódja - tkod  
38   #Keressük meg ezt a településkódot az adatok végétől visszafelé!
39   #Lehet a klasszikus lineáris keresés a megoldás vagy egy for ciklus,
40   #és kiugrunk, ha megvan. Azt is figyelhetjük, hogy megvan-e egyáltalán.
41   
42   i=-1    #utolsó elem indexe - ezen belül a 0 indexen lesznek a településkódok
43   while i>-len(adatok) and adatok[i][0]!=tkod:
44       i-=1
45   if i>-len(adatok):
46       #megvan a kód
47       ora=adatok[i][1]
48       perc=adatok[i][2]
49       print(f'Az utolsó mérési adat a megadott településről {ora}:{perc}-kor érkezett.')
50   else:
51       print('Ilyen kód nincs az adatok között!')
52   
53   #-----------------------------------------------------------------------
54   # 3. Határozza meg, hogy a nap során mikor mérték a legalacsonyabb és
55   #    a legmagasabb hőmérsékletet! Jelenítse meg a méréshez kapcsolódó
56   #    település nevét, az időpontot és a hőmérsékletet! Amennyiben több
57   #    legnagyobb vagy legkisebb érték van, akkor elég az egyiket kiírnia. 
58   #-----------------------------------------------------------------------
59   print('\n3. feladat\n')
60   maxho=-1    #ennél biztosan lesz nagyobb (akkor kell, ha klasszikus megoldást adunk
61   minho=100   #ennél biztosan lesz kisebb
62   
63   #szerintem itt sokféle út lehet, de most vagy
64   #klasszikus szélsőérték keresés vagy listába szedjük a hőmérsékleteket
65   #és abban alkalmazzuk a max és min függvényeket (most ez lesz)
66   homersekletek=[]
67   for adat in adatok:
68       homersekletek.append(adat[4])
69   
70   maxho=max(homersekletek)
71   maxi=homersekletek.index(maxho)    #meghatározzuk, hogy milyen indexen van ez az adat
72   minho=min(homersekletek)
73   mini=homersekletek.index(minho)    #meghatározzuk, hogy milyen indexen van ez az adat
74   
75   #kiírandó adatsorok összeállítása
76   adatsor=adatok[mini][0]+' '+adatok[mini][1]+':'+adatok[mini][2]+' '+adatok[mini][4]
77   print('A legalacsonyabb hőmérséklet: %s fok' %adatsor)
78   adatsor=adatok[maxi][0]+' '+adatok[maxi][1]+':'+adatok[maxi][2]+' '+adatok[maxi][4]
79   print('A legmagasabb hőmérséklet: %s fok' %adatsor) 
80   
81   #-----------------------------------------------------------------------    
82   # 4. Határozza meg, azokat a településeket és időpontokat, ahol és
83   #    amikor a mérések idején szélcsend volt! (A szélcsendet a táviratban
84   #    00000 kóddal jelölik.) Ha nem volt ilyen, akkor 
85   #    a „Nem volt szélcsend a mérések idején.” szöveget írja ki!
86   #    A kiírásnál a település kódját és az időpontot jelenítse meg. 
87   #-----------------------------------------------------------------------
88   print('\n4. feladat\n')
89   
90   #kiválogatás és megszámolás tétele
91   #számoljuk azt, hogy megfelelő adat volt, hogy a végén tudjunk reagálni,
92   #ha egy sem volt...
93   db=0
94   for adat in adatok:
95       if adat[3]=='00000':
96           db+=1
97           print(adat[0]+' '+adat[1]+':'+adat[2])
98           
99   if db==0:
100      print('Nem volt szélcsend a mérések idején!')
101  
102  #-----------------------------------------------------------------------
103  # 5. Határozza meg a települések napi középhőmérsékleti adatát és a
104  #    hőmérséklet-ingadozását! A kiírásnál a település kódja szerepeljen
105  #    a sor elején a minta szerint! A kiírásnál csak a megoldott feladat-
106  #    részre vonatkozó szöveget és értékeket írja ki! 
107  #       a. A középhőmérséklet azon hőmérsékleti adatok átlaga, amikor
108  #          a méréshez tartozó óra értéke 1., 7., 13., 19. Ha egy telepü-
109  #          lésen a felsorolt órák valamelyikén nem volt mérés, akkor a
110  #          kiírásnál az „NA” szót jelenítse meg! Az adott órákhoz tartozó
111  #          összes adat átlagaként határozza meg a középhőmérsékletet,
112  #          azaz minden értéket azonos súllyal vegyen figyelembe!
113  #          A középhőmérsékletet egészre kerekítve jelenítse meg! 
114  #       b. A hőmérséklet-ingadozás számításhoz az adott településen a
115  #          napi legmagasabb és legalacsonyabb hőmérséklet különbségét
116  #          kell kiszámítania! (Feltételezheti, hogy minden település
117  #          esetén volt legalább két mérési adat.)
118  #-----------------------------------------------------------------------
119  print('\n5. feladat\n')
120  
121  #óra értéke 1., 7., 13., 19.
122  orak={'01', '07', '13', '19'}
123  
124  for t in telepulesek:   #lásd 10. sor
125      atlag=[]    #ebben gyűjtöm a fenti órákban történt méréseket (fokokat)
126      max_min=[]  #ebben gyűjtöm az összes mérést (fokokat)
127      oke=set()   #ebbe a halmazba dobálom az órákat, és ha nem 4 elemű, akkor nem oké
128      for adat in adatok:
129          if adat[0]==t:      #megfelelő település
130              hom=int(adat[4])        #ne felejtsük egészre alakítani a fokot
131              max_min.append(hom)     #válogatás nélkül mindent bele ebbe
132              if adat[1] in orak:     #ha jó óra van, akkor
133                  atlag.append(hom)   
134                  oke.add(adat[1])
135              
136      if len(oke)<4:    #mivel 4 figyelembe veendő időpont van
137          s=' NA; '
138      else:
139                                           #mean fv. vagyis átlagszámítás, lásd 1. sor fent
140          s=' Középhőmérséklet: '+str(round(mean(atlag)))+'; '
141          
142      hi='Hőmérséklet-ingadozás: '+str(max(max_min)-min(max_min))   
143      print(t+s+hi)
144  
145  
146  #----------------------------------------------------------------------------
147  # 6. Hozzon létre településenként egy szöveges állományt, amely első
148  #    sorában a település kódját tartalmazza! A további sorokban a mérési
149  #    időpontok és a hozzá tartozó szélerősségek jelenjenek meg! A szél-
150  #    erősséget a minta szerint a számértéknek megfelelő számú kettős-
151  #    kereszttel (#) adja meg! A fájlban az időpontokat és a szélerősséget
152  #    megjelenítő kettőskereszteket szóközzel válassza el egymástól!
153  #    A fájl neve X.txt legyen, ahol az X helyére a település kódja kerüljön!
154  #----------------------------------------------------------------------------
155  print('\n6. feladat - fájlok elkészítése')
156  
157  #pl.:
158  #BC 
159  #00:45 ###
160  
161  for t in telepulesek:       #egyik település a másik után
162      fki=open(t+'.txt','w')  #megnyitjuk a település kódja szerinti fájlt
163      print(t,file=fki)       #kiírjuk a fájl első sorába a településkódot
164      for adat in adatok:     #egyik adat a másik után
165          if adat[0]==t:      #ha megfelelő településről van szó, akkor
166              sor=adat[1]+':'+adat[2]+' '     #sorba bekerül óó:pp és egy szóköz
167              szelero=int(adat[3][-2:])*'#'   #3-as indexen van a szélirány és erősség
168                                              #az erősség az utolsó két karaktere [-2:]
169              sor+=szelero                    #szöveg szorzása annyiszor ismétlést jelent
170              print(sor,file=fki)
171      fki.close()             #ha végig értünk az adatokon, akkor fájl bezár és
172                              #jöhet a következő település
173          
174  
175