Tesztverseny
Érettségi feladat - 2017. május 15.
Egy közismereti versenyen a versenyzőknek 13+1, azaz összesen 14 tesztfeladatot tűznek ki. A versenyzőknek minden feladat esetén négy megadott lehetőség (A, B, C, D) közül kell a helyes választ megjelölniük. A versenybizottság garantálja, hogy a tesztlapon minden kérdéshez pontosan egy helyes válasz tartozik. A kitöltött tesztlapokat elektronikusan rögzítik, a visszaélések elkerülése végett a versenyzőket betűkből és számokból álló kóddal azonosítják.
A helyes megoldást és a versenyzők válaszait a valaszok.txt szöveges állomány tartalmazza. A fájlban legfeljebb 500 versenyző adatai szerepelnek. A fájl első sorában a helyes válaszok szerepelnek. A fájl többi sora a versenyzők kódjával kezdődik, ezt egy szóköz, majd az adott versenyző által adott válaszok sorozata követi. A versenyzők kódja legfeljebb 5 karakterből áll. A válaszok a feladatokkal egyező sorrendben, elválasztójel nélkül, nagybetűvel szerepelnek. Ha a versenyző egy kérdésre nem válaszolt, akkor annak helyén X betű szerepel. Például:
A 2. kérdésre a helyes válasz a C volt, de erre a kérdésre az AB123 kódú versenyző nem válaszolt.
Készítsünk programot tesztverseny néven az alábbi feladatok megoldására! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőrizni, feltételezhetjük, 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 írjuk a képernyőre
a feladat sorszámát (például: 2. feladat:)! Ha a felhasználótól kérünk be adatot, jelenítsük meg a képernyőn, hogy milyen értéket vár! A képernyőn megjelenő üzenetek az adott környezet
nyelvi sajátosságainak megfelelően a mintától eltérhetnek (pl. ékezetmentes betűk, tizedespont használata).
Készítsünk programot a következő feladatok megoldására!
Olvassuk be és tároljuk el a valaszok.txt szöveges állomány adatait! (5 pont)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <string.h> #define KMAX 6 #define VMAX 15 #define SMAX KMAX+VMAX+2 int beolvas(char *fajlnev,char *helyesvalaszok,struct valaszok adatok[]){ FILE *fp; int i=0; char sor[SMAX],*token,elv[]={" \n"}; if((fp=fopen(fajlnev,"r"))==NULL){ printf("A(z) %s fájl nem található!\n",fajlnev); return -1; } fgets(sor,SMAX-1,fp); strcpy(helyesvalaszok,strtok(sor,elv)); while(fgets(sor,SMAX-1,fp)){ token=strtok(sor,elv); strcpy(adatok[i].kod,token); token=strtok(NULL,elv); strcpy(adatok[i++].valaszok,token); } fclose(fp); return i; } |
Olvassuk be a valaszok.txt adatait a paraméterként kapott struktúra tömbbe, és ügyeljünk arra, hogy az első sort külön dolgozzuk fel. A függvény visszatérési értéke a beolvasott sorok száma legyen.
Jelenítsük meg a képernyőn a mintának megfelelően, hogy hány versenyző vett részt a tesztversenyen! (2 pont)
1 2 3 4 | void main(void){ /* ... */ printf("\n2. feladat: A vetélkedőn %d versenyző indult.\n",index); } |
Írjuk ki a képernyőre a beolvas függvény által visszadott értéket.
Kérjük be egy versenyző azonosítóját, és jelenítsük meg a mintának megfelelően a hozzá eltárolt válaszokat! Feltételezhetjük, hogy a fájlban létező azonosítót adnak meg. (4 pont)
1 2 3 4 5 6 7 8 | void main(void){ /* ... */ printf("\n3. feladat: A versenyző azonosítója = "); scanf("%s",sor); i=0; while(i<index && strcmp(adatok[i].kod,sor)!=0){i++;} printf("%-20s (a versenyző válasza)\n",adatok[i].valaszok); } |
A kereséshez használjunk while ciklust. Amikor a ciklus megáll, akkor a ciklusváltozó a keresett sorszámú rekordra fog hivatkozni.
Írassuk ki a képernyőre a helyes megoldást! A helyes megoldás alatti sorba "+" jelet tegyünk, ha az adott feladatot az előző feladatban kiválasztott versenyző eltalálta, egyébként egy szóközt! A kiírást a mintának megfelelő módon alakítsuk ki! (6 pont)
1 2 3 4 5 6 7 8 9 10 | void main(void){ /* ... */ printf("\n4. feladat:\n"); printf("%-20s (a helyes megoldás)\n",helyes); for(j=0;helyes[j];j++){ er[j]=(helyes[j]==adatok[i].valaszok[j])?'+':' '; } er[j]='\0'; printf("%-20s (a versenyző helyes válaszai)\n",er); } |
Generáljuk le a helyes válaszokat tartalmazó kimenetet egy tömbbe, majd formázottan jelenítsük meg a képernyőn.
Kérjük be egy feladat sorszámát, majd határozzuk meg, hogy hány versenyző adott a feladatra helyes megoldást, és ez a versenyzők hány százaléka! A százalékos eredményt a mintának megfelelően, két tizedesjeggyel írassuk ki! (7 pont)
1 2 3 4 5 6 7 8 9 10 11 | void main(void){ /* ... */ printf("\n5. feladat: A feladat sorszáma = "); scanf("%d",&feladat); for(i=0;i<index;i++){ if(helyes[feladat-1]==adatok[i].valaszok[feladat-1]){ db++; } } printf("A feladatra %d fő, a versenyzők %.2f%%-a adott helyes választ.\n",db,((double)db/index)*100); } |
Ciklussal haladjunk végig a versenyzők válaszain, és amikor a keresett feladatra jó választ találunk, akkor növeljük meg a helyes válaszok számát tároló változó értékét eggyel. A ciklus végén számoljuk ki, hogy a versenyzők hány százaléka adott jó választ a keresett kérdésre, és jelenítsük meg a képernyőn.
A verseny feladatai nem egyenlő nehézségűek: az 1-5. feladat 3 pontot, a 6-10. feladat 4 pontot, a 11-13. feladat 5 pontot, míg a 14. feladat 6 pontot ér. Határozzuk meg az egyes versenyzők pontszámát, és a listát írassuk ki a pontok.txt nevű állományba! Az állomány minden sora egy versenyző kódját, majd szóközzel elválasztva az általa elért pontszámot tartalmazza! (8 pont)
A versenyen a három legmagasabb pontszámot elérő összes versenyzőt díjazzák. Például 5 indulónál előfordulhat, hogy 3 első és 2 második díjat adnak ki. Így megtörténhet az is, hogy nem kerül sor mindegyik díj kiadására. Írassuk ki a mintának megfelelően a képernyőre a díjazottak kódját és pontszámát pontszám szerint csökkenő sorrendben! (9 pont)
A teljes program
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <stdio.h> #include <string.h> #include <locale.h> #define N 500 #define KMAX 6 #define VMAX 15 #define SMAX KMAX+VMAX+2 struct valaszok{ char kod[KMAX], valaszok[VMAX]; int pontok; }; /* Beolvas függvény */ void main(void){ struct valaszok adatok[N]; int i,j,feladat,db=0,index=0; char er[KMAX],sor[SMAX],helyes[SMAX]; setlocale(LC_ALL,""); printf("1. feladat: "); if((index=beolvas("valaszok.txt",helyes,adatok))>0){ printf("Az adatok beolvasása\n"); printf("\n2. feladat: A vetélkedőn %d versenyző indult.\n",index); printf("\n3. feladat: A versenyző azonosítója = "); scanf("%s",sor); i=0; while(i<index && strcmp(adatok[i].kod,sor)!=0){i++;} printf("%-20s (a versenyző válasza)\n",adatok[i].valaszok); printf("\n4. feladat:\n"); printf("%-20s (a helyes megoldás)\n",helyes); for(j=0;helyes[j];j++){ er[j]=(helyes[j]==adatok[i].valaszok[j])?'+':' '; } er[j]='\0'; printf("%-20s (a versenyző helyes válaszai)\n",er); printf("\n5. feladat: A feladat sorszáma = "); scanf("%d",&feladat); for(i=0;i<index;i++){ if(helyes[feladat-1]==adatok[i].valaszok[feladat-1]){ db++; } } printf("A feladatra %d fő, a versenyzők %.2f%%-a adott helyes választ.\n",db,((double)db/index)*100); } } |
A program egy lehetséges kimenete
1. feladat: Az adatok beolvasása 2. feladat: A vetélkedőn 303 versenyző indult. 3. feladat: A versenyző azonosítója = AB123 BXCDBBACACADBC (a versenyző válasza) 4. feladat: BCCCDBBBBCDAAA (a helyes megoldás) + + + + (a versenyző helyes válaszai) 5. feladat: A feladat sorszáma = 10 A feladatra 111 fő, a versenyzők 36,63%-a adott helyes választ.
Ha a program hibamentesen futtatható és szintaktikailag helyes, valamint a képernyőre írt megfelelő formátumú üzenetekért további 4 pont kapható.
Az itt található érettségi feladat megoldása nem az Oktatási Minisztérium által kiadott hivatalos megoldás. A feladatokat azért dolgoztam ki C nyelven is, hogy segítsem a diákjaim sikeres emelt szintű érettségi felkészülését. A megoldások irányadó jellegűek, a feladatok többféleképpen is megoldhatóak.
Ha a lakattal jelölt feladatok megoldásaira is kíváncsi vagy, keress bizalommal!