IT Egzaminai/2021

Iš Pitonas.
16:25, 26 gegužės 2023 versija, sukurta Admin (aptarimas | indėlis)
(skirt) ← Ankstesnė versija | Dabartinė versija (skirt) | Vėlesnė versija → (skirt)

1 užduotis. Bėgimas

Maksimalus vertinimas – 20 taškų

Laurynas nusprendė liepos mėnesį ryte ir vakare bėgti miške tą pačią 5 km trasą. Tokį atstumą jis įprastai įveikia per 15–20 minučių. Savo bėgimo laiko rezultatus Laurynas pasižymėdavo užrašuose, įrašydamas dieną ir kiekvieno bėgimo pradžios bei pabaigos laiką valandomis ir minutėmis. Jeigu dėl kokios nors priežasties (pvz., prasto oro) bėgimą praleisdavo, tuomet vietoj to bėgimo pradžios ir pabaigos laiko valandomis ir minutėmis jis įrašydavo nulius.

Parašykite programą, skirtą rasti dieną, kai Laurynas, bėgdamas ir ryte, ir vakare, sugaišo mažiausiai laiko. Jeigu yra kelios tokios dienos, turi būti pateikiamos jos visos

Pradiniai duomenys

Duomenys pateikiami tekstiniame faile U1.txt

  • Pirmoje eilutėje užrašyta, kiek dienų d (1 ≤ d ≤ 31) Laurynas bėgo bent vieną kartą.
  • Tolesnėse eilutėse užrašyti bėgimo duomenys: liepos mėnesio diena; bėgimo ryte pradžios ir pabaigos laikas, nurodytas valandomis ir minutėmis; bėgimo vakare pradžios ir pabaigos laikas, nurodytas valandomis ir minutėmis. Duomenys atskirti bent vienu tarpo simboliu. Buvo bent viena diena, kai Laurynas bėgo ir ryte, ir vakare.

Rezultatai

Rezultatus pateikite tekstiniame faile U1rez.txt.

  • Pirmoje eilutėje parašykite tekstą „Minimalus laikas“.
  • Antroje eilutėje užrašykite mažiausią bėgimo ryte ir vakare laiką minutėmis.
  • Trečioje eilutėje parašykite tekstą „Dienos“.
  • Ketvirtoje eilutėje užrašykite dieną, kai Laurynas, bėgdamas ir ryte, ir vakare, sugaišo mažiausiai laiko. Jeigu yra kelios tokios dienos, jos turi būti pateikiamos tokia eilės tvarka, kokia jas surašė Laurynas. Dienos turi būti atskiriamos vienu tarpo simboliu.

Nurodymai

  • Sukurkite ir parašykite funkciją, kuri apskaičiuoja, kiek laiko (minutėmis) Laurynas sugaišo bėgimui.
  • Programoje nenaudokite sakinių, skirtų darbui su ekranu.

Duomenų ir rezultatų pavyzdžiai

Pavyzdys
Duomenų failo pavyzdys Paaiškinimai
6
 3 09 25 09 40 19 45 20 00
 6 08 30 08 48  0  0  0  0
 7 09 18 09 38 18 52 19 11
10 08 48 09 03 18 45 19 00
15 08 52 09 11 17 58 18 18
30  0  0  0  0 19 02 19 20
* Skaičius dienų, kai Laurynas bėgo bent vieną kartą.
* Liepos mėnesio diena; bėgimo ryte pradžios ir pabaigos
laikas, nurodytas valandomis ir minutėmis; bėgimo
vakare pradžios ir pabaigos laikas, nurodytas valandomis
ir minutėmis. * 0 0 0 0 rodo, jog tą rytą arba vakarą Laurynas nebėgo
Rezultatų failo pavyzdys Paaiškinimai
Minimalus laikas
30
Dienos
3 10
* Mažiausias bėgimo ryte ir vakare laikas minutėmis.
* Liepos mėnesio dienos, kai Laurynas, bėgdamas ir ryte,
ir vakare, sugaišo mažiausiai laiko

1 užduotis. Sprendimas

ĮVESTIS = "U1.txt"
IŠVESTIS = "U1rez.txt"

# skaitymo funkcija
def skaityk_failą():
  # čia saugosime grąžinomus parametrus
  parametrai = []
  
  with open(ĮVESTIS, "rt") as skaitomas_failas:
    # pirma eilutė - kiek dienų bėgta
    dienų_bėgta = int( skaitomas_failas.readline() )

    # skaitome, tiek eilučių, kiek dienų buvo bėgta
    for _ in range(1, dienų_bėgta):
      # skaitoma eilutė
      d = skaitomas_failas.readline().split()
      # paskaičiuojame ryto bėgimo laiką
      rytas = kiek_sugaiso(d[1], d[2], d[3], d[4])
      # paskaičiuojame vakaro bėgimo laiką
      vakaras = kiek_sugaiso(d[5], d[6], d[7], d[8])

      # jeigu ryte arba vakare nebuvo bėgta, tęsiame skaitymą
      if rytas == 0 or vakaras == 0: continue

      # pridedame rezultatą prie grąžinamų parametrų
      parametrai.append({
        'diena': d[0],
        'sugaista': rytas + vakaras
      })
  
  return parametrai

# funkcija, suskaičiuoti, kiek užtruko bėgimas
# sh - starto valanda, sm - starto minutės, gh - galo valanda, gm - galo minutės
# verčiame viską į skaičius, tada minutes, tada atimame ir gauname tiką laiką
def kiek_sugaiso(sh, sm, gh, gm):
  return (int(gh) * 60 + int(gm)) - (int(sh) * 60 + int(sm))

# funkcija, skirta atrinkti atsakymą
def atrink(parametrai):
  # kintamieji. t_laikas - trumpiausias laikas. Priskiriame didelį skaičių, kaip pradinį
  t_laikas = 99999
  atsakymas = {'sugaista': 0, 'dienos': []}

  # atrandame trumpiausia laiką
  for p in parametrai:
    if (t_laikas > p['sugaista']): t_laikas = p['sugaista']

  # užsirašome trumpiausią laiką, kaip tekstinę eilutę (spausdinimui į failą)
  atsakymas['sugaista'] = str(t_laikas)

  for p in parametrai:
    # jeigu truko ilgiau, praleidžiame
    if (t_laikas != p['sugaista']): continue
    # pridedame prie tinkamų dienų rezultate, kaip tekstinė eilutė
    atsakymas['dienos'].append(str(p['diena']))

  return atsakymas

def rašyk_į_failą(atsakymas):
  # atidarome failą
  with open(IŠVESTIS, 'wt') as rasomas_failas:
    # spausdiname rezultatą
    rasomas_failas.writelines([
      'Minimalus laikas',
      '\n',
      atsakymas['sugaista'],
      '\n',
      'Dienos',
      '\n',
      # sujungiame dienas per tarpą
      ' '.join(atsakymas['dienos']) 
    ])

# pagrindinė programa
if (__name__ == "__main__"):
  # skaitome failą
  rezultatai = skaityk_failą()
  # atrenkame tik sąlygą atitinkamus rezultatus
  atsakymas = atrink(rezultatai)
  # surašome viską į failą
  rašyk_į_failą(atsakymas)

2 užduotis. Apklausa

Maksimalus vertinimas – 30 taškų

Monika projektinio darbo metu atliko apklausą, siekdama išsiaiškinti, kurie mokomieji dalykai jos draugams patinka labiausiai. Atlikdama apklausą, ji kaskart pasižymėdavo draugo vardą, jo mėgstamiausią dalyką ir to dalyko pažymius.

Parašykite programą, kuri sudarytų mokinių nurodytų populiariausių dalykų sąrašą ir pateiktų šiuos dalykus pasirinkusių mokinių vardus. Sąraše turi būti pateikiami tik tie dalykai, kuriuos pasirinkusių mokinių pažymių vidurkis yra ne mažesnis kaip 9.

Pradiniai duomenys

Duomenys pateikiami tekstiniame faile U2.txt.

  • Pirmoje eilutėje užrašytas apklaustų mokinių skaičius m (1 ≤ m ≤ 50).
  • Tolesnėse eilutėse užrašyti draugų duomenys: vardas (vienas žodis); jo mėgstamiausias dalykas (vienas žodis); to dalyko pažymių skaičius; pažymiai. Duomenys atskirti vienu tarpo simboliu.

Rezultatai

Rezultatus pateikite tekstiniame faile U2rez.txt.

  • Įrašykite dalykus, kuriuos pasirinkusių mokinių pažymių vidurkis ne mažesnis kaip 9, ir juos pasirinkusių mokinių skaičių. Dalykus rašykite pagal jų populiarumą mažėjančiai. Jei yra keli dalykai, kurių populiarumas vienodas, tai juos pateikite abėcėliškai.
  • Po kiekvieno dalyko atskirose eilutėse pateikite jį pasirinkusių mokinių, kurių to dalyko pažymių vidurkis yra ne mažesnis kaip 9, vardus tokia eilės tvarka, kokia jie buvo užrašyti pradinių duomenų faile.
  • Jeigu tarp dalykų nėra tokių, kuriuos pasirinkusių mokinių pažymių vidurkis ne mažesnis kaip 9, tuomet turi būti pateiktas tekstinis pranešimas „Neatitinka vidurkis“.

Nurodymai

  • Programoje naudokite struktūros duomenų tipo masyvą apklaustų mokinių duomenims saugoti.
  • Sukurkite ir parašykite funkciją, kuri surikiuoja populiariausių dalykų sąrašą.
  • Programoje nenaudokite globalių kintamųjų.
  • Programoje nenaudokite sakinių, skirtų darbui su ekranu

Duomenų ir rezultatų pavyzdžiai

1 pavyzdys
Duomenų failo pavyzdys Paaiškinimai
8
Povilas Matematika 5 9 9 9 9 10
Jonas Istorija 4 10 9 10 10
Milda Matematika 6 10 8 9 9 9 9
Asta Informatika 3 10 10 10
Ieva Matematika 3 9 9 8
Rima Informatika 3 10 10 7
Juozas Fizika 2 8 9
Laura Fizika 1 8
* Apklaustų mokinių skaičius.
* Mokinio vardas; jo mėgstamiausias dalykas; to
dalyko pažymių skaičius; pažymiai.
Rezultatų failo pavyzdys Paaiškinimai
Informatika 2
Asta
Rima
Matematika 2
Povilas
Milda
Istorija 1
Jonas
* Dalykai, kuriuos pasirinkusių mokinių pažymių
vidurkis ne mažesnis kaip 9, ir juos pasirinkusių mokinių skaičius. * Tą dalyką pasirinkusių mokinių vardai.
2 pavyzdys
Duomenų failo pavyzdys Paaiškinimai
4
Linas Informatika 4 10 8 8 9
Ieva Matematika 3 9 9 8
Juozas Fizika 2 8 9
Rokas Chemija 4 9 9 10 7
* Apklaustų mokinių skaičius.
* Mokinio vardas; jo mėgstamiausias dalykas; to
dalyko pažymių skaičius; pažymiai.
Rezultatų failo pavyzdys Paaiškinimai
Neatitinka vidurkis
Nėra nė vieno dalyko, kurį pasirinkusių mokinių
pažymių vidurkis ne mažesnis kaip 9.

2 užduotis. Sprendimas

class Dalykas:
    def __init__(self, pavadinimas):
        self.pavadinimas = pavadinimas
        self.mokiniai = []


def rikiuoti_dalykus(dalykai):
    return sorted(
        dalykai, key=lambda dalykas: (-len(dalykas.mokiniai), dalykas.pavadinimas)
    )


def vidurkis(pažymiai):
    return sum(pažymiai) / len(pažymiai)


with open("U2.txt", "r") as failas:
    mokiniu_skaicius = int(failas.readline())
    dalykai = {}
    for _ in range(mokiniu_skaicius):
        vardas, pavadinimas, pazymiu_skaicius, *pazymiai = failas.readline().split()
        pazymiai = list(map(int, pazymiai))
        if vidurkis(pazymiai) >= 9:
            if pavadinimas not in dalykai:
                dalykai[pavadinimas] = Dalykas(pavadinimas)
            dalykai[pavadinimas].mokiniai.append(vardas)

with open("U2rez.txt", "w") as failas:
    rikiuoti = rikiuoti_dalykus(list(dalykai.values()))
    if not rikiuoti:
        failas.write("Neatitinka vidurkis\n")
    else:
        for dalykas in rikiuoti:
            failas.write(f"{dalykas.pavadinimas} {len(dalykas.mokiniai)}\n")
            for mokinys in dalykas.mokiniai:
                failas.write(f"{mokinys}\n")