IT Egzaminai/2023: Skirtumas tarp puslapio versijų

Iš Pitonas.
183 eilutė: 183 eilutė:
== 2 užduotis. Sprendimas ==
== 2 užduotis. Sprendimas ==
<syntaxhighlight lang="python">
<syntaxhighlight lang="python">
# vieta sprendimui
def apskaičiuoti_panašumą(slaptažodis, įrašyti_slaptažodžiai):
    skirtumų_suma = abs(slaptažodis['ilgis'] - įrašyti_slaptažodžiai['ilgis'])
    skirtumų_suma += abs(slaptažodis['didžiosios_raides'] -
                        įrašyti_slaptažodžiai['didžiosios_raides'])
    skirtumų_suma += abs(slaptažodis['mažosios_raides'] -
                        įrašyti_slaptažodžiai['mažosios_raides'])
    skirtumų_suma += abs(slaptažodis['skaitmenys'] -
                        įrašyti_slaptažodžiai['skaitmenys'])
    skirtumų_suma += abs(slaptažodis['specialūs_simboliai'] -
                        įrašyti_slaptažodžiai['specialūs_simboliai'])
    return skirtumų_suma
 
 
def įvertinti_slaptažodžio_stiprumą(naudotojo_slaptažodis, įrašyti_slaptažodžiai):
    mažiausias_panašumo_reikšmė = float('inf')
    slaptažodžio_stiprumas = ''
    panašūs_slaptažodžiai = []
 
    # Ieškome panašiausio slaptažodžio
    for įrašytas_slaptažodis in įrašyti_slaptažodžiai:
        panašumas = apskaičiuoti_panašumą(
            naudotojo_slaptažodis, įrašytas_slaptažodis)
 
        if panašumas == mažiausias_panašumo_reikšmė:
            panašūs_slaptažodžiai.append(įrašytas_slaptažodis)
 
        if panašumas < mažiausias_panašumo_reikšmė:
            panašūs_slaptažodžiai = [įrašytas_slaptažodis]
            mažiausias_panašumo_reikšmė = panašumas
            slaptažodžio_stiprumas = įrašytas_slaptažodis['stiprumas']
 
    panašūs_slaptažodžiai = sorted(
        panašūs_slaptažodžiai, key=lambda x: x['ilgis'])
    return slaptažodžio_stiprumas, mažiausias_panašumo_reikšmė, panašūs_slaptažodžiai
 
 
def pagrindinis():
    # Nuskaitome duomenis iš failo
    with open('U2.txt', 'r') as failas:
        naudotojo_slaptažodžių_skaičius, įrašytų_slaptažodžių_skaičius = map(
            int, failas.readline().split())
 
        naudotojo_slaptažodžiai = []
        įrašyti_slaptažodžiai = []
 
        # Išskiriame naudotojo ir įrašytus slaptažodžius
        for i in range(1, naudotojo_slaptažodžių_skaičius + 1):
            duomenys = failas.readline()
            slaptažodis = duomenys[:15]
            slaptažodžio_duomenys = duomenys[16:].split()
            naudotojo_slaptažodžiai.append({
                'slaptažodis': slaptažodis,
                'ilgis': int(slaptažodžio_duomenys[0]),
                'didžiosios_raides': int(slaptažodžio_duomenys[1]),
                'mažosios_raides': int(slaptažodžio_duomenys[2]),
                'skaitmenys': int(slaptažodžio_duomenys[3]),
                'specialūs_simboliai': int(slaptažodžio_duomenys[4])
            })
 
        # Išskiriame naudotojo ir įrašytus slaptažodžius
        for i in range(naudotojo_slaptažodžių_skaičius + 1, naudotojo_slaptažodžių_skaičius + įrašytų_slaptažodžių_skaičius + 1):
            duomenys = failas.readline()
            slaptažodis = duomenys[:15]
            slaptažodžio_duomenys = duomenys[16:].split()
            įrašyti_slaptažodžiai.append({
                'slaptažodis': slaptažodis,
                'ilgis': int(slaptažodžio_duomenys[0]),
                'didžiosios_raides': int(slaptažodžio_duomenys[1]),
                'mažosios_raides': int(slaptažodžio_duomenys[2]),
                'skaitmenys': int(slaptažodžio_duomenys[3]),
                'specialūs_simboliai': int(slaptažodžio_duomenys[4]),
                'stiprumas': slaptažodžio_duomenys[5]
            })
 
    # Vertiname slaptažodžio stiprumą ir randame panašiausius slaptažodžius
    rezultatai = []
 
    for naudotojo_slaptažodis in naudotojo_slaptažodžiai:
        slaptažodžio_stiprumas, mažiausias_panašumo_reikšmė, panašūs_slaptažodžiai = įvertinti_slaptažodžio_stiprumą(
            naudotojo_slaptažodis, įrašyti_slaptažodžiai)
        rezultatai.append(
            (naudotojo_slaptažodis['slaptažodis'], slaptažodžio_stiprumas, mažiausias_panašumo_reikšmė, panašūs_slaptažodžiai))
 
    # Rezultatų rašymas į failą
    with open('U2rez.txt', 'w') as failas:
        for rezultatas in rezultatai:
            failas.write(f"{rezultatas[0]} {rezultatas[1]} {rezultatas[2]}\n")
            for panašus_slaptažodis in rezultatas[3]:
                failas.write(f"{panašus_slaptažodis['slaptažodis']}\n")
 
if __name__ == '__main__':
    pagrindinis()
 
</syntaxhighlight>
</syntaxhighlight>

15:02, 20 liepos 2023 versija

Informacinių technologijų valstybinio brandos egzamino užduotis

Čia rasi 2023 m. informacinių technologijų valstybinio brandos egzamino programavimo praktines užduotis ir jų sprendimus python programavimo kalba.

1 užduotis. Žingsniai

Maksimalus vertinimas – 20 taškų

Mokykla, minėdama Pasaulinę sveikatos dieną, surengė savaitės trukmės akciją „Judėk!“ Kiekvienas akcijos dalyvis turėjo užsiregistruoti internetu, nurodydamas savo klasės kategoriją ir žingsnio ilgį, o paskui kiekvieną savaitės dieną įvesti nueitų žingsnių skaičių.

Parašykite programą, kuri pateiktų kiekvienos klasės kategorijos visų akcijoje dalyvavusių mokinių nueito atstumo sąrašą.

Pradiniai duomenys

Duomenys pateikti tekstiniame faile U1.txt.

  • Pirmoje eilutėje užrašytas akcijoje dalyvavusių mokinių skaičius m (10 ≤ m ≤ 50).
  • Tolesnėse eilutėse užrašyti akcijoje dalyvavusių mokinių duomenys: klasės kategorija (skaičius nuo 1 iki 12); žingsnio ilgis centimetrais; kiekvieną akcijos savaitės dieną nueitų žingsnių skaičius. Jeigu mokinys tam tikrą savaitės dieną neįvedė nueitų žingsnių skaičiaus, pateikiama reikšmė 0. Duomenys atskirti vienu tarpo simboliu. Buvo bent vienas mokinys, kuris įvedė nueitų žingsnių skaičių kiekvieną akcijos savaitės dieną.

Rezultatai

Rezultatus pateikite tekstiniame faile U1rez.txt.

  • Spausdinamas kiekvienos klasės kategorijos mokinių viso nueito atstumo sąrašas: klasės kategorija; kiek buvo mokinių, kurie įvedė nueitų žingsnių skaičių kiekvieną akcijos savaitės dieną; visas nurodytos klasės kategorijos nueitas atstumas kilometrais, suapvalintas iki šimtųjų. Jeigu dalyvis bent vieną dieną neįvedė nueitų žingsnių skaičiaus, jo duomenys nėra naudojami skaičiavimams. Duomenys atskirti vienu tarpo simboliu.
  • Vienoje eilutėje pateikiami vienos klasės kategorijos duomenys. Jeigu kurioje nors klasės kategorijoje nebuvo nė vieno mokinio, kuris įvedė nueitų žingsnių skaičių kiekvieną akcijos savaitės dieną, tai duomenų apie šią klasės kategoriją pateikti nereikia. Sąrašas pagal klasių kategorijas pateikiamas tokia eilės tvarka, kokia jos buvo nurodytos pradinių duomenų faile.

Nurodymai

  • Sukurkite ir parašykite vieną funkciją, kuri apskaičiuoja kiekvienos klasės kategorijos visą nueitą atstumą kilometrais ir suskaičiuoja, kiek tos klasės kategorijos mokinių įvedė nueitų žingsnių skaičių kiekvieną akcijos savaitės dieną.

Duomenų ir rezultatų pavyzdžiai

Duomenų failo pavyzdys Paaiškinimai
10
7 76 4353 8738 4946 6484 8946 6336 6284
11 74 4352 4578 7239 3157 7856 4648 5850
6 70 5731 9017 7641 6785 8865 3184 6800
5 68 9147 9702 8671 0 5398 9555 7141
8 71 7550 0 9089 8446 4390 0 7901
7 68 4227 7160 9565 3297 4401 5740 6908
7 73 6362 6705 0 9017 5971 3154 3585
6 73 7053 8752 7606 4079 5204 3819 3310
5 73 4263 5836 3336 5401 4719 0 0
8 71 8588 5617 6903 9565 6445 6786 4522
• Akcijoje dalyvavusių mokinių skaičius.
• Mokinių duomenys: klasės kategorija; 
žingsnio ilgis centimetrais; kiekvieną
akcijos savaitės dieną nueitų žingsnių 
skaičius.
• Reikšmė 0 rodo, kad mokinys neįvedė 
tos dienos duomenų
Rezultatų failo pavyzdys Paaiškinimai
7 2 63.11
11 1 27.88
6 2 62.69
8 1 34.38
• Klasių kategorijų duomenys: klasės
kategorija; kiek buvo mokinių, kurie
įvedė nueitų žingsnių skaičių kiekvieną
akcijos savaitės dieną; visas tos klasės
kategorijos mokinių nueitas atstumas
kilometrais, suapvalintas iki šimtųjų.
• Sąrašas pagal klasių kategorijas
pateikiamas tokia eilės tvarka, kokia jos
buvo nurodytos pradinių duomenų faile.

1 užduotis. Sprendimas

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

def skaičiuoti(žingsnio_ilgis, žingsniai_sąrašas):
    viso = 0
    for žingsniai in žingsniai_sąrašas:
        viso = viso + (žingsniai * žingsnio_ilgis)
    return viso

def skaityti():
    with open(ĮVESTIS, 'r', encoding='utf-8') as failas:
        dalyvių_sąrašas = {}
        dalyvių_skaičius = int(failas.readline())
        for _ in range(dalyvių_skaičius):
            reikšmės = list(map(int, failas.readline().split()))
            klasė = str(reikšmės[0])
            žingsnio_ilgis = reikšmės[1]
            žingsniai_sąrašas = reikšmės[2:]

            if 0 in žingsniai_sąrašas:
                continue
            if not dalyvių_sąrašas.get(klasė):
                dalyvių_sąrašas[klasė] = { 'kiekis': 1, 'atstumas': 0 }
            else:
                dalyvių_sąrašas[klasė]['kiekis'] += 1
            
            dalyvių_sąrašas[klasė]['atstumas'] += skaičiuoti(žingsnio_ilgis, žingsniai_sąrašas)
        return dalyvių_sąrašas

def rašyti(duomenys):
    with open(IŠVESTIS, 'w', encoding='utf-8') as f:
        for klasė, reikšmės in duomenys.items():
            kilometrai = round((reikšmės["atstumas"] / (1000 * 100)), 2)
            f.write(f'{klasė} {reikšmės["kiekis"]} {kilometrai}\n')

if __name__ == '__main__':
    duomenys = skaityti()
    rašyti(duomenys)

2 užduotis. Slaptažodžiai

Maksimalus vertinimas – 30 taškų

Vaida, atlikdama informatikos projektinį darbą apie slaptažodžius, sukūrė mobiliąją programėlę. Programėlė palygina naudotojo įvesto slaptažodžio duomenis su Vaidos iš anksto į programėlę įrašytų įvairaus stiprumo slaptažodžių duomenimis ir įvertina naudotojo įvesto slaptažodžio stiprumą – silpnas, vidutinis ar stiprus.

Parašykite programą, kuri įvertintų mobiliosios programėlės naudotojo įvestų slaptažodžių stiprumą. Norint įvertinti naudotojo įvesto slaptažodžio stiprumą, reikia rasti į jį panašiausią slaptažodį Vaidos įrašytų slaptažodžių sąraše. Panašumo reikšmė nustatoma, apskaičiuojant naudotojo įvesto ir kiekvieno Vaidos į programėlę įrašyto slaptažodžio parametrų skirtumų absoliučiųjų didumų sumą. Kuo mažesnė apskaičiuota slaptažodžių panašumo reikšmė, tuo panašesni slaptažodžiai.

Pradiniai duomenys

Duomenys pateikiami tekstiniame faile U2.txt.

  • Pirmoje eilutėje užrašyta naudotojo įvestų slaptažodžių skaičius n (1 ≤ n ≤ 5) ir Vaidos iš anksto į programėlę įrašytų įvairaus stiprumo slaptažodžių skaičius s (5 ≤ s ≤ 25).
  • Tolesnėse eilutėse užrašyti:
    • mobiliosios programėlės naudotojo įvestų slaptažodžių duomenys: slaptažodis (15 simbolių); slaptažodžio ilgis; didžiųjų raidžių kiekis; mažųjų raidžių kiekis; skaitmenų kiekis; specialiųjų simbolių kiekis;
    • Vaidos iš anksto į programėlę įrašytų slaptažodžių duomenys: slaptažodis (15 simbolių); slaptažodžio ilgis; didžiųjų raidžių kiekis; mažųjų raidžių kiekis; skaitmenų kiekis; specialiųjų simbolių kiekis; slaptažodžio stiprumą nusakanti žymė (Silpnas, Vidutinis, Stiprus; 9 simboliai). Duomenys atskirti vienu tarpo simboliu.

Rezultatai

Rezultatus pateikite tekstiniame faile U2rez.txt.

  • Nuo eilutės pradžios įrašykite mobiliosios programėlės naudotojo įvesto slaptažodžio duomenis: slaptažodis, nustatyta slaptažodžio stiprumo žymė ir apskaičiuota slaptažodžių panašumo mažiausia reikšmė. Yra žinoma, kad naudotojo įvestų slaptažodžių nustatyta stiprumo žymė sutapo tik su viena kuria nors Vaidos įrašytų slaptažodžių žyme. Duomenis eilutėje atskirkite vienu tarpo simboliu.
  • Po naudotojo kiekvieno įvesto slaptažodžio atskirose eilutėse pateikite Vaidos įrašytų slaptažodžių, kurie panašiausi į naudotojo įvestą slaptažodį, sąrašą. Sąrašą surikiuokite pagal slaptažodžių ilgį mažėjančiai. Jeigu yra keli vienodo ilgio slaptažodžiai, jie turi būti pateikiami tokia eilės tvarka, kokia juos surašė Vaida.

Nurodymai

  • Programoje naudokite struktūros duomenų tipo masyvus mobiliosios programėlės naudotojo įvestų ir Vaidos iš anksto į programėlę įrašytų slaptažodžių duomenims saugoti. Python programavimo kalboje naudokite žodyno duomenų struktūrą arba struktūrą sudarykite, naudodami klases.
  • Sukurkite ir parašykite funkciją2, kuri apskaičiuotų mobiliosios programėlės naudotojo įvesto slaptažodžio ir Vaidos iš anksto į programėlę įrašyto slaptažodžio panašumo reikšmę.

Duomenų ir rezultatų pavyzdžiai

Duomenų failo pavyzdys Paaiškinimai
2 7
Katinas.33#?    12 1 6 2 3
kasa11          6 0 4 2 0
slaptas135      10 0 7 3 0 Vidutinis
admin           5 0 5 0 0 Silpnas
Pyragaitis12!   13 1 9 2 1 Stiprus
11Auto11        8 1 3 4 0 Vidutinis
abcdef1         7 0 6 1 0 Silpnas
<EgZaMiNaS>     11 5 4 0 2 Stiprus
saitas1         7 0 6 1 0 Silpnas
● Naudotojo įvestų slaptažodžių skaičius; Vaidos
iš anksto į programėlę įrašytų slaptažodžių
skaičius.
● Naudotojo įvestų slaptažodžių duomenys:
slaptažodis; slaptažodžio ilgis; didžiųjų raidžių
kiekis; mažųjų raidžių kiekis; skaitmenų
kiekis; specialiųjų simbolių kiekis.
● Vaidos iš anksto į programėlę įrašytų
slaptažodžių duomenys: slaptažodis;
slaptažodžio ilgis; didžiųjų raidžių kiekis;
mažųjų raidžių kiekis; skaitmenų kiekis;
specialiųjų simbolių kiekis; stiprumą nusakanti
žymė.
Rezultatų failo pavyzdys Paaiškinimai
Katinas.33#?    Stiprus   6
Pyragaitis12!   
kasa11          Silpnas   4
abcdef1
saitas1
admin
● Naudotojo įvesto slaptažodžio duomenys:
slaptažodis; nustatyta slaptažodžio stiprumo
žymė; apskaičiuota slaptažodžių panašumo
mažiausia reikšmė.
● Vaidos įrašytų slaptažodžių, kurie panašiausi į
naudotojo įvestą slaptažodį, sąrašas. Sąrašas
surikiuotas pagal slaptažodžių ilgį mažėjančiai.

2 užduotis. Sprendimas

def apskaičiuoti_panašumą(slaptažodis, įrašyti_slaptažodžiai):
    skirtumų_suma = abs(slaptažodis['ilgis'] - įrašyti_slaptažodžiai['ilgis'])
    skirtumų_suma += abs(slaptažodis['didžiosios_raides'] -
                         įrašyti_slaptažodžiai['didžiosios_raides'])
    skirtumų_suma += abs(slaptažodis['mažosios_raides'] -
                         įrašyti_slaptažodžiai['mažosios_raides'])
    skirtumų_suma += abs(slaptažodis['skaitmenys'] -
                         įrašyti_slaptažodžiai['skaitmenys'])
    skirtumų_suma += abs(slaptažodis['specialūs_simboliai'] -
                         įrašyti_slaptažodžiai['specialūs_simboliai'])
    return skirtumų_suma


def įvertinti_slaptažodžio_stiprumą(naudotojo_slaptažodis, įrašyti_slaptažodžiai):
    mažiausias_panašumo_reikšmė = float('inf')
    slaptažodžio_stiprumas = ''
    panašūs_slaptažodžiai = []

    # Ieškome panašiausio slaptažodžio
    for įrašytas_slaptažodis in įrašyti_slaptažodžiai:
        panašumas = apskaičiuoti_panašumą(
            naudotojo_slaptažodis, įrašytas_slaptažodis)

        if panašumas == mažiausias_panašumo_reikšmė:
            panašūs_slaptažodžiai.append(įrašytas_slaptažodis)

        if panašumas < mažiausias_panašumo_reikšmė:
            panašūs_slaptažodžiai = [įrašytas_slaptažodis]
            mažiausias_panašumo_reikšmė = panašumas
            slaptažodžio_stiprumas = įrašytas_slaptažodis['stiprumas']

    panašūs_slaptažodžiai = sorted(
        panašūs_slaptažodžiai, key=lambda x: x['ilgis'])
    return slaptažodžio_stiprumas, mažiausias_panašumo_reikšmė, panašūs_slaptažodžiai


def pagrindinis():
    # Nuskaitome duomenis iš failo
    with open('U2.txt', 'r') as failas:
        naudotojo_slaptažodžių_skaičius, įrašytų_slaptažodžių_skaičius = map(
            int, failas.readline().split())

        naudotojo_slaptažodžiai = []
        įrašyti_slaptažodžiai = []

        # Išskiriame naudotojo ir įrašytus slaptažodžius
        for i in range(1, naudotojo_slaptažodžių_skaičius + 1):
            duomenys = failas.readline()
            slaptažodis = duomenys[:15]
            slaptažodžio_duomenys = duomenys[16:].split()
            naudotojo_slaptažodžiai.append({
                'slaptažodis': slaptažodis,
                'ilgis': int(slaptažodžio_duomenys[0]),
                'didžiosios_raides': int(slaptažodžio_duomenys[1]),
                'mažosios_raides': int(slaptažodžio_duomenys[2]),
                'skaitmenys': int(slaptažodžio_duomenys[3]),
                'specialūs_simboliai': int(slaptažodžio_duomenys[4])
            })

        # Išskiriame naudotojo ir įrašytus slaptažodžius
        for i in range(naudotojo_slaptažodžių_skaičius + 1, naudotojo_slaptažodžių_skaičius + įrašytų_slaptažodžių_skaičius + 1):
            duomenys = failas.readline()
            slaptažodis = duomenys[:15]
            slaptažodžio_duomenys = duomenys[16:].split()
            įrašyti_slaptažodžiai.append({
                'slaptažodis': slaptažodis,
                'ilgis': int(slaptažodžio_duomenys[0]),
                'didžiosios_raides': int(slaptažodžio_duomenys[1]),
                'mažosios_raides': int(slaptažodžio_duomenys[2]),
                'skaitmenys': int(slaptažodžio_duomenys[3]),
                'specialūs_simboliai': int(slaptažodžio_duomenys[4]),
                'stiprumas': slaptažodžio_duomenys[5]
            })

    # Vertiname slaptažodžio stiprumą ir randame panašiausius slaptažodžius
    rezultatai = []

    for naudotojo_slaptažodis in naudotojo_slaptažodžiai:
        slaptažodžio_stiprumas, mažiausias_panašumo_reikšmė, panašūs_slaptažodžiai = įvertinti_slaptažodžio_stiprumą(
            naudotojo_slaptažodis, įrašyti_slaptažodžiai)
        rezultatai.append(
            (naudotojo_slaptažodis['slaptažodis'], slaptažodžio_stiprumas, mažiausias_panašumo_reikšmė, panašūs_slaptažodžiai))

    # Rezultatų rašymas į failą
    with open('U2rez.txt', 'w') as failas:
        for rezultatas in rezultatai:
            failas.write(f"{rezultatas[0]} {rezultatas[1]} {rezultatas[2]}\n")
            for panašus_slaptažodis in rezultatas[3]:
                failas.write(f"{panašus_slaptažodis['slaptažodis']}\n")

if __name__ == '__main__':
    pagrindinis()