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

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:

Társalgó érettségi feladat

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

int 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)

Lásd a főprogramban...

Í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 kiváncsi vagy, keress bizalommal!