tesztverseny201705.py
1    def kiir(ssz, szoveg):
2        print('%d. feladat - %s' % (ssz, szoveg))
3    
4    
5    # -----------------------------------------------------------------------
6    # 1. Olvassa be és tárolja el a valaszok.txt szöveges állomány adatait!
7    # -----------------------------------------------------------------------
8    kiir(1, 'fájl beolvasása')
9    
10   fv = open('valaszok.txt', 'r')
11   megoldas = fv.readline()  # a forrásfájl első sora
12   print('...')
13   
14   adatok = []  # mátrix: elemei AZONOSÍTÓ és VÁLASZ
15   
16   for sor in fv:
17       sor = sor.strip().split()
18       adatok.append(sor)
19   
20   fv.close()
21   
22   # -----------------------------------------------------------------------
23   # 2. Jelenítse meg a képernyőn a mintának megfelelően, hogy hány
24   #    versenyző vett részta tesztversenyen!
25   # -----------------------------------------------------------------------
26   kiir(2, 'versenyzők száma')
27   
28   vsz = len(adatok)  # versenyzők száma=fájlból első sor kivételével
29   # beolvasott adatsorok száma
30   print('A vetélkedőn {} versenyző indult.'.format(vsz))
31   
32   # -----------------------------------------------------------------------
33   # 3. Kérje be egy versenyző azonosítóját, és jelenítse meg a mintának
34   #    megfelelően a hozzá eltárolt válaszokat! Feltételezheti, hogy a
35   #    fájlban létező azonosítót adnak meg.
36   # -----------------------------------------------------------------------
37   kiir(3, 'versenyző és válasza')
38   
39   # megkeressük az azonosítót a mátrixban és kiírjuk a válaszát,
40   # addig ismételtetjük az INPUT parancsot, amíg nem ad meg jó
41   # azonosító kódot!
42   van = False
43   while not van:
44       # UPPER - az input egy stringet ad, az lesz nagybetűs
45       vaz = input('A versenyző azonosítója = ').upper()
46       i = 0
47       while i < len(adatok) and adatok[i][0] != vaz:
48           i += 1
49       if i < len(adatok):
50           van = True
51           valasz = adatok[i][1]  # 4. feladathoz kell majd
52           print('A versenyző válasza: ', valasz)
53   
54   # -----------------------------------------------------------------------
55   # 4. Írassa ki a képernyőre a helyes megoldást! A helyes megoldás alatti
56   #    sorba „+” jelet tegyen, ha az adott feladatot az előző feladatban
57   #    kiválasztott versenyző eltalálta, egyébként egy szóközt! A kiírást
58   #    a mintának megfelelő módon alakítsa ki!
59   # -----------------------------------------------------------------------
60   kiir(4, 'a megoldás és a versenyző válasza')
61   
62   print(megoldas, end='')
63   for i in range(len(valasz)):
64       if valasz[i] == megoldas[i]:
65           print('+', end='')
66       else:
67           print(' ', end='')
68   print()
69   
70   # -----------------------------------------------------------------------
71   # 5. Kérje be egy feladat sorszámát, majd határozza meg, hogy hány
72   #    versenyző adott a feladatra helyes megoldást, és ez a versenyzők
73   #    hány százaléka! A százalékos eredményt a mintának megfelelően,
74   #    két tizedesjeggyel írassa ki!
75   # -----------------------------------------------------------------------
76   kiir(5, 'egy adott feladatra adott helyes válaszok aránya')
77   
78   letszam = len(adatok)
79   
80   # feladat sorszáma: 1-14 közötti szám
81   # megpróbáljuk rávenni a felhasználót, hogy 1-14 közötti számot adjon meg!
82   # (ez nem követelmény!)
83   
84   while True:
85       try:
86           sorszam = int(input('A feladat sorszáma = '))
87           if sorszam < 1 or sorszam > 14:
88               print('1-14 közötti számot kell megadni!!')
89           else:
90               break
91       except ValueError:
92           print('Csalódtam benned!')
93   sorszam -= 1  # -1 az indexelés miatt, szokásos :(
94   szamlalo = 0  # helyes megoldások száma, gyakorlatilag összegzés következik
95   for adat in adatok:
96       valasz = adat[1]  # a második eleme az adatnak a válasz
97       if valasz[sorszam] == megoldas[sorszam]:
98           szamlalo += 1
99   arany = szamlalo / letszam
100  print(f'A feladatra {szamlalo} fő, a versenyzők {arany * 100:.2f}%-a adott helyes választ.')
101  
102  # -----------------------------------------------------------------------
103  # 6. A verseny feladatai nem egyenlő nehézségűek:
104  #    az 1-5. feladat 3 pontot, a 6-10. feladat 4 pontot,
105  #    a 11-13. feladat 5 pontot, míg a 14. feladat 6 pontot ér.
106  #    Határozza meg az egyes versenyzők pontszámát, és a listát írassa
107  #    ki a pontok.txt nevű állományba! Az állomány minden sora egy
108  #    versenyző kódját, majd szóközzel elválasztva az általa elért
109  #    pontszámot tartalmazza!
110  # -----------------------------------------------------------------------
111  kiir(6, 'versenyzők pontszámának meghatározása')
112  print('...')
113  
114  pontok = [3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 6]
115  
116  
117  # ez a lista jelentősen leegyszerűsíti a megoldást
118  
119  def pontszamitas(valasz):
120      pontszam = 0
121      for i in range(len(valasz)):
122          if valasz[i] == megoldas[i]:
123              # i-dik válasz jó, akkor i-dik pont a pontok listából
124              pontszam += pontok[i]
125      return pontszam
126  
127  
128  fv = open('pontok.txt', 'w')
129  
130  dijazas = []  # 7.feladathoz kell majd
131  for adat in adatok:
132      pontszam = pontszamitas(adat[1])
133      # 7.feladat miatt külön változóba kerül a pontszám
134      print(adat[0], pontszam, file=fv)
135      # 7.feladat hatására, rögzítjük az eredményeket
136      dijazas.append([adat[0], pontszam])
137  fv.close()
138  
139  # -----------------------------------------------------------------------
140  # 7. A versenyen a három legmagasabb pontszámot elérő összes versenyzőt
141  #    díjazzák. Például 5 indulónál előfordulhat, hogy 3 első és 2
142  #    második díjat adnak ki. Így megtörténhet az is, hogy nem kerül sor
143  #    mindegyik díj kiadására. Írassa ki a mintának megfelelően a
144  #    képernyőre a díjazottak kódját és pontszámát pontszám szerint
145  #    csökkenő sorrendben!
146  # -----------------------------------------------------------------------
147  kiir(7, 'versenyzők díjazása')
148  
149  
150  # ez a feladat hatással van az előzőre, a 6. feladatra. Ne csak fájlba
151  # írjuk az azonosítót és a pontszámot, hanem rögzítsük is egy mátrixban
152  # ezeket az adatokat! ---> dijazas "mátrix"
153  
154  # rendezzük be a "mátrixot" pontszám szerint csökkenő sorrendbe!
155  
156  def pontszam_szerint(elem):
157      return elem[1]  # 1-es index, azaz a másod elem vagyis a pontszám
158  
159  
160  dijazas = sorted(dijazas, key=pontszam_szerint, reverse=True)
161  
162  print('A verseny legjobbjai:')
163  
164  dijazottak_szama = 1  # maximum 3 lehet
165  helyezes = 1  # helyezési sorrend, pl.: 1. vagy 2., stb....
166  # a rendezett "mátrix" első sor az 1. helyezettet tartalmazza
167  # ezt kiiírjuk, és a következő versenyzőt hozzás viszonyítjuk...
168  print('{}. díj ({} pont): {}'.format(helyezes, dijazas[0][1], dijazas[0][0]))
169  i = 1  # másodiktól megy majd a ciklus (while)
170  while dijazottak_szama < 4:
171      if dijazas[i][1] != dijazas[i - 1][1]:  # ha eltérő pontszám jön, akkor...
172          helyezes += 1  # ...növeljük a helyzési sorszámot
173      print('{}. díj ({} pont): {}'.format(helyezes, dijazas[i][1], dijazas[i][0]))
174      dijazottak_szama += 1  # ez független a helyezéstől
175      i += 1  # ez csak azért kell, hogy ne a
176      # dijazottak_szama változót használjam indexnek