IT Egzaminai/2022: Skirtumas tarp puslapio versijų
| 187 eilutė: | 187 eilutė: | ||
'''Nurodymai'''<br> | '''Nurodymai'''<br> | ||
* Programoje naudokite struktūros duomenų tipo masyvą sportavimo duomenims saugoti. | * Programoje naudokite struktūros duomenų tipo masyvą sportavimo duomenims saugoti. | ||
* Sukurkite ir parašykite funkciją, kuri sudarytų pratimų unikalių (nepasikartojančių) pavadinimų | * Sukurkite ir parašykite funkciją, kuri sudarytų pratimų unikalių (nepasikartojančių) pavadinimų sąrašą. Python programavimo kalboje naudokite žodyno duomenų struktūrą arba struktūrą sudarykite, naudodami klases. | ||
sąrašą. Python programavimo kalboje naudokite žodyno duomenų struktūrą arba struktūrą sudarykite, naudodami klases. | |||
{| class="wikitable" style="width:100%" | {| class="wikitable" style="width:100%" | ||
|+ Duomenų ir rezultatų pavyzdžiai | |+ Duomenų ir rezultatų pavyzdžiai | ||
11:48, 23 vasario 2023 versija
1 užduotis. Programavimo konkursas
Į Lietuvos programavimo konkurso finalą pateko penki mokiniai, kurių rezultatai atrankos etape buvo geriausi. Finale mokiniams buvo pateiktos įvairaus sudėtingumo programavimo užduotys. Buvo nurodytas joms atlikti skirtas laiko limitas minutėmis ir jų maksimalus vertinimas taškais. Dalyviai programų failus kėlė į automatinio vertinimo sistemą, kuri tikrino, ar programos teisingos. Kai dalyvio programa pateikdavo teisingus visų testų rezultatus, sistema užfiksuodavo užduoties atlikimo laiką minutėmis. Jei dalyvis išsprendė uždavinį teisingai ir neviršijo tam uždaviniui skirto laiko limito, jis už tą uždavinį gavo maksimalų taškų skaičių; jeigu išsprendė teisingai, bet viršijo laiko limitą, gavo pusę maksimalaus taškų skaičiaus (rezultatas skaičiuojamas sveikaisiais skaičiais; pavyzdžiui, jei maksimalus užduoties vertinimas yra 3 taškai, tai už teisingą užduoties sprendimą, viršijus laiko limitą, dalyvis gavo 1 tašką); jeigu dalyvis uždavinio nesprendė arba išsprendė klaidingai, už jį gavo 0 taškų.
Parašykite programą, kuri rastų didžiausią finale surinktų taškų skaičių ir sudarytų dalyvių, surinkusių daugiausia taškų, sąrašą.
Pradiniai duomenys
Duomenys pateikiami tekstiniame faile U1.txt.
- Pirmoje eilutėje užrašytas finale pateiktų uždavinių skaičius u (1 ≤ u ≤ 12).
- Antroje eilutėje iš eilės nurodytas kiekvienam uždaviniui spręsti skirtas laiko limitas minutėmis. Duomenys atskirti vienu tarpo simboliu.
- Trečioje eilutėje iš eilės nurodytas kiekvieno uždavinio maksimalus vertinimas taškais. Duomenys atskirti vienu tarpo simboliu.
- Tolesnėse eilutėse užrašyti penkių finalo dalyvių duomenys: vardas (10 simbolių) ir kiekvienam uždaviniui spręsti sugaištas laikas minutėmis, užfiksuotas sistemos. Duomenys atskirti vienu tarpo simboliu. Buvo bent vienas dalyvis, kuris teisingai išsprendė bent vieną uždavinį.
Rezultatai
Rezultatus pateikite tekstiniame faile U1rez.txt.
- Pirmoje eilutėje pateikite didžiausią finale surinktų taškų skaičių.
- Tolesnėse eilutėse pateikite dalyvių, surinkusių didžiausią taškų skaičių, sąrašą: dalyvio vardas, jo teisingai išspręstų uždavinių skaičius ir šiems uždaviniams spręsti sugaištas laikas minutėmis. Duomenys atskirti vienu tarpo simboliu. Sąrašas surikiuotas pagal teisingai išspręstų uždavinių skaičių mažėjančiai.
Nurodymai
- Sukurkite ir parašykite vieną funkciją, kuri apskaičiuoja dalyvio surinktų taškų skaičių, teisingai išspręstų uždavinių skaičių ir šiems uždaviniams spręsti sugaištą laiką minutėmis.
| Duomenų failo pavyzdys | Paaiškinimai |
|---|---|
|
6 |
|
| Rezultatų failo pavyzdys | Paaiškinimai |
|
13 |
|
1 užduotis. Sprendimas
# Konstantos
DUOMENŲ_FAILAS = "U1.txt"
REZULTATŲ_FAILAS = "U1rez.txt"
# globalūs kintamieji
# nuskaitysim iš failų
viso_uždavinių = 0
laiko_limitai = []
maks_verinimai = []
# naudosime visoje programoje
dalyviai = {}
maks_taškų = 1
# funkcija skaičiuoti vieno dalyvio rezultatus
# rezultatus prideda prie globalaus kintamojo 'rezultatai'
# parametrai: vardas ir sąrašas
def skaičiuok_balus(vardas, laikai):
# naudosime globalų kintamajį fiksuoti maksimalų surinkta taškų skaičių
global maks_taškų
# kintamieji
išspręsta_uždavinių = 0
surinkta_taškų = 0
viso_trukmė = 0
# kiekvieną uždavinį skaičiuojame atskirai
for i in range(viso_uždavinių):
# konvertuojame kintamuosius iš tekstinės eilutės į skaičius
laikas = int(laikai[i])
limitas = int(laiko_limitai[i])
maks_vertinimas = int(maks_verinimai[i])
# skiriame maks taškų. Vėliau patikriname ar turėtų gauti pusę ar 0 taškų
vertinimas = maks_vertinimas
if laikas > limitas:
vertinimas = maks_vertinimas // 2
if laikas > 0:
išspręsta_uždavinių += 1
surinkta_taškų += vertinimas
viso_trukmė += laikas
if maks_taškų < surinkta_taškų:
maks_taškų = surinkta_taškų
return { 'vardas': vardas, 'uždaviniai': išspręsta_uždavinių, 'balai': surinkta_taškų, 'laikas': viso_trukmė }
# rūšiavimo funkcija
def rūšiuok(rezultatai):
sąrašas = []
# pasiimame tik tuos rezultatus, kurie suringko maks balų
for r in rezultatai:
if r['balai'] == maks_taškų:
sąrašas.append(r)
# rūšiuojame atrinktus rezultatus burbulo principu
while True:
buvo_pakeitimų = False
for i in range(len(sąrašas) - 1):
s1 = sąrašas[i]
s2 = sąrašas[i + 1]
if s1['uždaviniai'] < s2['uždaviniai'] or (s1['uždaviniai'] == s2['uždaviniai'] and s1['laikas'] > s2['laikas']) :
laikinasElementas = sąrašas[i]
sąrašas[i] = sąrašas[i + 1]
sąrašas[i + 1] = laikinasElementas
buvo_pakeitimų = True
if not buvo_pakeitimų:
break
return sąrašas
# spausdiname rezultatus į failą
def atspausdinti(rezultatai):
global maks_taškų
with open(REZULTATŲ_FAILAS, "w") as rašomas_failas:
# pirma eilutė - maksimalus taškų skaičius
rašomas_failas.write(str(maks_taškų))
rašomas_failas.write("\n")
# įrašome pateiktus rezultatus iš eilės
for r in rezultatai:
rašomas_failas.writelines([r['vardas'], " ", str(r['uždaviniai']), " ", str(r['laikas']), "\n"])
# programa
# nuskaitome duomenis iš failo ir priskiriame juos globaliems kintamiesiems
with open(DUOMENŲ_FAILAS, "rt") as skaitomas_failas:
viso_uždavinių = int(skaitomas_failas.readline())
laiko_limitai = skaitomas_failas.readline().split(" ")
maks_verinimai = skaitomas_failas.readline().split(" ")
while True:
tekstas = skaitomas_failas.readline()
if not tekstas:
break
dalyviai[tekstas[:10].strip()] = tekstas[11:].split(" ")
# kiekvieno dalyvio balus apskaičiuojame atskirai pasinaudodami skaičiavimo funkcija
rezultatai = []
for dalyvis in dalyviai:
rezultatai.append(skaičiuok_balus(dalyvis, dalyviai[dalyvis]))
# prafiltruojame ir surūšiuojame rezultatus
galutiniai_rezultatai = rūšiuok(rezultatai)
# atspausdiname
atspausdinti(galutiniai_rezultatai)
2 užduotis. Sportas namuose
Juozas dirba namuose. Norėdamas daugiau judėti, jis nusprendė sausio mėnesį pradėti sportuoti – pagal galimybes atlikti namuose penkis įvairius pratimus. Juozas užrašuose žymėdavosi sportavimo duomenis: kiek kartų sportavo tam tikrą dieną, pratimų pavadinimus, kuriuo dienos metu juos atliko ir kiek laiko minutėmis skyrė nurodytiems pratimams atlikti.
Parašykite programą, kuri apskaičiuotų ir išvestų Juozo sausio mėnesį atliktų pratimų statistiką.
Pradiniai duomenys
Duomenys pateikiami tekstiniame faile U2.txt.
- Pirmoje eilutėje užrašyta, kiek dienų d (1 ≤ d ≤ 31) sausio mėnesį sportavo Juozas.
- Tolesnėse eilutėse užrašyti Juozo sportavimo duomenys: kiek kartų jis sportavo tam tikrą dieną s (1 ≤ s ≤ 7) ir pratimų duomenys: pratimo pavadinimas (14 simbolių), dienos metas (žodis Rytas, Diena, Vakaras; 7 simboliai) ir kiek laiko minutėmis Juozas sugaišo, atlikdamas nurodytą pratimą. Juozas gali tą patį pratimą atlikti tą pačią dieną daugiau negu vieną kartą ir bet kuriuo dienos metu. Duomenys atskirti vienu tarpo simboliu. Buvo bent viena diena, kai Juozas atliko bent vieną pratimą.
Rezultatai
Rezultatus pateikite tekstiniame faile U2rez.txt.
- Įrašykite pratimų pavadinimus, dienų, kai Juozas atliko nurodytus pratimus, skaičių ir kiek iš viso laiko minutėmis sugaišo šiems pratimams atlikti. Pratimų sąrašą surikiuokite abėcėliškai. Duomenis eilutėje atskirkite vienu tarpo simboliu.
- Po kiekvieno pratimo pavadinimo atskirose eilutėse parašykite žodžius Rytas, Diena, Vakaras ir nurodykite, kiek kartų sausio mėnesį Juozas nurodytu dienos metu atliko nurodytą pratimą. Duomenis eilutėje atskirkite vienu tarpo simboliu. Jeigu kurio nors pratimo kuriuo nors dienos metu nebuvo atlikta nė karto, duomenų apie šį dienos metą pateikti nereikia.
Nurodymai
- Programoje naudokite struktūros duomenų tipo masyvą sportavimo duomenims saugoti.
- Sukurkite ir parašykite funkciją, kuri sudarytų pratimų unikalių (nepasikartojančių) pavadinimų sąrašą. Python programavimo kalboje naudokite žodyno duomenų struktūrą arba struktūrą sudarykite, naudodami klases.
| Duomenų failo pavyzdys | |
|---|---|
|
8 2 Atsilenkimai Rytas 10 Prisitraukimai Rytas 8 3 Atsispaudimai Diena 8 Tempimas Vakaras 8 Atsilenkimai Vakaras 9 1 Svarmenys Vakaras 11 3 Svarmenys Diena 10 Svarmenys Diena 12 Atsilenkimai Diena 15 2 Atsilenkimai Vakaras 22 Svarmenys Vakaras 10 3 Svarmenys Diena 15 Atsispaudimai Diena 15 Atsispaudimai Diena 5 2 Svarmenys Rytas 23 Svarmenys Vakaras 13 3 Atsispaudimai Rytas 10 Atsispaudimai Diena 12 Tempimas Vakaras 10 | |
| Paaiškinimai | |
| |
| Rezultatų failo pavyzdys | Paaiškinimai |
|
Atsilenkimai 4 56 |
|
2 užduotis. Sprendimas
print("Čia bus sprendimas")