Sunteți pe pagina 1din 25

Ministerul Educaiei i tiinei al Republicii

Moldova
Universitatea Tehnic a Moldovei
Facultatea Calculatoare Informatic i Microelectronic

Catedra Informatic i Limbi Moderne Aplicate

Tema: Baze de date despre complexe turistice

Planul lucrrii

Sarcina problemei
1. Introducere
2. Descrierea instruciunilor folosite
3. Descrierea programului
4. Listingul programului
5. Rezultatele
Concluzii
Bibliografie

Sarcina problemei
De alctuit o baz de date despre complexe turistice, nscris ntr-un fiier,
care contine informaiile despre denumirea ei, costul cazrii, costul
mncrii, a serviciilor i posibiltatea de a:
- afia fiierul
- comleta fiierul
- sorta dup denumire
- interpela la denumire
- interpelare la costul cazrii
- interpelare la costul mncrii
- interpelare la costul serviciilor
- interpelare la preul total
- schimbarea fiierului
- scimbarea nregistrrii.
Introducere
Sa ne intrebam, care e scopul unui limbaj de programare ? Acesta e de a
ne usura viata de programator. Relevant in acest caz este limbajul C sau C
++ . De ce C ?
Din cauza ca este asa de popular si fiindca este disponibil pe majoritatea
platformelor(calculatoarelor), in plus este si relativ usor de invatat. C nu
este un limbaj sofisticat, el poseda numai citeva comenzi native, asa incit
nu este mult de memorat. In ciuda simplitatii sale, C este extrem de
performant, astfel incit poate fi folosit la scrierea aplicatiilor din cele mai
sofisticate. Nu degeaba o mare majoritate din aplicatiile software au fost
scrise in C si, se pare ca aceasta tendinta se va mentine si in viitor.

Putem dezvolta aplicatiile cele mai diverse precum jocuri, software


pentru afaceri, utilitare, modele matematice, procesoare de texte,
programe generatoare de tabele si inca multe alte.
Un exemplu poate fi o baza de date ce contine infomatie despre mai
multe baze de turism.
Descrierea instruciunilor folosite
La alcatuirea acestui program am folosit o serie de instructiuni si functii.
Pentru a afia un mesaj sau o variabil la consol trebuie sa folosim
instruciunea printf. Care are structura printf(control, parametru 1,
parametru 2). Control un sir de caractere care defineste textele si
formatele datelor care se scriu de la tastatura. Parametru 1, parametru 2
snt expresii, valorile lor se scriu conform specificatorilor de format
prezeni n parametru control.
Pentru a atribui o valoare unei variabile trebuie sa folosim instructiunea
scanf. Ea are structura scanf(control, parametru 1, parametru 2).
Parametru 1, parametru 2 adresele datelor unde de pstreaz datele.
Una din cele mai folosite instructiuni in program este instructiunea
if.
Forma general a instruciunii if este:
if (expr)
instr_1;
[ else
instr_2; ]
Ramura else, inclus ntre [ ], este opional. Execuia ncepe cu evaluarea
lui expr: dac este adevrat (diferit de 0), atunci se execut instr_1.
Dac expr este fals (0) i exist ramur else, se execut instr_2, iar dac
nu exist ramur else, controlul trece la instruciunea urmtoare.
Construcia de mai sus, cu sau fr ramur else, este vzut ca o singur
4

instruciune C: instruciunea de tip if. Instruciunile instr_1 i instr_2


sunt considerate instruciuni simple. Dac este cazul, se pot folosi blocuri
de instruciuni pe oricare din ramuri.
O alta importanta instructiune este switch, care ne e foarte folositoare in
cazul cind se testeaz dac o expresie coincide cu o valoare constant
ntreag, dintr-o list de valori date, executndu-se un salt la o etichet
asociat cu fiecare constant. Forma general este:
switch(expr) {
case ex_ct_1: instruciuni;
case ex_ct_2: instruciuni;
.............................................
case ex_ct_n: instruciuni;
[ default:

instruciuni; ]

}
Se evalueaz expr; dac este egal cu una din expresiile constante
ex_ct_1,...,ex_ct_n (care trebuie s fie distincte), se transfer controlul la
eticheta (cazul) respectiv. Spre deosebire de alte limbaje, se vor executa
instruciunile corespunztoare cazului respectiv precum i toate cele care
urmeaz pn la sfritul lui switch.
Un caz poate conine una, mai multe sau nici o instruciune, adic pot
exista mai multe cazuri asociate la acelai grup de instruciuni. Dac expr
nu este egal cu nici una din expresiile constante, controlul trece la
eticheta default. Default este opional: dac lipsete, se trece la execuia
urmtoarei instruciuni dup switch. Ordinea cazurilor, inclusiv default
poate fi oarecare.
Dac se dorete ca la un anumit caz s se execute numai grupul de
instruciuni asociat, nu i cele care urmeaz, atunci se va pune, ca ultim
instruciune din grupul respectiv, instruciunea break, prin aceasta
forndu-se ieirea din switch.
5

Un tip de instructiuni care cred ca fara ele nu se poate de alcatuit


nici un program mai complicat, sint ciclurile.
Instruciune while are forma general:
while (expr)
instr
n care, evident, instr se poate nlocui cu un bloc de instruciuni. Execuia
ncepe cu evaluarea lui expr: dac este adevrat (!= 0), se execut instr
i apoi se revine la evaluarea lui expr. Cnd expr este fals (0), se iese din
ciclu i se continu cu instruciunea urmtoare. Se vede c este posibil ca
instr s nu se execute nici o dat, dac expr este fals de la nceput.
O alta instructiune asemanatoare cu while este for-ul.
Instruciunea for are forma general:
for(expr_1; expr_2; expr_3)
instr;
Prin definiie, construcia de mai sus este absolut echivalent cu secvena:
expr_1;
while (expr_2) {
instr;
expr_3;
}
Se vede c expr_1 este interpretat ca o instruciune care se execut o
singur dat (iniializare), apoi se execut un while dup expr_2 (care este
interpretat ca o condiie de execuie a ciclului). La fiecare iteraie din
while se execut instruciunea din for (instr;) i apoi expr_3, care este
interpretat deci ca instruciune (actualizare).
Se vede c expr_1 se evalueaz o singur dat, expr_2 se evalueaz cel
puin o dat i este posibil ca expr_3 s nu se evalueze nici o dat. Ca i la
while se poate iei din for i prin break sau return.

For este, n esen, un while dotat cu o iniializare i cu o actualizare la


fiecare iteraie, actualizare care se face dup execuia corpului while.
Instruciunea simpl instr se poate nlocui evident cu un bloc, sau cu
instruciunea vid.
Att expr_1 ct i expr_3 pot lipsi: se scrie for (; expr_2;). Dac lipsete
expr_2, se consider condiia de la while permanent adevrat. Astfel,
forma for (;;) va nsemna un ciclu infinit, din care se poate iei numai cu
break sau return din corpul ciclului.
Ciclurile care le-am enumerat mai sus sint cicluri cu test la partea
superioara, insa in C exista si cu test la partea inferioara. Acesta e
instructiunea do.
Forma general a instruciunii do este:
do
instr;
while (expr);
Se execut instr (care poate fi i un bloc) i apoi se evalueaz expr: dac
este adevrat (!= 0), se reia execuia lui instr. Daca expr este fals (0), se
iese din ciclu. Evident, se poate iei i prin break sau return.
Spre deosebire de ciclurile cu test la partea superioar, instruciunile dintrun ciclu do se execut cel puin o dat, chiar dac expr este fals de la
nceput.
Dupa cum am mai scris, uneori trebuie de iesit fortat dintr-un program,
pentru aceasta am folosit instructiunea break. Instruciune ce provoac
ieirea forat dintr-un ciclu while, for sau do, ca i din switch. Dac sunt
mai multe asemenea instruciuni de ciclare sau switch incluse una n alta,
se iese numai din ciclul curent (cel n care este instruciune break). Dac
este un ciclu for, break face ca actualizarea pentru pasul curent (expr_3
din ciclul for), s nu se mai execute.
7

n unele cazuri e necesar de a sterge tot ecranul, n modul text aceasta o


putem face cu ajutorul funciei clrscr. Ea are declaraia void clrscr(void),
clrscr cur fereastra text, curent. i plaseaz cursorul n colul stng de
sus, la poziia 1,1.
Funcia delay(), e folosit pentru a suspenda pe un interval execuia
programului, n paranteze se scrie timpul (n milisecunde). Ea se folosete
din biblioteca dos.h.
Pentru a sorta bazele turistice dupa denumire in ordine alfabetic, am
folosit un ir de funcii din biblioteca string.h.
Strlen() calculeaz lungimea irului scris ntre paranteze. El ntoarce
numrul de caractere, necalculnd ultimul caracter.
Funcia strcpy() copie un ir char n altul. Strcmp(a,b) compar dou
iruri, comparaia se ncepe cu primul caracter la ambele iruri, apoi trece
la urmtoarele pna cnd caracterele difer sau s-a sfrit irul. El ntoarce
valorile
mai mic ca zero dac a < b , egal cu zero dac a == b i mai mare ca zero
cnd a > b. Funcia stricmp e asemanatoare cu strcmp, numai c n acest
caz litera mic e egal cu cea mare.
n cazul cnd n program avem o alegere, adic trebuie s apsm
un buton oarecare i programul s se execute mai departe fr de a apsa
altceva folosim funcia getch(). Care citete de la consol un caracter fr
de al arta la ecran i ntoarce caracterul citit. i putch() afieaz la
consol caracterul dintre paranteze.
Pentru a avea datele nscrise pe memoria extern a calculatorului, am
folosit fiierele. Cnd un fiier nu este gsit sau nu vrea s se deschid
trebuie de afiat acest eroare i o facem cu funciea perror(). Care
tiprete la consol un mesaj de eroare ce e scris ntre paranteze. Unica
8

operaie prin care se poate atribui o valoare corect unui pointer la fiier
este operaia de deschidere, care se face cu ajutorul funciei fopen(). n
urma deschiderii se stabilete o legtur logic ntre pointerul la fiier i
un anumit fiier. ncepnd cu acest moment toate operaiile de prelucrare a
fiierului se va realiza prin intermediul pointerului la fiier obinut la
deschidere. Funcia fopen() returneaz o valoare diferit de zero dac
deschiderea a avut loc corect. Uneori trebuie s facem intrri sau ieiri la
nivel de caracter. Astfel funcia fgets are declaraia char *fgets(char *s,
int n, FILE *pf), se citesc cel mult n-1 caractere din pf n zona pointat
de s, citirea oprindu-se la caracterul \n. Caracterul \n e inclus n s i
apoi se adaug \0. Funcia ntoarce s, sau n caz de eroare NULL.
Funcia fputs(s,pf), scrie irul s n fiierul pf. Pentru a afla dac s-a
terminat un ir sau nu am folosit macroinstruciunea feof(). Care
returneaz 0 cnd nu a fost gsit sfritul i diferit de zero n caz contrar.
nchiderea fiierului se opereaz cu funcia fcolse(), prototipul ei este int
fclose(FILE *p). Funcia ntoarce EOF n caz de eroare i zero n caz
normal. Prin nchidere ncetez conexiunea logic ntre pointer i fiier
care fusese stabilit la deshidere. Efectele nchiderii snt:
scrierea datelor nescrise din buferul de ieire n fiier
abandonarea datelor necitite din buferul de intrare
- eliberarea buferelor alocate automat
- tierea conexiunii logice ntre pointer i fiier.
Funcia fprintf() are prototipul int fprintf(FILE *stream, const char
*format . . . ). Punctele arat c merge vorba de o funcie cu un numar variabil
de parametri. Argumentele specificate se convertesc i se scriu n stream
conform cu irul format. Funcia ntoarce numrul de caractere scrise sau
valoarea negativ n caz de eroare. Funcia sprintf() e similar cu fprintf() cu
excepia faptului c se scrie n irul de caractere i adugndu-se \0 la sfrit.
Caracterul \0 nu se socoate la numrul de caractere scrise care este ntors de
ctre funcie.
9

Deoarece am folosit pointerii, am avut nevoie i de unele funcii specifice


pointerilor. Funcia calloc() aloc spaiu continuu pentru un tablou de n obiecte,
fiecare presupus a avea size octei. ntoarce un pointer la spaiul rezervat sau
NULL dac alocarea nu s-a putut face corect.
Pentru ca baza de date s arate mai frumos i mai uor de lucrat, am
folosit culori diferite ale textului i ale ecranului. n modul text am avut nevoie
de funcia textcolor() care afieaz textul cu culoarea respectiv din paranteze.
Funcia textbackground() coloreaz ecranul n culoarea ce e scris n paranteze.
n modul grafic pentru a desena butoanele, ferestrele i altele am avut
nevoie de mai multe funcii. Cu setcolor(color) are loc schimbarea culorii
textului. Funcia settextstyle(stilul, direcia, mrimea), afieaz un text n
direcia menionat i cu mrimea scris. Folosind funcia setfillstyle(patern,
color) putem umple un dreptunghi, de exemplu cu o culoare sau s-l haurm
dup stilul cotat. Liniile se pot trasa cu ajutorul lui line(x1, y1, x2, y2) care
folosete stilul i grosimea curent. Funcia bar(x1, y1, x2, y2) deseneaz un
dreptunghi colorat cu culoarea i stilul curent. Dar pentru a afia un dreptunghi
necolorat nuntru am folosit funcia rectangle(x1, y1, x2, y2). Cu outtextxy(x,
y, ir) se afieaz un text n locul menionat de coordonate, se folosete stilul,
direcia i mrimea curent. Funcia setgraphmode iniializeaz modul grafic i
cur ecranul. Cu ajutorul restorecrtmode ne putem ntoarce la modul text.
Cnd modul grafic nu s-a iniializat corect atunci afim un mesaj de eroare cu
funcia grapherrormsg(). Pentru a nchide modul grafic i de a elibera memoria
ocupat de acesta folosim funcia closegraph, dup aceasta se trece la modul ce
era nainte de a iniializa initgraph.
Descrierea programului
De la nceput se iniializeaz modul grafic, apoi se execut funcia
Getnewfile. Se deseneaz o ram unde trebuie s introducem numele fiierului.
Scrisul e scris cu dou culori pentru a fi mai frumos.
10

Dac fiierul exist atunci se deschide, iar dac nu, se creaz unul nou.
Apoi are loc afiarea meniului. De la nceput se scrie irul ce conine infomaie
despre ce reprezint programul, dup aceasta se deseneaz cele 12 butoane, cu
coninutul pe dnsele.
n partea de jos se afieaz o mic descriere la fiecare buton. Cu tastele
sus i jos putem schimba alte butoane, aceasta va dura pn cnd vom apsa
Enter la un buton ales.
Dac e primul buton, atunci are loc trecerea la modul text i se introduce
n fiier, dup aceasta se ntoarce la modul grafic i alegem: mai facem o nou
nregistrare sau nu, aceast confirmare este executat de funcia Yesnobox, la
care da i nu se schimb cu ajutorul tastei Tab. Dac da mai introducem
pn cnd alegem nu i n entoarcem la meniu.
Dac alegem al doilea buton adic Completarea fiierului se trece la
modul text ca i pentru primul caz i tot aa introducem informaia.
Cnd vom alege Afiarea fiierului se terge ecranul cu linii i se trece la
modul text. Se afieaz coninutul fiierului cu ajutorul funciei afisare().
Butonul al patrulea are funcia de a afia coninutul fiierului sortat dup
denumire. Se trece la modul text i se apeleaz funcia sort(). Are loc sortarea i
apoi afiarea fiierului.
Butoanele 5, 6, 7, 8 i 9 au funcia de a interpela respectiv la denumire,
costul cazrii, costul mncrii, costul serviciilor i la preul total. Toate se
execut asemntor. Se terge ecranul, se trece la modul text, apoi se execut
funcia cerere(n-5), unde n e numarul butonului. n dependen de valoarea lui n5 se execut funcia butonului respectiv. Introducem semnul de comparare (<, =,
>, !) dup aceasta scrim valoarea respectiv la ce ne intereseaz i se verific
fiecare cmp dac corespunde acestei interpelri, dac da se afieaz. Dup ce sa afiat totul apsm orice tast i ne rentoarcem n meniu.
Butonul 10 are funcia de a schimba fiierul i se introduce ca la nceput
fiierul, dac el exist se deschide dac nu se creaz.

11

Pentru a scimba o nregistrare ne folosim de butonul 11. Se trece la modul


text i se apeleaz funcia schimbare(). Se introduce numrul nregistrrii n care
dorim s facem schimbare i scrim apoi informaia, aceasta se scrie ntr-un ir i
irul se scrie n fiier, apoi se afieaz meniul principal.
n caz cnd alegem ultimul buton, adic Ieire, ne apare confirmarea
dac ntr-adevr dorim s prsim programul. Dac nu, ne ntoarcem la meniu,
dac da se terge ecranul cu linii, se nchide modul grafic i se iese din program.

Listingul programului
#include
#include
#include
#include
#include
#include
#include

<stdio.h>
<stdlib.h>
<ctype.h>
<string.h>
<conio.h>
<graphics.h>
<dos.h>

typedef struct baza_tur


{ char denumirea[15];
int cazare;
int mincare;
int servicii;
int total;
}; /* Structura de baza */
char s[100], nf[30];
struct baza_tur x[100];
typedef int (*sort_func)
(const void*arg1, const void*arg2);
typedef int (*cerere_func)
(struct baza_tur a,struct baza_tur b);
//functia de stergere a ecranului cu linii
void ClrGraphScr()
{int i;
setcolor(0);
for(i=0;i<=getmaxy()/2;i++)
{
line(0,i*2,getmaxx(),i*2);
12

delay(3);
}
for(i=getmaxy()/2;i>=0;i--)
{
line(0,i*2+1,getmaxx(),i*2+1);
delay(3);
}
}
//functia ce reprezinta un buton
void Button(int bx,int by,int lx,int ly,char *ms,int tc,int fc,int up)
{int len=strlen(ms);
settextstyle(2,0,0);
setfillstyle(1,fc);
bar(bx+1,by+1,bx+lx-1,by+ly);
if(!up)setcolor(8);else setcolor(15);
rectangle(bx+1,by+1,bx+lx-1,by+ly);
setcolor(tc);
outtextxy(bx+lx/2-len/2*6,by+2,ms);
if(!up)setcolor(15);else setcolor(0);
line(bx+1,by+1,bx+lx-2,by+1);
line(bx+1,by+1,bx+1,by+ly-1);
}
//Functia ce deseenaza o rama de o anumita grosime
void Frame(int rx,int ry,int lx,int ly,int gr,int c1,int c2,int ap)
{
Button(rx,ry,lx,ly,"",0,c1,0);
Button(rx+gr,ry+gr,lx-2*gr,ly-2*gr,"",0,c2,ap);
}
//functia ce afiseaza un mesaj
void Message(int cx,int cy,int lx,const char *ms,int cm)
{Frame(cx,cy,lx,20,2,7,7,1);
setcolor(15);
outtextxy(cx+11,cy+6,ms);
setcolor(cm);
outtextxy(cx+10,cy+5,ms);
};
int YesNoBox(char Msg[200])
{char ch;int yes=1;
Frame(getmaxx()/2-150,150,300,70,2,7,7,0);
Button(getmaxx()/2-70,200,50,15,"Da",10,7,0);
Button(getmaxx()/2+20,200,50,15,"Nu",10,7,0);
setcolor(15);outtextxy(getmaxx()/2-130,165,Msg);
setcolor(0);outtextxy(getmaxx()/2-131,164,Msg);
do
{
if(yes)Button(getmaxx()/2-70,200,50,15,"Da",10,7,1);
else Button(getmaxx()/2+20,200,50,15,"Nu",10,7,1);
ch=getch();
13

if(yes)Button(getmaxx()/2-70,200,50,15,"Da",10,7,0);
else Button(getmaxx()/2+20,200,50,15,"Nu",10,7,0);
if(ch==9)yes=(yes==1?0:1);
}while(ch!=13);
return yes;
}
char *ReadCell(char *dest,int rx,int ry,int rl,int rn,int rc)
{char ch='\0',st[20];
settextstyle(2,0,0);
setfillstyle(1,15);
setcolor(0);
do {
if(ch==8)
dest[strlen(dest)-1]='\0';
else if(strlen(dest)<rn)
{
dest[strlen(dest)+1]='\0';
dest[strlen(dest)]=ch;}
Button(rx,ry,rl,14,"",0,rc,1);
strcpy(st,dest);strcat(st,"|");
outtextxy(rx+3,ry+2,st);
ch=getch();
} while(ch!=13);
bar(rx+1,ry+1,rx+rl-1,ry+14);
outtextxy(rx+3,ry+2,dest);
return dest;
}
/* Functia de citire a unei inregistrari */
int citire(struct baza_tur *s)
{ printf("Denumirea Bazei Tur. :" ) ;scanf("%s" , s->denumirea) ;
printf("Pretul pentru cazare :" ) ;scanf("%d" , &s->cazare) ;
printf("Pretul pentru mincare :" ) ;scanf("%d" , &s->mincare) ;
printf("Pretul pentru servicii :" ) ;scanf("%d" , &s->servicii) ;
s->total=s->cazare+s->mincare+s->servicii;
return 0;
}
/* Functia de scriere a unei inregistrari */
int scrie_inr(int n)
{ int i;
char linie[80] ;
FILE *f;
struct baza_tur st;
i=0;
if(n==1)/* Pentru n=1 se face suprascrierea */
{
if ((f=fopen(nf,"w"))==NULL)
{perror("Nu se poate scrie in fisier !");return 0;}
fprintf(f,"%4s %-15s %7s %7s %7s %7s\n", "Nr.", "Denumirea","Cazare","Mincare",
"Serv.","Total");
14

fprintf(f,"

\n" ) ;
}
if(n==2)/* Pentru n=2 se face adaugare */
{
if((f=fopen(nf,"r"))==NULL)
{perror("Nu se poate scrie in fisier !");return 0;}
while(!feof(f)){ fgets(s,80,f);i++;}
/*Mai intai se cazarea cate inregistrari
au fost introduse pentru a sti cazareul de ordine al inregistrarii*/
fclose(f);
if((f=fopen(nf,"a"))==NULL)
{perror("Nu se poate citi fisierul !");return 0;}
i-=3;
}
while (1)
{
setgraphmode(getgraphmode());
if(!YesNoBox("Introduceti o noua inregistrare"))
{restorecrtmode();
break;
}
restorecrtmode();
/*Se apeleaza functia de introducere a unei inregistrari */
citire (&st) ;
/*Se scrie apoi intr - un sir */
sprintf(linie,"%4d %-15s %7d %7d %7d %7d\n",+
+i,st.denumirea,st.cazare,st.mincare,st.servicii,st.total);
/*Si apoi sirul se scrie in fisier */
fputs(linie,f);
}
/*Se inchide fisierul */
fclose(f);
return 0;
}
/*Functia de afisare a unui fisier*/
int afisare()
{FILE *f; char lin[120] ;
clrscr();
if ((f=fopen(nf,"r" ))==NULL)
{perror("Fisierul nu se poate deschide");getch();exit(0);}
while(1)
{fgets(lin,120,f);
if(feof(f)){fclose(f);getch();return 0;}
printf("%s",lin);
}
}
/*Functia de citire a inregistrarilor din fisier intrun tablou de structuri*/
int citire_inr(struct baza_tur x[100])
15

{ FILE *f;char *s;


int i;
clrscr();
if((f=fopen(nf,"r"))==NULL)
{printf("Eroare la citire");return 1;}
s=(char*)calloc(80,1);
fgets(s,80,f);printf("%s",s);
fgets(s,80,f);printf("%s",s);
i=0;
while(!feof(f))
{
fgets(s,80,f);
if(feof(f))
{
if ferror(f) {perror("Eroare in timpul citirii");exit(1);}
fclose(f);
return i;
}
/* Se citeste Numarul Inregistrarii din Fisier */
s+=6;
/* Se citeste denumirea*/
sscanf(s,"%s",x[i].denumirea);
s+=18;
/* Se citeste cazare*/
sscanf(s,"%d",&x[i].cazare);
s+=10;
/* Se citeste pentru mincare */
sscanf(s,"%d",&x[i].mincare);
s+=10;
/* Se citeste pentru servicii*/
sscanf(s,"%d",&x[i].servicii);
s+=10;
/* Se citeste pentru total */
sscanf(s,"%d",&x[i].total);
i++;
}
return 0;
}
int schimbare(struct baza_tur x[100])
{int n,i;
char linie[80] ;
FILE *f;
clrscr();
printf("Intr-a cita inregistrare doriti sa efectuati schimbari? ");scanf("%i",&i);
n=citire_inr(x);
citire(&x[i-1]);
if ((f=fopen(nf,"w"))==NULL)
{perror("Nu se poate scrie in fisier !");return 0;}
fprintf(f,"%4s %-15s %7s %7s %7s %7s\n", "Nr.", "Denumirea","Cazare","Mincare",
"Serv.","Total");

16

fprintf(f,"

\n" ) ;
for(i=0;i<n;i++)
{ /*Se scrie apoi intr - un sir */
sprintf(linie,"%4d %-15s %7d %7d %7d %7d\n",
i+1,x[i].denumirea,x[i].cazare,x[i].mincare,x[i].servicii,x[i].total);
/*Si apoi sirul se scrie in fisier */
fputs(linie,f);
}
fclose(f);
return 0;
}
/* functia de comparatie crescatoare dupa denumirea */
int sort_denumirea(const void *a,const void *b)
{ return (stricmp (((struct baza_tur*)a)->denumirea, ((struct baza_tur *)b)->denumirea));
}
/* functia de comparatie dupa denumirea */
int cerere_denumirea(struct baza_tur a,struct baza_tur b)
{ return (strcmp (a.denumirea,b.denumirea));
}
/* functia de comparatie dupa cazare */
int cerere_cazare(struct baza_tur a,struct baza_tur b)
{ return (a.cazare-b.cazare);
}
/* functia de comparatie dupa mincare */
int cerere_mincare(struct baza_tur a,struct baza_tur b)
{ return (a.mincare-b.mincare);
}
/* functia de comparatie dupa servicii */
int cerere_servicii(struct baza_tur a,struct baza_tur b)
{ return (a.servicii-b.servicii);
}
/* functia de comparatie dupa total */
int cerere_total(struct baza_tur a,struct baza_tur b)
{ return (a.total-b.total);
}
//functia de apel a cererilor
int cerere(int k)
{
cerere_func cmp[5]
={cerere_denumirea,cerere_cazare,cerere_mincare,cerere_servicii,cerere_total} ;
struct baza_tur x[100],temp;
int i,nr;
char sign;
17

clrscr();
printf("\nIntroduceti semnul de comparae (<,=,>,!):");
sign=getch();putch(sign);
printf("\nIntroduceti valoarea cimpului:");
switch(k)
{
case 0:scanf("%s",temp.denumirea);break;
case 1:scanf("%i",&temp.cazare);break;
case 2:scanf("%i",&temp.mincare);break;
case 3:scanf("%i",&temp.servicii);break;
case 4:scanf("%i",&temp.total);break;
}
clrscr();
printf("%4s %-15s %7s %7s %7s %7s\n", "Nr.", "Denumirea","Cazare","Mincare",
"Serv.","Total");
printf("

\n" ) ;
nr=citire_inr(x);
for(i=0;i<nr;i++)
{
if((cmp[k](x[i],temp)>0&&sign=='>')||(cmp[k](x[i],temp)==0&&sign=='=')||
(cmp[k](x[i],temp)<0&&sign=='<')||(cmp[k](x[i],temp)!=0&&sign=='!'))
printf("%4d %-15s %7d %7d %7d %7d\n",
i+1,x[i].denumirea,x[i].cazare,x[i].mincare,x[i].servicii,x[i].total);}
getch();
return 0;
}
//functia de sortare
int sort(int k)
{
struct baza_tur x[100] ;
int i;
i=citire_inr(x);
qsort ((void*)x,i,sizeof (struct baza_tur),sort_denumirea) ;
clrscr();
printf("%4s %-15s %7s %7s %7s %7s\n", "Nr.", "Denumirea","Cazare","Mincare",
"Serv.","Total");
printf("

\n" ) ;
for(int j=0;j<i;j++)
printf("%4d %-15s %7d %7d %7d %7d\n",
j+1,x[j].denumirea,x[j].cazare,x[j].mincare,x[j].servicii,x[j].total);
getch();
return 0;
}
//functia de reprezentare a meniului
int GetMenu()
{
18

int i,pos=0;char ch;


char help[12][80]=
{
" Acest program reprezinta",
"o baza de date care lucreaza",
"cu cimpurile unei structuri",
"care reprezinta o baza turistica",
"prin urmatoarele cimpuri:",
" 1. Denumirea
- sir de caractere",
" 2. Costul cazarii - tip intreg",
" 3. Costul mincarii - tip intreg",
" 4. Costul serviciilor - tip intreg",
" 5. Pretul total
- suma cimpurilor 2,3,4",
" Posibilitati de lucru cu fisierele",
" Graphic User Interface"
};
char m[12][80]=
{
" Crearea fisierului
\r\n",
" Completarea fisierului \r\n",
" Afisarea fisierului
\r\n",
" Sortare dupa Denumire \r\n",
" Interpelare la Denumire \r\n",
" Interpelare la Cost Cazare\r\n",
" Interpelare la Cost Minc.\r\n",
" Interpelare la Cost Serv. \r\n",
" Interpelare la Pret Total \r\n",
" Schimbarea fisierului \r\n",
" Schimbarea Inregistrarii \r\n",
" Iesire
\r\n"
};
char mes[12][80]=
{
" A incepe un fisier curat
\r\n",
" A continua scrierea in fisier \r\n",
" Afisarea continutului
\r\n",
" Sortare dupa Denumire
\r\n",
" Cerere la primul cimp
\r\n",
" Cerere la cimpul al doilea \r\n",
" Cerere la cimpul trei
\r\n",
" Cerere la cimpul patru
\r\n",
" Cerere la cimpul cinci
\r\n",
" Schimbarea numeleui fisierului \r\n",
" Schimbarea inregistrarii
\r\n",
" Abandonarea programului
\r\n"
};
Frame(0,0,getmaxx(),getmaxy(),4,GREEN,7,1);
Frame(200,50,getmaxx()-220,getmaxy()-80,3,RED,15,1);
for(i=0;i<12;i++)
{
setcolor(CYAN);
outtextxy(250,100+i*15,help[i]);
setcolor(0);
outtextxy(249,99+i*15,help[i]);
19

}
Message(20,20,getmaxx()-40,"Program elaborat de studentul Gr. C-002 Victor
Soltan",BLUE);
for(i=0;i<12;i++)
if(i==pos)Button(10,50+i*30,160,20,m[i],0,7,1);
else Button(10,50+i*30,160,20,m[i],0,7,0);
do{
Message(20,getmaxy()-25,getmaxx()-40,mes[pos],RED);
Button(10,50+pos*30,160,20,m[pos],0,7,1);
ch=getch();
Button(10,50+pos*30,160,20,m[pos],0,7,0);
if(ch==0)
{ ch=getch();
switch(ch)
{
case 72:if(pos>0)pos--;else pos=11;break;
case 80:if(pos<11)pos++;else pos=0;break;
};
}
}
while (ch!=13);
if(pos==11)return 0;
else return pos+1;
}
void GetNewFile(char *nf)
{
settextstyle(2,0,0);
Frame(getmaxx()/2-150,getmaxy()/2-50,300,100,2,7,7,1);
setcolor(15);
outtextxy(getmaxx()/2-80,getmaxy()/2-30,"Introduceti numele fisierului");
setcolor(CYAN);
outtextxy(getmaxx()/2-81,getmaxy()/2-31,"Introduceti numele fisierului");
ReadCell(nf,getmaxx()/2-50,getmaxy()/2,100,15,GREEN);
}
void main (void)
{ int n;
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
textcolor(0);
textbackground(15);
clrscr();
/* initialize graphics and local
variables */
initgraph(&gdriver, &gmode, "C:\\BORLAND\\BC\\BGI");
/* read result of initialization */
errorcode = graphresult();
/* an error occurred */
20

if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);

/* terminate with an error code */

}
GetNewFile(nf);//se citeste numele fisierului
do {
n=GetMenu();
switch(n)
{ case 1:
case 2:ClrGraphScr();
restorecrtmode();scrie_inr(n);setgraphmode(getgraphmode());break;
case 3:ClrGraphScr();
restorecrtmode();afisare();setgraphmode(getgraphmode());break;
case 4:ClrGraphScr();
restorecrtmode();sort(0);setgraphmode(getgraphmode());break;
case 5:
case 6:
case 7:
case 8:
case 9:ClrGraphScr();
restorecrtmode();cerere(n-5);setgraphmode(getgraphmode());break;
case 10:
GetNewFile(nf);ClrGraphScr();break;
case 11:ClrGraphScr();
restorecrtmode();schimbare(x);setgraphmode(getgraphmode());break;
}
if(!n)if(!YesNoBox("Intr-adevar doriti sa parasiti programul ?"))n=-1;
}
while (n);
ClrGraphScr();
closegraph();
}.

21

Rezultatele
n programul dat meniul arat n felul urmtor

Astfel se afieaz fiierul:


Nr. Denumirea
Cazare Mincare Serv. Total
----+-------------------+---------+----------+---------+-------1 Chisinau

80 45
50 175
2 National

78
34
35 147
3 Codru

90
68 57 215
22

4 Inturist

5 VadulluiVoda

45
20

23
15

20
5

88
40

Sortarea pentru datele introduse:


Nr. Denumirea
Cazare Mincare Serv. Total
---+-------------------+---------+-----------+--------+-------1 Chisinau

80 45
50 175
2 Codru

90
68 57 215
3 Inturist

45
23

20
88
4 National

78
34

35 147
5 VadulluiVoda
20 15

5 40
Interpelare la denumire n caz cnd punem egal cu Codru:
Nr. Denumirea
Cazare Mincare Serv. Total
---+-------------------+---------+-----------+--------+-------3 Codru

90
68 57 215
Interpelare la costul cazrii, cnd avem mai mic ca 50:
Nr. Denumirea
Cazare Mincare Serv. Total
---+-------------------+---------+-----------+--------+-------4 Inturist

45
23

20
88
5 VadulluiVoda
20 15

5 40
Interpelare la costul mncrii, cnd avem mai mare ca 40:
Nr. Denumirea
Cazare Mincare Serv. Total
---+-------------------+---------+-----------+--------+-------1 Chisinau

80 45
50 175
3 Codru

90
68 57 215
Interpelare la costul serviciilor, cnd avem diferit de 50:
Nr. Denumirea
Cazare Mincare Serv. Total
---+-------------------+---------+-----------+--------+-------2 National

78
34

35 147
3 Codru

90
68
57 215
4 Inturist

45
23

20
88
5 VadulluiVoda
20 15

5 40
Interpelare la costul total cnd avem mai mic ca 150:
Nr. Denumirea

Cazare Mincare Serv. Total


23

---+-------------------+---------+-----------+--------+-------2 National

78
34

35 147
4 Inturist

45
23

20
88
5 VadulluiVoda
20 15

5 40
Fereastra ce o afieaz funcia YesNoBox() cu irul scris n ea:

Concluzie
n urma efecturii lucrrii date am fcut cunotin cu lucrul cu modul grafic,
cu fiierele i prelucrarea lor, am repetat aproape toate instruciunile nvate n
decursul anului i am creat, cred eu, o baz de date reuit.

24

Bibliografie
Caietul de curs i practic la programare
Tom Swan C . . . pas cu pas
Valentin Cristea Tehnici de programare

25