Referat Baza De Date
Mai jos puteti citi fragmente din
Referat Baza De Date si de asemenea puteti face
Download Referat Baza de dateCiteste 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)