Korábbi érettségi programozás feladatsorok és megoldásaik
2022. október (Jeladó)
Az állatok mozgását ma már rutinszerűen figyelik a rájuk rögzített jeladók segítségével.
Ebben a feladatban egy ilyen jeladó által továbbított adatokat kell feldolgoznia.
Az itt használt jeladó úgy működik, hogy helyének x és y koordinátáját továbbítja. Jelet küld,
ha a legutolsó küldés óta bármely koordináta változása elérte a 10 egységet. Ha nem történt
ekkora elmozdulás, 5 perc elteltével akkor is mindenképpen jelenti helyét. A vevőegység egy
fájlban rögzíti a jel érkezési idejét és a pozíciót. Előfordulhat, hogy a vétel meghiúsul, ezért
lehetnek egymást követő adatsorok, amelyek között 5 percnél több idő telik el, vagy a
koordináták változása 10 egységnél nagyobb.
Rendelkezésére áll a jel.txt nevű adatfájl, amely egy napról tartalmaz adatokat
időrendben. Soraiban öt egész szám található, egymástól egy-egy szóközzel elválasztva. Az
első három szám a jeladás időpontját (óra, perc, másodperc) adja meg, a negyedik szám az x,
az ötödik az y koordináta. A sorok száma legfeljebb 1000, a koordináták -10 000 és 10 000
közötti értékek lehetnek.
Például:
A példa első csoportjában a második sor megmutatja, hogy a jeladó 5 egységnyit mozdult x, 2 egységnyit pedig y irányban 5 perc alatt. A harmadik bejegyzés azért született, mert y irányban 10 egységnyit mozdult el a jeladó, a negyedik bejegyzés pedig egy x irányú 10 egységnyi elmozdulást jelez.
A példa második csoportjában a második sor adataiból látszik, hogy legalább egyszer nem jutott el a jel a vevőhöz, mert 5 percnél több idő telt el az előző vételtől, de az eltelt idő a 10 percet nem haladja meg. A második és harmadik vétel által jelzett pozíciók y koordinátája
29 egységnyivel eltér, ezért legalább két vétel nem került rögzítésre.
Készítsen programot, amely az állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentse jelado néven! A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.
A képernyőre írást igénylő részfeladatok esetén – a mintához tartalmában hasonlóan – írja ki a képernyőre a feladat sorszámát (például: 5. feladat), és utaljon a kiírt tartalomra is!
Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Mindkét esetben az ékezetmentes kiírás is elfogadott.
1. Olvassa be a jel.txt állomány tartalmát, tárolja el a rögzített jelek adatait, és azok felhasználásával oldja meg a következő feladatokat!
2. Kérje be a felhasználótól egy jel sorszámát (a sorszámozás 1-től indul), és írja a képernyőre az adott jeladáshoz tartozó x és y koordinátát!
3. Készítsen függvényt eltelt néven, amely megadja, hogy a paraméterként átadott két időpont között hány másodperc telik el! A két időpontot, mint paramétert tetszőleges módon átadhatja. Használhat három-három számértéket, két tömböt vagy listát, de más, a célnak megfelelő típusú változót is. Ezt a függvényt később használja fel legalább egy feladat megoldása során!
4. Adja meg, mennyi idő telt el az első és az utolsó észlelés között! Az időt óra:perc:mperc alakban írja a képernyőre!
5. Határozza meg azt a legkisebb, a koordináta-rendszer tengelyeivel párhuzamos oldalú téglalapot, amelyből nem lépett ki a jeladó! Adja meg a téglalap bal alsó és jobb felső sarkának koordinátáit!
6. Írja a képernyőre, hogy mennyi volt a jeladó elmozdulásainak összege! Úgy tekintjük, hogy a jeladó két pozíciója közötti elmozdulása a pozíciókat összekötő egyenes mentén történt. Az összeget három tizedes pontossággal jelenítse meg! A kiírásnál a tizedesvessző és tizedespont kiírása is elfogadott. Az i-edik és az i+1-edik pontok távolságát a $\sqrt{(x_i-x_{i-1})^2+(y_i-y_{i-1})^2}$ képlet segítségével határozhatja meg.
7. Írja a kimaradt.txt fájlba a kimaradt észlelésekkel kapcsolatos adatokat! A kimeneti fájlban azok a bemeneti állományban rögzített vételi időpontok jelenjenek meg, amelyek előtt közvetlenül egy vagy több észlelés kimaradt! Az időpont mellett – a mintának
megfelelően – jelenjen meg, hogy legalább hány jel maradt ki és az is, hogy miből következtet a hiányra! Ha idő- és koordináta-eltérésből is adódik jelkimaradás, akkor a nagyobb értéket írja ki! Ha az időeltérés és a koordináták eltérése alapján is ugyanannyi
jelkimaradásra következtetünk, akkor bármelyiket kiírhatja.
Minta
2. feladat
Adja meg a jel sorszámát! 3
x=126 y=639
fajl = open("jel.txt")
forras = fajl.read().splitlines()
fajl.close()
adatok = [sor.split(" ") for sor in forras] #adatok[ó,p,mp,x,y]
for adat in adatok: #számokká konvertáljuk az adatokat stringből for i in range(len(adat)): adat[i] = int(adat[i])
#print(adatok) #ellenőrző kiírás
ssz = int(input("2. feladat\nAdja meg a jel sorszámát! "))-1
print(f"x={adatok[ssz][3]} y={adatok[ssz][4]}")
def eltelt(ido1,ido2): #ido1: [ó1,p1,mp1] és idő2[ó2,p2,mp2] #mindent másodpercbe váltunk, és visszaadjuk a kettő különbségét return 3600*ido2[0]+60*ido2[1]+ido2[2]-(3600*ido1[0]+60*ido1[1]+ido1[2])
it = eltelt(adatok[0][:3],adatok[-1][:3])
print(f"\n4. feladat\nIdőtartam: {it//3600}:{(it-3600*(it//3600))//60}:{it%60}")
xek = [adat[3] for adat in adatok]
yok = [adat[4] for adat in adatok]
print(f"\n5. feladat\nBal alsó: {min(xek)} {min(yok)}, jobb felső: {max(xek)} {max(yok)}")
tav = 0
for i in range(1,len(adatok)): tav += ((adatok[i][3]-adatok[i-1][3])**2 + (adatok[i][4]-adatok[i-1][4])**2)**0.5
print(f"\n6. feladat\nElmozdulás: {round(tav,3)} egység")
fajl = open("kimaradt-vg.txt","w")
for i in range(1,len(adatok)): regi = adatok[i] uj = adatok[i-1] kimaradtido = 0 xkimaradtkoord = 0 ykimaradtkoord = 0 kimaradtkoord = 0 idokulonbseg = eltelt(adatok[i-1][:3],adatok[i][:3]) xkulonbseg = abs(adatok[i][3] - adatok[i-1][3]) ykulonbseg = abs(adatok[i][4] - adatok[i-1][4]) if idokulonbseg > 300: kimaradtido = (idokulonbseg // 300) if idokulonbseg % 300 == 0: kimaradtido -= 1 if xkulonbseg//10>0: xkimaradtkoord = xkulonbseg//10 if xkulonbseg%10 == 0: xkimaradtkoord -= 1 if ykulonbseg//10>0: ykimaradtkoord = ykulonbseg//10 if ykulonbseg%10 == 0: ykimaradtkoord -= 1 kimaradtkoord = max([xkimaradtkoord,ykimaradtkoord]) if kimaradtido+kimaradtkoord > 0: #ha nem volt eltérés, ez az összeg 0 if kimaradtido > kimaradtkoord: print(f"{regi[0]} {regi[1]} {regi[2]} időeltérés {kimaradtido}",file=fajl) else: print(f"{regi[0]} {regi[1]} {regi[2]} koordináta-eltérés {kimaradtkoord}",file=fajl)
fajl.close()
2022. május (Építményadó)
Egy Balaton-parti önkormányzat építményadót vezet be. Az adó mértéke a telken lévő építmény alapterületétől és a teleknek a Balatontól mért távolságától függ. A telkeket a Balatonparttól mért távolságtól függően három sávba sorolták be. Az A sávba azok a telkek kerültek, amelyek 300 méternél közelebb vannak a tóhoz a B sáv az előzőn túl 600 méter távolságig terjed, a többi telek a C sávba tartozik. Az építmény után négyzetméterenként fizetendő összeg sávonként eltérő, azonban, ha az így kiszámított összeg nem éri el a 10.000 Ft-ot, akkor az adott építmény után nem kell adót fizetni.
A testületi döntést az Adó Ügyosztály egy mintával készítette elő, amely csupán néhány utca
adatait tartalmazza. Ezek az adatok az utca.txt fájlban vannak. A fájl első sorában a három
adósávhoz tartozó négyzetméterenként fizetendő összeg található A, B, C sorrendben, egy-egy
szóközzel elválasztva:
800 600 100
…
33366 Aradi 8A C 180
22510 Aradi 8B C 137
90561 Aradi 10 C 168
…
A többi sorban egy-egy építmény adatai szerepelnek egy-egy szóközzel elválasztva. Az első
a telek tulajdonosának ötjegyű adószáma; egy tulajdonosnak több telke is lehet. A második adat
az utca neve, amely nem tartalmazhat szóközt. A harmadik adat a házszám, majd az adósáv
megnevezése, végül az építmény alapterülete következik. A minta harmadik sorában például
azt látjuk, hogy a 33366 adószámú tulajdonos telke az Aradi utca 8A-ban található, és a C sávba
eső telken álló építmény alapterülete 180 m2.
A fájl legfeljebb 1000 telek adatait tartalmazza. A feladat megoldása során kihasználhatja,
hogy a fájlban az adatok utca, azon belül pedig házszám szerinti sorrendben következnek.
Készítsen programot, amely az utca.txt állomány adatait felhasználva az alábbi
kérdésekre válaszol! A program forráskódját mentse epitmenyado néven!
(A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell
ellenőriznie, és feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok esetén – a mintához tartalmában hasonlóan – írja
ki a képernyőre a feladat sorszámát (például: 3. feladat), és utaljon a kiírt tartalomra is!
Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Mindkét
esetben az ékezetmentes kiírás is elfogadott.
1. Olvassa be és tárolja el az utca.txt állományban talált adatokat, és annak
felhasználásával oldja meg a következő feladatokat!
2. Hány telek adatai találhatók az állományban? Az eredményt írassa ki a mintának
megfelelően a képernyőre!
3. Kérje be egy tulajdonos adószámát, és írassa ki a mintához hasonlóan, hogy melyik utcában,
milyen házszám alatt van építménye! Ha a megadott azonosító nem szerepel az
adatállományban, akkor írassa ki a „Nem szerepel az adatállományban.” hibaüzenetet!
4. Készítsen függvényt ado néven, amely meghatározza egy adott építmény után fizetendő
adót! A függvény paraméterlistájában szerepeljen az adósáv és az alapterület, visszaadott
értéke pedig legyen a fizetendő adó! A következő feladatokban ezt a függvényt is
felhasználhatja.
5. Határozza meg, hogy hány építmény esik az egyes adósávokba, és mennyi az adó összege
adósávonként! Az eredményt a mintának megfelelően írassa ki a képernyőre!
6. Bár az utcák többé-kevésbé párhuzamosak a tó partjával, az egyes porták távolsága a parttól
az utcában nem feltétlenül ugyanannyi. Emiatt néhány utcában – az ottani tulajdonosok
felháborodására – egyes telkek eltérő sávba esnek. Listázza ki a képernyőre, hogy melyek
azok az utcák, ahol a telkek sávokba sorolását emiatt felül kell vizsgálni! Feltételezheti,
hogy minden utcában van legalább két telek.
7. Határozza meg a fizetendő adót tulajdonosonként! A tulajdonos adószámát és a fizetendő
összeget írassa ki a mintának megfelelően a fizetendo.txt állományba! A fájlban
minden tulajdonos adatai új sorban szerepeljenek, a tulajdonos adószámát egy szóközzel
elválasztva kövesse az általa fizetendő adó teljes összege.
Példa a szöveges kimenetek kialakításához:
2. feladat. A mintában 543 telek szerepel.
3. feladat. Egy tulajdonos adószáma: 68396
Harmat utca 22
Szepesi utca 17
5. feladat
A sávba 165 telek esik, az adó 20805600 Ft.
B sávba 144 telek esik, az adó 13107000 Ft.
C sávba 234 telek esik, az adó 3479600 Ft.
6. feladat. A több sávba sorolt utcák:
Besztercei
Gyurgyalag
Icce
Kurta
Rezeda
Szepesi
Példa a fizetendo.txt fájl kialakításához:
(A fájl a megadott forrásállomány esetén 519 adatsort fog tartalmazni.)
fajl = open('utca.txt')
forras = fajl.read().splitlines()
A = int(forras[0].split()[0])
B = int(forras[0].split()[1])
C = int(forras[0].split()[2])
adatok = [forras[i].split() for i in range(1,len(forras))]
print(f'2. feladat. A mintában {len(adatok)} telek szerepel.')
be = '68396'#input('3. feladat. Egy tulajdonos adószáma: ')
lista = [adat for adat in adatok if adat[0]==be]
if lista: for i in range(len(lista)): print(lista[i][1]+' utca '+lista[i][2])
else: print('Nem szerepel az adatállományban.')
def ado(adosav,terulet): if adosav == 'A': egy = int(A) elif adosav == 'B': egy = int(B) else: egy = int(C) ado1 = egy*int(terulet) if ado1<10000: return 0 else: return ado1
print('5. feladat')
for betu in ['A','B','C']: adoA = [ado(adat[3],adat[4]) for adat in adatok if adat[3]==betu] print(betu+' sávba',len(adoA),'telek esik, az adó',sum(adoA),'Ft.')
print('6. feladat. A több sávba sorolt utcák:')
utcak = set([adat[1] for adat in adatok])
for utca in utcak: lista = set([adat[3] for adat in adatok if adat[1]==utca]) if len(lista)>1: print(utca)
fajl = open('fizetendo-vg.txt','w')
# Egy tulajdonosnak több telke is lehet!
tulajok = set([adat[0] for adat in adatok])
for tulaj in tulajok: adoosszeg = sum([ado(adat[3],adat[4]) for adat in adatok if adat[0]==tulaj]) print(tulaj,adoosszeg,file=fajl)
fajl.close()
2022. május magyar, mint idegennyelv (Szakaszsebesség-ellenőrzés)
A szakaszsebesség-ellenőrzést már több országban is alkalmazzák a közlekedés ellenőrzésére. Ennek lényege, hogy a járművek elhaladnak két egymástól több kilométerre lévő ellenőrzőkapunál.
Mindkét ponton rögzítik a jármű rendszámát és az elhaladás időpontját. Majd a két időérték
segítségével kiszámítják az átlagsebességet. Ha ez meghaladja az útszakaszon megengedett
legnagyobb sebességet, akkor a jármű vezetője szabálysértést követ el. Rendelkezésünkre állnak
egy 10 km-es kétszer egysávos főútvonal egyik sávjában rögzített szakaszsebesség mérésének
adatai. Az adott szakasz zárt, azaz nincs felhajtási és lehajtási lehetőség.
A meresek1.txt szövegállomány egy adott nap reggel 8 órától végzett 1 órányi mérés adatait
tartalmazza. Minden egyes jármű csak egyszer szerepel a mérési adatok között. Egy jármű mérési
adatai egy sorban szerepelnek egymástól szóközzel elválasztva. Egy sorban 9 adat szerepel, a jármű
rendszáma (6 karakteren), a szakasz kezdeti- és végpontján rögzített időpont óra, perc, másodperc,
ezredmásodperc formában. (A fájl olyan járművek adatait nem tartalmazza, amelyeknek a szakasz
kezdeti- vagy végpontján nem volt mérési értéke.)
A sorok száma legfeljebb 1000. Az adatok a belépési ponton mért idő szerint rendezettek.
Például:
A példában látható, hogy az QTS988 rendszámú jármű 8:5:0,854-kor haladt el a szakasz
kezdetén lévő mérőnél és 8:12:19,879-kor a szakasz végén lévő mérőnél. Az átlagsebessége
82 km/h, ami a megtett út (10 km) és a megtételhez szükséges idő (0,1219 óra) hányadosa.
Készítsen programot, amely a meresek1.txt állomány adatait felhasználva az alábbi
kérdésekre válaszol! A program forráskódját mentse ellenorzes néven! (A program
megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell
ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre
a feladat sorszámát (például: 3. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg
a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott. A tizedesszámok
megjelenítésekor a használt programozási nyelvben alapértelmezett megjelenítési módot
használja!
Az eredmény megjelenítését és a felhasználóval való kommunikációt a feladatot követő
minta alapján valósítsa meg!
1. Olvassa be és tárolja el a meresek1.txt állomány adatait!
2. Írja ki a képernyőre, hogy hány jármű adatait rögzítették a mérés során!
3. Határozza meg a rendelkezésre álló adatok segítségével, hogy 9 óra előtt hány jármű haladt
át a szakasz végpontján! A kapott értéket írja ki a képernyőre!
4. Kérjen be a felhasználótól egy óra, perc értéket!
a. Határozza meg, hogy abban a percben hány jármű haladt el a kezdő
méréspontnál! Ha az adott percben nem haladt el jármű a méréspontnál, akkor a
0 értéket jelenítse meg!
b. Számítsa ki a forgalomsűrűséget, amely a megadott időpontban kezdődő
percben (pl.: ha a megadott óra perc 08:09 volt, akkor 08:09:00,000-
08:09:59,999 között) az útszakaszon lévő járművek száma és az útszakasz
hosszának hányadosa. Az értéket tizedes tört alakban jelenítse meg.
5. Mekkora volt a legnagyobb átlagsebességgel haladó járműnek a sebessége, és hány
járművet hagyott le a mért szakasz végére? Amennyiben több legnagyobb átlagsebesség
érték van, akkor elég az egyiket kiírnia. Az autó rendszámát, az átlagsebességet egész
számként és a lehagyott járművek számát jelenítse meg!
6. Határozza meg, hogy a járművek hány százalékának az átlagsebessége haladta meg az
útszakaszon megengedett legnagyobb sebességet (90 km/h)! Az értéket tizedes tört alakban
jelenítse meg a minta szerint!
7. Készítsen egy szöveges állományt buntetes.txt néven, amely a gyorshajtók adatait
tartalmazza! Ebbe a szöveges állományba azon járművek adatai kerüljenek be, amelyek
átlagsebessége 104 km/h-nál nagyobb! A fájlban a jármű rendszáma, az átlagsebesség egész
számként megjelenítve és a büntetés összege szerepeljen mértékegységgel, pontosvesszővel
vagy tabulátorokkal elválasztottan! A büntetési tételeket a következő táblázat tartalmazza:
Átlagsebesség
Büntetés
104 km/h felett 121 km/h-ig
30 000 Ft
121 km/h felett 136 km/h-ig
45 000 Ft
136 km/h felett 151 km/h-ig
60 000 Ft
151 km/h felett
200 000 Ft
Minta a szöveges kimenetek kialakításához:
2. feladat
A mérés során 687 jármű adatait rögzítették.
3. feladat
9 óra előtt 603 jármű haladt el a végponti mérőnél.
4. feladat
Adjon meg egy óra és perc értéket! 8 20
a. A kezdeti méréspontnál elhaladt járművek száma: 12
b. A forgalomsűrűség: 9,4
5. feladat
A legnagyobb sebességgel haladó jármű
rendszáma: OKL564
átlagsebessége: 137 km/h
által lehagyott járművek száma: 33
6. feladat
A járművek 11,94%-a volt gyorshajtó.
A fájl elkészült.
A buntetes.txt fájl tartalma:
QZV314 128 km/h 45000 Ft OJW811 107 km/h 30000 Ft QUT385 131 km/h 45000 Ft QRC440 128 km/h 45000 Ft QJQ854 109 km/h 30000 Ft
be = input('
4. feladat
Adjon meg egy óra és perc értéket! (ó p) ').split(' ')
lista = [1 for adat in adatok if adat[1]==be[0] and adat[2]==be[1]]
print(' a. A kezdeti méréspontnál elhaladt járművek száma:',sum(lista))
kezd = ido(be[0],be[1],'0','0') # perc kezdete
vege = ido(be[0],be[1],'59','999') # perc vége
darab = 0
for adat in adatok: if kezd>=ido(adat[1],adat[2],adat[3],adat[4]) and ido(adat[5],adat[6],adat[7],adat[8])>=vege: #print(adat,ido(adat[1],adat[2],adat[3],adat[4]),ido(adat[5],adat[6],adat[7],adat[8])) darab += 1
print(' b. A forgalomsűrűség:',darab/10)
atlagok = [round(10/(ido(adat[5],adat[6],adat[7],adat[8]) - ido(adat[1],adat[2],adat[3],adat[4]))) for adat in adatok]
adatjo = adatok[atlagok.index(max(atlagok))]
print('
5. feladat
A legnagyobb sebességgel haladó jármű
rendszáma:',adatjo[0],'
átlagsebessége:',max(atlagok),'km/h')
be = ido(adatjo[1],adatjo[2],adatjo[3],adatjo[4])
ki = ido(adatjo[5],adatjo[6],adatjo[7],adatjo[8])
lehagyott = [1 for adat in adatok if be>ido(adat[1],adat[2],adat[3],adat[4]) and ki
print(' által lehagyott járművek száma:',sum(lehagyott))
tullepok = [atlag for atlag in atlagok if atlag>90]
print('
6. feladat
A járművek',str(round(len(tullepok)/len(adatok)*100,2))+'%-a volt gyorshajtó.')
fajl = open('buntetes-vg.txt','w')
for adat in adatok: atlagseb = round(10/(ido(adat[5],adat[6],adat[7],adat[8]) - ido(adat[1],adat[2],adat[3],adat[4]))) bunti = 0 if 104<atlagseb<=121: bunti = 30000 elif 121<atlagseb<=136: bunti = 45000 elif 136<atlagseb<=151: bunti = 60000 elif 150<atlagseb: bunti = 200000 if bunti>0: print(adat[0],' ',atlagseb,'km/h ',bunti,'Ft',file=fajl)
print('
A fájl elkészült.')
fajl.close()
2021. október (Sodoku)
A sudoku egy logikai játék, melyben megadott szabályok szerint számjegyeket kell
elhelyezni egy táblázatban. Ebben a feladatban 9×9-es táblázatot használunk.
A táblázat – az ábrának megfelelően – 9 darab 3×3-as résztáblázatra van felosztva.
Minden résztáblázatot az 1, 2, 3, 4, 5, 6, 7, 8, 9 számokkal kell kitölteni úgy, hogy az egész
9×9-es táblázat minden sorában és minden oszlopában az 1...9 számok mindegyike pontosan
egyszer forduljon elő. A rejtvény készítője előre ki szokta tölteni a táblázat bizonyos celláit. A
rejtvényfejtő feladata kitölteni a maradék cellákat a leírt szabályoknak megfelelően.
A bemenetet tartalmazó szövegfájlok első 9 sorának mindegyike 9 egész számot tartalmaz,
a játék kiindulási állapotának megfelelően. A kitöltetlen mezők helyén a 0 szám olvasható. A
következő néhány sorban a játékos egy-egy lehetséges kitöltési lépését rögzítették. Egy lépést
három egész szám ír le: a számot, amelyet a játékos be akar írni, majd a sor és az oszlop számát,
ahova írni szeretné. A bemeneti fájl egy-egy sorában a számokat egy-egy szóköz választja el
egymástól. A táblázat ellentmondásmentes, tehát megoldható feladatot ír le. A játékos által
megtett lépések száma legalább 1, legfeljebb 10, közöttük lehet hibás.
Például:
A fenti példában a nehez.txt bemeneti fájl tartalma látható. A 10. sorban szereplő számok
azt jelentik, hogy a 9-es értéket kell a 2. sor 4. helyére beírni. Az adott sorban és az adott
oszlopban nem szerepel még a 9-es, sőt, az érintett négyzetben sem, így a lépéssel nem alakul
ki hiba, megtehető. A 11. sorbeli lépés is megtehető. A 13. sor hibás lépést tartalmaz, mert a 2.
sorban már szerepel a 7-es szám.
A jobb oldalon látható képen a körbe írt számok megadják, hogy az egyes 3×3 méretű
résztáblákat milyen számmal azonosítjuk.
Készítsen programot, amely a bemeneti állományok egyikét felhasználva (konnyu.txt,
kozepes.txt, nehez.txt) az alábbi kérdésekre válaszol! A program forráskódját mentse
sudoku néven! (A program megírásakor a felhasználó által megadott adatok helyességét,
érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a
leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre
a feladat sorszámát (például: 4. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg a
képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
1. Olvassa be egy fájl nevét, egy sor és egy oszlop sorszámát (1 és 9 közötti számot)!
A későbbi feladatokat ezen értékek felhasználásával kell megoldania!
2. Az előző feladatban beolvasott névnek megfelelő fájl tartalmát olvassa be, és tárolja el a
táblázat adatait! Ha ezt nem tudja megtenni, akkor használja forrásként a rendelkezésre álló
állományok egyikét!
3. Írja ki a képernyőre, hogy a beolvasott sor és oszlop értékének megfelelő hely…
a. milyen értéket tartalmaz! Ha az adott helyen a 0 olvasható, akkor az „Az adott
helyet még nem töltötték ki.” szöveget jelenítse meg!
b. melyik résztáblázathoz tartozik!
4. Határozza meg a táblázat hány százaléka nincs még kitöltve! Az eredményt egy tizedesjegy
pontossággal jelenítse meg a képernyőn!
5. Vizsgálja meg, hogy a fájlban szereplő lépések lehetségesek-e a beolvasott táblázaton!
Tekintse mindegyiket úgy, mintha az lenne az egyetlen lépés az eredeti táblázaton, de ne
hajtsa azt végre! Állapítsa meg, hogy okoz-e valamilyen ellentmondást a lépés végrehajtása!
Írja ki a lépéshez tartozó három értéket, majd a következő sorba írja az alábbi
megállapítások egyikét! Ha több megállapítás is igaz, elegendő csak egyet megjelenítenie.
„A helyet már kitöltötték”
„Az adott sorban már szerepel a szám”
„Az adott oszlopban már szerepel a szám”
„Az adott résztáblázatban már szerepel a szám”
„A lépés megtehető”
Minta a szöveges kimenetek kialakításához:
1. feladat
Adja meg a bemeneti fájl nevét! konnyu.txt
Adja meg egy sor számát! 1
Adja meg egy oszlop számát! 1
3. feladat
Az adott helyen szereplő szám: 5
A hely a(z) 1 résztáblázathoz tartozik.
4. feladat
Az üres helyek aránya: 17.3%
5. feladat
A kiválasztott sor: 2 oszlop: 4 a szám: 9
A helyet már kitöltötték.
A kiválasztott sor: 3 oszlop: 6 a szám: 7
A lépés megtehető.
A kiválasztott sor: 6 oszlop: 6 a szám: 3
A résztáblázatban már szerepel a szám.
A kiválasztott sor: 7 oszlop: 9 a szám: 8
Az adott oszlopban már szerepel a szám.
print('1. feladat')
fnev = 'konnyu.txt'#input('1. feladat
Adja meg a bemeneti fájl nevét! ')
besor = 1#int(input('Adja meg egy sor számát! '))
beoszlop = 1#int(input('Adja meg egy oszlop számát! '))
print('
3. feladat')
print('Az adott helyen szereplő szám:',forras[besor-1][(beoszlop-1)*2])
print('A hely a(z)',(beoszlop-1)//3+1+3*((besor-1)//3),'résztáblázathoz tartozik.')
nullak=0
for i1 in range(9): for betu in forras[i1]: if betu=='0': nullak += 1
print('
4. feladat
Az üres helyek aránya:',str(round(100*nullak/81,1))+'%')
print('
5. feladat')
adatok=[]
for i1 in range(9): sor = forras[i1].split(' ') adatok.append([betu for betu in sor])
lepesek=[]
for i1 in range(9,len(forras)): sor = forras[i1].split(' ') lepesek.append([int(szam) for szam in sor])
for lepes in lepesek: sor = lepes[1]-1 oszlop = lepes[2]-1 szam = lepes[0] print('A kiválasztott sor:',1+sor,'oszlop:',1+oszlop,'a szám:',szam) #előállítjuk a sorát, oszlopát, résztábláját és a benne levést vizsgáljuk sora = [adatok[sor]] oszlopa = [adatok[i2][oszlop] for i2 in range(9)] resztablaja = [] for i1 in range(3): for i2 in range(3): resztablaja.append(adatok[i1+3*(sor//3)][i2+3*(oszlop//3)]) if adatok[sor][oszlop] != '0': print('A helyet már kitöltötték
') elif str(szam) in sora: print('Az adott sorban már szerepel a szám
') elif str(szam) in oszlopa: print('Az adott oszlopban már szerepel a szám
') elif str(szam) in resztablaja: print('A résztáblában már szerepel a szám
') else: print('A lépés megtehető
')
2021. május (Gödrök)
Egy teljesen sík terepen a talaj olyan anyagból van, ami nem ereszti át a vizet. Ezen a
területen egy egyenes mentén munkagépekkel 10 méter széles csatornát építenek. A munka
még nem készült el, ezért a csatorna mélysége nem állandó, helyenként a felszín is érintetlen.
A már elkészült résszel, mint különálló gödrök sorozatával foglalkozik a feladat. Az egyszerűbb
kezelés érdekében a gödröket úgy tekintjük, hogy oldalfaluk függőleges, teljes szélességben
azonos mélységű, így a keresztmetszeti kép jól
leírja a terepviszonyokat.
A melyseg1.txt fájlban méterenként
rögzítették, hogy azon a szakaszon milyen
mélyen van a gödör alja. Minden sor egy-egy
egész számot tartalmaz, amely a mélység
értékét mutatja – szintén méterben. A fájl
legfeljebb 2000 számot tartalmaz, értékük
legfeljebb 30 lehet. Tudjuk, hogy az első és az
utolsó méteren sértetlen a felszín, tehát ott
biztosan a 0 szám áll.
Például:
A fenti példában látható keresztmetszeti képen a melyseg1.txt bemeneti fájl tartalmának a
kezdete látható. Az egyszerűbb szemléltetés miatt a forrásfájlban külön sorokban szereplő
értékeket itt az ábrán egymás mellett szerepeltetjük. Leolvasható, hogy az első méteren 0 a
mélység. Az első gödör a 7. méteren kezdődik. Az első gödör 16 méter hosszan tart, legnagyobb
mélysége 4 méter, térfogata 440 m3. A második gödör a 26. méternél kezdődik, 3 méter hosszan
tart, térfogata 60 m3.
Készítsen programot, amely a melyseg1.txt állományt felhasználva az alábbi kérdésekre
válaszol! A program forráskódját mentse godor néven! (A program megírásakor a felhasználó
által megadott adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a
rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre
a feladat sorszámát (például: 2. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg a
képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
1. Olvassa be és tárolja el a melyseg1.txt fájl tartalmát! Írja ki a képernyőre, hogy az
adatforrás hány adatot tartalmaz!
2. Olvasson be egy távolságértéket, majd írja a képernyőre, hogy milyen mélyen van a gödör
alja azon a helyen! Ezt a távolságértéket használja majd a 6. feladat megoldása során is!
3. Határozza meg, hogy a felszín hány százaléka maradt érintetlen és jelenítse meg 2 tizedes
pontossággal!
4. Írja ki a godrok.txt fájlba a gödrök leírását, azaz azokat a számsorokat, amelyek egy-egy
gödör méterenkénti mélységét adják meg! Minden gödör leírása külön sorba kerüljön! Az
állomány pontosan a gödrök számával egyező számú sort tartalmazzon!
A godrok.txt fájl első két sorának tartalma:
2 2 2 2 4 4 3 2 2 3 3 4 4 3 2 2
2 2 2
…
5. Határozza meg a gödrök számát és írja a képernyőre!
6. Ha a 2. feladatban beolvasott helyen nincs gödör, akkor „Az adott helyen nincs gödör.”
üzenetet jelenítse meg, ha ott gödör található, akkor határozza meg, hogy
a) mi a gödör kezdő és végpontja! A meghatározott értékeket írja a képernyőre!
(Ha nem tudja meghatározni, használja a további részfeladatoknál a 7 és 22
értéket, mint a kezdő és a végpont helyét)
b) a legmélyebb pontja felé mindkét irányból folyamatosan mélyül-e! Azaz a gödör
az egyik szélétől monoton mélyül egy pontig, és onnantól monoton emelkedik a
másik széléig. Az eredménytől függően írja ki a képernyőre a „Nem mélyül
folyamatosan.” vagy a „Folyamatosan mélyül.” mondatot!
c) mekkora a legnagyobb mélysége! A meghatározott értéket írja a képernyőre!
d) mekkora a térfogata, ha szélessége minden helyen 10 méternyi! A meghatározott
értéket írja a képernyőre!
e) a félkész csatorna esőben jelentős mennyiségű vizet fogad be. Egy gödör annyi
vizet képes befogadni anélkül, hogy egy nagyobb szélvihar hatására se öntsön
ki, amennyi esetén a víz felszíne legalább 1 méter mélyen van a külső felszínhez
képest. Írja a képernyőre ezt a vízmennyiséget!
Minta a szöveges kimenetek kialakításához:
1. feladat
A fájl adatainak száma: 694
2. feladat
Adjon meg egy távolságértéket! 9
Ezen a helyen a felszín 2 méter mélyen van.
3. feladat
Az érintetlen terület aránya 10.09%.
5. feladat
A gödrök száma: 22
6. feladat
a)
A gödör kezdete: 7 méter, a gödör vége: 22 méter.
b)
Nem mélyül folyamatosan.
c)
A legnagyobb mélysége 4 méter.
d)
A térfogata 440 m^3.
e)
A vízmennyiség 280 m^3.
print('1. feladat')
fajl = open('melyseg1.txt')
forras = fajl.read().splitlines()
fajl.close()
adatok = [int(sor) for sor in forras]
print('A fájl adatainak száma:',len(adatok))
print('
2. feladat')
tav = int(input('Adjon meg egy távolságértéket: '))
print('Ezen a helyen a felszín',adatok[tav-1],'méter mélyen van')
print('
3. feladat')
erintetlen = [1 for adat in adatok if adat==0]
print('Az érintetlen terület aránya',str(round(sum(erintetlen)/len(adatok)*100,2))+'%.')
# 4. feladat
godrok = [] # gödör kezdetének indexe, gödör végének indexe
i = 0
kezdete , vege = 0, 0
while i<len(adatok)-1: if adatok[i-1] == 0 and adatok[i] != 0: kezdete = i if adatok[i] != 0 and adatok[i+1] == 0: vege = i if kezdete != 0 and vege != 0: godrok.append([kezdete,vege]) kezdete , vege = 0, 0 i += 1
#print(godrok)
fajl = open('godrok-vg.txt','w')
for godor in godrok: lista = [str(adatok[i1]) for i1 in range(godor[0],godor[1]+1)] print(' '.join(lista),file=fajl)
fajl.close()
print('
6. feladat')
godor_index = -1 # ha ez negatív marad, akkor nem gödörben van
for godor in godrok: if tav-1 in range(godor[0],godor[1]+1): godor_index = godrok.index(godor)
if godor_index < 0: print('Az adott helyen nincs gödör.')
else: print('a)
A gödör kezdete:',godrok[godor_index][0]+1,'méter, a gödör vége:',godrok[godor_index][1]+1,'méter.') melysegek = [adatok[i1] for i1 in range(godrok[godor_index][0],godrok[godor_index][1]+1)] # a gödör mélységeinek listája legmelyebb, legmelyebb_index = 0, 0 for i1 in range(len(melysegek)): if melysegek[i1] > legmelyebb: legmelyebb = melysegek[i1] legmelyebb_index = i1 #print(melysegek,legmelyebb,legmelyebb_index) monoton = True for i1 in range(legmelyebb_index): # csökkenés vizsgálata az elejétől a legmélyebb pontig if melysegek[i1+1] monoton = False #print(i1,monoton,melysegek[i1],melysegek[i1+1]) #print() for i1 in range(legmelyebb_index,len(melysegek)-1): # növekedés vizsgálata a legmélyebb ponttól if melysegek[i1+1]>melysegek[i1]: # ha valamelyik nagyobb, mint az előző, akkor nem monoton monoton = False #print(i1,monoton,melysegek[i1],melysegek[i1+1]) print('b)\nFolyamatosan mélyül.' if monoton else 'b)
Nem mélyül folyamatosan.') print('c)\nA legnagyobb mélysége',legmelyebb,'méter.') print('d)\nA térfogata',10*sum(melysegek),'m^3.') print('e)\nA vízmennyiség',10*(sum(melysegek)-len(melysegek)),'m^3.') #minden értékből 1-et le kell vonni, összesen ahány méter
2021. május magyar, mint idegennyelv (Bányató)
A bányató egy elhagyott külszíni bánya, amely egy idő után megtelik vízzel. Ebben
a feladatban egy bányató mélységét kell elemeznie.
A tó felszínét sakktáblaszerűen 1 m oldalhosszúságú négyzetekre bontották, és minden ilyen
négyzetben megmérték a tó mélységét. A mérést deciméter pontossággal végezték.
A szárazföldet a 0 érték jelzi. A mérési adatokat egy téglalap alakú táblázatban rögzítették,
például:
Az ábrán az első oszlop, illetve az első sor a mérési adatok koordinátáját adja meg, például
12. sor 6. oszlopában lévő mérési eredmény 33 dm. (A tó medrét szürke háttér jelzi.)
Rendelkezésére áll a melyseg2.txt nevű adatfájl, amelynek első két sorában az adatokat
tartalmazó táblázat sorainak majd oszlopainak száma található. A fájlban ezt a mérési adatok
követik soronként, az adatokat szóköz választja el egymástól. A fájlban a sorok és oszlopok
azonosítói nem szerepelnek. Például egy 42 sorból és 25 oszlopból álló táblázat esetén az első
4 sor adatai a fájlban:
Készítsen programot, amely az állomány adatait felhasználva az alábbi kérdésekre válaszol!
A program forráskódját mentse banyato néven! A megoldás során felhasználhatja, hogy a fájl
legfeljebb 99 sort és legfeljebb 99 oszlopot tartalmaz. A program megírásakor a felhasználó
által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és feltételezheti, hogy
a rendelkezésre álló adatok a leírtaknak megfelelnek.
A képernyőre írást igénylő részfeladatok esetén – a mintához tartalmában hasonlóan – írja
ki a képernyőre a feladat sorszámát (például: 3. feladat), és utaljon a kiírt tartalomra is!
Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Mindkét
esetben az ékezetmentes kiírás is elfogadott.
1. Olvassa be és tárolja el a melyseg2.txt állomány adatait, és annak felhasználásával oldja
meg a következő feladatokat!
2. Kérje be egy mérési eredmény sor- és oszlopazonosítóját, majd írassa ki az adott helyen
mért adatot a képernyőre! (A sorok és oszlopok számozása kezdődjön 1-gyel!)
3. Határozza meg a tó (vagyis az ábrán szürkével jelölt rész) felszínének területét, valamint
a tó átlagos mélységét! Írassa ki a két eredményt a mintának megfelelően a képernyőre!
A tó átlagos mélysége méterben kifejezve, két tizedesjegy pontossággal jelenjen meg!
4. Mekkora a tó legnagyobb mélysége, és hol a legmélyebb a tó? Jelenítse meg a választ
a képernyőn! A legmélyebb pont koordinátáit a mintának megfelelően (sor; oszlop)
formában írassa ki! Ha több ilyen mérési eredmény is van, mindegyik koordinátapárja
jelenjen meg!
5. Milyen hosszú a tó partvonala, vagyis az ábrán a szürkével jelölt részt határoló vastag fekete
vonal hossza? A partvonalhoz vegye hozzá a tóban lévő szigetek kerületét is! Írassa ki
az eredményt a mintának megfelelően a képernyőre! (A megoldás során felhasználhatja,
hogy a táblázat első és utolsó sorában és oszlopában minden adat 0.)
6. Kérje be a felhasználótól egy oszlop azonosítóját, és szemléltesse a diagram.txt
szöveges állományban „sávdiagramon” a tó mélységét az adott oszlopban a következő
módon! A sor elején jelenjen meg a mérési adat sorának azonosítója pontosan két
számjeggyel, majd tegyen egymás mellé annyi csillagot (*), ahány méter az adott helyen
a tó mélysége! A mérési adatokat a matematika szabályainak megfelelően kerekítse!
Példa a szöveges kimenetek kialakításához (a tizedesjel az alkalmazott fejlesztői környezettől
függően eltérhet):
2. feladat
A mérés sorának azonosítója=12
A mérés oszlopának azonosítója=6
A mért mélység az adott helyen 33 dm
3. feladat
A tó felszíne: 646 m2, átlagos mélysége: 4,28 m
4. feladat
A tó legnagyobb mélysége: 98 dm
A legmélyebb helyek sor-oszlop koordinátái:
(14; 20) (26; 11) (32; 16)
5. feladat
A tó partvonala 270 m hosszú
6. feladat
A vizsgált szelvény oszlopának azonosítója=6
with open('melyseg2.txt') as fajl: forras = fajl.read().splitlines()
sorok = int(forras[0])
oszlopok = int(forras[1])
adatok1 = [forras[i].split(' ') for i in range(2,len(forras))]
adatok = []
for adat in adatok1: a = [int(i) for i in adat] adatok.append(a)
#print(adatok)
sor = int(input('2. feladat
A mérés sorának azonosítója= '))-1
oszlop = int(input('A mérés oszlopának azonosítója= '))-1
print('A mért mélység az adott helyen',adatok[sor][oszlop],'dm')
osszeg = 0
darab = 0
for adat in adatok: a = [i for i in adat if i != 0] darab += len(a) osszeg += sum(a)
print('3. feladat
A tó felszíne:',darab,'m2, átlagos mélysége:',round(osszeg/darab/10,2),'m')
maximumok = []
for adat in adatok: maximumok.append(max([i for i in adat]))
max_mely = max(maximumok)
print('4. feladat
A tó legnagyobb mélysége:',max_mely,'dm')
kiir = ''
for i in range(sorok): for j in range(oszlopok): if adatok[i][j]==max_mely: kiir += '('+str(i+1)+'; '+str(j+1)+') '
print('A legmélyebb helyek sor-oszlop koordinátái:
',kiir)
part = 0
for i in range(1,sorok-1): for j in range(1,oszlopok-1): if adatok[i][j] != 0: if adatok[i-1][j] == 0: part += 1 if adatok[i+1][j] == 0: part += 1 if adatok[i][j-1] == 0: part += 1 if adatok[i][j+1] == 0: part += 1
print('5. feladat
A tó partvonala',part,'m hosszú')
szelveny = int(input('6. feladat
A vizsgált szelvény oszlopának azonosítója= '))
melyseg = [round(adat[szelveny-1]/10) for adat in adatok]
fajl = open('diagram.txt','w')
for i in range(len(melyseg)): if i+1<10: kiir = '0'+str(i+1) else: kiir = str(i+1) kiir += melyseg[i]*'*' print(kiir,file=fajl)
fajl.close()
2020. október (Sorozatok)
Sok olyan sorozatrajongó van, aki folyamatosan követi a kedvelt sorozatait. Egy, az angol
nyelvű sorozatokért rajongó személy feljegyzést készített egy nyolc hónapos időszak kedvenc
sorozatairól.
A lista.txt fájl a rajongó által kedvelt sorozatok adásba
kerülésének dátumát, a sorozat angol címét, az évadot és az epizód
számát, az epizód hosszát percben és egy jelzést tartalmaz, hogy a lista
készítője megnézte-e már azt az epizódot. Ezek az adatok egymás után
külön sorokban szerepelnek. A fájlban biztosan 400-nál kevesebb
epizódról van adat, epizódonként 5 sorban.
Például:
A példában látható, hogy a Puzzles című sorozat 3. évadának
10. epizódja 2018. 01. 19-én került adásba. Az epizód 43 perces, és
még nem nézte meg a lista készítője.
A dátumokat mindig „éééé.hh.nn” formátumban rögzítették.
Vannak olyan sorozatrészek, amelyeknek a lista rögzítésekor
még nem tudták az adásba kerülésük idejét. Ezeknél a dátum
helyett mindig az „NI” rövidítés szerepel.
Az évad jelzése vezető nullák nélkül történik, az epizód számát pedig mindig két
számjeggyel rögzítették. Az évad és az epizód számát egy „x” választja el egymástól.
Az egyes sorozatok epizódjai mindig ugyanolyan hosszúak.
Az epizóddal kapcsolatos utolsó adat értéke „0” vagy „1”. Az „1”-es számjegy jelöli,
hogy az adott részt már megtekintette a lista készítője, a „0” pedig azt, hogy még nem
látta.
Készítsen programot a lista.txt állomány adatainak feldolgozására! A program
forráskódját mentse sorozatok néven! (A program megírásakor a felhasználó által megadott
adatok helyességét, érvényességét nem kell ellenőriznie, feltételezheti, hogy a rendelkezésre
álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre
a feladat sorszámát (például 2. feladat:)! Ha a felhasználótól kér be adatot, jelenítse meg
a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
1. Olvassa be és tárolja el a lista.txt fájl tartalmát!
2. Írassa ki a képernyőre, hogy hány olyan epizód adatait tartalmazza a fájl, amelynek ismert
az adásba kerülési dátuma!
3. Határozza meg, hogy a fájlban lévő epizódok hány százalékát látta már a listát rögzítő
személy! A százalékértéket a minta szerint, két tizedesjeggyel jelenítse meg a képernyőn!
4. Számítsa ki, hogy összesen mennyi időt töltött a személy az epizódok megnézésével!
Az eredményt a minta szerint nap, óra, perc formában adja meg!
5. Kérjen be a felhasználótól egy dátumot „éééé.hh.nn” formában! Határozza meg, hogy
az adott dátumig megjelent epizódokból melyeket nem látta még! Az aznapi epizódokat is
számolja bele! A feltételnek megfelelő epizódok esetén írja a képernyőre tabulátorral
elválasztva az évad- és az epizódszámot, valamint a sorozat címét a minta szerint!
6. Készítse el az alábbi algoritmus alapján a hét napját meghatározó függvényt! A függvény
neve Hetnapja legyen! A függvény az év, hónap és nap megadása után szöveges
eredményként visszaadja, hogy az adott nap a hét melyik napja volt. (Az a és b egész
számok maradékos osztása esetén az a div b kifejezés adja meg a hányadost,
az a mod b pedig a maradékot, például 17 div 7 = 2 és 17 mod 7 = 3.)
Függvény hetnapja(ev, ho, nap : Egész) : Szöveg napok: Tömb(0..6: Szöveg)= (″v″, ″h″, ″k″, ″sze″,″cs″, ″p″, ″szo″) honapok: Tömb(0..11: Egész)= (0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4) Ha ho < 3 akkor ev := ev -1 hetnapja := napok[(ev + ev div 4 – ev div 100 + ev div 400 + honapok[ho-1] + nap) mod 7]
Függvény vége
7. Kérjen be a felhasználótól egy napot az előző feladatban látható rövidített alakban!
A napokat egy (h, k, p, v), kettő (cs), vagy három (sze, szo) karakterrel adja meg! Határozza
meg, hogy a fájlban lévő sorozatok közül melyike(ke)t vetítik az adott napon! A sorozatok
nevét a minta szerint jelenítse meg a képernyőn! Ha az adott napon egy sorozatot sem adtak
adásba, akkor „Az adott napon nem kerül adásba sorozat.” üzenetet jelenítse meg!
8. Határozza meg sorozatonként az epizódok összesített vetítési idejét és az epizódok számát!
A számításnál vegye figyelembe a vetítési dátummal nem rendelkező epizódokat is!
A megoldás során felhasználhatja, hogy egy sorozat epizódjainak adatai egymást követik
a forrásállományban. A listát írja ki a summa.txt fájlba! A fájl egy sorában a sorozat címe,
az adott sorozatra vonatkozó összesített vetítési idő percben és az epizódok száma
szerepeljen szóközzel elválasztva!
Minta a szöveges kimenetek kialakításához:
2. feladat
A listában 202 db vetítési dátummal rendelkező epizód van.
3. feladat
A listában lévő epizódok 45,66%-át látta.
5. feladat
Adjon meg egy dátumot! Dátum= 2017.10.18
7x01 The Fable
7x02 The Fable
15x04 Military Police
5x03 Spy School
5x04 Spy School
4x04 The Elite Minds
7. feladat
Adja meg a hét egy napját (például cs)! Nap= cs
The Hospital
Spectacular Power
Upper Story
Chicago Flame
Shrinktime
# 1. feladat
with open('lista.txt') as forrasfajl: sorok = forrasfajl.read().splitlines()
adatok = [sorok[i:i+5] for i in range(0,len(sorok),5)]
# adatok[dátum, cím, évad x epizód, hossz, megnézte-e]
#2. feladat
print('2. feladat
A listában',len([adat[0] for adat in adatok if adat[0]!='NI']),'db vetítési dátummal rendelkező epizód van.')
#3. feladat
latta = int(len([adat[0] for adat in adatok if adat[4]=='1'])/len(adatok)*10000)
print('
3. feladat
A listában lévő epizódok {},{}%-át látta.'.format(latta//100,latta%100))
#4. feladat
percek = sum([int(adat[3]) for adat in adatok if adat[4]=='1'])
print('
4. feladat
Sorozatnézéssel {} napot, {} órát és {} percet töltött.'.format(percek//1440,percek%1440//60,percek%1440%60))
#5. feladat
datum = input('
5. feladat
Adjon meg egy dátumot! Dátum= ').split('.')
datum = datum[0]*365+datum[1]*31+datum[2]
nemlatta = []
for adat in adatok: if adat[0] != 'NI': aktdatum = adat[0].split('.') aktdatum = aktdatum[0]*365+aktdatum[1]*31+aktdatum[2] if adat[4]=='0' and datum>=aktdatum: print(adat[2],' ',adat[1])
# 6. feladat
def hetnapja(ev,ho,nap): napok = ['v','h','k','sze','cs','p','szo'] honapok = [0,3,2,5,0,3,5,1,4,6,2,4] if ho<3: ev -= 1 return napok[(ev + ev // 4 - ev // 100 + ev // 400 + honapok[ho-1] + nap) % 7]
# 7. feladat
print('
7. feladat')
nap = input('Adja meg a hét egy napját (például cs)! Nap= ')
filmek = {adat[1] for adat in adatok if adat[0]!= 'NI' and hetnapja(int(adat[0].split('.')[0]),int(adat[0].split('.')[1]),int(adat[0].split('.')[2])) == nap}
print('
'.join(filmek) if filmek else 'Az adott napon nem kerül adásba sorozat.')
# 8. feladat
fajl = open('summa.txt','w')
cimek = {adat[1] for adat in adatok}
for cim in cimek: print(' '.join([cim,str(sum([int(adat[3]) for adat in adatok if adat[1]==cim])),str(len([adat[3] for adat in adatok if adat[1]==cim]))]),file=fajl)
fajl.close()
2020. május (Meteorológiai jelentés)
Az ország területén néhány városból rendszeres időközönként időjárás táviratokat küldenek.
A távirat egy rövid szöveges üzenet, amely a főbb időjárási információkat tartalmazza.
Rendelkezésünkre áll az ország területéről egy adott nap összes távirata.
A tavirathu13.txt szövegállomány egy adott hónap 13. napjának időjárás adatait
tartalmazza. Egy távirat adatai egy sorban találhatóak egymástól szóközzel elválasztva. Egy
sorban 4 adat szerepel a következőképpen.
település
szöveg (2 karakter)
A település kétbetűs kódja
idő
szöveg (óópp formátumban)
A mérés időpontja
szélirány és -erősség
szöveg (5 karakter) szélirány 3 karakter, -erősség 2 karakter
A szél iránya fokban vagy szöveggelés sebessége csomóban megadva
hőmérséklet
egész szám (2 karakter)
Mért hőmérséklet (nem negatív)
A sorok száma legfeljebb 500. Az adatok idő szerint rendezettek.
Például:
BP 0300 32007 21
PA 0315 35010 19
PR 0315 32009 19
SM 0315 01015 20
DC 0315 VRB01 21
SN 0315 00000 21
A példában látható, hogy 03:15-kor PR településen 320 fokos irányból 9 csomós szél fújt.
A hőmérséklet 19 °C volt. Ugyanekkor DC településen változó (VRB) szélirány volt 1 csomós
szélsebességgel, a hőmérséklet 21 °C volt.
Készítsen programot, amely a tavirathu13.txt állomány adatait felhasználva az alábbi
kérdésekre válaszol! A program forráskódját mentse metjelentes néven! (A program
megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell
ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre
a feladat sorszámát (például: 3. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg
a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
Az eredmény megjelenítését és a felhasználóval való kommunikációt a feladatot követő
minta alapján valósítsa meg!
1. Olvassa be és tárolja el a tavirathu13.txt állomány adatait!
2. Kérje be a felhasználótól egy város kódját! Adja meg, hogy az adott városból mikor érkezett
az utolsó mérési adat! A kiírásban az időpontot óó:pp formátumban jelenítse meg!
3. Határozza meg, hogy a nap során mikor mérték a legalacsonyabb és a legmagasabb
hőmérsékletet! Jelenítse meg a méréshez kapcsolódó település nevét, az időpontot és
a hőmérsékletet! Amennyiben több legnagyobb vagy legkisebb érték van, akkor elég
az egyiket kiírnia.
4. Határozza meg, azokat a településeket és időpontokat, ahol és amikor a mérések idején
szélcsend volt! (A szélcsendet a táviratban 00000 kóddal jelölik.) Ha nem volt ilyen, akkor
a „Nem volt szélcsend a mérések idején.” szöveget írja ki! A kiírásnál a település kódját és
az időpontot jelenítse meg.
5. Határozza meg a települések napi középhőmérsékleti adatát és a hőmérséklet-ingadozását!
A kiírásnál a település kódja szerepeljen a sor elején a minta szerint! A kiírásnál csak
a megoldott feladatrészre vonatkozó szöveget és értékeket írja ki!
A középhőmérséklet azon hőmérsékleti adatok átlaga, amikor a méréshez tartozó óra
értéke 1., 7., 13., 19. Ha egy településen a felsorolt órák valamelyikén nem volt mérés,
akkor a kiírásnál az „NA” szót jelenítse meg! Az adott órákhoz tartozó összes adat
átlagaként határozza meg a középhőmérsékletet, azaz minden értéket azonos súllyal
vegyen figyelembe! A középhőmérsékletet egészre kerekítve jelenítse meg!
A hőmérséklet-ingadozás számításhoz az adott településen a napi legmagasabb és
legalacsonyabb hőmérséklet különbségét kell kiszámítania! (Feltételezheti, hogy
minden település esetén volt legalább két mérési adat.)
6. Hozzon létre településenként egy szöveges állományt, amely első sorában a település kódját
tartalmazza! A további sorokban a mérési időpontok és a hozzá tartozó szélerősségek
jelenjenek meg! A szélerősséget a minta szerint a számértéknek megfelelő számú
kettőskereszttel (#) adja meg! A fájlban az időpontokat és a szélerősséget megjelenítő
kettőskereszteket szóközzel válassza el egymástól! A fájl neve X.txt legyen, ahol
az X helyére a település kódja kerüljön!
Minta a szöveges kimenetek kialakításához:
2. feladat
Adja meg egy település kódját! Település: SM
Az utolsó mérési adat a megadott településről 23:45-kor érkezett.
3. feladat
A legalacsonyabb hőmérséklet: SM 23:45 16 fok.
A legmagasabb hőmérséklet: DC 13:15 35 fok.
4. feladat
BP 01:00
DC 02:15
SN 03:15
BC 04:45
DC 04:45
SN 05:15
SN 05:45
KE 08:45
BC 11:45
5. feladat
BP Középhőmérséklet: 23; Hőmérséklet-ingadozás: 8
DC Középhőmérséklet: 29; Hőmérséklet-ingadozás: 15
SM Középhőmérséklet: 22; Hőmérséklet-ingadozás: 8
PA Középhőmérséklet: 21; Hőmérséklet-ingadozás: 7
SN Középhőmérséklet: 26; Hőmérséklet-ingadozás: 13
PR Középhőmérséklet: 21; Hőmérséklet-ingadozás: 8
BC NA; Hőmérséklet-ingadozás: 14
PP NA; Hőmérséklet-ingadozás: 6
KE NA; Hőmérséklet-ingadozás: 13
fajl = open('tavirathu13.txt')
forras = fajl.read().splitlines()
fajl.close()
adatok = [sor.split() for sor in forras] #0: település; 1:óópp óra, perc; 2:iiiee - irány, erősség; 3:hőmérséklet
#2. feladat
print('2. feladat')
telepules = 'SM'#input('Adja meg egy település kódját! Település: ')
maxadat = max([60*int(adat[1][:2])+int(adat[1][2:4]) for adat in adatok if adat[0]==telepules]) #perccé konvertáljuk az időket
print(f'Az utolsó mérési adat a megadott településről {maxadat//60}:{maxadat%60}-kor érkezett.')
#3. feladat
print('
3. feladat')
maxhom = max([int(adat[3]) for adat in adatok])
maxadat = [adat for adat in adatok if int(adat[3])==maxhom][0]
minhom = min([int(adat[3]) for adat in adatok])
minadat = [adat for adat in adatok if int(adat[3])==minhom][0]
print(f'A legalacsonyabb hőmérséklet: {minadat[0]} {minadat[1][:2]}:{minadat[1][2:4]} {minadat[3]} fok.')
print(f'A legmagasabb hőmérséklet: {maxadat[0]} {maxadat[1][:2]}:{maxadat[1][2:4]} {maxadat[3]} fok.')
#4. feladat
print('
4. feladat')
szelcsend = [adat[0]+' '+adat[1][:2]+':'+adat[1][2:4] for adat in adatok if adat[2]=='00000']
print('
'.join(szelcsend) if szelcsend else 'Nem volt szélcsend a mérések idején.')
#5. feladat
print('
5. feladat')
telepulesek = set([adat[0] for adat in adatok])
for t in telepulesek: hom = [[adat[1][:2],int(adat[3])] for adat in adatok if (adat[1][:2] in ['01','07','13','19']) and adat[0]==t] #a település és a megfelelő hőmérséklet adatok homersekletek = [int(h[1]) for h in hom] #csak a hőmérsékletek if len(set([h[0] for h in hom]))<4: kozep = 'NA' else: kozep = 'Középhőmérséklet: '+str(round(sum(homersekletek)/len(homersekletek))) napi = [int(adat[3]) for adat in adatok if adat[0]==t] #az összes napi hőmérséklet ing = max(napi)-min(napi) print(t,kozep+';','Hőmérséklet-ingadozás:',ing)
#6. feladat
print('
6. feladat
A fájlok elkészültek.')
for t in telepulesek: fajl = open(t+'.txt',mode='w') meresek = [[adat[1][:2]+':'+adat[1][2:4],int(adat[2][3:])] for adat in adatok if adat[0]==t] print(t,file=fajl) for m in meresek: print(m[0],m[1]*'#',file=fajl) fajl.close()
2020. május magyar, mint idegennyelv (Menetrend)
Az ország keleti felében évekkel ezelőtt bevezették az ütemes menetrendet. Ez azt jelenti,
hogy a végállomásról minden órában ugyanakkor indulnak a vonatok és menetrend szerint
minden állomásra ugyanakkor érkeznek. A jól tervezhető utazás miatt nőtt az utazók száma.
A vonat.txt fájlban rögzítették a Szeged-Budapest vonal néhány vonatának indulási és
érkezési adatait. A fájl soraiban öt, tabulátorral elválasztott érték található, négy egész szám és
egy karakter. Az első szám a vonatazonosító, a második az állomásazonosító, a harmadik és
negyedik egy időpont órája és perce. A karakter pedig azt jelzi, hogy a vonat az adott állomásra
érkezik (E) vagy éppen indul (I) a megadott időben.
A sorok száma legfeljebb 1000, a vonatok és az állomások azonosítója pedig egy 0 és 20
közötti egész szám. Az óra értéke 0 és 23, a perc 0 és 59 közötti érték. Az állomások 0-tól
távolság, a vonatok 1-től indulási idő szerint növekvően sorszámozottak, minden értéket
felvesznek.
A fájl a vonatok tényleges útját rögzíti. Az adatok időrendben szerepelnek, azon belül pedig
– az induló állomás kivételével – az érkezés mindig megelőzi az indulást. Tudjuk, hogy minden
vonat a 0. állomásról indul, és eléri a végállomást, közben minden állomáson megáll, és egyik
vonat sem előzi meg a másikat.
Például:
…
2 0 6 45 I
1 4 6 49 E
1 4 6 50 I
2 1 6 58 E
1 5 7 0 E
Az első sorból leolvasható, hogy a 2. vonat a kiinduló állomásról 6 óra 45 perckor indul.
A következő sorban pedig az szerepel, hogy az 1. vonat 6 óra 49 perckor érkezik a 4. állomásra.
Készítsen programot, amely a vonat.txt állomány adatait felhasználva az alábbi
kérdésekre válaszol! A program forráskódját mentse menetrend néven! (A program
megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell
ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre
a feladat sorszámát (például: 5. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg
a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
1. Olvassa be és tárolja el a vonat.txt fájl tartalmát!
2. Írja a képernyőre a fájlban tárolt vonatok és állomások darabszámát – a kezdő és
végállomást is beleértve!
3. Határozza meg, hogy melyik állomáson állt legtöbbet vonat! Adja meg a vonat és az állomás
azonosítóját, valamint az állás idejét! Ha több ilyen volt, elég csak az egyiket megadnia.
4. Olvassa be egy vonat azonosítóját, valamint egy időpont óra és perc értékét! A későbbi
feladatokban használja ezeket!
5. Ezen a vonalon az előírt menetidő 2 óra 22 perc. Írja a képernyőre, hogy a beolvasott
azonosítójú vonat hány perccel tért el ettől! Például: „A(z) 5. vonat útja 2 perccel rövidebb
volt az előírtnál.”, „A(z) 5. vonat útja pontosan az előírt ideig tartott.” vagy „A(z) 5. vonat
útja 3 perccel hosszabb volt az előírtnál.”
6. Írja a haladX.txt fájlba, hogy a beolvasott azonosítójú vonat melyik állomásra mikor
érkezett! A fájlnévben az X helyére a beolvasott vonatazonosító kerüljön!
7. Adja meg, hogy a beolvasott időpontban úton lévő, azaz a már elindult, de a végállomást
még el nem érő vonatok közül melyik hol tartott! A tesztelés során a következő időpontokra
érdemes figyelni: 6:50, 8:45, 9:05, 10:04, 10:20.
Minta a szöveges kimenetek kialakításához:
2. feladat
Az állomások száma: 11
A vonatok száma: 12
# 1. feladat
with open('vonat.txt') as fajl: sorok = fajl.read().splitlines()
adatok = [sorok[i].split(' ') for i in range(len(sorok))]
# adatok[vonatazonosító, állomásazonosító, óra, perc, 'E' vagy 'I']
# 2. feladat
vonatok = {adat[0] for adat in adatok}
allomasok = {adat[1] for adat in adatok}
print('2. feladat
Az állomások száma:',len(allomasok),'
A vonatok száma:',len(vonatok))
# 3. feladat
# idopontok[vonat,állomás,indulás/érkezés ideje]
max_ido = 0
for vonat in vonatok: idopontok = [[adat[1],int(adat[2])*60+int(adat[3])] for adat in adatok if adat[0]==vonat] for index1 in range(2,len(idopontok)-1,2): varakozas = idopontok[index1][1]-idopontok[index1-1][1] if varakozas > max_ido: max_ido = varakozas max_allomas = idopontok[index1][0] max_vonat = vonat
print('
3. feladat
A(z) '+max_vonat+'. vonat a(z) '+max_allomas+'. állomáson '+str(max_ido)+' percet állt.')
# 4. feladat
vonat = input('
4. feladat
Adja meg egy vonat azonosítóját! ')
ido_beker = input('Adjon meg egy időpontot (óra perc)! ').split(' ') # idopont['óra','perc']
# 5. feladat
kiir = '
5. feladat
A(z) '+vonat+'. vonat útja '
idopontok = [int(adat[2])*60+int(adat[3]) for adat in adatok if adat[0]==vonat]
hossz = idopontok[-1]-idopontok[0] - (2*60+22)
if hossz == 0: kiir += 'pontosan az előírt ideig tartott.'
else: kiir += str(-1*hossz)+' perccel rövidebb volt az előírtnál.' if hossz<0 else str(hossz)+' perccel hosszabb volt az előírtnál.'
print(kiir)
# 6. feladat
fajl = open('halad'+vonat+'.txt','w')
print('
'.join([adat[1]+'. állomás: '+adat[2]+':'+adat[3] for adat in adatok if adat[0]==vonat and adat[4]=='E']),file=fajl)
fajl.close()
# 7. feladat
print('
7. feladat')
akt_ido = int(ido_beker[0])*60+int(ido_beker[1])
for vonat in vonatok: idopontok = [[adat[1],int(adat[2])*60+int(adat[3])] for adat in adatok if adat[0]==vonat] if idopontok[0][1] <= akt_ido < idopontok[-1][1]: # ez a vonat úton van index1 = 0 while idopontok[index1][1] <= akt_ido: # lépkedünk az időkkel, amíg az aktuális időhöz nem érünk index1 += 1 if idopontok[index1-1][0]=='0': print('A(z) '+vonat+'. vonat épp akkor indult útjára.') elif idopontok[index1-1][0] == idopontok[index1][0]: print('A(z) '+vonat+'. vonat a(z) '+idopontok[index1-1][0]+ '. állomáson állt.') else: print('A(z) '+vonat+'. vonat a(z) '+idopontok[index1-1][0]+'. és a(z) '+idopontok[index1][0]+'. állomások között haladt.')
2019. október (eUtazás)
Egyre több országban fordul elő, hogy a közlekedési eszközökön használatos bérleteket és
jegyeket valamilyen elektronikus eszközön (például: chipes kártya) tárolják. Egy nagyváros
ilyen rendszert szeretne bevezetni a helyi közlekedésben, amelyet néhány buszjáraton
tesztelnek. Ezekre a buszokra csak az első ajtónál lehet felszállni, ahol egy ellenőrző eszközhöz
kell érinteni a kártyát, amelynek chipje tartalmazza a jegy vagy bérlet információkat.
A busz ellenőrző eszköze statisztikai és fejlesztési célból rögzíti a felszállók kártyájának
adatait. Az utasadat.txt szóközökkel tagolt állomány egy, a tesztelésben részt vevő busz
végállomástól-végállomásig tartó útjának adatait tartalmazza.
Az utasadat.txt állomány legfeljebb 2000 sort tartalmaz és minden sorában 5 adat
szerepel. Ezek:
a megálló sorszáma (0-29; 0 az indulás helye és a 30 a végállomás, ahol már nem lehet
felszállni.)
a felszállás dátuma és időpontja (ééééhhnn-óópp formátumban, kötőjellel elválasztva
a dátum és az idő)
a kártya egyedi azonosítója (hétjegyű szám), egy utas a járaton legfeljebb egyszer utazik
a jegy vagy bérlet típusa:
Azonosító Megnevezés
FEB Felnőtt bérlet
TAB Tanulóbérlet (kedvezményes)
NYB Nyugdíjas bérlet (kedvezményes)
NYP 65 év feletti bérlet (ingyenes)
RVS Rokkant, vak, siket vagy kísérő bérlet (ingyenes)
GYK Iskolakezdés előtti gyerekbérlet (ingyenes)
JGY Jegy
a bérlet érvényességi ideje, vagy a felhasználható jegyek száma. A bérlet esetén a dátum
ééééhhnn formátumban szerepel, jegy esetén egy 0-10 közötti szám szerepel.
A fenti példában szereplő adatoknál látható, hogy az induló állomáson (0. állomás)
2019. 03. 26-án 7:00-kor a 1680423 kártyaazonosítójú utas tanulóbérlettel szállt fel, amely
2019. 04. 20-ig érvényes. A 12. állomáson 2019. 03. 26-án 7:16-kor a 9529716
kártyaazonosítójú utas jeggyel szállt volna fel, de már elhasználta az összes jegyét (0).
Készítsen programot, amely az utasadat.txt állomány felhasználásával a következő
kérdésekre válaszol! A program forráskódját eutazas néven mentse! (A program megírásakor
a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie,
feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre a
feladat sorszámát (például 2. feladat)! A részfeladatok eredményeit a mintán látható
formában jelenítse meg! Az ékezetmentes kiírás is elfogadott.
1. Olvassa be és tárolja el az utasadat.txt fájl tartalmát!
2. Adja meg, hogy hány utas szeretett volna felszállni a buszra!
3. A közlekedési társaság szeretné, ha a járművőn csak az érvényes jeggyel vagy bérlettel
rendelkezők utaznának. Ezért a jegyeket és bérleteket a buszvezető a felszálláskor ellenőrzi.
(A bérlet még érvényes a lejárat napján.) Adja meg, hogy hány esetben kellett
a buszvezetőnek elutasítania az utas felszállását, mert lejárt a bérlete vagy már nem volt
jegye!
4. Adja meg, hogy melyik megállóban próbált meg felszállni a legtöbb utas! (Több azonos
érték esetén a legkisebb sorszámút adja meg!)
5. A közlekedési társaságnak kimutatást kell készítenie, hogy hányszor utaztak valamilyen
kedvezménnyel a járművön. Határozza meg, hogy hány kedvezményes és hány ingyenes
utazó szállt fel a buszra! (Csak az érvényes bérlettel rendelkező szállhatott fel a buszra!)
6. Készítsen függvényt napokszama néven az alábbi algoritmus alapján. Az algoritmus
a paraméterként megadott két dátumhoz (év, hónap, nap) megadja a közöttük eltelt napok
számát! (A MOD a maradékos osztást, a DIV az egészrészes osztást jelöli.) Az algoritmust
a fuggveny.txt fájlban is megtalálja. A függvényt a következő feladat megoldásához
felhasználhatja.
Függvény napokszama(e1:egész, h1:egész, n1: egész, e2:egész, h2: egész, n2: egész): egész h1 = (h1 + 9) MOD 12 e1 = e1 - h1 DIV 10 d1 = 365*e1 + e1 DIV 4 - e1 DIV 100 + e1 DIV 400 + (h1*306 + 5) DIV 10 + n1 - 1 h2 = (h2 + 9) MOD 12 e2 = e2 - h2 DIV 10 d2 = 365*e2 + e2 DIV 4 - e2 DIV 100 + e2 DIV 400 + (h2*306 + 5) DIV 10 + n2 - 1 napokszama:= d2-d1
Függvény vége
7. A közlekedési társaság azoknak az utasoknak, akiknek még érvényes, de 3 napon belül lejár
a bérlete, figyelmeztetést szeretne küldeni e-mailben. (Például, ha a felszállás időpontja
2019. február 5., és a bérlet érvényessége 2019. február 8., akkor már kap az utas levelet,
ha 2019. február 9. az érvényessége, akkor még nem kap levelet.) Válogassa ki és írja a
figyelmeztetes.txt állományba ezen utasok kártyaazonosítóját és a bérlet
érvényességi idejét (éééé-hh-nn formátumban) szóközzel elválasztva!
Minta a szöveges kimenetek kialakításához:
2. feladat
A buszra 699 utas akart felszállni.
3. feladat
A buszra 21 utas nem szállhatott fel.
4. feladat
A legtöbb utas (39 fő) a 8. megállóban próbált felszállni.
5. feladat
Ingyenesen utazók száma: 133 fő
A kedvezményesen utazók száma: 200 fő
Minta a figyelmeztetes.txt állomány kialakításához:
# 1. feladat
fajl = open('utasadat.txt')
forras = fajl.read().splitlines()
fajl.close()
adatok = [sor.split(' ') for sor in forras]
print('\n2. feladat')
print('A buszra',len(adatok),'utas akart felszállni.')
print('\n3. feladat')
nemjo = 0
ervenyesek = [] # az érvényes indexek, kell majd az 5. feladathoz
for adat in adatok: erv = True if adat[4]=='0': erv = False if adat[3] != 'JGY': # bérletes felszall = int(adat[1][:4])*365+int(adat[1][4:6])*31+int(adat[1][6:8]) # 1 év 365 nap, 1 hónap 31 napos ervenyes = int(adat[4][:4])*365+int(adat[4][4:6])*31+int(adat[4][6:8]) # 1 év 365 nap, 1 hónap 31 napos if felszall>ervenyes: erv = False if erv: ervenyesek.append(adatok.index(adat))
print('A buszra',len(adatok)-len(ervenyesek),'utas nem szálhatott fel.')
print('\n4. feladat')
felszallok = []
for i1 in range(30): felszallok.append(sum([1 for adat in adatok if int(adat[0])==i1]))
print('A legtöbb utas ('+str(max(felszallok))+') fő a '+str(felszallok.index(max(felszallok)))+'. megállóban próbált felszállni.')
print('\n5. feladat') # a tömbökbe elég pl. 1-eseket írni csak, utána úgyis a méretük kell
kedv = [1 for adat in adatok if adatok.index(adat) in ervenyesek and adat[3] in ['TAB','NYB']]
ingy = [1 for adat in adatok if adatok.index(adat) in ervenyesek and adat[3] in ['RVS','NYP','GYK']]
print('Ingyenesen utazók száma:',len(ingy),'fő.')
print('Kedvezményesen utazók száma:',len(kedv),'fő.')
# 7. feladat
fajl = open('figyelmeztetes-vg.txt','w')
for adat in adatok: if adat[3] != 'JGY' and adatok.index(adat) in ervenyesek: e_1 = int(adat[1][:4]) h_1 = int(adat[1][4:6]) n_1 = int(adat[1][6:8]) e_2 = int(adat[4][:4]) h_2 = int(adat[4][4:6]) n_2 = int(adat[4][6:8]) if napokszama(e_1,h_1,n_1,e_2,h_2,n_2)<4: print(adat[2],adat[4][:4]+'-'+adat[4][4:6]+'-'+adat[4][6:8],file=fajl)
fajl.close()
2019. május (Céges autók)
Egy cég 10 olyan autóval rendelkezik, amelyet a dolgozók igénybe vehetnek az üzleti ügyeik
intézésére. Az autókat akár többnapos útra is elvihetik, illetve egy autót egy nap több dolgozó
is elvihet. A rendszer az autók parkolóból való ki- és behajtását rögzíti. A parkoló a hónap
minden napján 7-23 óra között van nyitva, csak ebben az időszakban lehet elvinni és
visszahozni az autókat. Az autót mindig annak a dolgozónak kell visszahoznia, amelyik elvitte.
Egyszerre csak egy autó lehet minden dolgozónál.
Az autok.txt fájl egy hónap (30 nap) adatait rögzíti. Egy sorban szóközökkel elválasztva
6 adat található az alábbi sorrendben.
nap
egész szám (1-30)
a hónap adott napja
óra:perc
szöveg (óó:pp formátumban)
a ki- vagy a behajtás időpontja
rendszám
6 karakteres szöveg (CEG300-CEG309)
az autó rendszáma
személy azonosítója
egész szám (500-600)
az autót igénybe vevő dolgozó azonosítója
km számláló
egész szám
a km számláló állása
ki/be hajtás
egész szám (0 vagy 1)
a parkolóból kihajtáskor 0, a behajtáskor 1
A sorok száma legfeljebb 500. Az adatok a napok szerint, azon belül óra és perc szerint
rendezettek. Továbbá tudjuk, hogy a hónap első napján a cég mind a tíz autója a parkolóban
volt.
Például:
A példában látható, hogy a CEG300 rendszámú autót az 5. napon kétszer is elvitték. Először
7:30-kor vitték el és 14:16-kor hozta vissza az 590-es dolgozó. A kivitelkor a kilométerszámláló
állása 30 580 km volt, amikor visszahozta 30 656 km volt. Másodszor 17:00-kor vitte el
az 534-es dolgozó az autót és 19:03-kor hozta vissza. A CEG308 rendszámú autót pedig
a 15. napon vitte el az 543-as dolgozó és a 17. napon hozta vissza.
Készítsen programot, amely az autok.txt állomány adatait felhasználva az alábbi
kérdésekre válaszol! A program forráskódját mentse cegesauto néven! (A program
megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell
ellenőriznie, feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok eredményének megjelenítése előtt írja a képernyőre
a feladat sorszámát (például: 3. feladat)! Ha a felhasználótól kér be adatot, jelenítse meg
a képernyőn, hogy milyen értéket vár! Az ékezetmentes kiírás is elfogadott.
Az eredmény megjelenítését és a felhasználóval való kommunikációt a feladatot követő
minta alapján valósítsa meg!
1. Olvassa be és tárolja el az autok.txt fájl tartalmát!
2. Adja meg, hogy melyik autót vitték el utoljára a parkolóból! Az eredményt a mintának
megfelelően írja a képernyőre!
3. Kérjen be egy napot és írja ki a képernyőre a minta szerint, hogy mely autókat vitték ki és
hozták vissza az adott napon!
4. Adja meg, hogy hány autó nem volt bent a hónap végén a parkolóban!
5. Készítsen statisztikát, és írja ki a képernyőre mind a 10 autó esetén az ebben a hónapban
megtett távolságot kilométerben! A hónap végén még kint lévő autók esetén az utolsó
rögzített kilométerállással számoljon! A kiírásban az autók sorrendje tetszőleges lehet.
6. Határozza meg, melyik személy volt az, aki az autó egy elvitele alatt a leghosszabb
távolságot tette meg! A személy azonosítóját és a megtett kilométert a minta szerint írja a
képernyőre! (Több legnagyobb érték esetén bármelyiket kiírhatja.)
7. Az autók esetén egy havi menetlevelet kell készíteni! Kérjen be a felhasználótól egy
rendszámot! Készítsen egy X_menetlevel.txt állományt, amelybe elkészíti az adott
rendszámú autó menetlevelét! (Az X helyére az autó rendszáma kerüljön!) A fájlba
soronként tabulátorral elválasztva a személy azonosítóját, a kivitel időpontját (nap.
óra:perc), a kilométerszámláló állását, a visszahozatal időpontját (nap. óra:perc), és
a kilométerszámláló állását írja a minta szerint! (A tabulátor karakter ASCII-kódja: 9.)
Minta a szöveges kimenetek kialakításához:
2. feladat
30. nap rendszám: CEG300
3. feladat
Nap: 4
Forgalom a(z) 4. napon:
12:50 CEG303 561 ki
19:17 CEG308 552 be
4. feladat
A hónap végén 4 autót nem hoztak vissza.
5. feladat
CEG300 6751 km
CEG301 5441 km
CEG302 5101 km
CEG303 7465 km
CEG304 6564 km
CEG305 5232 km
CEG306 7165 km
CEG307 6489 km
CEG308 6745 km
CEG309 1252 km
6. feladat
Leghosszabb út: 1551 km, személy: 506
7. feladat
Rendszám: CEG304
Menetlevél kész.
A CEG304_menetlevel.txt fájl tartalma:
...
588$\qquad$21. 16:58$\qquad$13452 km$\qquad$23. 20:28$\qquad$14335 km
512$\qquad$24. 16:58$\qquad$14335 km$\qquad$26. 22:21$\qquad$15041 km
504$\qquad$27. 13:47$\qquad$15041 km
# 1. feladat
with open('autok.txt') as fajl: forras = fajl.read().splitlines()
adatok = [sor.split(' ') for sor in forras]
# adatok[nap, idő: óó:pp, rendszám, személy, km, ki:0 vagy be:1]
# 2. feladat; nem biztos, hogy az utolsó bejegyzés a legutolsó idejű
# nap*24*60+óra*60+perc alapján lehet összevetni az időket
# elvitték autókról lista: nap, rendszám, elvitel ideje percekbe konvertálva
lista = [[adat[0],adat[2],24*60*int(adat[0])+60*int(adat[1][0:2])+int(adat[1][3:5])] for adat in adatok if adat[5]=='0']
#print(lista)
utolso = [[a[0],a[1]] for a in lista if a[2]==max([b[2] for b in lista])]
print('2. feladat
'+utolso[0][0]+'. nap rendszám:'+utolso[0][1])
# 3. feladat
print('
3. feladat')
nap = '4'#input('Nap: ')
print('Nap tesztadat:',nap)
print('Forgalom a(z) '+nap+'. napon:')
forgalom = [[adat[1],adat[2],adat[3],adat[5]] for adat in adatok if int(adat[0])==int(nap)] # azért kell az int, mert lehet '4' vagy '04' is a nap
for forg in forgalom: if forg[3]=='0': forg[3]='ki' else: forg[3]='be'
for forg in forgalom: print(' '.join([i for i in forg]))
# 4. feladat
kint = [] # a kint lévő autók listája; ha kiviszik, akkor kivesszük a listából, ha behozzuk, akkor berakjuk a listába
for adat in adatok: if adat[5] == '0': kint.append(adat[2]) else: kint.remove(adat[2])
print('
4. feladat
A hónap végén',len(kint),'autót nem hoztak vissza.')
# 5. feladat
print('
5. feladat')
rendszamok = {adat[2] for adat in adatok}
rendszamok1 = [[rendszam,0,0] for rendszam in rendszamok] # rendszám, első km, utolsó km
#print(rendszamok1)
for rendszam in rendszamok1: for adat in adatok: if rendszam[0] == adat[2]: # kigyűjtjük a rendszámhoz tartozó legkisebb és legnagyobb km értékét az adatokból if int(adat[4]) < rendszam[1] or rendszam[1] == 0: rendszam[1] = int(adat[4]) elif int(adat[4]) > rendszam[2]: rendszam[2] = int(adat[4])
print('
'.join([rendszam[0]+' '+str(rendszam[2]-rendszam[1])+' km' for rendszam in rendszamok1]))
# 6. feladat
# utak[rendszám,ember,kivitel km,megtett út km-ben, kivitel indexe az adatok tömbben, kivitel dátuma, behozatal dátuma, behozatal km]
# az index azért kell, hogy a következő behozatal keresése ettől az indextől induljon; az index utáni adatok a 7. feladat megoldását segítik
# először a kiviteleket gyűjtjük be a tömbbe
utak = [[adat[2],adat[3],int(adat[4]),0,adatok.index(adat),adat[0]+'. '+adat[1],'',''] for adat in adatok if adat[5]=='0']
#print(utak)
# most megvizsgáljuk a kivitelhez legközelebbi visszahozást; ha nem talál, akkor annál az adatnál 0 marad a behozatal és a megtett út
for ut in utak: index1 = ut[4]+1 if index1 < len(adatok): #print('ehhez keres:',ut) #print('innen indul:',index1,adatok[index1]) while index1 #print(' keresés:',index1,adatok[index1],len(adatok)) index1 += 1 #print('megtalálta:',index1,adatok[index1],len(adatok)) if index1 != len(adatok): # kint van-e a kocsi ut[3] = int(adatok[index1][4])-ut[2] ut[6] = adatok[index1][0]+'. '+adatok[index1][1] ut[7] = adatok[index1][4]
utak.sort(key = lambda e:e[3], reverse = True)
#for ut1 in utak:
# print(ut1)
print('
6. feladat
Leghosszabb út:',utak[0][3],'km, személy:',utak[0][1])
#7. feladat
print('
7. feladat')
rendszam = 'CEG304'#input('Rendszám: ')
print('tesztrendszám:',rendszam) # tesztelés után törledő
fajl = open(rendszam+'_menetlevel.txt',mode='w')
menetlevel = [ut for ut in utak if ut[0]==rendszam]
menetlevel.sort(key = lambda e:e[2]) # kivitel km alapján rendezzük
for menet in menetlevel: #print(menet) print(menet[1],menet[5],str(menet[2])+' km ',sep=' ',end='', file=fajl) # ha nincs ott a km utám a spce, hülyén néz ki a kiírás print(' '+menet[6]+' '+menet[7]+' km' if menet[7]!='' else '
', file=fajl)
fajl.close()
print('Menetlevél kész.')
'''
A fájlba
soronként tabulátorral elválasztva a személy azonosítóját, a kivitel időpontját (nap.
óra:perc), a kilométerszámláló állását, a visszahozatal időpontját (nap. óra:perc), és
a kilométerszámláló állását írja a minta szerint!
while index1 < len(menetlevel): if menetlevel[index1][0] == rendszam: sor = menetlevel[index1][1]+' '+menetlevel[index1][2]+'. '+menetlevel[index1][3]+' '+str(menetlevel[index1][4])+' km' index1 += 1 if menetlevel[index1][0] == rendszam: sor += ' '+menetlevel[index1][2]+'. '+menetlevel[index1][3]+' '+str(menetlevel[index1][4])+' km' index1 += 1 fajl.write(sor+'
') else: index1 += 1
print('Menetlevél kész.')
'''
2019. május magyar, mint idegennyelv (Tantárgyfelosztás)
A tantárgyfelosztás a tanév tervezésének alapvető dokumentuma. A tantárgyfelosztás azt
tartalmazza, hogy a tanárok a tantárgyaikat mely osztályokban, hány órában tanítják. Ebben
a feladatban egy négy évfolyamos gimnázium tantárgyfelosztásának adatait kell elemeznie.
A tantárgyfelosztást ezúttal egy adatbázis-kezelő programmal előállított, egyszerű
szerkezetű szöveges állományban kapja az alábbi minta szerint (Minden bejegyzést négy sor
tárol.):
Az első bejegyzés megadja, hogy Albatrosz Aladin tanár úr biológiát (biologia) fog tanítani
a 9.a osztályban heti 2 órában. Ha az osztály betűjele x, akkor évfolyam szintű csoportról van
szó. Példánkban Csincsilla Csilla tanárnő a 9. évfolyam részére heti 2 órás matematika órát tart.
Az osztályfőnököket arról ismerhetjük fel, hogy ők tartják az osztályfőnöki (osztalyfonoki) órát.
A megoldás során felhasználhatja, hogy a fájl maximum 1000 bejegyzést (azaz legfeljebb
4000 sort) tartalmaz. Az iskolában legfeljebb 100 tanár és legfeljebb 50 osztály van, továbbá
minden osztálynak pontosan egy osztályfőnöke van.
Készítsen programot, amely a beosztas1.txt állomány adatait felhasználva az alábbi
kérdésekre válaszol! A program forráskódját mentse tanfel néven! (A program megírásakor
a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőriznie, és
feltételezheti, hogy a rendelkezésre álló adatok a leírtaknak megfelelnek.)
A képernyőre írást igénylő részfeladatok esetén – a mintához tartalmában hasonlóan – írja
ki a képernyőre a feladat sorszámát (például: 3. feladat:), és utaljon a kiírt tartalomra is!
Ha a felhasználótól kér be adatot, jelenítse meg a képernyőn, hogy milyen értéket vár! Mindkét
esetben az ékezetmentes kiírás is elfogadott.
1. Olvassa be és tárolja el a beosztas1.txt állományban talált adatokat, és annak
felhasználásával oldja meg a következő feladatokat!
2. Hány bejegyzés található az állományban? Az eredményt írassa ki a képernyőre!
3. A fenntartó számára fontos információ, hogy az iskolában hetente összesen hány tanítási
óra van. Határozza meg ezt az adatot és írassa ki a képernyőre!
4. Kérje be a felhasználótól egy tanár nevét, és írassa ki a képernyőre, hogy hetente hány
órában tanít!
5. Készítse el az of.txt fájlt, amely az osztályfőnökök nevét tartalmazza osztályonként
az alábbi formában (az osztályok megjelenítésének sorrendje a mintától eltérhet):
6. Egyes osztályokban bizonyos tantárgyakat a tanulók csoportbontásban tanulnak: ekkor az
adott tantárgyra és osztályra két bejegyzést is tartalmaz a tantárgyfelosztás. Kérje be egy
osztály azonosítóját, valamint egy tantárgy nevét, és írassa ki a képernyőre, hogy az adott
osztály a megadott tantárgyat csoportbontásban vagy osztályszinten tanulja-e!
(Feltételezheti, hogy a megadott osztály tanulja a megadott tantárgyat.)
7. A fenntartó számára az is fontos információ, hogy hány tanár dolgozik az iskolában. Írassa
ki ezt az adatot a képernyőre!
Példa a szöveges kimenetek kialakításához:
2. feladat
A fájlban 329 bejegyzés van.
3. feladat
Az iskolában a heti összóraszám: 1016
4. feladat
Egy tanár neve= Albatrosz Aladin
A tanár heti óraszáma: 24
# 1. feladat
with open('beosztas.txt') as fajl: forras = fajl.read().splitlines()
adatok = [forras[i:i+4] for i in range(0,len(forras),4)]
print(adatok) # adatok[név,tantárgy,osztály,óraszám]
# 2. feladat
print('2. feladat
A fájlban',len(adatok),'bejegyzés van.')
# 3. feladat
print('
3. feladat
Az iskolában a heti összóraszám:',sum([int(adat[3]) for adat in adatok]))
# 4. feladat
tanar = 'Albatrosz Aladin'#input('Egy tanár neve= ')
print('
4. feladat
A tanár heti óraszáma:',sum([int(adat[3]) for adat in adatok if adat[0]==tanar]))
# 5. feladat
fajl = open('of.txt',mode='w')
print('
'.join([adat[2]+' - '+adat[0] for adat in adatok if adat[1]=='osztalyfonoki']),fajl)
fajl.close()
# 6. feladat
print('')
osztaly = '9.a'#input('Osztály= ')
tantargy = 'fizika'#input('Tantárgy= ')
print('tesztadatok:',osztaly,tantargy) # tesztelés után törlendő
print('
6. feladat
Osztályszinten tanulják' if len([adat[0] for adat in adatok if (adat[2]==osztaly and adat[1]==tantargy)])==1 else 'Csoportbontásban tanulják')
# 7. feladat
print('
7. feladat
Az iskolában',len({adat[0] for adat in adatok}),'tanár tanít.')