Ö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!