Társalgó
Érettségi feladat - 2018. május 14.
Egy színház társalgójában még a délelőtti próbák alatt is nagy a forgalom. A színészek hosszabb-rövidebb beszélgetésekre térnek be ide, vagy éppen csak keresnek valakit. A feladatban a társalgó ajtajánál 9 és 15 óra között felvett adatokat kell feldolgozni.
Az ajto.txt fájlban időrendben rögzítették, hogy ki és mikor lépett be vagy ki a társalgó egyetlen ajtaján. A fájl soraiban négy, szóközzel elválasztott érték található. Az első két szám az áthaladás időpontja (óra, perc), a harmadik a személy azonosítója, az utolsó az áthaladás iránya (be/ki). A sorok száma legfeljebb 1000, a személyek azonosítója egy 1 és 100 közötti egész szám. Biztosan tudjuk, hogy a megfigyelés kezdetén (9 órakor) a társalgó üres volt, de a megfigyelés végén (15 órakor) még lehettek benn a társalgóban. A társalgóba be- és kilépéseket azok sorrendjében tartalmazza az állomány, még akkor is, ha a perc pontossággal rögzített adatok alapján egyezőség áll fenn. Például:
A fenti példában a szürke mintázatú részen a bemeneti fájl első néhány sora látható. A második sora azt mutatja, hogy a 9-es azonosítójú személy 9 óra 1 perckor lépett be a társalgóba. A negyedik sorban olvasható, hogy 9 óra 5 perckor már ki is ment, tehát ekkor összesen 4 percet töltött bent. A szürke rész sorai mellett olvasható számok azt mutatják, hogy a be- vagy kilépést követően hányan vannak bent a társalgóban. Ez a szám egy percen belül akár többször is változhat.
Készítsünk programot, amely az ajto.txt állomány adatait felhasználva az alábbi kérdésekre válaszol! A program forráskódját mentsük tarsalgo néven! (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: 4. 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árunk! Az ékezetmentes kiírás is elfogadott.
Olvassuk be és tároljuk el az ajto.txt fájl tartalmát! (5 pont)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int beolvas(char *bemenet,struct tarsalgo a[]){ int i=0; FILE *fp=fopen(bemenet,"r"); if(fp==NULL){ return -1; } while(!feof(fp)){ if(fscanf(fp,"%d %d %d %s",&a[i].o,&a[i].p,&a[i].szemely,a[i].irany)==4){ i++; } } fclose(fp); return i; } |
Olvassuk be az ajto.txt adatait a paraméterként kapott struktúra tömbbe, és ügyeljünk arra, hogy az input fájl végén lévő üres sort ne dolgozzuk fel. A függvény visszatérési értéke a beolvasott sorok száma legyen.
Írjuk a képernyőre annak a személynek az azonosítóját, aki a vizsgált időszakon belül először lépett be az ajtón, és azét, aki utoljára távozott a megfigyelési időszakban! (3 pont)
1 2 3 4 5 6 7 8 9 | #include <string.h> int utolso_kilepo(struct tarsalgo a[],int meret){ int i=meret-1; while(i>=0 && strcmp(a[i].irany,"ki")!=0){ i--; } return a[i].szemely; } |
Az első belépő személy sorszámát a struktúra tömb első eleme tárolja. Az utolsó távozó meghatározásához induljunk el a tömb végéről és keressük meg az első kilépő személyt. Visszatérési értékként a személy sorszámát adjuk.
Határozzuk meg a fájlban szereplő személyek közül, ki hányszor haladt át a társalgó ajtaján! A meghatározott értékeket azonosító szerint növekvő sorrendben írjuk az athaladas.txt fájlba! Soronként egy személy azonosítója, és tőle egy szóközzel elválasztva az áthaladások száma szerepeljen! (8 pont)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #define M 101 int athaladas(struct tarsalgo a[],int meret,int stat[]){ int i; FILE *fp=fopen("athaladas.txt","w"); if(fp==NULL){ return 0; } for(i=0;i<M;i++){ stat[i]=0; } for(i=0;i<meret;i++){ stat[a[i].szemely]++; } for(i=0;i<M;i++){ if(stat[i]>0){ fprintf(fp,"%d %d\n",i,stat[i]); } } fclose(fp); return 1; } |
Ahhoz, hogy megkapjuk, ki hányszor haladt át a társalgó ajtaján, készítsünk statisztikát a személyek előfordulásáról. A kimeneti fájlba csak azokat a sorszámú személyeket írjuk, akik legalább egyszer benne voltak a fájlban. A függvény a statisztika tömb tartalmát átadja a hívó félnek, amit később még felhasználhatunk (következő feladatban).
Írjuk a képernyőre azon személyek azonosítóját, akik a vizsgált időszak végén a társalgóban tartózkodtak! (4 pont)
1 2 3 4 5 6 7 8 9 10 11 | #define M 101 void bentmaradtak(int stat[]){ int i; for(i=0;i<M;i++){ if(stat[i]!=0 && stat[i]%2!=0){ printf("%d ",i); } } printf("\n"); } |
Az előző feladat alapján azok a személyek maradtak a társalgóban, akik páratlan előfordulással rendelkeznek a vizsgált időszak végén.
Hányan voltak legtöbben egyszerre a társalgóban? Írjunk a képernyőre egy olyan időpontot (óra:perc), amikor a legtöbben voltak bent! (6 pont)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <string.h> int bentlevok_max(struct tarsalgo a[],int meret){ int i,letszam=0,max=0,maxi=0; for(i=0;i<meret;i++){ if(!strcmp(a[i].irany,"be")){ letszam++; }else if(!strcmp(a[i].irany,"ki")){ letszam--; } if(letszam>max){ max=letszam; maxi=i; } } return maxi; } |
A létszám meghatározásához haladjunk végig a struktúra tömb elemein, és növeljük a létszámot, ha valaki belép, valamit csökkentsük, ha valaki kilép. Keressük meg az így kapott aktuális létszámok maximumát. A függvény visszatérési értéke a megtalált maximumhoz tartozó rekord indexe legyen.
Kérjük be a felhasználótól egy személy azonosítóját! A további feladatok megoldásánál ezt használjuk fel! Feltételezhetjük, hogy a megadott azonosítóhoz tartozik adat a forrásfájlban. (2 pont)
Írjuk a képernyőre, hogy a beolvasott azonosítóhoz tartozó személy mettől meddig tartózkodott a társalgóban! (7 pont)
Határozzuk meg, hogy a megfigyelt időszakban a beolvasott azonosítójú személy összesen hány percet töltött a társalgóban! Az előző feladatban példaként szereplő 22-es személy 5 alkalommal járt bent, a megfigyelés végén még bent volt. Róla azt tudjuk, hogy 18 percet töltött bent a megfigyelés végéig. A 39-es személy 6 alkalommal járt bent, a vizsgált időszak végén nem tartózkodott a helyiségben. Róla azt tudjuk, hogy 39 percet töltött ott. Írjuk ki, hogy a beolvasott azonosítójú személy mennyi időt volt a társalgóban, és a megfigyelési időszak végén bent volt-e még! (8 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 | #include <stdio.h> #include <string.h> #include <locale.h> #define IMAX 3 #define N 1000 #define M 101 struct tarsalgo{ int o,p; int szemely; char irany[IMAX]; }; /* Függvények ... */ int main(void){ struct tarsalgo adatok[N]; int meret,stat[M],m,szemely; setlocale(LC_ALL, ""); /* 1. feladat */ printf("1. feladat\n"); meret=beolvas("ajto.txt",adatok); if(meret>0){ printf("Az ajto.txt beolvasása sikeresen megtörtént!\n"); } else{ printf("Az ajto.txt beolvasása sikertelen!\n"); } /* 2. feladat */ printf("\n2. feladat\n"); printf("Az első belépő: %d\nAz utolsó kilépő: %d\n",adatok[0].szemely,utolso_kilepo(adatok,meret)); /* 3. feladat */ printf("\n3. feladat\n"); if(athaladas(adatok,meret,stat)){ printf("Az athaladas.txt létrehozása sikeresen megtörtént!\n"); } else{ printf("Az athaladas.txt létrehozása sikertelen!\n"); } /* 4. feladat */ printf("\n4. feladat\n"); printf("A végén a társalgóban voltak: "); bentmaradtak(stat); /* 5. feladat */ m=bentlevok_max(adatok,meret); printf("\n5. feladat\n"); printf("Például %.2d:%.2d-kor voltak a legtöbben a társalgóban.\n",adatok[m].o,adatok[m].p); /* 6. feladat */ printf("\n6. feladat\n"); printf("Adja meg a személy azonosítóját! "); scanf("%d",&szemely); return 0; } |
Hívjuk meg a fent bemutatott függvényeket a főprogramban, és jelenítsük meg a képernyőn a kapott eredményeket.
A program egy lehetséges kimenete
1. feladat Az ajto.txt beolvasása sikeresen megtörtént! 2. feladat Az első belépő: 2 Az utolsó kilépő: 6 3. feladat Az athaladas.txt létrehozása sikeresen megtörtént! 4. feladat A végén a társalgóban voltak: 1 11 22 24 29 30 35 37 5. feladat Például 10:44-kor voltak a legtöbben a társalgóban. 6. feladat Adja meg a személy azonosítóját! 22
A képernyőre írt megfelelő formátumú üzenetekért további 2 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!