Középiskolai Matematikai és Fizikai Lapok
Informatika rovattal
Kiadja a MATFUND Alapítvány
Már regisztráltál?
Új vendég vagy?

Az I. 225. feladat (2009. november)

I. 225. E feladat a szöveges állományok gyors és hatékony feldolgozásának eszközét, az awk programozási nyelv alapszintű megismerését tűzi ki célul az alábbi feladat megoldásán keresztül.

A meccs.txt (honlapunkról letölhető) szövegfájl labdarúgó mérkőzések eredményeit tartalmazza. Soronként egy mérkőzés adatai láthatók (hazai csapat, vendégcsapat, hazai gólok száma, vendég gólok száma), az egyes értékeket egyetlen szóköz választja el egymástól.

Adjuk meg a következő feladatok megoldását awk nyelven.

1. Készítsük el a mérkőzések listáját a következő minta szerint: \ Alfa -- Béta: 1--2 (A mérkőzések megjelenítését a későbbiekben is ilyen módon várjuk el.)

2. Listázzuk ki a Gamma csapat mérkőzéseit.

3. Jelenítsük meg a Delta csapat otthoni győztes mérkőzéseit.

4. Adjuk meg, hány mérkőzést tartalmaz az állomány.

5. Írjuk ki a képernyőre, mekkora volt a legnagyobb különbségű vendéggyőzelem.

6. Számítsuk ki az Alfa otthon szerzett pontszámát. (A győzelemért 3, a döntetlenért 1 pont jár.)

7. Készítsünk statisztikát, amely kilistázza, hogy melyik eredmény hányszor fordult elő. Feltételezhető, hogy egyetlen csapat sem szerzett 9 gólnál többet. (Az eredményt a hazai csapat szemszögéből kell vizsgálni.)

Az első négy feladat megoldása 1-1, a további feladatok megoldása 2 pontot ér.

Mintafeladat: Adjuk meg, hány gól született a mérkőzéseken összesen. E feladat megoldását a következő parancs szolgáltatja:

awk "BEGIN { ossz=0 }{ ossz+=($3+$4) } END { print ossz }" meccs.txt

A parancs windows alatt működik, linux alatt a határoló jelek módosítására szükség lehet.

Az eszköz megismerését segítheti a következő címen található leírás:\ http://hup.hu/old/gawk/tobb/gawk_toc.html.

Beküldendő az egyes feladatok megoldását jól elkülönített módon tartalmazó i225.txt fájl, amelyben szerepeljen az operációs rendszer megnevezése és a megoldáskor használt awk verziószáma is.

meccs.txt

(10 pont)

A beküldési határidő 2009. december 10-én LEJÁRT.


A feladatban megnevezett eszközt igen hatékonyan tudják használni azok, akik komolyabban foglalkoznak informatikával. A feladat könnyen érthető példák segítségével igyekezett a KöMaL megoldóit bevezetni a használat rejtelmeibe.

Meglepő volt, hogy a megoldók fele Linux operációs rendszert használt (Ubuntu és Debian) és csak a fele dolgozott Microsoft operációs rendszer (XP) alatt.

Néhány feladat megoldása szinte betűről-betűre egyezett a feladat kitűzésekor kigondolttal, de esetenként voltak jelentősen eltérő megoldások is.

Az első három feladatban azt kellett kihasználnunk, hogy az awk program a bemeneti fájl minden sorát feldolgozza pontosan ugyanúgy, mintha egy "hétköznapi" programozási nyelvben ilyen céllal egy ciklust írnánk. A sorban található adatokat egy megadott határolójel mentén (alapértelmezésben szóköz) felbont és az adatokat egy-egy változóban helyezi el. $i a sorbeli i-edik változót tárolja. Ezen ismereten túl még az elágazásra volt szükség, amelyet a C-szerű nyelvekben megszokott formában lehetett alkalmazni.

1. Készítsük el a mérkőzések listáját a következő minta szerint: Alfa - Béta: 1-2

Megoldás:

awk "{ print $1 \" - \" $2 \" : \" $3 \" - \" $4 }" meccs.txt

2. Listázzuk ki a Gamma csapat mérkőzéseit.

Megoldás:

awk "{ if($1==\"Gamma\" || $2==\"Gamma\" ) {print $1 \" - \" $2 \" : \" $3 \"-\" $4 } }" meccs.txt

3. Listázzuk ki a Delta csapat otthoni győztes mérkőzéseit.

Megoldás:

awk "{ if($1==\"Delta\" && $3>$4 ) {print $1 \" - \" $2 \" : \" $3 \"-\" $4 } }" meccs.txt

A további feladatok megoldásához több ismeretre van szükség. A BEGIN mögött megfogalmazott utasításrész csak egyszer, még a fájl feldolgozása előtt, az END után írt utasításrész pedig a fájl feldolgozását követően kerül végrehajtásra. Előbbi a kezdőértékek megadására, utóbbi az eredmény egyszeri megjelenítésére teszi alkalmassá az eszközt.

4. Adjuk meg, hány mérkőzést tartalmaz az állomány.

Megoldás:

awk "END { print NR }" meccs.txt

A helyi változók használata nagyon egyszerűvé teszi az alábbi szélsőértékmeghatározást.

5. Adjuk meg, mekkora volt a legnagyobb különbségű vendéggyőzelem.

Megoldás:

awk "BEGIN { max=0 } { if ($4-$3>max){ max=$4-$3 } } END {print max} " meccs.txt

6. Számítsuk ki az Alfa otthon szerzett pontszámát! (A győzelemért 3, a döntetlenért 1 pont jár.)

Megoldás:

awk "BEGIN { pont=0 } { if ($1==\"Alfa\"){ if($3>$4){ pont+=3} if($3==$4){ pont+=1}} } END {print pont} " meccs.txt

A tömb adatszerkezet is a megszokott módon használható.

Az aktuális feladatnál azért volt szükség a szerzett gólokra vonatkozóan határt szabni, hogy egyszerű számlálásos ciklussal meg lehessen jeleníteni az eredményt.

7. Készítsünk statisztikát, amely kilistázza, hogy melyik eredmény hányszor fordult elő! Feltételezhető, hogy egyetlen csapat sem szerzett 9 gólnál többet. (Az eredményt a hazai csapat szemszögéből kell vizsgálni.)

Megoldás:

awk "{ e[$3,$4]++ } END {for (i=0; i<10; i++) { for (j=0; j<10; j++) { if (e[i,j]>0) {print i \"-\" j \" : \" e[i,j] \" darab\"} } } }" meccs.txt


Statisztika:

6 dolgozat érkezett.
10 pontot kapott:Balla Attila, Nagy 111 Miklós, Szabó 928 Attila.
9 pontot kapott:Pap 999 Dávid.
8 pontot kapott:1 versenyző.
6 pontot kapott:1 versenyző.

A KöMaL 2009. novemberi informatika feladatai