
81_KOLLÉGISTÁK
81_KOLLÉGISTÁK

def beolvasas(fajlnev):
adatok = []
with open(fajlnev, 'r', encoding='utf-8') as file:
reader = csv.reader(file, delimiter=';')
sorok = list(reader)
n = int(sorok[0][0])
m = int(sorok[1][0])
for sor in sorok[2:n+3]:
nev = sor[0].strip('"')
pontok = list(map(int, sor[1:m+1]))
osszpont = sum(pontok)
adatok.append([nev] + pontok + [osszpont])
return adatok, n, m
def feladatok_osszpontszama(adatok, n, m):
ossz_pontok = [0] * (m + 1)
for i in range(n):
for j in range(m):
ossz_pontok[j] += adatok[i][j+1]
return ossz_pontok
def rendez(adatok):
adatok.sort(key=lambda x: x[-1], reverse=True)
def cimkezes(pont):
if pont >= 91:
return "Arany"
elif pont >= 81:
return "Ezüst"
elif pont >= 71:
return "Bronz"
return ""
def kiiras(adatok, ossz_pontok):
for versenyzo in adatok:
print(f"{versenyzo[0]:10} ", end="")
for pont in versenyzo[1:]:
print(f"{pont:4}", end=" ")
print(cimkezes(versenyzo[-1]))
print("\nFeladatok összpontszáma:")
print("Összesen: ", " ".join(map(str, ossz_pontok)))
adatok, n, m = beolvasas("verseny.csv")
ossz_pontok = feladatok_osszpontszama(adatok, n, m)
rendez(adatok)
kiiras(adatok, ossz_pontok)
Ez a program egy CSV fájlból beolvassa a versenyzők nevét és pontszámait, majd az adatok alapján értékelést végez és megjeleníti az eredményeket. Nézzük lépésről lépésre, hogy mit csinál:
1️⃣ Beolvasás (beolvasas)
Megnyitja a fájlt és beolvassa az adatokat.
Az első két sorból kiolvassa, hány versenyző (n) és hány feladat (m) van.
A további sorokból kiolvassa a versenyző nevét és pontszámait.
Összegzi a pontszámokat, majd eltárolja őket egy listában.
2️⃣ Feladatok összpontszámának kiszámítása (feladatok_osszpontszama)
Kiszámítja, hogy az egyes feladatok során összesen hány pontot kaptak a versenyzők.
3️⃣ Rendezés (rendez)
A versenyzőket a kapott összpontszámuk alapján csökkenő sorrendbe rendezi.
4️⃣ Címkézés (cimkezes)
Az összpontszám alapján besorolja a versenyzőket:
Arany (91+ pont)
Ezüst (81-90 pont)
Bronz (71-80 pont)
Egyéb esetben nincs címke.
5️⃣ Eredmények kiírása (kiiras)
Megjeleníti a versenyzők nevét, pontszámait, összesített eredményeiket és a kategóriájukat.
Megjeleníti az egyes feladatok összpontszámát is.
Nagy Programozóverseny és a Python
A gimnáziumban minden évben megrendezik a Nagy Programozóversenyt. Idén a szervezők egy új ötlettel álltak elő: a diákoknak maguknak kell megírniuk egy programot, amely feldolgozza és kiértékeli a verseny eredményeit!
"Ez nagyon izgalmas lesz!" – mondta Anna, miközben a laptopjához ült.
"Kezdjük azzal, hogy beolvassuk a verseny eredményeit!" – javasolta Péter.
1️⃣ Az adatok beolvasása
Első lépésként importálni kell a megfelelő modult a fájlkezeléshez.
import csv
"Nyissuk meg a fájlt és olvassuk be a sorokat!" – tette hozzá Gábor.
def beolvasas(fajlnev):
A programnak el kell tárolnia az adatokat, ezért létrehoznak egy üres listát.
adatok = []
"Most nyissuk meg a fájlt olvasásra!"
with open(fajlnev, 'r', encoding='utf-8') as file:
Mivel a fájl pontosvesszővel (;) elválasztott értékeket tartalmaz, egy csv olvasót használnak.
reader = csv.reader(file, delimiter=';')
"A sorokat listába mentjük, hogy könnyebb legyen velük dolgozni!"
sorok = list(reader)
"Az első két sor a versenyzők és a feladatok számát tartalmazza!"
n = int(sorok[0][0])
m = int(sorok[1][0])
"Most dolgozzuk fel a versenyzők adatait!"
for sor in sorok[2:n+3]:
"Az első oszlop a versenyző neve, vegyük ki belőle az idézőjeleket!"
nev = sor[0].strip('"')
"A következő oszlopok a feladatokra kapott pontszámok!"
pontok = list(map(int, sor[1:m+1]))
Ez a kódrészlet egy lista (pontok) létrehozását jelenti, amelyben egy adott sor (sor) meghatározott elemeit egész számokká alakítja.
Bontsuk szét:
sor[1:m+1] – A sor listából kiválasztja az 1. indexű elemtől az m+1-edik elemig tartó részt. Ez lesz az átalakítandó adatok listája.
map(int, sor[1:m+1]) – A map függvény minden egyes elemre alkalmazza az int() konverziót, azaz minden szöveges számot egész számmá alakít.
list(...) – A map() objektum alapvetően egy iterátor, így ezzel alakítjuk át egy valódi listává.
Ez tehát egy olyan listát hoz létre, amely az sor megfelelő elemeit tartalmazza, de már egész számként. Például, ha sor = ['Anna', '23', '45', '78'] és m=3, akkor:
pontok = list(map(int, sor[1:4])) # [23, 45, 78]
"Számoljuk ki az összpontszámot!"
osszpont = sum(pontok)
"Adjunk mindent egy listához: név, pontszámok és az összpontszám!"
adatok.append([nev] + pontok + [osszpont])
"Végül térjünk vissza az adatokkal!"
return adatok, n, m
2️⃣ A feladatok összpontszámának kiszámítása
"Most nézzük meg, összesen hány pontot értek el az egyes feladatokban!"
def feladatok_osszpontszama(adatok, n, m):
Először egy listát hoznak létre, amely az összes feladat pontszámait tárolja.
ossz_pontok = [0] * (m + 1)
"Most végigmegyünk minden versenyzőn és összeadjuk a pontjaikat!"
for i in range(n):
for j in range(m):
ossz_pontok[j] += adatok[i][j+1]
"Végül visszaadjuk az összegzett pontokat!"
return ossz_pontok
3️⃣ Rendezés eredmény szerint
"Most rendezzük a versenyzőket az összpontszám szerint!"
def rendez(adatok):
"Használjunk egy beépített rendezőfüggvényt, amely csökkenő sorrendbe rakja őket!"
adatok.sort(key=lambda x: x[-1], reverse=True)
Ez a kódrészlet a "adatok" listát rendezi az utolsó elemük értéke alapján, csökkenő sorrendben.
🔹 Elemzés:
adatok.sort(...) → Rendezést végez a adatok listán, módosítva annak sorrendjét.
key=lambda x: x[-1] → Meghatározza, hogy a rendezés milyen érték alapján történjen:
A lambda x: x[-1] azt jelenti, hogy minden egyes x lista utolsó elemét (x[-1]) használja rendezési kulcsként.
reverse=True → Csökkenő sorrendben történik a rendezés (tehát a legnagyobb érték lesz az első).
4️⃣ Érmek kiosztása
"Adjunk érmeket az elért pontszámok alapján!"
def cimkezes(pont):
Ha valaki 91 vagy több pontot ért el, aranyérmet kap.
if pont >= 91:
return "Arany"
Ha 81 és 90 pont között van, ezüstérmet kap.
elif pont >= 81:
return "Ezüst"
Ha 71 és 80 pont között van, bronzérmet kap.
elif pont >= 71:
return "Bronz"
Mindenki másnak nem jár érem.
return ""
5️⃣ Kiírás a képernyőre
"Most írjuk ki az eredményeket szépen formázva!"
def kiiras(adatok, ossz_pontok):
"Végigmegyünk a versenyzők listáján!"
for versenyzo in adatok:
print(f"{versenyzo[0]:10} ", end="")
"Kiírjuk az egyes feladatokra kapott pontszámokat!"
for pont in versenyzo[1:]:
print(f"{pont:4}", end=" ")
"Hozzáadjuk az érmet (ha van)!"
print(cimkezes(versenyzo[-1]))
"Most kiírjuk az egyes feladatok összpontszámait is!"
print("\nFeladatok összpontszáma:")
print("Összesen: ", " ".join(map(str, ossz_pontok)))
Az "Összesen: " szöveg jelenik meg először.
Az " ".join(map(str, ossz_pontok)) rész alakítja át az ossz_pontok listát szép, szóközzel elválasztott formátumba:
map(str, ossz_pontok) minden elemet szöveggé (str) alakít a listában, így elkerüljük, hogy számokat és szöveget próbáljunk egyben kiírni.
" ".join(...) pedig összefűzi az átalakított értékeket egy szóközzel elválasztott listává.
6️⃣ A program futtatása
"Most futtassuk le a programot és nézzük az eredményeket!"
adatok, n, m = beolvasas("verseny.csv")
ossz_pontok = feladatok_osszpontszama(adatok, n, m)
rendez(adatok)
kiiras(adatok, ossz_pontok)
"Megcsináltuk!" A program sikeresen feldolgozta az eredményeket és kiosztotta az érmeket!
Az iskola hivatalosan is bejelentette a végeredményeket, és mindenki izgatottan nézte az eredménylistát.
A Nagy Programozóverseny hivatalos eredményeit egy saját Python program számolta ki!