Referat Baza De Date

Mai jos puteti citi fragmente din Referat Baza De Date si de asemenea puteti face Download Referat Baza de date

Citeste fragmente din Referat Baza De Date

Ministerul Educaţiei şi Ştiinţei 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 lucrării Sarcina problemei 1. Introducere 2. Descrierea instrucţiunilor folosite 3. Descrierea programului 4. Listingul programului 5. Rezultatele Concluzii Bibliografie Sarcina problemei De alcătuit o bază de date despre complexe turistice, înscrisă într-un fişier, care contine informaţiile despre denumirea ei, costul cazării, costul mîncării, a serviciilor şi posibiltatea de a: - afişa fişierul - comleta fişierul - sorta după denumire - interpela la denumire - interpelare la costul cazării - interpelare la costul mîncării - interpelare la costul serviciilor - interpelare la preţul total - schimbarea fişierului - scimbarea înregistrării. 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. ţiunilor folosite La alcatuirea acestui program am folosit o serie de instructiuni si functii. Pentru a afişa un mesaj sau o variabilă la consolă trebuie sa folosim instrucţiunea 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 sînt expresii, valorile lor se scriu conform specificatorilor de format prezenţi î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 păstrează datele. Una din cele mai folosite instructiuni in program este instructiunea if. Forma generală a instrucţiunii if este: if (expr) instr_1; [ else instr_2; ] Ramura else, inclusă între [ ], este opţională. Execuţia începe cu evaluarea lui expr: dacă este adevărată (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 instrucţiunea următoare. Construcţia de mai sus, cu sau fără ramură else, este văzută ca o singură instrucţiune C: instrucţiunea de tip if. Instrucţiunile instr_1 şi instr_2 sunt considerate instrucţiuni simple. Dacă este cazul, se pot folosi blocuri de instrucţiuni 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, executându-se un salt la o etichetă asociată cu fiecare constantă. Forma generală este: switch(expr) { case ex_ct_1: instrucţiuni; case ex_ct_2: instrucţiuni; ............................................. case ex_ct_n: instrucţiuni; [ default: instrucţiuni; ] } 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 instrucţiunile corespunzătoare cazului respectiv precum şi toate cele care urmează până la sfârşitul lui switch. Un caz poate conţine una, mai multe sau nici o instrucţiune, adică pot exista mai multe cazuri asociate la acelaşi grup de instrucţiuni. Dacă expr nu este egală cu nici una din expresiile constante, controlul trece la eticheta default. Default este opţional: dacă lipseşte, se trece la execuţia următoarei instrucţiuni după switch. Ordinea cazurilor, inclusiv default poate fi oarecare. Dacă se doreşte ca la un anumit caz să se execute numai grupul de instrucţiuni asociat, nu şi cele care urmează, atunci se va pune, ca ultimă instrucţiune din grupul respectiv, instrucţiunea break, prin aceasta forţându-se ieşirea din switch. Un tip de instructiuni care cred ca fara ele nu se poate de alcatuit nici un program mai complicat, sint ciclurile. Instrucţiune while are forma generală: while (expr) instr În care, evident, instr se poate înlocui cu un bloc de instrucţiuni. Execuţia începe cu evaluarea lui expr: dacă este adevărată (!= 0), se execută instr şi apoi se revine la evaluarea lui expr. Când expr este falsă (0), se iese din ciclu şi se continuă cu instrucţiunea următoare. 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. Instrucţiunea for are forma generală: for(expr_1; expr_2; expr_3) instr; Prin definiţie, construcţia de mai sus este absolut echivalentă cu secvenţa: expr_1; while (expr_2) { instr; expr_3; } Se vede că expr_1 este interpretată ca o instrucţiune care se execută o singură dată (iniţializare), apoi se execută un while după expr_2 (care este interpretată ca o condiţie de execuţie a ciclului). La fiecare iteraţie din while se execută instrucţiunea din for (instr;) şi apoi expr_3, care este interpretată deci ca instrucţiune (actualizare). Se vede că expr_1 se evaluează o singură dată, expr_2 se evaluează cel puţin o dată şi este posibil ca expr_3 să nu se evalueze nici o dată. Ca şi la while se poate ieşi din for şi prin break sau return. For este, în esenţă, un while dotat cu o iniţializare şi cu o actualizare la fiecare iteraţie, actualizare care se face după execuţia corpului while. Instrucţiunea simplă instr se poate înlocui evident cu un bloc, sau cu instrucţiunea vidă. Atât expr_1 cât şi expr_3 pot lipsi: se scrie for (; expr_2;). Dacă lipseşte expr_2, se consideră condiţia de la while permanent adevărată. Astfel, forma for (;;) va însemna un ciclu infinit, din care se poate ieşi 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 instrucţiunii do este: do instr; while (expr); Se execută instr (care poate fi şi un bloc) şi apoi se evaluează expr: dacă este adevărată (!= 0), se reia execuţia lui instr. Daca expr este falsă (0), se iese din ciclu. Evident, se poate ieşi şi prin break sau return. Spre deosebire de ciclurile cu test la partea superioară, instrucţiunile dintr-un ciclu do se execută cel puţin 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. Instrucţiune ce provoacă ieşirea forţată dintr-un ciclu while, for sau do, ca şi din switch. Dacă sunt mai multe asemenea instrucţiuni de ciclare sau switch incluse una în alta, se iese numai din ciclul curent (cel în care este instrucţiune break). Dacă este un ciclu for, break face ca actualizarea pentru pasul curent (expr_3 din ciclul for), să nu se mai execute. În unele cazuri e necesar de a sterge tot ecranul, în modul text aceasta o putem face cu ajutorul funcţiei clrscr. Ea are declaraţia void clrscr(void), clrscr curăţă fereastra text, curentă. Şi plasează cursorul în colţul stîng de sus, la poziţia 1,1. Funcţia delay(), e folosită pentru a suspenda pe un interval execuţia programului, în paranteze se scrie timpul (în milisecunde). Ea se foloseşte din biblioteca dos.h. Pentru a sorta bazele turistice dupa denumire in ordine alfabetică, am folosit un şir de funcţii din biblioteca string.h. Strlen() calculează lungimea şirului scris între paranteze. El întoarce numărul de caractere, necalculînd ultimul caracter. Funcţia strcpy() copie un şir char în altul. Strcmp(a,b) compară două şiruri, comparaţia se începe cu primul caracter la ambele şiruri, apoi trece la următoarele pîna cînd caracterele diferă sau s-a sfîrşit şirul. El întoarce valorile mai mic ca zero dacă a < b , egal cu zero dacă a == b şi mai mare ca zero cînd a > b. Funcţia stricmp e asemanatoare cu strcmp, numai că în acest caz litera mică e egală cu cea mare. În cazul cînd în program avem o alegere, adică trebuie să apăsăm un buton oarecare şi programul să se execute mai departe fără de a apăsa altceva folosim funcţia getch(). Care citeşte de la consolă un caracter fără de al arăta la ecran şi întoarce caracterul citit. Şi putch() afişează la consolă caracterul dintre paranteze. Pentru a avea datele înscrise pe memoria externă a calculatorului, am folosit fişierele. Cînd un fişier nu este găsit sau nu vrea să se deschidă trebuie de afişat acestă eroare şi o facem cu funcţiea perror(). Care tipăreşte la consolă un mesaj de eroare ce e scris între paranteze. Unica operaţie prin care se poate atribui o valoare corectă unui pointer la fişier este operaţia de deschidere, care se face cu ajutorul funcţiei fopen(). În urma deschiderii se stabileşte o legătură logică între pointerul la fişier şi un anumit fişier. Începînd cu acest moment toate operaţiile de prelucrare a fişierului se va realiza prin intermediul pointerului la fişier obţinut la deschidere. Funcţia fopen() returnează o valoare diferită de zero dacă deschiderea a avut loc corect. Uneori trebuie să facem intrări sau ieşiri la nivel de caracter. Astfel funcţia fgets are declaraţia 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 ‘ ’. Caracterul ‘ ’ e inclus în s şi apoi se adaugă ‘’. Funcţia întoarce s, sau în caz de eroare NULL. Funcţia fputs(s,pf), scrie şirul s în fişierul pf. Pentru a afla dacă s-a terminat un şir sau nu am folosit macroinstrucţiunea feof(). Care returnează 0 cînd nu a fost găsit sfîrşitul şi diferit de zero în caz contrar. Închiderea fişierului se operează cu funcţia fcolse(), prototipul ei este int fclose(FILE *p). Funcţia întoarce EOF în caz de eroare şi zero în caz normal. Prin închidere înceteză conexiunea logică între pointer şi fişier care fusese stabilită la deshidere. Efectele închiderii sînt: scrierea datelor nescrise din buferul de ieşire în fişier abandonarea datelor necitite din buferul de intrare eliberarea buferelor alocate automat tăierea conexiunii logice între pointer şi fişier. Funcţia fprintf() are prototipul int fprintf(FILE *stream, const char *format . . . ). Punctele arată că merge vorba de o funcţie cu un numaăr variabil de parametri. Argumentele specificate se convertesc şi se scriu în stream conform cu şirul format. Funcţia întoarce numărul de caractere scrise sau valoarea negativă în caz de eroare. Funcţia sprintf() e similară cu fprintf() cu excepţia faptului că se scrie în şirul de caractere şi adăugîndu-se ‘’ la sfîrşit. Caracterul ‘’ nu se socoate la numărul de caractere scrise care este întors de către funcţie. Deoarece am folosit pointerii, am avut nevoie şi de unele funcţii specifice pointerilor. Funcţia calloc() alocă spaţiu continuu pentru un tablou de n obiecte, fiecare presupus a avea size octeţi. întoarce un pointer la spaţiul rezervat sau NULL dacă alocarea nu s-a putut face corect. Pentru ca baza de date să arate mai frumos şi mai uşor de lucrat, am folosit culori diferite ale textului şi ale ecranului. În modul text am avut nevoie de funcţia textcolor() care afişează textul cu culoarea respectivă din paranteze. Funcţia 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 funcţii. Cu setcolor(color) are loc schimbarea culorii textului. Funcţia settextstyle(stilul, direcţia, mărimea), afişează un text în direcţia menţionată şi cu mărimea scrisă. Folosind funcţia setfillstyle(patern, color) putem umple un dreptunghi, de exemplu cu o culoare sau să-l haşurăm după stilul cotat. Liniile se pot trasa cu ajutorul lui line(x1, y1, x2, y2) care foloseşte stilul şi grosimea curentă. Funcţia bar(x1, y1, x2, y2) desenează un dreptunghi colorat cu culoarea şi stilul curent. Dar pentru a afişa un dreptunghi necolorat înăuntru am folosit funcţia rectangle(x1, y1, x2, y2). Cu outtextxy(x, y, şir) se afişează un text în locul menţionat de coordonate, se foloseşte stilul, direcţia şi mărimea curentă. Funcţia setgraphmode iniţializează modul grafic şi curăţă ecranul. Cu ajutorul restorecrtmode ne putem întoarce la modul text. Cînd modul grafic nu s-a iniţializat corect atunci afişăm un mesaj de eroare cu funcţia grapherrormsg(). Pentru a închide modul grafic şi de a elibera memoria ocupată de acesta folosim funcţia closegraph, după aceasta se trece la modul ce era înainte de a iniţializa initgraph. Descrierea programului De la început se iniţializează modul grafic, apoi se execută funcţia Getnewfile. Se desenează o ramă unde trebuie să introducem numele fişierului. Scrisul e scris cu două culori pentru a fi mai frumos. Dacă fişierul există atunci se deschide, iar dacă nu, se crează unul nou. Apoi are loc afişarea meniului. De la început se scrie şirul ce conţine infomaţie despre ce reprezintă programul, după aceasta se desenează cele 12 butoane, cu conţinutul pe dînsele. În partea de jos se afişează o mică descriere la fiecare buton. Cu tastele “sus” şi “jos” putem schimba alte butoane, aceasta va dura pînă cînd vom apăsa “Enter” la un buton ales. Dacă e primul buton, atunci are loc trecerea la modul text şi se introduce în fişier, după aceasta se întoarce la modul grafic şi alegem: mai facem o nouă înregistrare sau nu, această confirmare este executată de funcţia Yesnobox, la care “da” şi “nu” se schimbă cu ajutorul tastei “Tab”. Dacă “da” mai introducem pînă cînd alegem “nu” şi n eîntoarcem la meniu. Dacă alegem al doilea buton adică “Completarea fişierului” se trece la modul text ca şi pentru primul caz şi tot aşa introducem informaţia. Cînd vom alege “Afişarea fişierului” se şterge ecranul cu linii şi se trece la modul text. Se afişează conţinutul fişierului cu ajutorul funcţiei afisare(). Butonul al patrulea are funcţia de a afişa conţinutul fişierului sortat după denumire. Se trece la modul text şi se apelează funcţia sort(). Are loc sortarea şi apoi afişarea fişierului. Butoanele 5, 6, 7, 8 şi 9 au funcţia de a interpela respectiv la denumire, costul cazării, costul mîncării, costul serviciilor şi la preţul total. Toate se execută asemănător. Se şterge ecranul, se trece la modul text, apoi se execută funcţia cerere(n-5), unde n e numarul butonului. În dependenţă de valoarea lui n-5 se execută funcţia butonului respectiv. Introducem semnul de comparare (<, =, >, !) după aceasta scrim valoarea respectiv la ce ne interesează şi se verifică fiecare cîmp dacă corespunde acestei interpelări, dacă da se afişează. După ce s-a afişat totul apăsăm orice tastă şi ne reîntoarcem în meniu. Butonul 10 are funcţia de a schimba fişierul şi se introduce ca la început fişierul, dacă el există se deschide dacă nu se crează. Pentru a scimba o înregistrare ne folosim de butonul 11. Se trece la modul text şi se apelează funcţia schimbare(). Se introduce numărul înregistrării în care dorim să facem schimbare şi scrim apoi informaţia, aceasta se scrie într-un şir şi şirul se scrie în fişier, apoi se afişează meniul principal. În caz cînd alegem ultimul buton, adică “Ieşire”, ne apare confirmarea dacă într-adevăr dorim să părăsim 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 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); 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); Ü è 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(); 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= ,st[20]; settextstyle(2,0,0); setfillstyle(1,15); setcolor(0); do { if(ch==8) dest[strlen(dest)-1]= ; else if(strlen(dest)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 ", "Nr.", "Denumirea","Cazare","Mincare", "Serv.","Total"); fprintf(f," ДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДЕДДД ДДДДДДЕДДДДДДДДДЕДДДДДДДД " ) ; } 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 ",++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]) { 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 ", "Nr.", "Denumirea","Cazare","Mincare", "Serv.","Total"); fprintf(f," ДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДЕДДД ДДДДДДЕДДДДДДДДДЕДДДДДДДД " ) ; for(i=0;idenumirea, ((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_t otal} ; struct baza_tur x[100],temp; int i,nr; char sign; clrscr(); printf(" Introduceti semnul de comparae (<,=,>,!):"); sign=getch();putch(sign); printf(" Introduceti 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 ", "Nr.", "Denumirea","Cazare","Mincare", "Serv.","Total"); printf(" ДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДЕДДД ДДДДДДЕДДДДДДДДДЕДДДДДДДД " ) ; nr=citire_inr(x); for(i=0;i0&&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 ", 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 ", "Nr.", "Denumirea","Cazare","Mincare", "Serv.","Total"); printf(" ДДДДЕДДДДДДДДДДДДДДДДДЕДДДДДДДДДЕДДД ДДДДДДЕДДДДДДДДДЕДДДДДДДД " ) ; for(int j=0;j0)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 */ if (errorcode != grOk) { printf("Graphics error: %s ", 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(); }. Rezultatele În programul dat meniul arată în felul următor Astfel se afişează fişierul: Nr. ¦ Denumirea ¦ Cazare ¦ Mincare ¦ Serv. ¦ Total ----+-------------------+---------+----------+---------+-------- 1 ¦ Chisinau ¦ 80 ¦ 45 ¦ 50 ¦ 175 2 ¦ National ¦ 78 ¦ 34 ¦ 35 ¦ 147 3 ¦ Codru ¦ 90 ¦ 68 ¦ 57 ¦ 215 4 ¦ Inturist ¦ 45 ¦ 23 ¦ 20 ¦ 88 5 ¦ VadulluiVoda ¦ 20 ¦ 15 ¦ 5 ¦ 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 cînd punem egal cu “Codru”: Nr. ¦ Denumirea ¦ Cazare ¦ Mincare ¦ Serv. ¦ Total ---+-------------------+---------+-----------+--------+-------- 3 ¦ Codru ¦ 90 ¦ 68 ¦ 57 ¦ 215 Interpelare la costul cazării, cînd 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 mîncării, cînd 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, cînd 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 cînd avem mai mic ca 150: Nr. ¦ Denumirea ¦ Cazare ¦ Mincare ¦ Serv. ¦ Total ---+-------------------+---------+-----------+--------+-------- 2 ¦ National ¦ 78 ¦ 34 ¦ 35 ¦ 147 4 ¦ Inturist ¦ 45 ¦ 23 ¦ 20 ¦ 88 5 ¦ VadulluiVoda ¦ 20 ¦ 15 ¦ 5 ¦ 40 Fereastra ce o afişează funcţia YesNoBox() cu şirul scris în ea: Concluzie În urma efectuării lucrării date am făcut cunoştinţă cu lucrul cu modul grafic, cu fişierele şi prelucrarea lor, am repetat aproape toate instrucţiunile învăţate în decursul anului şi am creat, cred eu, o bază de date reuşită. Bibliografie Caietul de curs şi practică la programare Tom Swan „C . . . pas cu pas” Valentin Cristea „Tehnici de programare” PAGE 1 PAGE 9 쥁@