Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<conio.h>
- #include<stdlib.h>
- #include<string.h>
- //structura pentru sublista
- typedef struct produs
- {
- char *tip_produs;
- float pret;
- int cantitate;
- struct produs *next;
- }produs;
- //structura pt lista principala
- typedef struct magazin
- {
- char *nume;
- struct magazin *next;
- struct produs *prim_sl;
- }magazin;
- //lista principala
- magazin *principal = NULL;
- magazin *add_lista(magazin *mag, magazin *el) //mag e lista noastra de pana acum si el este elementul ce dorim sa il adaugam in lista
- {
- magazin *m1, *m2; //declaram 2 variabile pointer de tip magazin pt a tine lista cu una mergand prin lista si in cealalta retinand nodul care respecta conditia
- //mergem cu un for prin lista atata timp cand variabila noastra cu care trecem prin noduri nu a ajuns la coada liste si comparam numele elementului prin care trecem cu numele elementului pe care trebuie sa il introducem
- //daca conditia nu este indeplinita inseamna ca am gasit un nod in care numele magazinului este mai mare din punct de vedere alfabetic decat numele magazinului din nodul pe care dorim noi sa il introducem
- //astfel salvam nodul si se opreste instructiunea repetitiva for
- for (m1 = m2 = mag; m1 != NULL && strcmp(m1->nume,el->nume) < 0; m2 = m1, m1 = m1->next);
- //daca m1 este egal cu m2 atunci rezulta ca contorul care trecea prin noduri a ajuns la coada listei si nu a gasit nici un element care sa NU respecte conditia
- //Metoda pe care o folosim noi pentru cautare aici este cunoscuta ca metoda reducerii la absurd , cautand elementele care NU respecta conditia initiala , oprindu-se fix la elementul ce respecta conditia noastra
- if (m1 == m2)
- {
- //adaugam elementul la coada listei pentru ca conditia nu este indeplinita adica el este din punct de vedere alfabetic ultimul
- el->next = mag;
- mag = el;
- }
- else
- {
- //"strecuram" elementul intre nodul gasit de noi si nodul ce urmeaza duoa el pentru a avea numele elementelor ordonate alfabetic
- m2->next = el;
- el->next = m1;
- }
- //returnam noua lista cu elementul adaugat
- return mag;
- }
- //functie de adaugare in sublista
- produs *add_sl(produs *prod, produs *el)
- {
- produs *p1, *p2;
- for (p1 = p2 = prod; p1 != NULL && p1->pret > el->pret; p2 = p1, p1 = p1->next);
- if (p1 == p2)
- {
- el->next = prod;
- prod = el;
- }
- else
- {
- p2->next = el;
- el->next = p1;
- }
- return prod;
- }
- //functie cu care vom cauta daca exista un magazin vom returna nodul la care l-am intalnit
- magazin *cauta_mg(magazin *mag, char *name)
- {
- magazin *m;
- for (m = mag; m != NULL && strcmp(m->nume, name) != 0; m = m->next);
- return m;
- }
- //functie cu care vom verifica daca exista un anumit produs in un anumit magazin
- produs *cauta_prod(magazin *mag, char *name_p)
- {
- produs *p;
- for (p = mag->prim_sl; p != NULL && strcmp(p->tip_produs, name_p) != 0; p = p->next);
- return p;
- }
- //functie pt afisarea produselor unui anumit magazin
- void AfisareProduse(magazin *mag)
- {
- produs *p;
- for (p = mag->prim_sl; p != NULL; p = p->next)
- {
- printf("Tip produs : %s | Pret : %.2f | Cantitate : %d\n", p->tip_produs, p->pret, p->cantitate);
- }
- }
- //functie pentru afisarea tuturor magazinelor
- void Afisare(magazin *mag)
- {
- magazin *m;
- for (m = mag; m != NULL; m = m->next)
- {
- printf("\nNume magazin : %s\n", m->nume);
- AfisareProduse(m);
- printf("\n");
- }
- }
- //adauga un magazin in baza de date
- void adauga_magazin(char *nume)
- {
- magazin *aux_l;
- aux_l = (magazin*)malloc(sizeof(magazin));
- aux_l->nume = (char*)malloc(sizeof(nume) + 1);
- if (aux_l->nume == NULL)
- {
- printf("Memorie insufienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- if (aux_l == NULL)
- {
- printf("Memorie insufienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- strcpy(aux_l->nume, nume);
- aux_l->prim_sl = NULL;
- principal = add_lista(principal,aux_l);
- }
- //adauga un produs unui magazin
- void adauga_produs(char *nmag,char *tipProd,int cantitate,float cost)
- {
- produs *aux_sl;
- magazin *n;
- n = cauta_mg(principal,nmag);
- if (n == NULL)
- {
- printf("%s - pla \n", nmag);
- }
- aux_sl = (produs*)malloc(sizeof(produs));
- if (aux_sl == NULL)
- {
- printf("Memorie insufienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- aux_sl->tip_produs = (char*)malloc(sizeof(tipProd) + 1);
- if (aux_sl->tip_produs == NULL)
- {
- printf("Memorie insufienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- strcpy(aux_sl->tip_produs,tipProd);
- aux_sl->cantitate = cantitate;
- aux_sl->pret = cost;
- n->prim_sl = add_sl(n->prim_sl,aux_sl);
- }
- //functie pt a sterge un magazin
- magazin *stergere_mag(magazin *mag, char *nume)
- {
- magazin *m1, *m2;
- for (m1 = m2 = mag; m1 != NULL && strcmp(m1->nume, nume) != 0; m2 = m1, m1 = m1->next);
- if (m1 != NULL && strcmp(m1->nume, nume) == 0)
- {
- if (m1 != m2) //nu e la coada listei
- {
- m2->next = m1->next;
- }
- else
- {
- mag = mag->next; //e la coada listei
- }
- //eliberam memora
- free(m1->nume);
- free(m1);
- printf("Magazinul '%s' a fost sters din lista.\n", nume);
- return mag;
- }
- else
- {
- //daca nu exista afisam un mesaj
- printf("Magazinul '%s' nu exista in lista.\n", nume);
- return mag;
- }
- }
- //functie pt a sterge un produs
- magazin *sterge_produs(char *nume_mag, char *nume)
- {
- magazin *n;
- n = cauta_mg(principal,nume_mag);
- produs *m1, *m2;
- int found = 0;
- for (m1 = m2 = n->prim_sl; m1 != NULL && strcmp(m1->tip_produs, nume) != 0;m2 = m1, m1 = m1->next);
- if (m1 != NULL && strcmp(m1->tip_produs, nume) == 0)
- {
- if (m1 != NULL && m1 == m2)
- {
- found = 1;
- m2->next = m1;
- m1 = m1->next;
- }
- if (found == 0 && m1 != m2) //nu e la coada listei
- {
- m2->next = m1->next;
- }
- else if(found == 0)
- {
- n = n->next; //e la coada listei
- }
- //eliberam memoria
- free(m1);
- printf("Produsul '%s' a fost sters din lista.\n", nume);
- return n;
- }
- else
- {
- //daca nu exista afisam un mesaj
- printf("Produsul '%s' nu exista in lista.\n", nume);
- return n;
- }
- }
- //functie care cauta un produs in un anumit magazin si modifica datele
- magazin *actiuni_produs(magazin *mag, produs *prod,char *nume_mag)
- {
- magazin *m;
- produs *p1;
- int found = 0;
- //cautam magazinul dupa nume in lista
- for (m = mag; m != NULL && strcmp(m->nume, nume_mag) != 0; m = m->next);
- {
- //merg prin sublista lui de produse pana dau de produsul cautat
- for (p1 = m->prim_sl; p1 != NULL;p1 = p1->next)
- {
- //am gasit produsul , il modificam
- if (strcmp(p1->tip_produs, prod->tip_produs) == 0)
- {
- found = 1;
- if (prod->cantitate == 0) //cantitate 0 -> stergem
- {
- //stergem produsul
- sterge_produs(nume_mag,prod->tip_produs);
- return mag; //returnam lista
- }
- else
- {
- //modificam produsul curent
- p1->cantitate = prod->cantitate;
- p1->pret = prod->pret;
- printf("Produsul %s a fost modificat.\n", prod->tip_produs);
- return mag; //returnam lista
- }
- }
- }
- //nu am gasit produsul atunci il adaugam
- if (found == 0)
- {
- //adauga produs
- adauga_produs(nume_mag, prod->tip_produs, prod->cantitate, prod->pret);
- printf("Produsul %s a fost adaugat.\n", prod->tip_produs);
- return mag; //returnam lista
- }
- }
- //daca nu a facut nici o modificare
- return mag;
- }
- //functie pentru citirea informatiilor din fisier si adaugarea acestora in lista
- void CitireFisier(char *txtName)
- {
- FILE *f;
- magazin *mg, *n;
- produs *prod;
- //dechid fisierul
- fopen_s(&f, txtName, "rt");
- //verific daca am reusit sa deschid fisierul
- if (f == NULL)
- {
- printf("Fisierul nu a putut fi deschis.\n");
- _getch();
- exit(1);
- }
- else
- {
- //citesc din el pana la EOF
- while (!feof(f))
- {
- char mag_name[20],tip_prod[20];
- float pret;
- int cantitate;
- //citesc datele din fisier
- fscanf_s(f, "%19s",mag_name, _countof(mag_name));
- fscanf_s(f, "%19s",tip_prod, _countof(tip_prod));
- fscanf_s(f, "%f",&pret);
- fscanf_s(f, "%d",&cantitate);
- //creez produsul
- prod = (produs*)malloc(sizeof(produs)); //alocam dinamic dimensiunea elementului
- if (prod == NULL)
- {
- printf("Memorie insuficienta pentru aloare.\n");
- _getch();
- exit(1);
- }
- prod->tip_produs = (char*)malloc(sizeof(tip_prod) + 1);
- if (prod->tip_produs == NULL)
- {
- printf("Memorie insuficienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- strcpy(prod->tip_produs,tip_prod);
- prod->cantitate = cantitate;
- prod->pret = pret;
- //verific daca magazinul exista deja in lista
- if ((n = cauta_mg(principal, mag_name)) == NULL)
- {
- mg = (magazin*)malloc(sizeof(magazin)); //alocam dinamic dimensiunea elementului
- //verific daca s-a alocat memoria
- if (mg == NULL)
- {
- printf("Memorie insuficienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- mg->nume = (char*)malloc(sizeof(mag_name)+1);
- if (mg->nume == NULL)
- {
- printf("Memorie insuficienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- strcpy(mg->nume,mag_name);
- //initializez sublista lui cu NULL si adaug produsul
- mg->prim_sl = NULL;
- mg->prim_sl = add_sl(mg->prim_sl,prod);
- //adaug elementul in lista
- principal = add_lista(principal, mg);
- n = mg;
- }
- else
- {
- //magazinul exista deja in lista deci ii adaug in sublista elementele
- if (cauta_prod(n, prod->tip_produs) != NULL) // produsul exista deja in lista
- {
- return;
- }
- n = cauta_mg(principal,mag_name);
- n->prim_sl = add_sl(n->prim_sl, prod);
- }
- }
- //inchid fisierul
- fclose(f);
- }
- }
- //functie pt a calcula valoarea stocurilor unui magazin
- float calculeazaValStoc(magazin *m)
- {
- produs *p;
- float total = 0.0,product;
- //adunam pretul si cantitatea fiecarui produs pt a gasi valoarea stocurilor
- for (p = m->prim_sl; p != NULL; p = p->next)
- {
- product = p->pret * p->cantitate;
- total += product;
- }
- return total;
- }
- //functia care v-a afisa meniul cu optiunile
- void Meniu()
- {
- printf("\n1.Incarca din fisier datele\n");
- printf("2.Afisaza lista de magazine in ordine alfabetica si sublistele de produse in ordine descresc. dp pret\n");
- printf("3.Sa se calculeze valoarea stocului dintr-un magazin citit de la tastatura\n");
- printf("4.Sa se afiseze produsele dintr-un magazin in ordine descrescatoare a pretului\n");
- printf("5.Sa se adauge un magazin in lista de magazine\n");
- printf("6.Sa se stearga un magazin din lista de magazine\n");
- printf("7.Sa se modifice datele de la un produs din un magazin,daca cantitatea e 0 atunci se sterge,daca nu exista se adauga\n");
- printf("0.Iesire\n");
- printf("Optiunea ta : ");
- }
- //functia main
- int main()
- {
- int optiune, e_initializata = 0, cant;
- float pret;
- char magaz_cautat[20],nume_prod[20];
- magazin *m;
- do
- {
- Meniu();
- scanf("%d", &optiune);
- switch(optiune)
- {
- case 1 :
- if (e_initializata == 1)
- {
- printf("Baza de date a fost deja initializata.\n");
- }
- else
- {
- e_initializata = 1;
- CitireFisier("magazine.txt");
- printf("Datele din fisier au fost incarcate cu succes in lista.\n");
- }
- break;
- case 2 :
- if (e_initializata == 0)
- {
- printf("Baza de date nu a fost inca initializata.\n");
- }
- else
- {
- Afisare(principal);
- }
- break;
- case 3 :
- if (e_initializata == 0)
- {
- printf("Baza de date nu a fost inca initializata.\n");
- }
- else
- {
- printf("Numele magazinului : ");
- scanf("%s", magaz_cautat);
- m = cauta_mg(principal, magaz_cautat);
- if (m == NULL)
- {
- printf("Magazinul nu a fost gasit.\n");
- }
- else
- {
- float val_stoc = calculeazaValStoc(m);
- printf("Valoarea stocului magazinului %s este de %.2f .\n", magaz_cautat, val_stoc);
- }
- }
- break;
- case 4 :
- if (e_initializata == 0)
- {
- printf("Baza de date nu a fost inca initializata.\n");
- }
- else
- {
- printf("Numele magazinului : ");
- scanf("%s", magaz_cautat);
- m = cauta_mg(principal, magaz_cautat);
- if (m == NULL)
- {
- printf("Magazinul nu a fost gasit.\n");
- }
- else
- {
- printf("Produsele din magazinul %s : \n",magaz_cautat);
- AfisareProduse(m);
- }
- }
- break;
- case 5 :
- if (e_initializata == 0)
- {
- printf("Baza de date nu a fost inca initializata.\n");
- }
- else
- {
- printf("Numele magazinului : ");
- scanf("%s",magaz_cautat);
- m = cauta_mg(principal,magaz_cautat);
- if (m != NULL)
- {
- printf("Magazinul exista deja in lista.\n");
- }
- else
- {
- int max_p;
- adauga_magazin(magaz_cautat);
- printf("Numarul de produse pe care vrei sa il adaugi : ");
- scanf("%d",&max_p);
- if (max_p <= 0)
- {
- printf("Trebuie introdus un numar pozitiv de produse pt adaugare.\n");
- _getch();
- break;
- }
- while (max_p > 0)
- {
- //citesc datele despre produs
- fflush(stdin);
- printf("\nNume produs : ");
- scanf("%s", nume_prod);
- printf("Cantitate : ");
- scanf("%d", &cant);
- fflush(stdin);
- printf("Pret : ");
- scanf("%f", &pret);
- adauga_produs(magaz_cautat, nume_prod, cant, pret);
- max_p--;
- }
- printf("Noul magazin a fost adaugat cu succes in baza de date.\n");
- }
- }
- break;
- case 6 :
- if (e_initializata == 0)
- {
- printf("Baza de date nu a fost inca initializata.\n");
- }
- else
- {
- printf("Numele magazinului : ");
- scanf("%s", magaz_cautat);
- m = cauta_mg(principal,magaz_cautat);
- if (m == NULL)
- {
- printf("Magazinul nu a fost gasit.\n");
- }
- else
- {
- principal = stergere_mag(principal, magaz_cautat);
- }
- }
- break;
- case 7 :
- if (e_initializata == 0)
- {
- printf("Baza de date nu a fost inca initializata.\n");
- }
- else
- {
- printf("Numele magazinului : ");
- scanf("%s", magaz_cautat);
- m = cauta_mg(principal, magaz_cautat);
- if (m == NULL)
- {
- printf("Magazinul nu a fost gasit.\n");
- }
- else
- {
- produs *prod;
- //citesc datele despre produs
- fflush(stdin);
- printf("Nume produs : ");
- scanf("%s",nume_prod);
- printf("Cantitate : ");
- scanf("%d",&cant);
- fflush(stdin);
- printf("Pret : ");
- scanf("%f",&pret);
- prod = (produs*)malloc(sizeof(produs));
- if (prod == NULL)
- {
- printf("Memorie insufienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- prod->tip_produs = (char*)malloc(sizeof(nume_prod) + 1);
- if (prod->tip_produs == NULL)
- {
- printf("Memorie insufienta pentru alocare.\n");
- _getch();
- exit(1);
- }
- strcpy(prod->tip_produs,nume_prod);
- prod->cantitate = cant;
- prod->pret = pret;
- //modific lista
- principal = actiuni_produs(principal, prod, magaz_cautat);
- }
- }
- break;
- case 0 :
- optiune = 0;
- exit(1);
- break;
- default :
- optiune = 0;
- exit(1);
- break;
- }
- } while(optiune != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement