Hiányzások – a 2017. októberi emelt szintű informatika érettségi programozás-feladatának megoldása

A Hiányzások című feladatsor nem meglepő módon hiányzásokkal foglalkozik, mármint egy osztály tanulóinak hiányzásaival.

A bemenő fájl szerkezete viszonylag bonyolult, ezért már a beolvasás során átalakítjuk olyanra, hogy könnyebb legyen vele dolgoznunk. Olyasmit teszünk vele, amelyet nagy adattömeget mozgató valós programban nem tennénk: redundanciát viszünk abba az adatszerkezetbe, amelyben a fájlban lévő adatokat tároljuk, azaz lesznek olyan adataink, amelyeket “fölöslegesen” többször is tárolunk. Adatbázis-kezelésből kölcsönvett fogalommal az adatainkat denormalizáljuk, megkönnyítendő a feldolgozásukat.

A feladat szövege és a forrásfájl letölthető innen.

És hát, lássuk a megoldást:

Íme a videóbeli megoldás forráskódja:


#!/usr/bin/env python3

def hetnapja(honap, nap):
    napnev = ["vasarnap", "hetfo", "kedd", "szerda", "csutortok", 'pentek', "szombat"]
    napszam = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 335]
    napsorszam = (napszam[honap-1]+nap) % 7
    hetnapja = napnev[napsorszam]
    return hetnapja

napló = []

forrásfájl = open('naplo.txt')
for sor in forrásfájl:
    sor = sor.strip().split()
    if sor[0] == '#': #dátumot találtunk
        hónap = int(sor[1])
        nap = int(sor[2])
    else: #hiányzás-bejegyzést találtunk
        vezetéknév = sor[0]
        keresztnév = sor[1]
        hiányzás = sor[2]
        napló.append([hónap, nap, vezetéknév + ' ' + keresztnév, hiányzás])
forrásfájl.close()

print('2. feladat')
print('A naplóban', len(napló), 'bejegyzés van.')

print('3. feladat')
igazolt = 0
igazolatlan = 0
for bejegyzés in napló:
    igazolt += bejegyzés[3].count('X')
    igazolatlan += bejegyzés[3].count('I')
print('Az igazolt hiányzások száma', igazolt, 'az igazolatlanoké', igazolatlan, 'óra.')

hónap = int(input('5. feladat\nA hónap sorszáma='))
nap = int(input('A nap sorszáma='))
print('Azon a napon', hetnapja(hónap, nap), 'volt.')

napneve = input('6. feladat\nA nap neve=')
órasorszáma = int(input('Az óra sorszáma='))
hiányzások = 0
for bejegyzés in napló:
    if hetnapja(bejegyzés[0], bejegyzés[1]) == napneve:
        if bejegyzés[3][órasorszáma-1] in ['X', 'I']:
        hiányzások += 1
print('Ekkor összesen', hiányzások, 'óra hiányzás történt.')

print('7. feladat:')

névhalmaz = set()
for bejegyzés in napló:
    névhalmaz.add(bejegyzés[2])

hiányzáslista = []
for név in névhalmaz:
    hiányzások = 0
    for bejegyzés in napló:
        if bejegyzés[2] == név:
            hiányzások = hiányzások + bejegyzés[3].count('X') + bejegyzés[3].count('I')
    hiányzáslista.append([név, hiányzások])

legnagyobb_hiányzás = 0
for bejegyzés in hiányzáslista:
    if bejegyzés[1] > legnagyobb_hiányzás:
    legnagyobb_hiányzás = bejegyzés[1]

legtöbbet_hiányzók = []
for bejegyzés in hiányzáslista:
    if bejegyzés[1] == legnagyobb_hiányzás:
        legtöbbet_hiányzók.append(bejegyzés[0])

print('A legtöbbet hiányzók:', ' '.join(legtöbbet_hiányzók))

Legutóbb nagyot koppantunk. Legközelebb fürdőbe megyünk.

Hiányzások – a 2017. októberi emelt szintű informatika érettségi programozás-feladatának megoldása” bejegyzéshez egy hozzászólás

Hozzászólás