Sunteți pe pagina 1din 13

ACADEMIA DE STUDII ECONOMICE

FACULTATEA DE CIBERNETIC, STATISTIC i INFORMATIC ECONOMIC

STRUCTURI DE DATE PROIECT

Baza de date pentru evidenta cartilor intr-o librarie folosind structuri de date

Student : Grupa : An: III

Pojala Diana 1051

Bucureti 2012

CUPRINS

Introducere ... pag. 3 Structura programului ... pag. 4 Structurile de date utilizate intern . pag. 5 Descrierea implementarii operatiilor de baza pag. 7 Concluzii pag. 12 Bibliografie pag. 13

INTRODUCERE
Obiectivul problemei Acest program tare ca obiectiv gestionarea cat mai buna a cartilor dintr-o librarie, realizand introducerea, modificarea si stergerea informatiilor utile despre carti, precum si diferite rapoarte pe stoc. ENUNTUL PROBLEMEI: Sa se creeze un program in limbajul C++ pentru evidenta cartilor dintr-o librarie. Se vor elabora proceduri pentru crearea structurii de date, stergerea logica/fizica a informatiilor, adaugare, inserare camp, modificare camp, salvarea informatiilor utile intrun fisier format .txt si respectiv afisarea pe ecran a bazei de date. Selectia operatiilor pe baza de date se va efectua in functia main() prin intermediul unei structuri alternative multiple. Sa se creeze un arbore binar de cautare. Operatiile pe aceasta structura de date sunt: inserare, afisare, cautare dupa cheia primara: numar_matricol. Necesitatea problemei Aceasta aplicatie, pe langa tinerea unei evidente precise a cartilor, realizeaza de asemenea si implementarea diferitelor operatii pe structurile alese: adaugarea unui nod in lista, cautarea unui element dupa cheie unica arbore, respectiv in lista, stergerea unui element din lista, precum si diferite conversii cum ar fi: din lista simplu inlantuita in fisier, din fisier in arbore binar de cautare. Mijloace de realizare Aplicatia este realizata in Microsoft Studio 2010. Pentru rezolvarea acestei probleme au fost create 3 structuri de date. Pentru prelucrarea datelor la nivel de intrare/iesire, cat si pentru adaugari si eliminari de elemente, se foloseste o structura de tip lista simplu inlantuita. Pentru a cauta un element s-a realizat memorarea elementelor listei simplu inlatuite intr-o structura de tip arbore binar de cautare. Structura arborelui binar garanteaza eficenta in cautarea dupa elementul cheie nr_matricol. Pentru scrierea in fisierul binar, baza de articole pentru crearea arborelui binar, s-a folosit structura de tip articol. Am definit cele 3 structuri de date, urmand procesul introducerii datelor, dupa ce acestea sunt validate. Pentru a verifica acest lucru, am realizat o functie care verifica daca un sir introdus de la tastatura este format doar din cifre si simbolul - . In caz afirmativ, se mai verifica si unicitatea ISBN-urilor (programul nu ma lasa sa introduc doua ISBN-uri identice).

Structura programului
Aplicatia denumita Pojala Diana.cpp este structura astfel: Sunt definite structurile folosite in program Sunt definite functiile care care lucreaza cu structurile: pentru introducerea datelor, afisarea datelor, adaugarea unui nod in lista simplu inlantuita, parcurgerea listei, transformarea listei in fisier, cautarea in lista dupa ISBN, afisarea continurului listei, conversia fisierului in arbore, parcurgerea arborelui, afisarea continutului arborelui, cautarea dupa numarul matricol in arbore) Toate aceste functii se regasesc in meniul aplicatiei, care contine o instructiune switch Ramurile principale sunt: Crearea listei simplu inlantuite Adaugarea de noi inregistrari (adaugarea unui nod in lista) Afisarea informatiilor (continutul listei, respectiv arborelui) Cautari dupa un cod (ISBN in lista, respectiv nr_matricol in arbore) Stergere dupa pozitie (in lista simplu inlantuita) Generare de raport text

Structurile de date utilizate intern


Pentru rezolvarea aplicatiei, am folosit urmatoarele tipuri de structuri: structura simpla de tip articol structura de tip lista simplu inlantuita structura de tip arbore binar de cautare Articolele sunt formate din compunerea mai multor tipuri de date fundamentale. Necesitatea folosirii articolelor deriva din complexitatea obiectului real, descris de o multime de caracteristici unice, iar structura de date de tip articol este o multime de caracteristici implementate prin intermediul tipurilor elementare de date. De asemenea, structura de tip articol este folosita si pentru scrierea in fisierul binar, acesta constituind baza de articole pentru crearea structurii de tip arbore binar de cautare.
typedef struct nodListaCarte { int numar_matricol; char ISBN[20], autor[50],nume[100]; float pret; int stoc; nodListaCarte *next,*pred; };

Arborii binari de cautare sunt arbori binari in care nodurile sunt memorate ordonat in functie de o cheie. Toate nodurile din arbore au in subarborele stang noduri care au chei mai mici, iar in subarborele drept noduri cu chei mai mari. Pe aceasta structura, am realizat operatiile de parcurgere, respectiv de cautare dupa cheia nr_matricol. Operatia de cautare- se compara cheia cu nodul curent: - daca este egala, am gasit nodul - daca este mai mica, cautam in subarborele stang - daca este mai mare, cautam in subarborele drept Cautarea se opreste cand nodul a fost gasit sau s-a atins baza arborelui.
struct nodArbore { int nr_matricol; char ISBN[20], autor[50],nume[100]; float pret; int stoc; nodArbore *st,*dr; };

Lista simplu inlantuita reprezinta o multime dinamica de structuri recursive de acelasi tip, numite noduri, pentru care este definita o relatie de ordine cu ajutorul unor pointeri din compunerea acestora. Fiecare nod contine un pointer a carui valoare reprezinta 5

adresa noduui urmator din lista, acest lucru permite numai acces secvential la elementele listei. Exista intotdeauna un nod care nu mai are succesor, precum si un nod care nu este succesorul nimanui, acestea doua fiind capetele listei simplu inlantuite. Pentru gestionarea aceste noduri terminale, se definesc doi pointeri cap si ultim. Specificarea inceputului listei prin pointerul cap este obligatorie, insa utilizarea pointerului de sfarsit ultim este optionala. Pentru accesarea listei, trebuie cunoscuta adresa primului element (capul listei), iar elementele urmatoare sunt accesate parcurgand lista. Operatiile folosite pe structura de tip lista inlantuita sunt: Parcurgere si afisare lista lista este parcursa pornind de la pointerul spre primul element si avansand folosind pointerii din structura pana la sfarsitul listei (pointer NULL). Inserare element Inserare la inceput trebuie alocat elementul, legat de primul element din lista si repozitionarea capului listei Inserare la sfarsitul listei trebuie parcursa lista si apoi adaugat elementul si legat de restul listei. De asemenea, trebuie tratat cazul in care lista este vida. Inserare dupa un element sau pe o anumita pozitie inserare in interior Cautare element presupune parcurgerea listei pentru identificarea nodului in functie de un criteriu. Rezultatul operatiei este adresa primului element gasit sau NULL. Cautare dupa pozitie se avanseaza pointerul cu numarul de pozitii specificat Cautare dupa valoare se parcurge lista pana la epuizarea acesteia sau identificarea elementului Stergere element Stergere element din interiorul listei, diferit de capul listei avem nevoie de adresa predecesorului elementului de sters, se modifica legaturile, dupa care se elibereaza memoria corespunzatoare elementului de sters Stergere element de pe o anumita pozitie daca este primul din lista, se modifica capul listei, altfel se cauta elementul si se sterge Stergere dupa valoare se cauta predecesorul si se sterge elementul
typedef struct carte { char ISBN[20]; char autor[50]; char nume[100]; float pret; int stoc; carte *next; }*pcarte;

Descrierea implementarii operatiilor de baza


In proiect, apar definite urmatoarele functii si proceduri: void InserareCarte(carte **cap, char ISBN[20], char autor[50], char nume[100], float pret, int stoc)

reprezinta in principal crearea unei liste, ea fiind apelata in programul principal prin intermediul unei structuri repetitive de tip for. Procedura adauga un nod la sfarsitul listei. EXEMPLU: Se va insera urmatorul nod: "978-973-675-600-9" "Cella Serghi" "Panza de paianjen" 10 10 Lista va arata in felul urmator: ISBN Carte 1: "978-973-10-40-691" Carte 2: "973-86048-9-3" Carte 3: "978-973-46-0826-3" Carte 4: "978-973-675-597-2" Carte 5: "978-973-675-644-3" Carte 6: "978-973-675-600-9" Pret 23 30 50 15 10 10 Stoc 10 15 8 20 20 10 ===> Noua carte Autor "F. M. Dostoievski" "Marin Preda" "F. M. Dostoievski" "Mircea Eliade" "Mircea Eliade" "Cella Serghi" Nume "Crima si pedeapsa" "Mizerabilii" "Idiotul" "Maitreyi" "Nunta in cer" "Panza de paianjen"

- int NumaraCarti(carte *cap) calculeaza numarul total de carti, parcurgand in totalitate lista. Aceasta functie este apelata atat in programul principal, cat si in operatiile ulterioare. Un exemplu concret este modificarea unei carti de pe pozitia 6, iar in lista sunt 5 carti, utilizand aceasta functie se va afisa mesajul: "Ati introdus o pozitie inexistenta in lista curenta. Va rugam reintroduceti:". - int NumaraCartiStoc0(carte *cap) numara cartile care nu mai sunt pe stoc, adica au campul stoc egal cu 0 (care sunt sterse logic). - int verificaISBN(char ISBN[20], carte *cap) verifica daca sirul de caractere introdus de la tastatura este format doar din cifre si simbolul "-", precum si daca acest ISBN exista deja in lista (pentru a fi unic).

- void AfisareCarti(carte *cap) realizeaza afisarea cartilor care sunt pe stoc, avand campul stoc>0. Am utilizat functia NumaraCarti(), cu scopul de a verifica daca lista este populata. EXEMPLU: Daca o anumita carte, de exemplu "Idiotul" de Dostoievski, nu mai este pe stoc, ea va avea campul stoc=0, drept pentru care nu va mai fi afisata: Carte 1: "978-973-10-40-691" Carte 2: "973-86048-9-3" Carte 4: "978-973-675-597-2" Carte 5: "978-973-675-644-3" "F. M. Dostoievski" "Crima si pedeapsa" "Marin Preda" "Mizerabilii" "Mircea Eliade" "Maitreyi" "Mircea Eliade" "Nunta in cer" 23 10 30 15 15 20 10 20

- void AfisareCartiTotal(carte *cap) afiseaza toate cartile. EXEMPLU: Carte 1: "978-973-10-40-691" Carte 2: "973-86048-9-3" Carte 3: "978-973-46-0826-3" Carte 4: "978-973-675-597-2" Carte 5: "978-973-675-644-3" "F. M. Dostoievski" "Crima si pedeapsa" "Marin Preda" "Mizerabilii" "F. M. Dostoievski" "Idiotul" "Mircea Eliade" "Maitreyi" "Mircea Eliade" "Nunta in cer" 23 30 50 15 10 10 15 8 20 20

- void AdaugareCarte(carte **cap, int pozitie, char ISBN[20], char autor[50],char nume[100], float pret, int stoc) efectueaza inserarea unui nod pe o pozitie data de la tastatura. Se poate insera si pe prima pozitie, capul listei fiind modificat. EXEMPLU: Se va insera urmatorul nod pe pozitia 4: "978-973-675-600-9" "Cella Serghi" "Panza de paianjen" 10 10 Carte 1: "978-973-10-40-691" "F. M. Dostoievski" "Crima si pedeapsa" 23 10 Carte 2: "973-86048-9-3" "Marin Preda" "Mizerabilii" 30 15 Carte 3: "978-973-46-0826-3" "F. M. Dostoievski" "Idiotul" 50 8 Carte 4: "978-973-675-600-9" "Cella Serghi" "Panza de paianjen" 10 10 Carte 5: "978-973-675-644-3" "Mircea Eliade" "Nunta in cer" 10 20 Carte 6: "978-973-675-597-2" "Mircea Eliade" "Maitreyi" 15 20 - int ModificareCarte(carte *cap, int pozitie) are scopul de a modifica o informatie despre o carte aflata pe o pozitie data de la tastatura. Trateaza cazurile in care se doreste modificarea ISBN-ului, autorului, numelui, pretului sau stocului. EXEMPLU: Dupa modificarea numelui cartii de pe pozitia 4 cu XYZ, lista va deveni: Carte 1: "978-973-10-40-691" "F. M. Dostoievski" "Crima si pedeapsa" 23 10 Carte 2: "973-86048-9-3" "Marin Preda" "Mizerabilii" 30 15 Carte 3: "978-973-46-0826-3" "F. M. Dostoievski" "Idiotul" 50 8 8

Carte 4: "978-973-675-597-2" "Mircea Eliade" "XYZ" 15 20 Carte 5: "978-973-675-644-3" "Mircea Eliade" "Nunta in cer" 10 20 - void AfiseazaCartiCuPretulSubX(carte *cap, float pret) efectueaza afisarea produselor ce au pretul sub o valoare data de la tastatura. EXEMPLU: Pentru X=20 "978-973-675-644-3" "Mircea Eliade" "Nunta in cer" 10 20 "978-973-675-597-2" "Mircea Eliade" "Maitreyi"15 20 - void StergereLogica(carte *cap, int pozitie) efectueaza lichidarea stocului unei anumite carti: campul stoc va deveni egal cu 0. La apelul functiei AfisareCarti, aceasta carte nu va mai fi afisata deoarece va avea campul stoc egal cu 0. EXEMPLU: Daca s-a lichidat stocul cartii "Idiotul" de Dostoievski, aceasta nu va mai fi afisata: Carte 1: "978-973-10-40-691" "F. M. Dostoievski" "Crima si pedeapsa" 23 10 Carte 2: "973-86048-9-3" "Marin Preda" "Mizerabilii" 30 15 Carte 4: "978-973-675-597-2" "Mircea Eliade" "Mitreyi" 15 20 Carte 5: "978-973-675-644-3" "Mircea Eliade" "Nunta in cer" 10 20 - void StergereFizica(pcarte *cap, int pozitie) este apelata in cazul in care o carte trebuie eliminata din lista. Nodul nu va mai avea nici o legatura cu lista, fiind dezalocat. Procedura trateaza si cazul in care se doreste stergerea primului element. EXEMPLU: Cartea "Maitreyi" este mutata din librarie, lista va deveni: Carte 1: "978-973-10-40-691" Carte 2: "973-86048-9-3" Carte 3: "978-973-46-0826-3" Carte 5: "978-973-675-644-3" "F. M. Dostoievski" "Crima si pedeapsa" 23 10 "Marin Preda" "Mizerabilii" 30 15 "F. M. Dostoievski" "Idiotul" 50 8 "Mircea Eliade" "Nunta in cer" 10 20

- void RaportCarti(carte *cap) creeaza fisierul Raport.txt si salveaza informatiile despre carti in acesta cu ajutorul clasei STREAM. Am utilizat OFSTREAM, ce permite doar scrierea in fisiere. EXEMPLU: Raport.txt va arata asa: *** ISBN ****** AUTOR ******* NUME ********* PRET *** STOC 978-973-10-40-691 F. M. Dostoievski Crima si pedeapsa 973-86048-9-3 Marin Preda Mizerabilii 30 978-973-46-0826-3 F. M. Dostoievski Idiotul 978-973-675-597-2 Mircea Eliade Mitreyi 15 9 23 15 50 20 8 10

978-973-675-644-3

Mircea Eliade

Nunta in cer

10

20

- nodArbore *InserareArbore(nodArbore *rad, int matricol,char ISBN[20], char autor[50], char nume[100], float pret, int stoc) are ca scop inserarea informatiilor utile in ARBORE. - void AfisareCartiDinArbore(nodArbore *point) are ca scop afisarea informatiilor utile din ARBORE. - nodArbore *CautareArboreCarte(nodArbore *rad, int matricol) are ca scop cautarea unei carti din ARBORE dupa NUMARUL MATRICOL
carte * Dezalocare_lista(carte *cap)

efectueaza dezalocarea listei. Ea este apelata din programul principal prin intermediul unei structuri repetitive de tip while. - void AfisareMeniu() are ca scop informarea utilizatorului cu privire la indexurile operatiilor. Dupa afisarea meniului, utilizatorul isi poate alege varianta dorita din cele de pe ecran, iar dupa executare apare din nou meniul in eventualitatea ca acesta va mai dori testarea unei optiuni din meniu, pana la introducerea tastei "0" de la tastatura.
void AfisareMeniu() { cout<<"******************************* \n"; cout<<"* BAZA DE DATE CARTI LIBRARIE * \n"; cout<<"******************************* \n"<<endl; cout<<"1. Creare lista\n"; cout<<"2. Populare lista de carti - Adaugare la sfarsitul listei\n"; cout<<"3. Inserare carte pe o anumita pozitie\n"; cout<<"4. Modificare carte de pe o anumita pozitie\n"; cout<<"5. Afisare carti cu pret mai mic decat o valoare introdusa de la tastatura\n"; cout<<"6. Cautare carti dupa ISBN introdus de la tastatura\n"; cout<<"7. Stergere logica sau fizica a unei carti\n"; cout<<"8. Salvare informatii carti in format .txt \n"; cout<<"9. Afisare lista carti care sunt pe stoc\n"; cout<<"10. Afisare completa a cartilor - inclusiv cele care nu sunt pe stoc\n"; cout<<"11. Creare arbore binar\n"; cout<<"12. Cautare articole in arbore binar\n"; cout<<"0. Iesire\n"; }

10

Fig. 1 - Ecran de start

11

Concluzii

Programul realizat reprezinta varianta optima pentru tinerea unei evidente precise a cartilor din librarie, deoarece asigura din punct de vedere fizic cea mai buna si rapida metoda de stocare a datelor: fisierul; si cea mai buna alternativa de regasire a datelor: arborele. Fisierul binar reprezinta o metoda eleganta de stocare a informatiei, regasirea acesteia realizandu-se secvential, indexat sau in acces direct, in functie de necesitate si de cantitatea de informatie. In acest caz s-a ales accesul de tip direct-secvential la date, ceea ce ofera o performanta medie in procesul de regasire a datelor, a vitezei, a memoriei ocupate si al gradului de complexitate al programarii Folosind arborii, procesul de cautare al unui cuvant in arbore necesita, de obicei, mai putini pasi. In fiecare nod se realizeaza o ramificare, deoarece se continua cautarea fie in subarborele stang, fie in cel drept, fie se constata ca nodul respectiv contine chiar cuvantul cautat.

12

Bibliografie
[IVAN05] [ROSC98] [ SMEU01] [SITE01] Ion IVAN, Cristian IONITA, Catalin BOJA, Marius POPA, Adrian POCOVNICU, Daniel MILODIN - Practica dezvoltarii software orientata pe structuri de date, Editura ASE, Bucuresti, 2005. Ion Gh. ROSCA, Bogdan GHILIC-MICU, Catalina- Lucia CIOCANUu, Marian STOICA, Cristian USCATU- Programarea calculatoarelor, Editura Cison, 1998. Ion SMEUREANU, Marian DARDALA,"Programare in limbajul C/C++ Editura Cison, Bucuresti 2001 http://www.scritube.com/stiinta/informatica

13

S-ar putea să vă placă și