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!