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

Telefonszámla

Érettségi feladat - 2006. február 28.

Egy új szolgáltatás keretében ki lehet kérni a napi telefonbeszélgetéseink listáját. A listát egy fájlban küldik meg, amelyben a következő adatok szerepelnek: hívás kezdete, hívás vége, hívott telefonszám. A hívás kezdete és vége óra, perc, másodperc formában szerepel.
Például:
6 15 0 6 19 0
395682211

A hívások listája időben rendezett módon tartalmazza az adatokat, és szigorúan csak egy napi adatot, azaz nincsenek olyan beszélgetések, amelyeket előző nap kezdtek vagy a következő napon fejeztek be. Továbbá az elmúlt időszak statisztikái alapján tudjuk, hogy a napi hívások száma nem haladja meg a kétszázat.

A telefonálás díjait a következő táblázat foglalja össze.

A csúcsidő reggel 7:00:00-kor, a csúcsidőn kívüli időszak pedig 18:00:00-kor kezdődik. A díjazás számításakor az számít, hogy mikor kezdte az illető a beszélgetést. (Például: ha 17:55-kor kezdett egy beszélgetést, de azt 18:10-kor fejezte be, akkor is csúcsidőbeli díjakkal kell számlázni.)További fontos információk:

  • Minden megkezdett perc egy egész percnek számít.
  • Minden telefonszám elején egy kétjegyű körzetszám, illetve mobil hívószám található. A mobil hívószámok: 39, 41, 71 kezdődnek, minden egyéb szám vezetékes hívószámnak felel meg.

A következő feladatokat oldjuk meg egy program segítségével! A programot mentsük szamla néven!

Kérjünk be a felhasználótól egy telefonszámot! Állapítsuk meg a program segítségével, hogy a telefonszám mobil-e vagy sem! A megállapítást írjuk ki a képernyőre! (8 pont)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <string.h> 

#define MAX 10
#define HMAX 3

int beker(char s[]){
	static char *hivoszamok[HMAX]={"39","41","71"},h[HMAX];
	int i;
	printf("Adjon meg egy telefonszámot!\n");
 	fgets(s,MAX,stdin);
 	strncpy(h,s,HMAX-1);
 	for(i=0;i<HMAX;i++){
		if(!strcmp(h,hivoszamok[i])){
			return 1;
		}
 	}
 	return 0;
}

Kérjünk be egy telefonszámot a szabvány bemenetről, és másoljuk át az első két karakterét egy segéd tömbbe. Ezt követően hasonlítsuk össze a mobil hívószámokkal, és ha egyezést találunk, akkor mobil, különben pedig vezetékes telefonszámról van szó. A megállapítást jelző 0 vagy 1 egész érték a függvény visszatérési értéke legyen.

Kérjünk be továbbá egy hívás kezdeti és hívás vége időpontot óra perc másodperc formában! A két időpont alapján határozzuk meg, hogy a számlázás szempontjából hány perces a beszélgetés! A kiszámított időtartamot írjuk ki a képernyőre! (8 pont)

1
2
3
4
5
6
7
8
int hivasok(void){
	int o1,p1,m1,o2,p2,m2;
	printf("Adja meg a hívás kezdetét OO:PP:MM formában:\n");
	scanf("%d:%d:%d",&o1,&p1,&m1);
	printf("Adja meg a hívás végét OO:PP:MM formában:\n");
	scanf("%d:%d:%d",&o2,&p2,&m2);
	return (o2-o1)*60+(p2-p1)+((m2-m1!=0)?1:0);	
}

Kérjük be részenként a két időpont elemeit (óra, perc, másodperc), és számoljuk ki a közöttük eltelt időt. A kapott eredmény a függvény visszatérési értéke legyen.

Állapítsuk meg a hivasok.txt fájlban lévő hívások időpontja alapján, hogy hány számlázott percet telefonált a felhasználó hívásonként! A kiszámított számlázott perceket írjuk ki a percek.txt fájlba a következő formában! perc telefonszám (15 pont)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
int beolvas(char *bemenet, char *kimenet, struct idok a[]){
	int i=0,perc;
	FILE *fp=fopen(bemenet,"r"),*op=fopen(kimenet,"w");
	if(fp==NULL || op==NULL){
		return -1;
	}
	while(!feof(fp)){
		fscanf(fp,"%d %d %d %d %d %d",&a[i].o1,&a[i].p1,&a[i].m1,&a[i].o2,&a[i].p2,&a[i].m2);
		fscanf(fp,"%s",a[i].telefonszam);
		perc=(a[i].o2-a[i].o1)*60+(a[i].p2-a[i].p1)+((a[i].m2-a[i].m1!=0)?1:0);
		fprintf(op,"%d %s\n",perc,a[i].telefonszam);
		i++;
	}
	fclose(op);
	fclose(fp);
	return i;
}

Olvassuk be az adatokat a bemeneti fájlból, és tároljuk le egy struktúra tömbben. A beolvasott adatokból számítsuk ki az előző feladatban bemutatott módon a közöttük eltelt időt, és írjuk ki a kimeneti fájlba a telefonszámmal együtt. A műveletek után zárjuk be a fájlokat.

Állapítsuk meg a hivasok.txt fájl adatai alapján, hogy hány hívás volt csúcsidőben és csúcsidőn kívül! Az eredményt jelenítsük meg a képernyőn! (6 pont)

A hivasok.txt fájlban lévő időpontok alapján határozzuk meg, hogy hány percet beszélt a felhasználó mobil számmal és hány percet vezetékessel! Az eredményt jelenítsük meg a képernyőn! (4 pont)

Összesítsük a hivasok.txt fájl adatai alapján, mennyit kell fizetnie a felhasználónak a csúcsdíjas hívásokért! Az eredményt a képernyőn jelenítsük meg! (4 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
#include <stdio.h>
#include <string.h> 
#include <locale.h>

#define MAX 10
#define HMAX 3
#define N 200

struct idok{
	int o1,p1,m1,o2,p2,m2;
	char telefonszam[MAX];
};

/* Függvények... */

int main(void){
	struct idok adatok[N];
	char telefonszam[MAX];
	int perc, meret;
	
	setlocale(LC_ALL, "");
	
	/* 1. feladat */
	if(beker(telefonszam)){
		printf("A megadott telefonszám mobil.\n\n");
	}
	else{
		printf("A megadott telefonszám nem mobil.\n\n");
	}
	
	/* 2. feladat */
	perc=hivasok();
	printf("A beszélgetés %d perces volt.\n\n",perc);
	
	/* 3. feladat */
	meret=beolvas("HIVASOK.TXT","percek.txt",adatok);
	if(meret==-1){
		printf("Sikertelen fájlművelet!\n");
	}
	else{
		printf("A percek.txt fájl elkészült.\n");
	}

	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

Adjon meg egy telefonszámot!
395682211
A megadott telefonszám mobil.

Adja meg a hívás kezdetét OO:PP:MM formában:
12:12:12
Adja meg a hívás végét OO:PP:MM formában:
13:14:15
A beszélgetés 63 perces volt.

A percek.txt fájl elkészült.

  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!