You are on page 1of 12

CUPRINS

1. 2. 3. 4. 5. 6. 7.

Introducere ...............

pag. 2

Descrierea problemei ............ pag. 3 Structura programului pag. 4 Structuri de date utilizate .......... pag. 5

Proceduri de prelucrare ........... pag. 8 Concluzii .................pag. 11 Bibliografie ................pag. 12

1. INTRODUCERE

1.1 Obiectivul problemei : Aceasta aplicatie informatica are ca obiectiv gestionarea cat mai bu na a orarului unei facultati pentru un an de studiu. Prin intermediul ei se poat e genera o varianta de orar la un moment dat, variantele de orar ale unui profes

or la un moment dat si variantele posibile de orar pentru o anumita grupa la un moment dat. 1.2 Necesitatea : Aceasta aplicatie, pe langa generarea orarului (in loc de orar poate fi orice alta structura care se doreste sa aibe inregistrari,unice, adica sa nu se regaseasca in cele afisate anterior.) realizeaza si implementarea diferitelo r operatii pe structurile alese: adaugarea unui nou nod in lista si in arbore bi anr de cautare, cautarea unui element dupa cheie unica in arbore si in lista, st ergerea unei inregistrari din lista si arbore. De asemenea mai realizeaza si dif erite tipuri de conversii, cum ar fi: din fisier in arbore binar de cautare si d in arbore in fisier, din fisier in lista simplu inlantuita si din lista simpla i n fisier, din fisier in vector memorati dinamic.

1.3 Mijloace de realizare : Aplicatia a fost realizata in Microsoft Visual Studio 6.0 (Microsoft Visual C++ 6.0). Datele de intrare, dupa ce acestea au fost in prealabil validate, s-au incarcat in fisierele binare corespunzatoare celor 4 structuri:prof.dat, materii.dat, grupe.dat si sali.dat, apoi aceste fisiere au fost convertite in structuri de t ip arbore binar de cautare, lista sumplu inlantuita, respectiv masiv unidimensio nal memorat dinamic astfel incat resuresele sa fie alocate corespunzator si sa p ermita prelucrarie cat mai eficiente. Aplicatia este realizata in Microsoft Visual Studio 6.0 mai precis M icrosoft Visual C++ 6.0

2. DESCRIEREA PROBLEMEI

Avand de rezolvat problema generarii unei variante de orar al unei facultati, am definit cele 4 structuri initiale (pentru profesori, materii, grupe si sali) c u structurile arborescente aferente, urmand apoi procesul introducerii datelor i n fosiere binare nu inaintea ca acestea sa fie valide. Pentru a verifica acest l ucru am realizat o functie care verifica daca un sir de caractere dat de la tast atura este numeric sau nu. In caz afirmativ, pe langa aceasta conditie , se mai verifica si unicitatea codurilor de inregistrare (programul nu ma lasa sa introd uc doua coduri identice) . Pe langa operatiile de adaugare de noi inregistrari in liste si arbori, cautari dupa cheie si stergere de elemente din lista si arbore identificate dupe codul u nic de inregistrare, aplicatia genereaza si o varianta a unui orar la o anumita ora (adica grupele, salile si profesorii trebuie sa nu coincida; materiile pot c oincide deoarece pot exista mai multi profesori de aceeasi matarie), pentru un a

numit profesor (adica ce variante de orar ar putea avea din cele care indeplines c conditiile ) si pentru o anumita grupa. Pentru generarea orarului am facut conversii fin cele 4 fisiere de intrare in ve ctori alocati dinamic si am obtinut un vector vect_o de tip orar (care contine u rmatoarele campuri:codul grupei, denumirea materiei, codul salii si numele profe sorului). Pentru a ajunge la acest vector trebuie sa punem o serie de filtre inr egistrarilor din fisiere, cum ar fi:tipul profesorului trebuie sa fie egal cu ti pul materiei (adica un profesor preda materia respetiva), numarul de studenti ai unei grupe sa fie mai mic decat numarul de locuri di sala, numarul maxim de or e al profesorului trebuie sa fir mai mic decat numarul de ore care ar trebui sa se faca la disciplina respectiva.

3. STRUCTURA PROGRAMULUI

Aplicatia denumita proiect_orar.cpp este structurata astfel: mai intai sunt defi nite structurile folosite in program (pentru profesori, materii, grupe si sali) si structurile arborescente aferente acestora (arbore_profesor, arbore_materii, arbore_grupe, arbore_sali), plus o structura noua orar (care ne va ajuta la gene rarea orarului), apoi sunt definite functiile care lucreaza cu structurile: prof esorilor (functii pentru introducerea inregistrarilor, de afisare a datelor init iale din fisiere, de adaugare a unui nod in arbore, de conversie a fisierului in arbore, de parcurgere a arborelui, de afisare a continutului arborelui in fisie r text, de cautare dupa codul unic de inregistrare, de stergere a unui nod din a rbore, de conversie a fisierului in vector de tip structura profesor), materiilo r (functii pentru introducerea inregistrarilor, de afisare a datelor initiale di n fisiere, de adaugare a unui nod in arbore, de conversie a fisierului in arbore , de parcurgere a arborelui, de afisare a continutului arborelui in fisier text, de cautare dupa codul unic de inregistrare, de stergere a unui nod din arbore, de conversie a fisierului in vector de tip structura profesor), grupelor (functi i pentru introducerea inregistrarilor, de afisare a datelor initiale din fisiere , de adaugare a unei noi inregistrari in lista, de parcuregere a listei, de afis are a continutului listei in fisier text, cautare a unei inregistrari dupa codul unic de inregistrare,de conversie a fisierului in lista simplu inlantuita, de s tergere a unei informatii din lista identificata prin codul unic de inregistrare

) si salilor (functii pentru introducerea inregistrarilor, de afisare a datelor initiale din fisiere, de adaugare a unei noi inregistrari in lista, de parcureg ere a listei, de afisare a continutului listei in fisier text, cautare a unei in registrari dupa codul unic de inregistrare,de conversie a fisierului in lista si mplu inlantuita, de stergere a unei informatii din lista identificata prin codul unic de inregistrare ). Toate aceste functii se gasesc apelate in meniul aplicatiei, care contine o inst ructiune switch cu un grup de 28 actiuni particularizate pentru cele 4 structuri . Ramurile principale de la care au fost apoi particularizate toate ramificatiile sunt urmatoarele: - CREAREA FISIERELOR (de creare a celor 4 fisiere) - AFISAREA INFORMATIILOR (de afisare a continuitui arborelui) - ADAUGAREA DE NOI INREGISTRARI (adaugarea unui nod in arbore) - CAUTARI DUPA CODUL UNIC DE INREGISTRARE (de cautare dupa cod) - STERGERI DUPA CODUL UNIC DE INREGISTRARE (de stergere a unei inregistrari id entificata prin codul unic de inregistrare) - GENERARE ORAR (genereaza o varianta de orar pentru o singura ora si determina costul unei asemenea variante prin insumarea salariilor profesorilor care se con sidera ca au ora la momentul respectiv, genereaza variantele de orar pentru o an umita grupa si pentru un anumit profesor) - GENERARE DE RAPOARTE TEXT (inainte de incheierea sesiunii de lucru cu aplicat ia, se fac actualizarile fisierelor initiale sub forma de rapoarte in fisiere te xt , dand posibilitatea utilizatorului de a denumi fisierul in care vor aparea i nregistrarile tastand comanda: afisare nume_fisier.txt in meniul aplicatiei)

4. STRUCTURI DE DATE UTILIZATE Pentru rezolvarea aplicatiei am folosit urmatoarele tipuri de structuri si anum e : 1) 2) 3) 4) structuri simple de tip articol arbori binari de cautare liste simplu inlantuite masive unidimensionale memorate dinamic

1 ) Articolele sunt constituite prin compunerea mai multor tipuri de date date f undamentale, rezultand ansambluri eterogene de elemente de baza, sau elemente ag regate. Necesitatea utilizarii articolelor deriva din complexitatea obiectului real, car e este identificat si descries de o multime de caracteristici unice. Lipsa unui indicator agregat care sa insumeze intr-o singura valoare, nivelurile tuturor ca racteristicilor si care sa fie memorat intr-o variabila de tip fundamental (inte

ger, float, char, double, bool), este suplinita de structura de date de tip arti col. Aceasta este o multime de caracteristici ce sunt implementate prin intermed iul tipurilor elementare de date sau prin intermediul altor articole. In continuare vom prezenta structurile folosite efectiv de programul proiect_orar.cpp si anume : struct profesor prof; struct arbore_profesor ; struct materii mat; struct arbore_materii ; struct grupe gr; struct lista_grupe ; struct sali s; struct lista_sali ; In plus mai avem un articol de tip orar cu urmatoarea structura: struct orar

2) Arborii binari de cautare sunt arbori binari in care nodurile sunt memorate o rdonat in functie de o cheie. Toate nodurile din arbore au in subarborele stang noduri care au chei mai mici si in subarborele drept chei mai mari. Arborii de cautare permit regasirea rapida a informatiilor (O(log2 n)) atat timp cat arborele este echilibrat. In cazul cel mai defavorabil, timpul de cautare este i dentic cu cel al unei liste simplu inlantuite. Operatiile de baza pe un arbore de cautare sunt urmatoarele:

Cautare - Se compara cheia cu nodul curent. Daca este mai egala, am gasit nodul , daca este mai mica cautam in subarborele stang, altfel cautam in subarborele drept. Cautarea se opreste cand nodul a fost gasit sau s-a atins baza arborelui. Adaugare - Se cauta folosind algoritmul de cautare pozitia in arbore si se aloc a memoria si se face legatura cu nodul parinte. Stergere - Se cauta nodul de sters si se sterge nodul. Subarborele drept este a vansat in locul nodului sters, iar subarborele stang este mutat ca fiu al celui mai mic element din subarborele drept. 3) Lista simplu inlantuita reprezinta o multime dinamica de structuri recursive de acelasi tip, numite noduri, pentru care este definita o singura relatie de or dine cu ajutorul unor pointeri din compunerea acestora. De obicei aceasta relati e este cea de succesor, adica fiecare nod contine un pointer a carui valoare rep rezinta adresa nodului urmator din lista.

Intr-o lista simplu inlantuita exista intotdeauna un nod care u mai are succesor , precum si un nod care nu este succesorul nici unui alt nod. Aceste noduri cons tituie capetele liste simplu inlantuite. Pentru gestionarea acestui tip de lista se definesc 2 pointeri cap si ultim pentru a referi nodurile terminale ale list ei. Daca specificarea inceputului listei pri poiterul cap este obligatorie, ut ilizarea pointerului de sfarsit ultim este optionala, insa eficienta atunci cand se doreste crearea listei in ordine naturala printr-o insertie a noilor noduri la sfarsitul acesteia.

Listele simplu inlantuite sunt structuri de date dinamice omogene. Spre deosebir e de masive, listele nu sunt alocate ca blocuri omogene de memorie, ci ca elemen te separate de memorie. Fiecare nod al listei contine, in afara ce informatia utila , adresa urmatorului element. Aceasta organizare permite numai acces secvential la elemen tele listei. Pentru accesarea listei trebuie cunoscuta adresa primului element (numita capul listei); elementele urmatoare sunt accesate parcurgand lista. In cazul in care elemenul este ultimul din lista, pointerul urmator va avea valo area

NULL. Principalele operatii cu liste sunt: Parcurgere si afisare lista Lista este parcursa pornind de la pointerul spre primul element si avansand folo sind pointerii din structura pana la sfarsitul listei (pointer NULL). Inserare element Inserarea unui element se poate face la inceputul sau la sfarsitul listei. a) Inserare la inceput Acesta este cazul cel mai simplu: trebuie doar alocat elementul, legat de primul element din lista si repozitionarea capului listei: b) Inserare la sfarsitul listei In acest caz trebuie intai parcursa lista si dupa aceea adaugat elementul si leg at de restul listei. De asemenea, trebuie avut in vedere cazul in care lista este vida . c) inserare dupa un element dat inserare in interior Cautare element Cautarea unui element dintr-o lista presupune parcurgerea listei pentru identifi carea nodului in functie de un criteriu. Cele mai uzuale criterii sunt cele legate de pozitia in cadrul listei si de informatiile utile continute de nod. Rezultatul operatiei es te adresa primului element gasit sau NULL. a) Cautarea dupa pozitie Se avanseaza pointerul cu numarul de pozitii specificat: b) Cautarea dupa valoare Se parcurge lista pana la epuizarea acesteia sau identificarea elementului: Stergere element a) Stergerea unui element din interiorul listei (diferit de capul listei)

In acest caz avem nevoie de adresa predecesorului elementului de sters. Se modif ica legaturile in sensul scurtcircuitarii elementului de sters, dupa care se elibere aza memoria corespunzatoare elementului de sters: b) Stergerea unui element de pe o anumita pozitie Daca elementul este primul din lista, atunci se modifica capul listei, altfel se cauta elemental si se sterge folosind functia definite anterior: c) stergerea dupa o valoare Se cauta predecesorul elementului si se foloseste functia de stergere element:5 PROCEDURI SI FUNCTII DE PRELUCRARE In programul proiect_orar apar definite urmatoarele functii si proceduri: - int valid(char s[20],int &num) - o functie pentru validarea caracterelor numer ice (returneaza 1 daca sirul introdus de la tastatura este valid si 0 in caz con trar ) - void creare_fisier_profesori(FILE *f,profesor prof) - prin intermediul careia se realizeaza introducerea inregistrarilor pentru profesori - void afisare_fisier_profesori(FILE *f,profesor prof) - pentru afisare datelor initiale din fisierul: profesori - arbore_profesor *adaugare_profesor(arbore_profesor *rad_prof,profesor prof) adaugarea unui nod in arbore pentru profesor - void fisier_prof_to_arbore(arbore_profesor *&rad_prof) - realizeaza conversie de fisier in arbore pentru profesori - void parcurgere_profesori(arbore_profesor *rad_prof) - parcurgerea arborelui p entru profesori (parcurgea in inordinr de la arbori binari) - void parcurgere_profesori_text(arbore_profesor *rad_prof,FILE *f) - parcurgere a arborelui pentru profesori si afisare in fisier text - arbore_profesor *cauta_profesor(arbore_profesor *rad_prof,int cod_p) - cautare profesor dupa cod - void stergere_prof(int x,arbore_profesor *&p) - stergerea unui nod din arborel e pentru profesori

- void fisier_vect_p(profesor *&vect_p) - conversie din fisierul pentru profeso ri in vectorul vect_p - void creare_fisier_materii(FILE *f,materii mat) - introducerea inregistrarilor pentru materii - void afisare_fisier_materii(FILE *f,materii mat) - afisarea datelor initiale din fisierul: materii - arbore_materii *adaugare_materie(arbore_materii *rad_mat,materii mat) - adauga rea unui nod in arbore pentru materii -void fisier_materii_to_arbore(arbore_materii *&rad_mat)- conversie de fisier in arbore pentru materii - void parcurgere_materii(arbore_materii *rad_mat) - parcurgerea arborelui pent ru materii - void parcurgere_materii_text(arbore_materii *rad_mat,FILE *f) - parcurgerea ar borelui pentru materii si afisare in fisier text - arbore_materii *cauta_materie(arbore_materii *rad_mat,int cod_m) - cautare mat erie dupa cod - void stergere_mat(int x,arbore_materii *&p) - sterg nod materii - void fisier_vect_m(materii *&vect_m) - conversie din fisierul pentru materii in vectorul vect_m - void fisier_vect_gr(grupe *&vect_gr) - conversie din fisierul pentru grupe in vectorul vect_gr - void creare_fisier_grupe(FILE *f,grupe gr) - ntroducerea inregistrarilor pentr u grupe - void afisare_fisier_grupe(FILE *f,grupe gr) - afisare datelor initiale din fis ierul: grupe - void adaugare_grupe(lista_grupe *&lista_gr,grupe inf) - adaugarea unei noi in registrari in lista grupelor - void parcurgere_grupe(lista_grupe *lista_gr) - parcurgerea listei pentru grupe

- int sterge_grupe(struct lista_grupe *&rad_gr,int a) - stergerea unei grupe dup a cod -void creare_fisier_sali(FILE *f,sali s) - introducerea inregistrarilor pentru s ali - void afisare_fisier_sali(FILE *f,sali s) - afisare datelor initiale din fisier ul: sali - void adaugare_sali(lista_sali *&lista_s,sali inf) -adaugarea unei noi inregist rari petru sali - void parcurgere_sali(lista_sali *lista_s) - parcurgerea listei pentru sali

- void fisier_vect_s(sali *&vect_s) - conversie din fisierul pentru sali in vect orul vect_s - lista_sali *cauta_sala(lista_sali *lista_s,int cod_s)- cautarea unei sali dupa cod -void lista_fisier_sali(FILE *f,lista_sali *lista_s) - conversie lista in fisie r pentru sali - void fisier_sali_to_lista(lista_sali *&lista_s) - conversie lista din fisier p entru sali - void afis_text_profesori(FILE *f,FILE *g) - afisare profesori in fisier text - void vector(int nr_p,int nr_m,int nr_gr,int nr_s,profesor *vect_p,materii *vec t_m,grupe *vect_gr,sali *vect_s,orar *&vect_o,int &numar) - crearea vectorului p entru generarea orarului - void orarul(int nr_p,profesor *vect_p,orar *vect_o,int numar) - generarea une i variante posibile de orar - void orarul_profesorilor(orar *vect_o,int numar) - generarea unei variante pis ibile pentru orarul profesorilor - void orarul_grupelor(orar *vect_o,int numar) - generarea unei variante posibil e pentru orarul unei grupe - void cost_orar(int nr_p,profesor *vect_p,orar *vect_o,int numar) - generarea unei variante posibile de orar)

-void meniu() - este o procedura care afiseaza meniul atata timp cat nu se intro duce 0 de la tastatura. Dupa afisarea meniului, utilizatorul isi poate alege var ianta dorita din cele de pe ecran, iar dupa executare apare din nou meniul in ev entualitatea ca acesta va mai dori testarea unei optiuni din meniu.

6. CONCLUZII

Programul realizat reprezinta varianta optima pentru rezolvarea prob lemei, 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 datelo r: arborele. Fisierul binar reprezinta o metoda eleganta de stocare a informatiei , regasirea acesteia realizandu-se secvential, indexat sau in acces direct, in f unctie de necesitate si de cantitatea de informatie. In acest caz s-a ales acces ul de tip direct-secvential la date, ceea ce ofera o performanta medie in proces ul de regasire a datelor, a vitezei, a memoriei ocupate si al gradului de comple xitate al programarii. Intr-adevar, accesul indexat ar fi fost indicat, dar in c azul acestui exemplu, in care informatia stocata e infima si timpul de acces ne fiind foarte important (deoarece nu se lucreaza cu mii de inregistrari), s-a ale s metoda mai facila din punct de vedere a programarii. Programul realizat reprezinta varianta optima pentru rezolvarea prob lemei, 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 datelo r: arborele. Folosind arborii, procesul de cautare al unui cuvant in arbore nece sita, de obicei, mai putini pasi. In fiecare nod se realizeaza o ramificare, deo arece se continua cautarea fie in subarborele stang, fie in cel drept, fie se co nstata ca nodul respectiv contine chiar cuvantul cautat.

BIBLIOGRAFIE

[IVAN05] Ion IVAN, Cristian IONITA, Catalin BOJA, Marius POPA, Adrian POCOVNICU, Daniel M ILODIN - Practica dezvoltarii software orientata pe structuri de date, Editura A SE, Bucuresti, 2005.

[ROSC03] Ion Gh. ROSCA, Bogdan GHILIC-MICU, Catalina- Lucia CIOCANUu, Marian STOICA, Cri stian USCATU- Programarea calculatoarelor, Editura Cison, 1998. [ SMEU01] Ion SMEUREANU, Marian DARDALA,"Programare in limbajul C/C++ Editura Cison,