Első megoldás
Szerkesztés
Tesztelve a 3.6.1 verzióban.
# coding: utf-8 """ 2017. őszi közismereti érettségi, Hiányzások feladat A megoldások sorrendjét a célszerűség diktálja. """ def f(i): print('%d. feladat:' % i) # Először megoldom azt a két feladatot, amihez nem kell beolvasni a forrást. # Pythonosítom a 4. feladatban megadott pszeudokódot ékezetekkel: def hetnapja(honap, nap): napnev = \ ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"] napszam = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 335] napsorszam = (napszam[honap - 1] + nap) % 7 return napnev[napsorszam] f(5) datum = [int(i) for i in input('Adja meg a hónap és a nap sorszámát vesszővel elválasztva: ').split(',')] # A következő sorban alkalmazott Python-specifikus rövidítő megoldás a kicsomagolás. print('Ez a nap ' + hetnapja(*datum) + '.') # 1. feladat text = open('naplo.txt').readlines() # Lista lesz. # Elvégzem az egyetlen további adatbekérést, hogy egy menetben oldhassak meg mindent. f(6) nap_ora = input('Kérem a nap nevét és az óra sorszámát szóközel elválasztva: ').split(' ') nap = nap_ora[0] ora = int(nap_ora[1]) hianyzas_sorok = 0 igazolt = 0 igazolatlan = 0 adott_ora = 0 aktualis_nap = '' hianyzok = dict() for line in text: if line.startswith('#'): datum = [int(n) for n in line.split(' ')[1:]] aktualis_nap = hetnapja(*datum) else: if len(line) > 1: # Hátha beolvasott üres sort. hianyzas_sorok += 1 l = line.rsplit(' ', 1) neve = l[0] jelek = l[1] igazolt += jelek.count('X') igazolatlan += jelek.count('I') if aktualis_nap == nap and jelek[ora-1] in 'IX': adott_ora +=1 hianyzok[neve] = hianyzok.get(neve,0) + jelek.count('X') + jelek.count('I') print('%s %d. órában összesen %d hiányzás történt.' % \ (nap.title(), ora, adott_ora)) f(2) print('A naplóban %d bejegyzés van.' % hianyzas_sorok) f(3) print('Az igazolt hiányzások száma %d, az igazolatlanoké %d óra.' % \ (igazolt, igazolatlan)) f(7) maxh = max(hianyzok.values()) print('A legtöbbet hiányzó tanulók: ' + ' '.join([k for k in hianyzok if hianyzok[k] == maxh]))
Második megoldás
Szerkesztés
Tesztelve a 3.6.1 verzióban.
# coding: utf-8 """ 2017. őszi közismereti érettségi, Hiányzások feladat Ez a megoldás sqlite adatbázist használ. https://docs.python.org/3/library/sqlite3.html """ import sqlite3 def f(i): print('%d. feladat:' % i) # Először megoldom azt a két feladatot, amihez nem kell beolvasni a forrást. # Pythonosítom a 4. feladatban megadott pszeudokódot ékezetekkel: def hetnapja(honap, nap): napnev = \ ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"] napszam = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 335] napsorszam = (napszam[honap - 1] + nap) % 7 return napnev[napsorszam] f(5) datum = [int(i) for i in input('Adja meg a hónap és a nap sorszámát vesszővel elválasztva: ').split(',')] # A következő sorban alkalmazott Python-specifikus rövidítő megoldás a kicsomagolás. print('Ez a nap ' + hetnapja(*datum) + '.') # Előkészítem az adatbázist conn = sqlite3.connect(':memory:') # A RAM-ban hoz létre adatbázist. c = conn.cursor() c.execute('CREATE TABLE naplo(nap text, neve text, jelek text, hiany integer)') # 1. feladat text = open('naplo.txt').readlines() # Lista lesz. aktualis_nap = '' for line in text: if line.startswith('#'): datum = [int(n) for n in line.split(' ')[1:]] aktualis_nap = hetnapja(*datum) else: if len(line) > 1: # Hátha beolvasott üres sort. l = line.rsplit(' ', 1) neve = l[0] jelek = l[1] hiany = jelek.count('I') + jelek.count('X') tup = (aktualis_nap, neve, jelek, hiany) c.execute('INSERT INTO naplo VALUES(?, ?, ?, ?)', tup) f(2) c.execute('SELECT total_changes()') print('A naplóban %d bejegyzés van.' % c.fetchone()) f(3) c.execute("SELECT group_concat(jelek, '') FROM naplo") s = c.fetchone() igazolt = s[0].count('X') igazolatlan = s[0].count('I') print('Az igazolt hiányzások száma %d, az igazolatlanoké %d óra.' % \ (igazolt, igazolatlan)) f(6) nap_ora = input('Kérem a nap nevét és az óra sorszámát szóközel elválasztva: ').split(' ') nap = nap_ora[0] ora = int(nap_ora[1]) # A string viszi az aposztrófját a lekérdezésbe, ezért kell int. sql = "SELECT sum(case when instr('IX', substr(jelek, ?, 1))>0 then 1 else 0 end) FROM naplo WHERE nap=?" c.execute(sql, (ora, nap)) print('%s %d. órában összesen %d hiányzás történt.' % \ (nap.title(), ora, c.fetchone()[0])) f(7) sql = "WITH osszes AS (select neve, sum(hiany) as ora from naplo group by neve), " + \ "maximum as (select max(ora) as m from osszes), " + \ "tagok AS (select neve from osszes inner join maximum on osszes.ora=maximum.m) " + \ "SELECT group_concat(neve, ' ') FROM tagok" c.execute(sql) print('A legtöbbet hiányzó tanulók: ' + c.fetchone()[0])
Harmadik megoldás videón
Szerkesztés
Érettségi feladatok programozásból |
---|
2004 Személyazonosító jel
2005 Lottó • Vigenère-tábla 2006 Telefonszámla • Fehérje • Zenei adók 2007 SMS-szavak • Foci 2008 SMS • Robot 2009 Lift • Automata • Útépítés 2010 Helyjegy • Telek • Anagramma 2011 Szójáték • Rejtvény • Pitypang 2012 Futár • Törtek • Szín-kép 2013 Választások • Számok • Közúti ellenőrzés 2014 IPv6 • Céllövészet • Nézőtér 2015 Expedíció • Latin táncok • Fej vagy írás 2016 Ötszáz • Zár • Telefonos ügyfélszolgálat 2017 Tesztverseny • Fürdő • Hiányzások 2018 Társalgó • Fogadóóra |