Advertisement
Guest User

Really_final_now

a guest
May 24th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 15.08 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5.  
  6. //structura pentru sublista
  7. typedef struct produs
  8. {
  9.     char *tip_produs;
  10.     float pret;
  11.     int cantitate;
  12.     struct produs *next;
  13. }produs;
  14.  
  15. //structura pt lista principala
  16. typedef struct magazin
  17. {
  18.     char *nume;
  19.     struct magazin *next;
  20.     struct produs *prim_sl;
  21. }magazin;
  22.  
  23. //lista principala
  24. magazin *principal = NULL;
  25.  
  26. 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
  27. {
  28.     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
  29.     //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
  30.     //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
  31.     //astfel salvam nodul si se opreste instructiunea repetitiva for
  32.     for (m1 = m2 = mag; m1 != NULL && strcmp(m1->nume,el->nume) < 0; m2 = m1, m1 = m1->next);
  33.     //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
  34.     //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
  35.     if (m1 == m2)
  36.     {
  37.         //adaugam elementul la coada listei pentru ca conditia nu este indeplinita adica el este din punct de vedere alfabetic ultimul
  38.         el->next = mag;
  39.         mag = el;
  40.     }
  41.     else
  42.     {
  43.         //"strecuram" elementul intre nodul gasit de noi si nodul ce urmeaza duoa el pentru a avea numele elementelor ordonate alfabetic
  44.         m2->next = el;
  45.         el->next = m1;
  46.     }
  47.     //returnam noua lista cu elementul adaugat
  48.     return mag;
  49. }
  50.  
  51. //functie de adaugare in sublista
  52. produs *add_sl(produs *prod, produs *el)
  53. {
  54.     produs *p1, *p2;
  55.     for (p1 = p2 = prod; p1 != NULL && p1->pret > el->pret; p2 = p1, p1 = p1->next);
  56.     if (p1 == p2)
  57.     {
  58.         el->next = prod;
  59.         prod = el;
  60.     }
  61.     else
  62.     {
  63.         p2->next = el;
  64.         el->next = p1;
  65.     }
  66.     return prod;
  67. }
  68.  
  69. //functie cu care vom cauta daca exista un magazin vom returna nodul la care l-am intalnit
  70. magazin *cauta_mg(magazin *mag, char *name)
  71. {
  72.     magazin *m;
  73.     for (m = mag; m != NULL && strcmp(m->nume, name) != 0; m = m->next);
  74.     return m;
  75. }
  76.  
  77. //functie cu care vom verifica daca exista un anumit produs in un anumit magazin
  78. produs *cauta_prod(magazin *mag, char *name_p)
  79. {
  80.     produs *p;
  81.     for (p = mag->prim_sl; p != NULL && strcmp(p->tip_produs, name_p) != 0; p = p->next);
  82.     return p;
  83. }
  84.  
  85. //functie pt afisarea produselor unui anumit magazin
  86. void AfisareProduse(magazin *mag)
  87. {
  88.     produs *p;
  89.     for (p = mag->prim_sl; p != NULL; p = p->next)
  90.     {
  91.         printf("Tip produs : %s | Pret : %.2f | Cantitate : %d\n", p->tip_produs, p->pret, p->cantitate);
  92.     }
  93. }
  94.  
  95. //functie pentru afisarea tuturor magazinelor
  96. void Afisare(magazin *mag)
  97. {
  98.     magazin *m;
  99.     for (m = mag; m != NULL; m = m->next)
  100.     {
  101.         printf("\nNume magazin : %s\n", m->nume);
  102.         AfisareProduse(m);
  103.         printf("\n");
  104.     }
  105. }
  106.  
  107. //adauga un magazin in baza de date
  108. void adauga_magazin(char *nume)        
  109. {
  110.     magazin *aux_l;
  111.     aux_l = (magazin*)malloc(sizeof(magazin));
  112.     aux_l->nume = (char*)malloc(sizeof(nume) + 1);
  113.     if (aux_l->nume == NULL)
  114.     {
  115.         printf("Memorie insufienta pentru alocare.\n");
  116.         _getch();
  117.         exit(1);
  118.     }
  119.     if (aux_l == NULL)
  120.     {
  121.         printf("Memorie insufienta pentru alocare.\n");
  122.         _getch();
  123.         exit(1);
  124.     }
  125.     strcpy(aux_l->nume, nume);
  126.     aux_l->prim_sl = NULL;
  127.     principal = add_lista(principal,aux_l);
  128. }
  129.  
  130. //adauga un produs unui magazin
  131. void adauga_produs(char *nmag,char *tipProd,int cantitate,float cost)      
  132. {
  133.     produs *aux_sl;
  134.     magazin *n;
  135.  
  136.     n = cauta_mg(principal,nmag);
  137.     if (n == NULL)
  138.     {
  139.         printf("%s - pla \n", nmag);
  140.     }
  141.     aux_sl = (produs*)malloc(sizeof(produs));
  142.     if (aux_sl == NULL)
  143.     {
  144.         printf("Memorie insufienta pentru alocare.\n");
  145.         _getch();
  146.         exit(1);
  147.     }
  148.     aux_sl->tip_produs = (char*)malloc(sizeof(tipProd) + 1);
  149.     if (aux_sl->tip_produs == NULL)
  150.     {
  151.         printf("Memorie insufienta pentru alocare.\n");
  152.         _getch();
  153.         exit(1);
  154.     }
  155.     strcpy(aux_sl->tip_produs,tipProd);
  156.     aux_sl->cantitate = cantitate;
  157.     aux_sl->pret = cost;
  158.     n->prim_sl = add_sl(n->prim_sl,aux_sl);
  159. }
  160.  
  161. //functie pt a sterge un magazin
  162. magazin *stergere_mag(magazin *mag, char *nume)
  163. {
  164.     magazin *m1, *m2;
  165.     for (m1 = m2 = mag; m1 != NULL && strcmp(m1->nume, nume) != 0; m2 = m1, m1 = m1->next);
  166.     if (m1 != NULL && strcmp(m1->nume, nume) == 0)
  167.     {
  168.         if (m1 != m2) //nu e la coada listei
  169.         {
  170.             m2->next = m1->next;
  171.         }
  172.         else
  173.         {
  174.             mag = mag->next; //e la coada listei
  175.         }
  176.         //eliberam memora
  177.         free(m1->nume);
  178.         free(m1);
  179.         printf("Magazinul '%s' a fost sters din lista.\n", nume);
  180.         return mag;
  181.     }
  182.     else
  183.     {
  184.         //daca nu exista afisam un mesaj
  185.         printf("Magazinul '%s' nu exista in lista.\n", nume);
  186.         return mag;
  187.     }
  188. }
  189.  
  190. //functie pt a sterge un produs
  191. magazin *sterge_produs(char *nume_mag, char *nume)
  192. {
  193.     magazin *n;
  194.     n = cauta_mg(principal,nume_mag);
  195.     produs *m1, *m2;
  196.     int found = 0;
  197.     for (m1 = m2 = n->prim_sl; m1 != NULL && strcmp(m1->tip_produs, nume) != 0;m2 = m1, m1 = m1->next);
  198.     if (m1 != NULL && strcmp(m1->tip_produs, nume) == 0)
  199.     {
  200.         if (m1 != NULL && m1 == m2)
  201.         {
  202.  
  203.             found = 1;
  204.             m2->next = m1;
  205.             m1 = m1->next;
  206.         }
  207.         if (found == 0 && m1 != m2) //nu e la coada listei
  208.         {
  209.             m2->next = m1->next;
  210.         }
  211.         else if(found == 0)
  212.         {
  213.             n = n->next; //e la coada listei
  214.         }
  215.         //eliberam memoria
  216.         free(m1);
  217.         printf("Produsul '%s' a fost sters din lista.\n", nume);
  218.         return n;
  219.     }
  220.     else
  221.     {
  222.         //daca nu exista afisam un mesaj
  223.         printf("Produsul '%s' nu exista in lista.\n", nume);
  224.         return n;
  225.     }
  226. }
  227. //functie care cauta un produs in un anumit magazin si modifica datele
  228. magazin *actiuni_produs(magazin *mag, produs *prod,char *nume_mag)
  229. {
  230.     magazin *m;
  231.     produs *p1;
  232.     int found = 0;
  233.     //cautam magazinul dupa nume in lista
  234.     for (m = mag; m != NULL && strcmp(m->nume, nume_mag) != 0; m = m->next);
  235.     {
  236.         //merg prin sublista lui de produse pana dau de produsul cautat
  237.         for (p1 = m->prim_sl; p1 != NULL;p1 = p1->next)
  238.         {
  239.             //am gasit produsul , il modificam
  240.             if (strcmp(p1->tip_produs, prod->tip_produs) == 0)
  241.             {
  242.                 found = 1;
  243.                 if (prod->cantitate == 0) //cantitate 0 -> stergem
  244.                 {
  245.                     //stergem produsul
  246.                     sterge_produs(nume_mag,prod->tip_produs);
  247.                     return mag; //returnam lista
  248.                 }
  249.                 else
  250.                 {
  251.                     //modificam produsul curent
  252.                     p1->cantitate = prod->cantitate;
  253.                     p1->pret = prod->pret;
  254.                     printf("Produsul %s a fost modificat.\n", prod->tip_produs);
  255.                     return mag; //returnam lista
  256.                 }
  257.             }
  258.         }
  259.         //nu am gasit produsul atunci il adaugam
  260.         if (found == 0)
  261.         {
  262.             //adauga produs
  263.             adauga_produs(nume_mag, prod->tip_produs, prod->cantitate, prod->pret);
  264.             printf("Produsul %s a fost adaugat.\n", prod->tip_produs);
  265.             return mag; //returnam lista           
  266.         }
  267.     }
  268.     //daca nu a facut nici o modificare
  269.     return mag;
  270. }
  271.  
  272. //functie pentru citirea informatiilor din fisier si adaugarea acestora in lista
  273. void CitireFisier(char *txtName)
  274. {
  275.     FILE *f;
  276.     magazin *mg, *n;
  277.     produs *prod;
  278.     //dechid fisierul
  279.     fopen_s(&f, txtName, "rt");
  280.     //verific daca am reusit sa deschid fisierul
  281.     if (f == NULL)
  282.     {
  283.         printf("Fisierul nu a putut fi deschis.\n");
  284.         _getch();
  285.         exit(1);
  286.     }
  287.     else
  288.     {
  289.         //citesc din el pana la EOF
  290.         while (!feof(f))
  291.         {
  292.             char mag_name[20],tip_prod[20];
  293.             float pret;
  294.             int cantitate;
  295.             //citesc datele din fisier
  296.             fscanf_s(f, "%19s",mag_name, _countof(mag_name));
  297.             fscanf_s(f, "%19s",tip_prod, _countof(tip_prod));
  298.             fscanf_s(f, "%f",&pret);
  299.             fscanf_s(f, "%d",&cantitate);
  300.             //creez produsul
  301.             prod = (produs*)malloc(sizeof(produs)); //alocam dinamic dimensiunea elementului
  302.             if (prod == NULL)
  303.             {
  304.                 printf("Memorie insuficienta pentru aloare.\n");
  305.                 _getch();
  306.                 exit(1);
  307.             }
  308.             prod->tip_produs = (char*)malloc(sizeof(tip_prod) + 1);
  309.             if (prod->tip_produs == NULL)
  310.             {
  311.                 printf("Memorie insuficienta pentru alocare.\n");
  312.                 _getch();
  313.                 exit(1);
  314.             }
  315.             strcpy(prod->tip_produs,tip_prod);
  316.             prod->cantitate = cantitate;
  317.             prod->pret = pret;
  318.             //verific daca magazinul exista deja in lista
  319.             if ((n = cauta_mg(principal, mag_name)) == NULL)
  320.             {
  321.                 mg = (magazin*)malloc(sizeof(magazin)); //alocam dinamic dimensiunea elementului
  322.                 //verific daca s-a alocat memoria
  323.                 if (mg == NULL)
  324.                 {
  325.                     printf("Memorie insuficienta pentru alocare.\n");
  326.                     _getch();
  327.                     exit(1);
  328.                 }
  329.                 mg->nume = (char*)malloc(sizeof(mag_name)+1);
  330.                 if (mg->nume == NULL)
  331.                 {
  332.                     printf("Memorie insuficienta pentru alocare.\n");
  333.                     _getch();
  334.                     exit(1);
  335.                 }
  336.                 strcpy(mg->nume,mag_name);
  337.                 //initializez sublista lui cu NULL si adaug produsul
  338.                 mg->prim_sl = NULL;
  339.                 mg->prim_sl = add_sl(mg->prim_sl,prod);
  340.                 //adaug elementul in lista
  341.                 principal = add_lista(principal, mg);
  342.                 n = mg;
  343.             }
  344.             else
  345.             {
  346.                 //magazinul exista deja in lista deci ii adaug in sublista elementele
  347.                 if (cauta_prod(n, prod->tip_produs) != NULL) // produsul exista deja in lista
  348.                 {
  349.                     return;
  350.                 }
  351.                 n = cauta_mg(principal,mag_name);
  352.                 n->prim_sl = add_sl(n->prim_sl, prod);
  353.             }
  354.         }
  355.         //inchid fisierul
  356.         fclose(f);
  357.     }
  358. }
  359.  
  360. //functie pt a calcula valoarea stocurilor unui magazin
  361. float calculeazaValStoc(magazin *m)
  362. {
  363.     produs *p;
  364.     float total = 0.0,product;
  365.     //adunam pretul si cantitatea fiecarui produs pt a gasi valoarea stocurilor
  366.     for (p = m->prim_sl; p != NULL; p = p->next)
  367.     {
  368.         product = p->pret * p->cantitate;
  369.         total += product;
  370.     }
  371.     return total;
  372. }
  373.  
  374. //functia care v-a afisa meniul cu optiunile
  375. void Meniu()
  376. {
  377.     printf("\n1.Incarca din fisier datele\n");
  378.     printf("2.Afisaza lista de magazine in ordine alfabetica si sublistele de produse in ordine descresc. dp pret\n");
  379.     printf("3.Sa se calculeze valoarea stocului dintr-un magazin citit de la tastatura\n");
  380.     printf("4.Sa se afiseze produsele dintr-un magazin in ordine descrescatoare a pretului\n");
  381.     printf("5.Sa se adauge un magazin in lista de magazine\n");
  382.     printf("6.Sa se stearga un magazin din lista de magazine\n");
  383.     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");
  384.     printf("0.Iesire\n");
  385.     printf("Optiunea ta : ");
  386. }
  387.  
  388. //functia main
  389. int main()
  390. {
  391.     int optiune, e_initializata = 0, cant;
  392.     float pret;
  393.     char magaz_cautat[20],nume_prod[20];
  394.     magazin *m;
  395.     do
  396.     {
  397.         Meniu();
  398.         scanf("%d", &optiune);
  399.         switch(optiune)
  400.         {
  401.             case 1 :
  402.                 if (e_initializata == 1)
  403.                 {
  404.                     printf("Baza de date a fost deja initializata.\n");
  405.                 }
  406.                 else
  407.                 {
  408.                     e_initializata = 1;
  409.                     CitireFisier("magazine.txt");
  410.                     printf("Datele din fisier au fost incarcate cu succes in lista.\n");
  411.                 }
  412.                 break;
  413.             case 2 :
  414.                 if (e_initializata == 0)
  415.                 {
  416.                     printf("Baza de date nu a fost inca initializata.\n");
  417.                 }
  418.                 else
  419.                 {
  420.                     Afisare(principal);
  421.                 }
  422.                 break;
  423.             case 3 :
  424.                 if (e_initializata == 0)
  425.                 {
  426.                     printf("Baza de date nu a fost inca initializata.\n");
  427.                 }
  428.                 else
  429.                 {
  430.                     printf("Numele magazinului : ");
  431.                     scanf("%s", magaz_cautat);
  432.                     m = cauta_mg(principal, magaz_cautat);
  433.                     if (m == NULL)
  434.                     {
  435.                         printf("Magazinul nu a fost gasit.\n");
  436.                     }
  437.                     else
  438.                     {
  439.                         float val_stoc = calculeazaValStoc(m);
  440.                         printf("Valoarea stocului magazinului %s este de %.2f .\n", magaz_cautat, val_stoc);
  441.                     }
  442.                 }
  443.                 break;
  444.             case 4 :
  445.                 if (e_initializata == 0)
  446.                 {
  447.                     printf("Baza de date nu a fost inca initializata.\n");
  448.                 }
  449.                 else
  450.                 {
  451.                     printf("Numele magazinului : ");
  452.                     scanf("%s", magaz_cautat);
  453.                     m = cauta_mg(principal, magaz_cautat);
  454.                     if (m == NULL)
  455.                     {
  456.                         printf("Magazinul nu a fost gasit.\n");
  457.                     }
  458.                     else
  459.                     {
  460.                         printf("Produsele din magazinul %s : \n",magaz_cautat);
  461.                         AfisareProduse(m);
  462.                     }
  463.                 }
  464.                 break;
  465.             case 5 :
  466.                 if (e_initializata == 0)
  467.                 {
  468.                     printf("Baza de date nu a fost inca initializata.\n");
  469.                 }
  470.                 else
  471.                 {
  472.                     printf("Numele magazinului : ");
  473.                     scanf("%s",magaz_cautat);
  474.                     m = cauta_mg(principal,magaz_cautat);
  475.                     if (m != NULL)
  476.                     {
  477.                         printf("Magazinul exista deja in lista.\n");
  478.                     }
  479.                     else
  480.                     {
  481.                         int max_p;
  482.                         adauga_magazin(magaz_cautat);
  483.                         printf("Numarul de produse pe care vrei sa il adaugi : ");
  484.                         scanf("%d",&max_p);
  485.                         if (max_p <= 0)
  486.                         {
  487.                             printf("Trebuie introdus un numar pozitiv de produse pt adaugare.\n");
  488.                             _getch();
  489.                             break;
  490.                         }
  491.                         while (max_p > 0)
  492.                         {
  493.                             //citesc datele despre produs
  494.                             fflush(stdin);
  495.                             printf("\nNume produs : ");
  496.                             scanf("%s", nume_prod);
  497.                             printf("Cantitate : ");
  498.                             scanf("%d", &cant);
  499.                             fflush(stdin);
  500.                             printf("Pret : ");
  501.                             scanf("%f", &pret);
  502.                             adauga_produs(magaz_cautat, nume_prod, cant, pret);
  503.                             max_p--;
  504.                         }
  505.                         printf("Noul magazin a fost adaugat cu succes in baza de date.\n");
  506.                     }
  507.                 }
  508.                 break;
  509.             case 6 :
  510.                 if (e_initializata == 0)
  511.                 {
  512.                     printf("Baza de date nu a fost inca initializata.\n");
  513.                 }
  514.                 else
  515.                 {
  516.                     printf("Numele magazinului : ");
  517.                     scanf("%s", magaz_cautat);
  518.                     m = cauta_mg(principal,magaz_cautat);
  519.                     if (m == NULL)
  520.                     {
  521.                         printf("Magazinul nu a fost gasit.\n");
  522.                     }
  523.                     else
  524.                     {
  525.                         principal = stergere_mag(principal, magaz_cautat);
  526.                     }
  527.                 }
  528.                 break;
  529.             case 7 :
  530.                 if (e_initializata == 0)
  531.                 {
  532.                     printf("Baza de date nu a fost inca initializata.\n");
  533.                 }
  534.                 else
  535.                 {
  536.                     printf("Numele magazinului : ");
  537.                     scanf("%s", magaz_cautat);
  538.                     m = cauta_mg(principal, magaz_cautat);
  539.                     if (m == NULL)
  540.                     {
  541.                         printf("Magazinul nu a fost gasit.\n");
  542.                     }
  543.                     else
  544.                     {
  545.                         produs *prod;
  546.                         //citesc datele despre produs
  547.                         fflush(stdin);
  548.                         printf("Nume produs : ");
  549.                         scanf("%s",nume_prod);
  550.                         printf("Cantitate : ");
  551.                         scanf("%d",&cant);
  552.                         fflush(stdin);
  553.                         printf("Pret : ");
  554.                         scanf("%f",&pret);
  555.                         prod = (produs*)malloc(sizeof(produs));
  556.                         if (prod == NULL)
  557.                         {
  558.                             printf("Memorie insufienta pentru alocare.\n");
  559.                             _getch();
  560.                             exit(1);
  561.                         }
  562.                         prod->tip_produs = (char*)malloc(sizeof(nume_prod) + 1);
  563.                         if (prod->tip_produs == NULL)
  564.                         {
  565.                             printf("Memorie insufienta pentru alocare.\n");
  566.                             _getch();
  567.                             exit(1);
  568.                         }
  569.                         strcpy(prod->tip_produs,nume_prod);
  570.                         prod->cantitate = cant;
  571.                         prod->pret = pret;
  572.                         //modific lista
  573.                         principal = actiuni_produs(principal, prod, magaz_cautat);
  574.                     }
  575.                 }
  576.                 break;
  577.             case 0 :
  578.                 optiune = 0;
  579.                 exit(1);
  580.                 break;
  581.             default :
  582.                 optiune = 0;
  583.                 exit(1);
  584.                 break;
  585.         }
  586.     } while(optiune != 0);
  587.     return 0;
  588. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement