expedicio201505.py
1    def kiir(ssz, szoveg):
2        print('{}. feladat - {}'.format(ssz, szoveg))
3    
4    
5    # --------------------------------------------------------------------
6    # 1. Olvassa be és tárolja a veetel.txt fájl tartalmát!
7    # --------------------------------------------------------------------
8    kiir(1, 'Fájl beolvasása')
9    
10   # napok: 1-11
11   # rádiósok: 1-20
12   # uzenetek:  90 karakter hosszú, # nem egyértelmű jel, $ üzenet már nincs
13   #           1/2 kezdet pl. 1 felnőtt és 2 kölyök példányt figyeltek meg
14   
15   fv = open('veetel.txt', 'r')
16   adatok = []  # mátrix: [nap, rádiós, uezenet] "kis" lista az eleme
17   N = 1  # páros vagy páratlan sor jön-e
18   db = 0  # mátrix elemeinek száma
19   akt_sor = []  # "kis" lista készítéséhez: [nap,rádiós,üzenet]
20   for adat in fv:
21       if N % 2 == 1:  # páratlan sor
22           # nap és rádiós jön
23           akt_sor = adat.strip().split()  # "szétkapjuk" listába
24           akt_sor = [int(akt_sor[0]), int(akt_sor[1])]
25       else:
26           db += 1  # páros sor: azaz üzenet jön, itt növelem a nagy mátrix elemszámát
27           akt_sor.append(adat.rstrip())  # rstrip() - jobbról "lecsapjuk" a '\n'-t!
28           adatok.append(akt_sor)  # "kis" lista megy a mátrixba
29           akt_sor = []  # ürítjük a változót a következő lépéshez
30       N += 1  # N-t is növeljük, de ezt lehetne más megoldással is...
31   
32   fv.close()
33   
34   # --------------------------------------------------------------------
35   # 2. Írja a képernyőre, hogy melyik rádióamatőr rögzítette az
36   #    állományban szereplő első és melyik az utolsó üzenetet!
37   # --------------------------------------------------------------------
38   kiir(2, 'Első és utolsó üzenet a forrásállományban')
39   
40   print('Az első üzenet rögzítője: ', adatok[0][1])
41   print('Az utolsó üzenet rögzítője: ', adatok[db - 1][1])
42   
43   # --------------------------------------------------------------------
44   # 3. Adja meg az összes olyan feljegyzés napját és a rádióamatőr
45   #    sorszámát, amelynek szövegében a „farkas” karaktersorozat
46   #    szerepel!
47   # --------------------------------------------------------------------
48   kiir(3, '"farkas" a szövegben')
49   
50   s = 'farkas'
51   for adat in adatok:
52       if adat[2].find(s) > -1:
53           print('{}. nap {}. rádióamatőr'.format(adat[0], adat[1]))
54   
55   # --------------------------------------------------------------------
56   # 4. Készítsen statisztikát, amely megadja, hogy melyik napon hány
57   #    rádióamatőr készített feljegyzést. Azok a napok 0 értékkel
58   #    szerepeljenek, amikor nem született feljegyzés! Az eredmény a
59   #    képernyőn jelenjen meg a napok sorszáma szerint növekvően!
60   #    A megjelenítést a feladat végén látható minta szerint alakítsa ki!
61   # --------------------------------------------------------------------
62   kiir(4, 'Statisztika')
63   napok = [0] * 11  # 11 nap lehet, ebben összesítjük a napi üzenetek számát
64   
65   for adat in adatok:
66       napok[adat[0] - 1] += 1  # indexelés az adat[0]-val, az az a nappal
67       # a -1 a szokásos okok miatt kell (indexek 0-tól...)
68   
69   for nap in range(11):
70       print('{}. nap: {} rádióamatőr'.format(nap + 1, napok[nap]))
71   
72   # --------------------------------------------------------------------
73   # 5. A rögzített üzenetek alapján kísérelje meg helyreállítani az
74   #    expedíció által küldött üzenetet! Készítse el az adaas.txt fájlt,
75   #    amely napok szerinti sorrendben tartalmazza a küldött üzeneteket!
76   #    Ha egy időpontban senkinél nem volt vétel, akkor azon a ponton
77   #    a # jel szerepeljen! (Feltételezheti, hogy az azonos üzenethez
78   #    tartozó feljegyzések között nincs ellentmondás.)
79   # --------------------------------------------------------------------
80   kiir(5, 'Üzenetek helyreállítása')
81   
82   fv = open('adaas.txt', 'w')
83   alap = ['#'] * 90  # 90 # jelből álló lista
84   alap = ''.join(alap)  # átlakítva szöveggé: '######....' (90 karakter hosszú)
85   
86   uj = [alap] * 11  # a fentiekből 11 helyreállított üzenet lesz
87   
88   for adat in adatok:
89       nap = adat[0] - 1  # a napot használom az uj lista indexeléséhez
90       szoveg = list(adat[2])  # az uzenet listává alakítása, hogy betűnként kezelhessük
91       uj2 = list(uj[nap])  # mint az előző sor
92       for i in range(len(szoveg)):
93           if szoveg[i] != '#':  # ha az uzenetben nem # jel van, akkor
94               uj2[i] = szoveg[i]  # az mehet az ujba
95       uj[nap] = ''.join(uj2)  # szöveggé alakítom a listát
96   
97   for i in range(11):
98       print(str(i + 1) + '. nap: ', uj[i])
99       print(uj[i], file=fv)
100  
101  fv.close()
102  
103  # --------------------------------------------------------------------
104  # 6. Készítsen függvényt szame néven az alábbi algoritmus alapján!
105  #    A függvény egy karaktersorozathoz hozzárendeli az igaz vagy a
106  #    hamis értéket. A függvény elkészítésekor az algoritmusban
107  #    megadott változóneveket használja! Az elkészített függvényt
108  #    a következő feladat megoldásánál felhasználhatja.
109  #
110  #    Függvény szame(szo:karaktersorozat): logikai
111  #       valasz:=igaz
112  #       Ciklus i:=1-től hossz(szo)-ig
113  #          ha szo[i]<'0' vagy szo[i]>'9' akkor valasz:=hamis
114  #       Ciklus vége
115  #       szame:=valasz
116  #    Függvény vége
117  # --------------------------------------------------------------------
118  kiir(6, 'Függvény készítése...')
119  
120  
121  def szame(szo):  # a függvény "egy az egyben" a mondatszerű leírás alapján készült
122      valasz = True
123      for i in range(len(szo)):
124          if szo[i] < '0' or szo[i] > '9':
125              valasz = False
126      return valasz
127  
128  
129  # --------------------------------------------------------------------
130  # 7. Olvassa be egy nap és egy rádióamatőr sorszámát, majd írja a
131  #    képernyőre a megfigyelt egyedek számát (a kifejlett és kölyök
132  #    egyedek számának összegét)! Ha nem volt ilyen feljegyzés,
133  #    a „Nincs ilyen feljegyzés” szöveget jelenítse meg! Ha nem volt
134  #    megfigyelt egyed vagy számuk nem állapítható meg, a
135  #    „Nincs információ” szöveget jelenítse meg! Amennyiben egy
136  #    számot közvetlenül # jel követ, akkor a számot tekintse nem
137  #    megállapíthatónak!
138  # --------------------------------------------------------------------
139  nap = int(input('Adja meg a nap sorszámát! '))
140  radios = int(input('Adja meg a rádióamatőr sorszámát! '))
141  
142  # keressük meg az adott napot és rádióst
143  i = 0
144  while i < db and not (adatok[i][0] == nap and adatok[i][1] == radios):
145      i += 1
146  
147  if i < db:  # ha megtaláltuk az adott napot és rádióst, akkor
148      p = adatok[i][2].find('/')  # az üzenet elején / jelet keresünk
149      felnott = adatok[i][2][0:p]  # / jel előtt a felnőtt egyed száma LEHET!
150      p2 = adatok[i][2].find(' ')  # / jel után, szóközig a kölykök száma LEHET!
151      kolyok = adatok[i][2][p + 1:p2]
152      if szame(felnott) and szame(kolyok):  # de tényleg számokról van szó?
153          print('A megfigyelt egyedek száma: ', int(felnott) + int(kolyok))
154      else:
155          print('Nincs információ!')
156  else:
157      print('Nincs ilyen feljegyzés!')