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

Ötszáz

Érettségi feladat - 2016. május 10.

Egy apróságokat árusító boltban minden árucikk darabja 500 Ft. Ha egy vásárlás során valaki egy adott árucikkből több darabot is vesz, a második ára már csak 450 Ft, a harmadik pedig 400 Ft, de a negyedik és további darabok is ennyibe kerülnek, tehát az ár a harmadik ugyanazon cikk vásárlása után már nem csökken tovább.

A pénztárhoz menők kosarában legalább 1 és legfeljebb 20 darab árucikk lehet. A kosarak tartalmát a penztar.txt fájl írja le, amelyben soronként egy-egy árucikk neve vagy az F karakter szerepel. A fájlban legfeljebb 1000 sor lehet. Az F karakter azt jelzi, hogy az adott vásárlónak nincs már újabb árucikk a kosarában, fizetés következik. Az árucikkek neve ékezet nélküli, több szóból is állhat, hossza legfeljebb 30 karakter.

Példa a penztar.txt fájl első néhány sorára:
toll
F
colostok
HB ceruza
HB ceruza
colostok
toll
szatyor
csavarkulcs
doboz
F

A példa alapján az első vásárló összesen 1 tollat vásárolt, ezért összesen 500 Ft-ot kell fizetnie. A második vásárlás során hatféle árucikket vásároltak – a HB ceruzából és a colostokból többet is –, összesen 3900 Ft értékben.

Készítsünk programot, amely a penztar.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentsük otszaz néven! (A program megírásakor a felhasználó által megadott adatok helyességét, érvényességét nem kell ellenőrizni, és feltételezhető, 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: 3. 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 program! Az ékezetmentes kiírás is elfogadott.

Olvassuk be és tároljuk el a penztar.txt fájl tartalmát! (4 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
void main(void){
	/* ... */
	printf("1. feladat:\n");
	if((fp=fopen("penztar.txt","r"))==NULL){
		printf("A penztar.txt nem letezik, ezert a program leall!\n");
		return 1;
	}
	while(fgets(sor,SMAX-1,fp)){
		token=strtok(sor,elv);
		if(strcmp(token,"F")==0){
			adatok[index].db=i;
			index++; i=0;
		}
		else{
			adatok[index].aru[i] = (char *)malloc((strlen(token)+1)*sizeof(char));
			if(adatok[index].aru[i]==NULL){
				printf("Nincs elegendo memoria, ezert a program leall!\n");
				return 1;
			}
			strcpy(adatok[index].aru[i],token); 
			i++;
		}
	}
	printf("Az adatok beolvasasa sikeresen megtortent!\n");
}

Olvassuk be soronként a penztar.txt tartalmát úgy, hogy az egyes vásárlók adatait egy dinamikusan tárolt karaktertömbben tároljuk. Az "F" karakter megjelenésekor tudni fogjuk, hogy egy adott vásárlót zárni kell, és a következő sort már egy újabb rekordba kell mentenünk. Ezzel a megoldással a struktúra minden eleme egy vásárlót fog azonosítani, ahol nyilvántartjuk a vásárolt tételeket és azok darabszámát.

Határozzuk meg, hogy hányszor fizettek a pénztárnál! (2 pont)

1
2
3
4
void main(void){
	/* ... */
	printf("\n2. feladat\nA fizetesek szama: %d\n",index);
}

Írjuk ki a képernyőre a struktúratömb méretét.

Írjuk a képernyőre, hogy az első vásárlónak hány darab árucikk volt a kosarában! (3 pont)

1
2
3
4
void main(void){
	/* ... */
	printf("\n3. feladat\nAz elso vasarlo %d darab arucikket vasarolt.\n",adatok[0].db);
}

Írjuk ki a képernyőre a legelső vásárló tételeinek számát.

Kérjük be a felhasználótól egy vásárlás sorszámát, egy árucikk nevét és egy darabszámot! A következő három feladat megoldásánál ezeket használjuk fel! (3 pont)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
void main(void){
	/* ... */
	printf("\n4. feladat\nAdja meg egy vasarlas sorszamat: ");
	scanf("%d",&sorszam);
	fflush(stdin);
	printf("Adja meg egy arucikk nevet: ");
	fgets(sor,SMAX-1,stdin);
	token=strtok(sor,elv);
	printf("Adja meg a vasarolt darabszamot: ");
	scanf("%d",&db);
}

Olvassuk be a kért adatokat, és tároljuk le őket.

Határozzuk meg, hogy a bekért árucikkből melyik vásárláskor vettek először, és melyiknél utoljára, valamint azt is, hogy összesen hány alkalommal vásároltak belőle! (8 pont)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
void main(void){
	/* ... */
	for(i=0;i<index;i++){
		for(j=0;j<adatok[i].db;j++){
			if(strcmp(adatok[i].aru[j],token)==0){
				if(elso==0){
					elso=i;
				}
				utolso=i;
				osszes++;
			}
		}
	}
	printf("\n5.feladat\n");
	printf("Az elso vasarlas sorszama: %d\n",elso+1);
	printf("Az utolso vasarlas sorszama: %d\n",utolso+1);
	printf("%d vasarlas soran vettek belole\n",osszes);
}

A kereséshez indítsunk két ciklust. A külső haladjon a struktúra elemein, a belső pedig a vásárlók vásárlási tételein. Ha a keresett tételt megtaláljuk, akkor tároljuk le az előfordulások indexeit, és növeljük a tétel gyakoriságát.

Határozzuk meg, hogy a bekért darabszámot vásárolva egy termékből mennyi a fizetendő összeg! A feladat megoldásához készítsünk függvényt ertek néven, amely a darabszámhoz a fizetendő összeget rendeli! (6 pont)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
int ertek(int db){
	if(db==1){
		return 500;
	} else if(db==2){
		return 950;
	} else if(db==3){
		return 1350;
	} else{
		return 1350+((db-3)*400);
	}
}

void main(void){
	/* ... */
	printf("\n6.feladat \n%d darab vetelekor fizetendo: %d Ft\n",db,ertek(db));
}

Készítsünk függvényt a vételár meghatározására, és hívjuk meg a főprogramban.

Határozzuk meg, hogy a bekért sorszámú vásárláskor mely árucikkekből és milyen mennyiségben vásároltak! Az árucikkek nevét tetszőleges sorrendben is megjeleníthetjük. (7 pont)

Készítsük el az osszeg.txt fájlt, amelybe soronként az egy-egy vásárlás alkalmával fizetendő összeg kerüljön a kimeneti mintának megfelelően! (9 pont)

A fő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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SMAX 32
#define AMAX 20
#define N 200

int ertek(int db){
	if(db==1){
		return 500;
	} else if(db==2){
		return 950;
	} else if(db==3){
		return 1350;
	} else{
		return 1350+((db-3)*400);
	}
}	

struct penztar{
	char *aru[AMAX];
	int db;
};

int main(void){
	FILE *fp;
	struct penztar adatok[N];
	int index=0,i=0,sorszam=0,db,j=0,elso=0,utolso,osszes=0;
	char sor[SMAX];
	char *token,elv[]={"\n"};
	printf("1. feladat:\n");
	if((fp=fopen("penztar.txt","r"))==NULL){
		printf("A penztar.txt nem letezik, ezert a program leall!\n");
		return 1;
	}
	while(fgets(sor,SMAX-1,fp)){
		token=strtok(sor,elv);
		if(strcmp(token,"F")==0){
			adatok[index].db=i;
			index++; i=0;
		}
		else{
			/* Dinamikus memoriakezeles */
			adatok[index].aru[i] = (char *)malloc((strlen(token)+1)*sizeof(char));
			if(adatok[index].aru[i]==NULL){
				printf("Nincs elegendo memoria, ezert a program leall!\n");
				return 1;
			}
			strcpy(adatok[index].aru[i],token); 
			i++;
		}
	}
	printf("Az adatok beolvasasa sikeresen megtortent!\n");	
	printf("\n2. feladat\nA fizetesek szama: %d\n",index);
	printf("\n3. feladat\nAz elso vasarlo %d darab arucikket vasarolt.\n",adatok[0].db);
	printf("\n4. feladat\nAdja meg egy vasarlas sorszamat: ");
	scanf("%d",&sorszam);
	/* Bemeneti puffer uritese */
	fflush(stdin);
	printf("Adja meg egy arucikk nevet: ");
	fgets(sor,SMAX-1,stdin);
	token=strtok(sor,elv);
	printf("Adja meg a vasarolt darabszamot: ");
	scanf("%d",&db);
	for(i=0;i<index;i++){
		for(j=0;j<adatok[i].db;j++){
			if(strcmp(adatok[i].aru[j],token)==0){
				if(elso==0){
					elso=i;
				}
				utolso=i;
				osszes++;
			}
		}
	}
	printf("\n5.feladat\n");
	printf("Az elso vasarlas sorszama: %d\n",elso+1);
	printf("Az utolso vasarlas sorszama: %d\n",utolso+1);
	printf("%d vasarlas soran vettek belole\n",osszes);
	printf("\n6.feladat \n%d darab vetelekor fizetendo: %d Ft\n",db,ertek(db));
	/* A lefoglalt memoria felszabaditasa */
	for(i=0;i<index;i++){
		for(j=0;j<adatok[i].db;j++){
			free(adatok[i].aru[j]);
		}
	}
	return 0;
}

A program egy lehetséges kimenete

1. feladat:
Az adatok beolvasasa sikeresen megtortent!

2. feladat
A fizetesek szama: 141

3. feladat
Az elso vasarlo 1 darab arucikket vasarolt.

4. feladat
Adja meg egy vasarlas sorszamat: 10
Adja meg egy arucikk nevet: toll
Adja meg a vasarolt darabszamot: 5

5.feladat
Az elso vasarlas sorszama: 2
Az utolso vasarlas sorszama: 136
44 vasarlas soran vettek belole

6.feladat
5 darab vetelekor fizetendo: 2150 Ft

A képernyőre írt megfelelő formátumú üzenetekért további 3 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!