Documente Academic
Documente Profesional
Documente Cultură
Moldova
Universitatea Tehnic a Moldovei
Facultatea Calculatoare Informatic i Microelectronic
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.
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
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
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
Listingul programului
#include
#include
#include
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<ctype.h>
<string.h>
<conio.h>
<graphics.h>
<dos.h>
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
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
}
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);
}
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
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
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
---+-------------------+---------+-----------+--------+-------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