C programozási nyelv, C programozás oktatás kezdőknek
Kérdésed van? +36 70 410 1763 info@c-programozas.hu

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:

Emelt szintű érettségi felkészítés

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!