Sunteți pe pagina 1din 31

UNIVERSITATEA DIN CRAIOVA

Facultatea de Automatica, Calculatoare si Electronica

PROIECT T.P.

COORDONATOR , Gheorghe Marian

STUDENT, Dinu Andrei, Grupa 10104

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

2011

1.

TEMA SI CERINTELE PROIECTULUI

Gestiunea masinilor de Formula 1 dintr-o boxa a echipei. Aplicatia se va realiza in limbajul C,folosind fisiere binare,fisiere texe si arbori binari de cautare. Aplicatia va avea o interfata cu utilizatorul sub forma unui meniu care va avea urmatoarele operatii: -creare fisier -adaugare in fisier -stergere unei inregistrari din fisier -modificare in fisier -listare continutului fisierului -sortare in fisier -permutari in fisier -creare arbore -afisarea arborelui -inserarea unui nod in arbore -stergerea unui nod din arbore

2. SPECIFICATII
2.1 SPECIFICATII PROGRAM
La executia programului,pe ecran apare un meniu principal compus din urmatoarele: 1-Creare fisier 2-Adaugare fisier 3-Stergere fisier 4-Modificare fisier 5-Listare fisier S-Sortare P-Permutatri 6-Creare arbore 7-Afisare arbore 8-Inserare 9-Stergere nod 0-Actualizare fisier E-Exit

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

Utilizatorul pentru a alege una din optiunii trebuie sa tasteze una din cifrele sau literele corespunzatoare fiecarei obtiuni din meniu. Daca utilizatorul alege cifra 1,adica se alege Creare fisier,se va crea un fisier binar numit boxe.dat ,apoi permite introducerea datelor in fisier de catre utilizator prin intermediul consolei (tastaturei). Fiecare inregistrare trebuie sa contina urmatoarele campuri: nr.m, echipa, anul, km, starea, costul reparatiilor. Dupa introducerea tuturor acestor date de catre utilizator apare un mesaj prin care utilizatorul este intrebat daca mai doreste sa mai introduca si alte date.Daca se apasa tasta natunci procesul de introducere a datelor se incheie si se revine la meniul anterior.Daca se apasa tasta d,atunci programul permite introducerea unei noi inregistrari in fisierul boxe.dat. Daca utilizatorul tasteaza cifra 2,adica alegeAdaugare fisier,aceasta permite adaugarea de la tastatura a unei noi inregistrari in fisierul boxe.dat,deja creat.Procedeul de adaugare este similar cu cel precedent prezentat la crearea fisierului boxe.dat. Daca utilizatorul alege cifra 3,adica Stergere fisier,acesta permite stergerea unei masini din fisierul boxe.dat,masina va fi identificata prin numarul de inregistrare al masinii.In cazul in care numarul de inregistrare nu se gaseste printre numerele de inregistrare ale masinilor din fisier apare mesajul:masina cu acest numar de inregistrare nu exista in stoc!. Daca utilizatorul tasteaza cifra 4,adica Modificare fisier,aceasta perminte modificarea datelor unei masini din fisierul boxe.dat,masina va fi identificata prin numarul de inregistrare.In cazul in care numarul de inregistrare introdus nu se gaseste printre numerele de inregistrare ale masinilor din fisier apare un mesaj: masina cu acest numar de inregistrare nu exista!.Modificarea se aplica tuturor campurilor din inregistrare. Daca utilizatorul tasteaza cifra 5 din meniul principal,adica se alege Listare fisier,acesta permite afisarea datelor din fisierul boxe.dat. Daca utilizatorul tasteaza litera S,adica Sortare,acesta permite sortarea datelor in fisier. Daca utilizatorul tasteaza litera P ,adica Permutari,aceasta permite realizarea de permutari in fisier tinand cont de numarul de inregistrare al masinilor. Daca utilizatorul tasteaza cifra 6,adica Creare arbore,acesta permite Crearea unui arbore binar de cautare.Iar dupa realizarea tuturor acestor operatii se va afisa un text cu mesajul: Arborele a fost creat!. Daca utilizatorul tasteaza cifra 7,adica afisare arbore,acesta permite afisarea arborelui binar de cautare. Daca utilizatorul tasteaza cifra 8,adica Inserare,aceasta permite inserarea unui nou nou in arborele binar de cautare. Daca utilizatorul tasteaza cifra 9,adica Sterge nod,acesta permite stergerea unui nod din arborele binar de cautare.La sfarsitul operatiei se va afisa un text cu mesajul: Nodul a fost sters!,daca nu este indeplinita acesata operatie se va afisa urmatorul text cu mesajul: Nu exista aceasta inregistrare!. Daca utilizatorul tasteaza cifra 0din meniul principal,adica Exit atunci aplicatia se incheie.

2.2 SPECIFICATII AVANSATE


Codul aplicatiei este alcatuit dintr-un fisier numit boxe si un arbore scris in limbajul C. Programul foloseste 2 structuri de date definite denumite garaj si arbore.Fiecare din ele reprezinta structura de date a inregistrarilor din fisier si arbore folosite in program. Tabelul ce descriere structura garaj este urmatorul: Denumie Tip de date Tip de date Marime

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

Camp Nr_m Echipa Anul cand a castigat Km Starea Costul reparatiilor intreg sir de caractere intreg intreg sir de caractere intreg

in C int char(20) int int char(20) int 20 caractere 20 caractere

Tabelul ce descrie structura arborelui este urmatorul Denumie Camp Nr_m Echipa Anul cand a castigat Km Starea Costul reparatiilor Tip de date intreg sir de caractere intreg intreg sir de caractere intreg Tip de date in C int char(20) int int char(20) int 20 caractere 20 caractere Marime

In program se vor folosi 2 variabile globale f1 si f2 de tip FILE*,2 variabile globale stg si drp de tip arbore*,2 variabile globale nod si rad de tip arb*.Pentru alegerea optiunilor din meniul principal si apoi din fiecare submeniu se vor folosi doua variabile globale alegi si alege 1 de tip caracter (char). Programul foloseste mai multe functii,fiecare realizand o anumita operatie si o functie principala(programul principal): -void creare_fis_garaj(void)-functia care permite crearea fisierului boxe.dat. -void adaugare_fis_garaj(void)-functia care permite adaugarea in fisierul boxe.dat. -void scriere_fisier-functia care permite scrierea in fisierul boxe.dat. -void stergere_fis_ garaj (void)-functia care permite stergerea din fisierul boxe.dat. -void modifica_fis_ garaj (void)-functia care permite modificarea din fisierul boxe.dat. -void listare_fis_ garaj (void)-functia care permite listarea fisierului boxe.dat. -void ordonare_fis(void)-functia care permite ordonarea fisierului boxe.dat. -void creare_ garaj _txt(void)-functia care permite crearea fisierului info.txt. -void listare_fis_txt(void)-functia care permite listarea fisierului info.txt.

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

-void scrie_nod(arb *p)-functia care permite scrierea unui nod in arbore. -void sterge_arb(nod &q ,int x, nod &rd)-functia care sterge un nod din arbore. -void elimina(int k,nod &rd)-functia care elimica cate un nod din arbore. -void adauga_arb(void)-functia care adauga un nod in arbore. -void creare_arb(void)-functia care creaza arborele. -void express(int n,arb *p) -void total( ) -void permuta( ) -void perm_fisier( )-functia care face permutari in fisierul boxe.dat. -void meniu(void)-functia programului principal;aceasta functie afiseaza meniul principal al programului precum si submeniurile atasate fiecarei obtiuni,si de asemenea permite alegerea unei obtiuni,iar in functie de obtiunea aleasa se apeleaza una din functiile descrise anterior.

2.3 SPECIFICATII DETALIATE


Functia de creare a lisierului binar boxe.dat Aceasta functie este functia creare_fis_garaj,functia contine o singura variabila locala ch de tip char folosita pentru a permite utilizatorului sa raspunda la intrebarea daca mai doreste sa mai introduca date in fisier. In primul rand se deschide fisierul "boxe.dat" pentru creare adica se foloseste optiunea"wb" pentru al doilea parametru al functiei fopen, apoi intr-un ciclu do-while se citesc datele de la tastatura in variabila gr de tip garaj si se scriu in fisierul "boxe.dat" cat timp nu se raspunde la intrebarea amintita mai sus cu caracterul 'N' sau 'n', adica cat timp ch!='n'and ch!='N'. Citirea datelor in variabila gr se face camp cu camp. Ca in pseudocodul urmator: functie creare_fis_garaj(){ *deschide fisierul "boxe.dat" pt scriere* repeta scrie "Nr_m masina=" citeste gr.nr_m scrie "echipa=" citeste gr.Echipa scrie "anul=" citeste gr.anul scrie "km parcursi=" citeste gr.km scrie "starea=" citeste gr.starea scrie costul reparatiilor= citeste gr.costul reparatiilor *scrie gr in fisierul "boxe.dat"* scrie "Mai doriti sa introduceti date?" citeste ch }cat timp(ch!='n' and ch!='N') *inchide fisierul "boxe.dat"*

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

} Functia de adaugare in fisierului "boxe.dat" Aceasta functie este functia adaugare_fis_garaj, functia contine o singura variabila locala ch de tip char folosita pentru a permite utilizatorului sa raspunda la intrebarea daca mai doreste sa introduca date in fisier. Se deschide fisierul "boxe.dat" pentru adaugare adica se foloseste optiunea"ab" pentru al doilea parametru al functiei fopen, se pozitioneaza cursorul in fisier la sfarsitul fisierului adica parametrul 3 al functiei fseek este SEEK_END, apoi intr-un ciclu do-while se citesc datele de la tastatura in variabila gr de tip garaj si se scriu in fisierul "boxe.dat" cat timp nu se raspunde la intrebarea amintita mai sus cu caracterul 'N' sau 'n', adica cat timp ch!='n'and ch!='N'. Citirea datelor in variabila gr se face camp cu camp. functie adaugare_fis_garaj(){ *deschide fisierul "boxe.dat" pt adaugare* *pozitionare la sfarsitul fisierului* repeta{ scrie "Nr_m masina=" citeste gr.nr_m scrie "echipa=" citeste gr.echipa scrie "anul=" citeste gr.anul scrie "km=" citeste gr.km parcursi scrie "starea=" citeste gr.starea scrie pcostul reparatiilor= citeste gr.costul reparatiilor *scrie gr in fisierul "boxe.dat"* scrie "Mai doriti sa introduceti date?" citeste ch }cat timp(ch!='n' and ch!='N') *inchide fisierul "boxe.dat"* } Functie de scriere a unui nod in fisier scriere_fisier boxe.dat Functia care scrie informatiile dintr-un nod in fisierul boxe.dat, deschide fisierul pentru scriere daca este prima inregistrare scrisa sau pentru adaugare daca nu este prima inregistrare scrisa . Functie scriere_fisier() {daca (nr==0) atunci {*decschide boxe.dat pentru scriere in f1* *scrie variabila gr in fisierul f1* inchide f1 } altfel { {*decschide boxe.dat pentru adaugare in f1*

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

*cauta sfarsitul lui f1* *scrie gr in fisierul f1 inchide f1 }} Functia de stergere in fisierului "boxe.dat" Aceasta functie este functia stergere_fis_garaj. Functia contine urmatoarele variabile locale: f de tip FILE*, nr de tip integer variabila in care se citeste numarul de inregistrare al masinii ce se doreste sters din fisier, h variabila de tip integer folosita ca o variabila booleana care verifica daca inregistrarea a fost sau nu gasita in fisier. Mai intai se citeste de la tastatura numarul de inregistrare al masinii ce se doreste a se sterge. Se deschide pentru citire fisierul "boxe.dat" si pentru creare un nou fisier numit "nou.dat", avand rolul de fisier temporal. Metoda de stergere folosita in aceasta functie este urmatoarea: se citeste inregistrare cu inregistrare din fisierul "boxe.dat", daca numarul de inregistrare cerut este diferit de numarul de inregistrare din inregistrare atunci inregistrarea curenta se scrie intr-un fisier "nou.dat", daca se gaseste un numar de inregistrare egal cu nr de inregistrare al masinii din inregistrare se face h=1, apoi in ambele cazuri se trece la citirea urmatoarei inregistrari din fisier pana cand se ajunge la sfarsitul fisirului. Daca dupa parcurgerea fisierului "boxe.dat", h are valoarea 0, inseamna ca masina cautata cu nr. de inregistrare cerut nu exista in fisier. Deci in fisierul "nou.dat" avem acum toate inregistrarile din fisierul "boxe.dat" mai putin cea a carui nr. de inregistrare s-a cerut sa se stearga. In final se sterge fizic de pe disc fisierul "boxe.dat" si apoi se redenumeste fisierul "nou.dat" cu numele "boxe.dat". Algoritmul este aratat in pseudocodul urmator: functie stergere_fis_garaj(){ atribuie h<-0 scrie "Dati Nr.de inregistrare al masinii=" citeste nr *deschide fisierul "boxe.dat" pt citire* *deschide fisierul "nou.dat" pt creare* *citeste in gr o inregistrare din "boxe.dat"* cat timp(*nu s-a ajuns la sfarsitul fisierului*){ daca(nr!=gr.nr_m)atunci *scrie gr in fis "nou.dat"* altfel atribuie h<-1 *citeste in gr o inregistrare din "boxe.dat"* } daca(v==0)atunci scrie " masina cu acest numar de inregistrare nu exista in stoc!" *inchide fisierul "boxe.dat"* *inchide fisierul "nou.dat"* *sterge fisierul "boxe.dat" de pe disc* *redenumeste fisierul "nou.dat" in "boxe.dat"* }

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

Functia de modificare a fisierului "boxe.dat" Aceasta functie este functia modifica_fis_garaj. Functia contine doua variabile locale nr de tip integer variabila in care se citeste numarul de inregistrare al masinii a carui date se doresc modificate, h variabila de tip integer folosita ca o variabila booleana care verifica daca inregistrarea a fost sau nu gasita in fisier. Se deschide fisierul "boxe.dat" pentru citire si adaugare adica se foloseste optiunea"rb+" pentru al doilea parametru al functiei fopen. Intr-un ciclu while cat timp nu se ajunge la sfarsitul de fisier si h este diferit de 0 se testeaza daca nr este egal cu nr de inregistrare din inregistrare in caz afirmativ se modifica datele inregistrarii curente, intai se citesc noile date in variabila structura gr apoi aceasta se scrie in fisierul "boxe.dat", dupa care h se face 1 si se reia ciclul. Daca dupa parcurgerea fisierului "boxe.dat", h are valoarea 0, inseamna ca inregistrarea cautata cu nr. de inregistrare nu exista in fisier. In final se inchide fisierul. Pseudocodul este urmatorul: functie modifica_fis_garaj(){ atribuie h<-0 scrie "Dati Nr.de inregistrare=" citeste nr *deschide fisierul "boxe.dat" pt citire si adaugare* *citeste in gr o inregistrare din "boxe.dat"* cat timp(*nu s-a ajuns la sfarsitul fisierului si h==0*){ daca(nr==gr.nr_m)atunci{ scrie "Nr_m masina=" citeste gr.nr_m scrie "echipa=" citeste gr.echipa scrie "anul=" citeste gr.anul scrie "km=" citeste gr.km parcursi scrie "starea=" citeste gr.starea scrie ptretul= citeste gr.costul reparatiilor *pozitionare la inceputul inregistrarii* *scrie gr in fisierul "boxe.dat"* atribuie h<-1 } *citeste in gr o inregistrare din "boxe.dat"* } daca(h==0)atunci scrie " masina cu acest numar de inregistrare nu exista!" *inchide fisierul "boxe.dat"* }

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

Functia de listare a fisierului "boxe.dat" Aceasta functie este functia listare_fis_garaj. Se deschide fisierul "boxe.dat" pentru citire adica se foloseste optiunea"rb" pentru al doilea parametru al functiei fopen. Se afiseaza un cap de tabel, apoi se citeste in variabila gr o inregistrare din fisier, apoi intr-un ciclu while cat timp nu se ajunge la sfarsitul de fisier se afiseaza datele din campurile variabilei structura gr, iar apoi se citeste o alta inregistrare din fisierul "boxe.dat" si se reia ciclul. Ca in pseudocodul urmator: functie listare_fis_garaj(){ *deschide fisierul "boxe.dat" pt citire* scrie "Nr echipa anul km starea costul reparatiilor" *citeste in gr o inregistrare din "boxe.dat"* cat timp(*nu s-a ajuns la sfarsitul fisierului*){ scrie gr.nr_m, gr.echipa, gr.anul, gr.km,gr.strea,gr.costul reparatiilor *citeste in gr o inregistrare din "boxe.dat"* } *inchide fisierul "boxe.dat"* } Functia de creare a fisierului "boxe.dat" din "info.txt" Aceasta functie este functia creare_garaj_txt(). Aceasta functie citeste caracter cu caracter o linie din fisierul text "info.txt", o transforma in inregistrare tip structura garaj apoi inscrie aceasta inregistrare in fisierul "boxe.dat". Fiecare linie din fisierul text se scrie intr-un tablou de caractere sau pointer de char numit sir apoi datele sunt incrise in campurile variabilei gr folosind o functie sscanf. Evident fisierul "info.txt" se deschide pentru citire, iar fisierul "boxe.dat" se deschide pentru creare. In functie se mai folosesc pe langa variabila locala sir si inca 3 variabile locale ft de tip FILE*, ch de tip char folosita pentru a citi fiecare caracter din fisierul "info.txt", si i de tip integer care reprezinta indexul tabloului sir functie creare_garaj_txt(){ *deschide fisierul "info.txt" pt citire* *deschide fisierul "boxe.dat" pt creare* *citeste in ch un caracter din "info.txt"* cat timp(*nu s-a ajuns la sfarsitul fisierului*){ atribuie i<-0 atribuie sir<-"" cat_timp (ch!='\n'){ atribuie sir[i++]<-ch *citeste in ch un caracter din "info.txt"* } atribuie sir[i]<-'\0' *cieteste gr din sir* *scrie gr in fisierul "boxe.dat"* } *inchide fisierul "boxe.dat"* *inchide fisierul "info.txt"* }

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

Functia de creare a fisierului "info.txt" Aceasta functie este functia listare_fis_txt(). Aceasta functie citeste caracter o inregistrare din fisierul "boxe.dat" si apoi transforma inregistrarea scrisa in variabila gr in sir de caractere dupa care scrie acest sir pe cate o linie in fisierul text "info.txt". Fuctie are 2 variabile locale ft de tip FILE* si o variabila sir de tip tablou de caractere sau pointer la char. Mai intai se deschide fisierul "info.txt" pentru creare iar fisierul "boxe.dat" pentru citire. Cat timp nu se ajunge la sfarsitul fisierului boxe.dat" se citeste cate o inregistrare, apoi inregistrarea este transformata in sirul de caractere sir cu ajutorul functiei sprintf si apoi sir este scris in fisierul "info.txt" dar si afisat pe ecran, apoi ciclul se repeta. In final se inchid cele doua fisiere. Algoritmul este prezentat in pseudocodul urmator: functie listare_fis_txt(){ *deschide fisierul "info.txt" pt creare* *deschide fisierul "boxe.dat" pt citire* *citeste in gr o inregistrare din "boxe.dat"* cat timp(*nu s-a ajuns la sfarsitul fisierului*){ atribuie sir<-"" *scrie in sir inregistrarea curenta din gr* *scrie sir in fisierul "info.txt"* *afiseaza sir pe ecran* *citeste in gr o inregistrare din "boxe.dat"* } *inchide fisierul "boxe.dat"* *inchide fisierul "info.txt"* } Functia creare a arborelui din fisierul boxe.dat creare_arb() Functia care citeste inregistrarile din fisier si le insereaza in arbore.Se parcurge fisierul linie cu linie, iar inregistrarile preluate din fisier in variabila gr se introduc in arbore una cate una prin intermediul functiei insert(). Pseudocodul este: functie creare_arb() { *deschide fisierul "boxe.dat" pt citire* *citeste in gr o inregistrare din "boxe.dat"* cat timp(*nu s-a ajuns la sfarsitul fisierului*){ rad<-insert(rad,gr) *citeste in gr o inregistrare din "boxe.dat"* } scrie "Arborele a fost creat!" *inchide fisierul "boxe.dat"* }

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

Functia de inserare a unui nod in arbore insert() Functia care insereaza nodul cu informatiile din pk in arborele cu radacina p.Functie recursiva care parcurge arborele si cauta un nod pentru a insera informatiile din variabila pk de tip garaj.Cautarea nodului unde se va insera este realizata de functia caut().Pseudocodul algoritmului este: functie insert(arb *p,garaj pk):arb* {k=pk.nr_m *aloca memorie pentru variabila q de tip arb* q->nr_m<-pk.nr_m copiaza(q->marca,pk.marca) q->anul<-pk.anul q->km<-pk.km copiaza(q->starea,pk.starea) q->pretul<-pk.pretul q->stg<-q->drp<-NULL r<-caut(p,k) daca r=0 atunci p<-q altfel daca r->nr_m>=k atunci r->stg<-q altfel r->drp<-q intoarce p } Functia de adaugare adauga_arb() Functia care adauga un nod nod in arbore ale carui informatii sunt citite de la tastatura.Functia citeste de la tastatura campurile variabilei pk de tip garaj, apoi prin intermediul functiei insert() adauga in arbore un nod cu informatiile din pk.Pseudocodul functiei este: functie adauga_arb() { repeta {clrscr(); scrie "Nr_m masina=" citeste pk.nr_m scrie "echipa=" citeste pk.echipa scrie "anul=" citeste pk.anul scrie "km="

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

citeste pk.km scrie "starea=" citeste pk.starea scrie pcostul reparatiilor= citeste pk.costul reparatiilor rad<-insert(rad,pk) scrie " Mai doriti sa introduceti date?d/n" citeste ch }cat timp((ch!='n') si (ch!='N')) } Functia de eliminare elimina(int k,nod &rd) Functia care parcurge si cauta in arbore nodul cu campul nr_m egal cu k ,cand il gaseste variabila found devine 1 si apeleaza functia determ() pentru a-l sterge.Pseudocodul este: functie elim(int k,arb &rd) { r<-NULL p<-rd found<-0 a<-0 cat timp((p) && !found) daca (k<p->nr_m) atunci { a<-1 r<-p p<-p->stg } altfel daca(k>p->nr_m) atunci { a<-2 r<-p p<-p->drp } altfel found<-1 daca (found) determ(r,a,rd) altfel scrie " Nu exista aceasta inregistrare!" } Functia care strege un nod din arbore sterge_arb(nod &q ,int x, nod &rd) Functia care sterge un nod din arbore si determina configuratia acestuia dupa stergere astfel inacat sa fie respectata configuratia de arbore de cautare. Pseudocodul acesteia este: functie sterge_arb(nod &q,int x,nod &rd) {

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

daca (x==1) atunci t<-q->stg altfel daca(x==2) atunci t<-q->drp altfel t<-rd daca(!t->drp) atunci daca(x==1) atunci q->stg<-t->stg altfel daca(x==2) atunci q->drp<-t->stg atunci rd<-t->stg altfel daca(!t->stg) atunci daca(x==1) atunci q->stg<-t->drp altfel daca(x==2) atunci q->drp<-t->drp altfel rd<-t->drp altfel {r<-NULL s<-t->drp cat timp(s->stg) {r<-s s<-s->stg } daca(r) atunci {r->stg<-s->drp s->drp<-r->drp } s->stg<-t->stg daca(x==1) atunci q->stg<-s altfel daca(x==2) atunci q->drp<-s altfel rd=s } delete(t) } Functia de afisare a arborelui express(int n,arb *p) Functia care afiseaza arborele in structura ramificata in functie de campul nr_m.Functie recursiva ca parcurge arborele SRD( stang radacina drept) si afiseaza campul nr_m al fiecarui nod. Variabila parametru n este folosita pentru a numara spatiile care sunt scrise inaintea fiecarui numar pentru a afisa o structura ramificata.

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

Functie express(int n,arb *p) { daca (p) atunci { express(n+1,p->drp) pentru i de la 1 la n executa scrie " " scrie p->nr_m scrie "\n" express(n+1,p->stg) } } Functia de scriere a arborelui in fisier scrie_nod(arb *p) Functia care parcurge arborele pentru a-l scrie in fisier. Se parcurge recursiv arborele si scrie informatiile din fiecare nod in fisier prin intermediul functiei scriere_fis().Pseudocodul acesteia: functie scrie_nod(arb *p) { daca(p) atunci { scrie_nod(p->drp) gr.nr_m<-p->nr_m gr.echipa<-p->echipa gr.anul<-p->anul gr.km<-p->km gr.strea<-p->strea gr.costul reparatiilor<-p->costul_reparatiilor scriere_fisier() nr++ scrie_nod(p->stg) } } Functia permuta( ) Functia genereaza un sir de n numere cu valori intre 1 si n (n este numarul de inregistrari din fisier), aceste numere sunt diferite intre ele, si reprezinta sirul de permutari Functie permuta() { randomize() ok<-0 cat timp(ok=0) atunci { a[1]<-random(n+1) daca (cont(1)=1) ok<-1} pentru i de la 2 la m atunci

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

{ ok<-0 cat timp(ok=0) { a[i]<-random(n+1) daca (cont(i)=1) atunci ok<-1} } } Functia perm_fisier() Functia citeste din fisier inregistrarile si le introduce intr-un sir de inregistrari, permuta inregistrarile dupa campul ales si apoi rescrie iregistrarile in fisier. Pseudocodul functiei este : Functie perm_fisier(void) { *deschide fisierul "boxe.dat" pt citire* *citeste in gr o inregistrare din "boxe.dat"* cat timp(*nu s-a ajuns la sfarsitul fisierului*){ gr1[++n]<-gr; *citeste in gr o inregistrare din "boxe.dat"* } *inchide fisierul "boxe.dat"*} pentru i de la 1 la n executa {gr2[i]<-gr1[i] strcpy(gr2[i].model,gr1[ai]].model) } *deschide fisierul "boxe.dat" pt scriere* pentru i de la 1 la n executa *scrie gr2 in fisierul "boxe.dat"* *inchide fisierul "boxe.dat"* } Programul principal Functia main() implementeaza meniul discutat la specificatiile de program pentru fiecare optiune se deschide un alt submeniu iar pentru fiecare optiune a acestuia se apeleaza una din functiile descrise anterior. Acest lucru este evidentiat in urmatorul pseudocod. Programul principal{ Repeta{ scrie " Alegeti una dintre optiunile urmatoare" scrie "Fisiere" scrie "1-Creare" scrie "2-Adaugare" scrie "3-Stergere" scrie "4-Modificare " scrie "5-Listare " scrie "S-Sortare " scrie "P-Permutari " scrie "Arbori"

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

scrie "6-Creare" scrie "7-Afisare arbore" scrie "8-Inserare" scrie "9-Stergere nod " scrie "0-Actualizare fisier 'garaj'" scrie "[E]xit" citeste alege alege (alege){ '1': repeta{ scrie"1-Creare fisier 'garaj' de la tastatura " scrie"2-Creare fisier 'garaj' din fisier" scrie"0-Exit." citeste alege1 alege(alege1){ '1': creare_fis_garaj() scrie " S-a creat fisierul.." '2': apeleaza creare_garaj_txt() } }cat timp(alege1!='0') '2': repeta{ scrie "1- Adaugare in fisierul 'garaj' " scrie "0-Exit." citeste alege1 adaugare_fis_garaj() }cat timp(alege1!='0') '3': repeta{ scrie "1-Stergere din fisierul 'garaj'" scrie "0-Exit." citeste alege1 stergere_fis_garaj() }cat timp(alege1!='0') '4': repeta{ scrie "1- Modificare in fisierul 'garaj' " scrie "0-Exit." citeste alege1 modifica_fis_garaj() }cat timp(alege1!='0') '5':repeta{ scrie "1-Listarea fisierului 'garaj' pe ecran" scrie "2-Listarea fisierului 'garaj' intr-un fisier text" scrie "0-Exit." citeste alege1 alege(alege1){ '1':apeleaza listare_fis_garaj() '2':apeleaza listare_fis_txt() } }cat timp(alege1!='0') } s:

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

S:ordonare_fis();listare_fis_garaj() scrie Total nr masini fabricate in anul p: P: n=0;perm_fisier() 6: rad=NULL;creare_arb() 7: express(0,rad) scrieApasati o tasta.." 8: adauga_arb() 9: scrie "Dati nr inregistrarii de sters " citeste ai elimina(ai,rad) 0: nr=0;scrie_nod(rad) scrie "Fisierul a fost reactualizat!" }cat timp(alege!='E'); }

"

3. CODUL PROGRAMULUI
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<ctype.h> typedef struct { int nr_m; char Echipa[20]; int anul; int km; char starea[20]; int Costul_reparatiilor; }boxe; typedef struct arbore{ int nr_m; char Echipa[20]; int anul; int km; char starea[20]; int Costul_reparatiilor;

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

struct arbore *stg,*drp; }arb; typedef arb *nod; arb *rad; boxe gr; int k,ai,ct,nr,n,a[50]; FILE *f1,*f2; char ok, ok1; void adaugare_fis_boxe(void) { char ch; f1=fopen("boxe.dat","ab"); fseek(f1,0,SEEK_END); do{ system("cls"); printf("\n Nr de inregistrare al masinii: ");scanf("%d",&gr.nr_m); printf(" Echipa: ");scanf("%s",gr.Echipa); printf(" Anul cand a castigat campionatul : ");scanf("%d",&gr.anul); printf(" Km parcursi: ");scanf("%d",&gr.km); printf(" Starea: ");scanf("%s",gr.starea); printf(" Costul_reparatiilor: ");scanf("%d",&gr.Costul_reparatiilor); fwrite(&gr,sizeof(boxe),1,f1); printf("\n Mai doriti sa introduceti date?(d/n)\n"); ch=getch(); } while((ch!='n')&&(ch!='N')); fclose(f1); } void creare_fis_boxe(void) { char ch; f1=fopen("boxe.dat","wb"); do{ system("cls"); printf("\n Nr de inregistrare al masinii: ");scanf("%d",&gr.nr_m); printf(" Echipa: ");scanf("%s",gr.Echipa); printf(" Anul cand a castigat campionatul : ");scanf("%d",&gr.anul); printf(" Km parcursi: ");scanf("%d",&gr.km); printf(" Starea: ");scanf("%s",gr.starea); printf(" Costul_reparatiilor: ");scanf("%d",&gr.Costul_reparatiilor); fwrite(&gr,sizeof(boxe),1,f1); printf("\nMai doriti sa introduceti date?(d/n)\n"); ch=getch(); }while((ch!='n')&&(ch!='N'));

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

fclose(f1); } void scriere_fisier() { if (nr==0) { f1=fopen("boxe.dat","wb"); fwrite(&gr,sizeof(boxe),1,f1); fclose(f1); } else { f1=fopen("boxe.dat","ab"); fseek(f1,0,SEEK_END); fwrite(&gr,sizeof(boxe),1,f1); fclose(f1); } } void stergere_fis_boxe(void) { FILE *f; int nr; int h=0; printf("\nDati nr de inregistrare al masinii: ");scanf("%d",&nr); f1=fopen("boxe.dat","rb"); f=fopen("nou.dat","wb"); fread(&gr,sizeof(boxe),1,f1); while(!feof(f1)){ if (nr!=gr.nr_m) fwrite(&gr,sizeof(boxe),1,f); else { h=1; printf("\nS-a sters!\n"); getch(); } fread(&gr,sizeof(boxe),1,f1); } if(h==0){ printf("\nMasina cu acest numar de inregistrare nu exista in stoc!"); getche(); } fclose(f1); fclose(f); remove("boxe.dat"); rename("nou.dat","boxe.dat");

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

} void modifica_fis_boxe(void) { int nr; int h=0; printf("\nDati nr inregistrare: ");scanf("%d",&nr); f1=fopen("boxe.dat","rb+"); fread(&gr,sizeof(boxe),1,f1); while((!feof(f1)) && (h==0)){ if (nr==gr.nr_m){ printf("\n Nr de inregistrare al masinii: ");scanf("%d",&gr.nr_m); printf(" Echipa: ");scanf("%s",gr.Echipa); printf(" Anul cand a castigat campionatul : ");scanf("%d",&gr.anul); printf(" Km parcursi: ");scanf("%d",&gr.km); printf(" Starea: ");scanf("%s",gr.starea); printf(" Costul_reparatiilor: ");scanf("%d",&gr.Costul_reparatiilor); fseek(f1,ftell(f1)-sizeof(boxe),SEEK_SET); fwrite(&gr,sizeof(boxe),1,f1); h=1; printf("\nS-a modificat!"); } fread(&gr,sizeof(boxe),1,f1); } if(h==0){ printf("\nMasina cu acest numar de inregistrare nu exista!"); getch(); } fclose(f1); } long FileSize(FILE *f) { long poz_curenta,lungime; poz_curenta=ftell(f); fseek(f,0,SEEK_END); lungime=ftell(f); fseek(f,poz_curenta,SEEK_SET); return lungime; } void listare_fis_boxe(void)

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

{ system("cls"); f1=fopen("boxe.dat","rb"); printf("\n\n Gestiune masini\n"); printf(" -----------------------------------------------------------------------------------------------\n"); printf(" |Nr d inregistrare| Echipa |Anul cand a castigat campionatul| Km parcursi| Stare | Pret |\n"); printf(" -----------------------------------------------------------------------------------------------\n"); fread(&gr,sizeof(boxe),1,f1); while(!feof(f1)){ printf(" | %17d | %12s | %32d | %12d | %7s | %8d |\n",gr.nr_m,gr.Echipa,gr.anul,gr.km,gr.starea,gr.Costul_reparatiilor); fread(&gr,sizeof(boxe),1,f1); } printf(" -----------------------------------------------------------------------------------------------\n"); fclose(f1); } void ordonare_fis() { FILE *f1; boxe p,q; int ordonat; long poz,i; f1=fopen("boxe.dat","r+b"); size_t lung_pers=sizeof(boxe); long lungime_fis=FileSize(f1)/lung_pers; do{ ordonat=1; rewind(f1); for(i=1;i<=lungime_fis-1;i++) { poz=ftell(f1); fread(&p,sizeof(boxe),1,f1); fread(&q,sizeof(boxe),1,f1); if(p.nr_m>q.nr_m) { fseek(f1,poz,SEEK_SET); fwrite(&q,sizeof(q),1,f1); fwrite(&p,sizeof(p),1,f1); ordonat=0; } fseek(f1,poz+lung_pers,SEEK_SET); } }while(!ordonat); fclose(f1); }

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

void creare_boxe_txt(void) { FILE *ft; char *sir; char ch; int i; system("cls"); ft=fopen("info.txt","rt"); f1=fopen("boxe.dat","wb"); ch=fgetc(ft); while(!feof(ft)){ i=0; strcpy(sir,""); while(ch!='\n'){ sir[i++]=ch; ch=fgetc(ft); } sir[i]='\0'; sscanf(sir,"%d %s %d %d %s %d\n",&gr.nr_m,gr.Echipa,&gr.anul,&gr.km,gr.starea,&gr.Costul_reparatiilor); fwrite(&gr,sizeof(boxe),1,f1); ch=fgetc(ft); } fclose(f1); fclose(ft); printf("\n Fisierul 'boxe.dat' a fost creat din fisierul 'info.txt'\n"); getch(); } void listare_fis_txt(void) { char *sir; FILE *ft; system("cls"); ft=fopen("info.txt","wt"); f1=fopen("boxe.dat","rb"); fread(&gr,sizeof(boxe),1,f1); while(!feof(f1)){ strcpy(sir,""); sprintf(sir,"%d %s %d %d %s %d\n",&gr.nr_m,gr.Echipa,&gr.anul,&gr.km,gr.starea,&gr.Costul_reparatiilor); fputs(sir,ft); puts(sir); fread(&gr,sizeof(boxe),1,f1);

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

} fclose(ft); fclose(f1); getch(); } void scrie_nod(arb *p) { if(p){ scrie_nod(p->drp); gr.nr_m=p->nr_m; strcpy(gr.Echipa,p->Echipa); gr.km=p->km; gr.anul=p->anul; strcpy(gr.starea,p->starea); gr.Costul_reparatiilor=p->Costul_reparatiilor; scriere_fisier(); nr++; scrie_nod(p->stg); } } void sterge_arb(nod &q,int x,nod &rd) { arb *r,*s,*t; if(x==1) t=q->stg; else if(x==2) t=q->drp; else t=rd; if(!t->drp) if(x==1) q->stg=t->stg; else if(x==2) q->drp=t->stg; else rd=t->stg; else if(!t->stg) if(x==1) q->stg=t->drp; else if(x==2) q->drp=t->drp; else rd=t->drp; else

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

{ r=NULL; s=t->drp; while(s->stg) { r=s; s=s->stg; } if(r) { r->stg=s->drp; s->drp=r->drp; } s->stg=t->stg; if(x==1) q->stg=s; else if(x==2) q->drp=s; else rd=s; } delete(t); } void elimina(int k,nod &rd) { int a; arb *p,*r; int gasit; r=NULL; p=rd; gasit=0; a=0; while((p)&& !gasit) if(k<p->nr_m) { a=1; r=p; p=p->stg; } else if(k>p->nr_m) { a=2; r=p; p=p->drp; } else gasit=1; if(gasit) { sterge_arb(r,a,rd); printf("\nNodul a fost sters!"); } else printf("Nu exista aceasta inregistrare!\n");

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

} arb *caut(arb *p,int key) { if(!p) return NULL; else if((!p->stg && key<=p->nr_m)||(!p->drp && key>p->nr_m)) return p; else { if(key<=p->nr_m) caut(p->stg,key); else caut(p->drp,key); } } arb *insert(arb *p,boxe pk) { arb *q,*r; k=pk.nr_m; q=(arb *)malloc(sizeof(arb)); q->nr_m=pk.nr_m; strcpy(q->Echipa,pk.Echipa); q->km=pk.km; q->anul=pk.anul; strcpy(q->starea,pk.starea); q->Costul_reparatiilor=pk.Costul_reparatiilor; q->stg=q->drp=NULL; r=caut(p,k); if(!r) p=q; else if(r->nr_m>=k) r->stg=q; else r->drp=q; return p; } void adauga_arb(void) { boxe pk; char ch; do{ system("cls"); printf("\n Nr de inregistrare al masinii: ");scanf("%d",&pk.nr_m); printf(" Echipa: ");scanf("%s",pk.Echipa); printf(" Anul cand a castigat campionatul : ");scanf("%d",&pk.anul); printf(" Km : ");scanf("%d",&pk.km); printf(" Starea: ");scanf("%s",pk.starea); printf(" Costul_reparatiilor: ");scanf("%d",&pk.Costul_reparatiilor);

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

rad=insert(rad,pk); printf("\nMai doriti sa introduceti date?(d/n)\n"); ch=getch(); }while((ch!='n')&&(ch!='N')); } void creare_arb(void) { system("cls"); f1=fopen("boxe.dat","rb"); fread(&gr,sizeof(boxe),1,f1); while(!feof(f1)) { rad=insert(rad,gr); fread(&gr,sizeof(boxe),1,f1); } printf("Arborele a fost creat!"); getche(); fclose(f1); } void express(int n,arb *p) { int i; if(p){ int i; express(n+1,p->drp); for(i=0;i<3*n;i++) printf(" "); printf("%3d\n",p->nr_m); express(n+1,p->stg); /* express(n+1,p->drp); for(i=1;i<=n;i++)printf(" "); printf("%3d",p->nr_m); printf("\n"); express(n+1,p->stg); */ } } void total() { int n=0;

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

int i,j,k; char *x[30]; f1=fopen("boxe.dat","rb"); fread(&gr,sizeof(boxe),1,f1); strcpy(x[n],gr.starea); while(!feof(f1)){ fread(&gr,sizeof(boxe),1,f1); strcpy(x[++n],gr.starea); } for(i=0;i<n;i++) { k=1; for(j=i+1;j<n;j++) if(!strcmp(x[i],x[j])) { k++;strcpy(x[j],"");} if(strcmp(x[i],"")) printf("\n%10s %10d",x[i],k); } fclose(f1); } int validare(int key) { int i; if(!a[key]) return 0; for(i=1;i<key;i++) if(a[key]==a[i]) return 0; return 1; } void permuta() { int i,ok=0; randomize(); while(!ok) { a[1]=random(n+1); if(validare(1)) ok=1;} for(i=2;i<=n;i++) { ok=0; while(!ok) { a[i]=random(n+1); if(validare(i)) ok=1;} } } void perm_fisier() { system("cls"); boxe gr1[50],gr2[50];

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

int i; f1=fopen("boxe.dat","rb"); fread(&gr,sizeof(boxe),1,f1); while(!feof(f1)) { gr1[++n]=gr; fread(&gr,sizeof(boxe),1,f1); } fclose(f1); f1=fopen("boxe.dat","wb"); permuta(); for(i=1;i<=n;i++) { gr2[i]=gr1[i]; gr2[i].nr_m=gr1[a[i]].nr_m; } for(i=1;i<=n;i++) fwrite(&gr2[i],sizeof(boxe),1,f1); fclose(f1); printf("S-a efectuat permutarea !"); } void meniu(void){ do{ system("cls"); printf("Alegeti una dintre optiunile urmatoare:\n"); printf("\n\n Fisiere\n"); printf("\n1. Creare"); printf("\n2. Adaugare"); printf("\n3. Stergere"); printf("\n4. Modificare"); printf("\n5. Listare"); printf("\nS. Sortare"); printf("\nP. Permutari"); printf("\n\n Arbori\n"); printf("\n6. Creare"); printf("\n7. Afisare arbore"); printf("\n8. Inserare"); printf("\n9. Stergere nod"); printf("\n0. Actualizare fisier 'boxe'\n"); printf("\n\n (E)xit\n"); ok=getch(); switch(ok){ case '1':{ do{ system("cls"); printf("\n1. Creare fisier 'boxe' de la tastatura");

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

printf("\n2. Creare fisier 'boxe' din fisier"); printf("\n0. Exit"); ok1=toupper(getch()); switch(ok1){ case '1':creare_fis_boxe(); printf("\nS-a creat fisierul..");getch();break; case '2':creare_boxe_txt();break; } }while(ok1!='0'); }break; case '2':{ do{ system("cls"); printf("\n1. Adaugare in fisierul 'boxe'"); printf("\n0. Exit"); ok1=getch(); if (ok1=='1') adaugare_fis_boxe(); }while(ok1!='0'); }break; case '3':{ do{ system("cls"); printf("\n1. Stergere din fisierul 'boxe'"); printf("\n0. Exit"); ok1=getch(); if (ok1=='1') stergere_fis_boxe(); }while(ok1!='0'); }break; case '4':{ do{ system("cls"); printf("\n1. Modificare in fisierul 'boxe'"); printf("\n0. Exit"); ok1=getch(); if (ok1=='1') modifica_fis_boxe(); }while(ok1!='0'); }break; case '5':{ do{ system("cls"); printf("\n1. Listarea fisierului 'boxe' pe ecran"); printf("\n2. Listarea fisierului 'boxe' intr-un fisier text"); printf("\n0. _E_xit"); ok1=getch(); switch(ok1){ case '1':listare_fis_boxe();getch();break;

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

case '2':listare_fis_txt();getch();break; } }while(ok1!='0'); }break; case 's': case 'S':ordonare_fis();listare_fis_boxe(); f1=fopen("boxe.dat","rb");getch(); printf("\nTotal %ld campionate castigate in anul %d",FileSize(f1)/sizeof(boxe),gr.anul); fclose(f1);getch(); printf("\n Masini"); total();getch(); break; case 'p': case 'P':n=0;perm_fisier();getch();break; case '6':rad=NULL;creare_arb();break; case '7':system("cls");express(0,rad);printf("Apasati o tasta..");getch();break; case '8':system("cls");adauga_arb();break; case '9':system("cls"); printf("Dati nr inregistrarii de sters: ");scanf("%d",&ai); elimina(ai,rad);break; case '0':system("cls");nr=0;scrie_nod(rad);printf("Fisierul a fost reactualizat!"); getch();break; } }while(ok!='E' && ok!='e'); }

UNIVERSITATEA DIN CRAIOVA Facultatea de Automatica, Calculatoare si Electronica

Cuprins 1. Tema si cerinta programului 2. Specificatii program 2.1 Specificatii program 2.2 Specificatii avansate 2.3 Specificatii detaliate 3. Codul programului