Advertisement
wiuu23

PR2-Ispit-globalneFunkcije,market, proizvod, fakutra, stavke

Sep 18th, 2017
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.37 KB | None | 0 0
  1. //1. ZADATAK
  2.  
  3. //Izvršiti definiciju funkcija na način koji odgovara opisu(komentarima) datom neposredno uz pozive ili nazive funkcija.
  4. //Možete dati komentar na bilo koju liniju code - a koju smatrate da bi trebalo unaprijediti ili da će eventualno uzrokovati grešku prilikom kompajliranja.
  5. //Također, možete dodati dodatne funkcije koje će vam olakšati implementaciju programa.
  6.  
  7. #include <iostream>
  8. #include <fstream>
  9. using namespace std;
  10.  
  11. /*
  12. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  13. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  14. 3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB160061.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  15. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  16. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI ĆETE KOPIRATI VAŠA RJEŠENJA)
  17. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  18. */
  19. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  20. #pragma warning(disable:4996)
  21.  
  22. /*
  23. u nastavku je prikazan primjer fakture(računa) sa njenim stavkama, pri cemu je zanemaren porez
  24. -------------------------------------------
  25. Datum: 07.09.2017
  26. -------------------------------------------
  27. FAKTURA/RAČUN
  28. -------------------------------------------
  29. RB   Naziv      Kol. Cij.     Iznos
  30. 1.Cokolada      10   1,5     15 BAM
  31. 2.Coca-Cola     2    1,2     2,4BAM
  32. 3.Cigarete      1    4,5     4,5BAM (Storno)
  33. -------------------------------------------
  34. UKUPNO:                      17,4BAM
  35. -------------------------------------------
  36. */
  37. char * crt = "\n-------------------------------------------\n";
  38. struct Datum
  39. {
  40.     int _dan;
  41.     int _mjesec;
  42.     int _godina;
  43.     void Unos(int d, int m, int g)
  44.     {
  45.         _dan = d;
  46.         _mjesec = m;
  47.         _godina = g;
  48.     }
  49.     void Ispis()
  50.     {
  51.         cout << _dan << "." << _mjesec << "." << _godina << " ";
  52.     }
  53.     char * getDatumKaoNizKaraktera()
  54.     {
  55.         char dan[3], mjesec[3], godina[5];
  56.         _itoa_s(_dan, dan, 10);
  57.         _itoa_s(_mjesec, mjesec, 10);
  58.         _itoa_s(_godina, godina, 10);
  59.         int size = strlen(dan) + 1 + strlen(mjesec) + 1 + strlen(godina) + 1 + 1 + 1;
  60.         char * niz = new char[size];
  61.  
  62.         strcpy_s(niz, size, dan);
  63.         strcat_s(niz, size, ".");
  64.         strcat_s(niz, size, mjesec);
  65.         strcat_s(niz, size, ".");
  66.         strcat_s(niz, size, godina);
  67.         return niz;
  68.     }
  69. };
  70. struct Proizvod {
  71.     char _naziv[20];
  72.     float _cijena;
  73.     float _stanjeSkladista;//svaki proizvod ce cuvati informaciju o tome koliko je trenutno stanje tog proizvoda na skladistu
  74.  
  75.     void Unos(char* naziv, float cijena)
  76.     {
  77.         strcpy_s(_naziv, naziv);
  78.         _cijena = cijena;
  79.         _stanjeSkladista = 0;
  80.     }
  81.     void DodajUSkladiste(float kolicina)
  82.     {
  83.         _stanjeSkladista += kolicina;
  84.     }
  85.     void UkloniSaSkladista(float kolicina)
  86.     {
  87.         _stanjeSkladista -= kolicina;
  88.     }
  89.     void Ispis()
  90.     {
  91.         cout << _naziv << ", cijena: " << _cijena << "KM, stanje: " << _stanjeSkladista << " " << endl;
  92.     }
  93. };
  94.  
  95. struct StavkaFakture
  96. {
  97.     float _kolicina;
  98.     Proizvod* _proizvod; //_proizvod će pokazivati na adresu objekata tipa proizvod koja se nalaze u Market-u, pa nije potrebno vršiti nove alokacije
  99.     bool _stornirana;
  100.     void Unos(Proizvod* proizvod, float kolicina)
  101.     {
  102.         _kolicina = kolicina;
  103.         _proizvod = proizvod;
  104.         _stornirana = false;
  105.     }
  106.     float GetIznos()
  107.     {
  108.         return _kolicina * _proizvod->_cijena;
  109.     }
  110.     void Ispis()
  111.     {
  112.         cout << _proizvod->_naziv << "\t" << _kolicina << "\t" << _proizvod->_cijena << "\t" << GetIznos() << "BAM";
  113.         if (_stornirana)
  114.             cout << " Storno";
  115.         cout << endl;
  116.     }
  117.  
  118. };
  119. struct Faktura
  120. {
  121.     Datum _datum;
  122.     StavkaFakture ** _stavke;//svaki put se dodaje po jedna stavka
  123.     int _brojStavki;
  124.     bool dodajStavkufakture(Proizvod * proizvod, float kolicina)
  125.     {
  126.         StavkaFakture ** temp = new StavkaFakture *[_brojStavki + 1];
  127.         for (int i = 0; i < _brojStavki; i++)
  128.         {
  129.             temp[i] = new StavkaFakture;
  130.             temp[i]->Unos(_stavke[i]->_proizvod, _stavke[i]->_kolicina);
  131.         }
  132.         temp[_brojStavki] = new StavkaFakture;
  133.         temp[_brojStavki]->Unos(proizvod, kolicina);
  134.         delete[] _stavke;
  135.         _stavke = temp;
  136.         _brojStavki++;
  137.         return true;
  138.     }
  139.     void Unos(Datum datum)
  140.     {
  141.         _datum = datum;
  142.         _brojStavki = 0;
  143.         _stavke = nullptr;
  144.     }
  145.  
  146.     /*iznos fakture izracunati koristeci lambda funkciju koja se poziva putem objekta
  147.     tipa auto. u iznos fakture ne racunati stornirane stavke*/
  148.     float GetIznosSuma()
  149.     {
  150.         auto lambda = [&]()
  151.         {
  152.             float suma = 0;
  153.             float cijena = 0;
  154.             for (int i = 0; i < _brojStavki; i++)
  155.             {
  156.                 if (_stavke[i]->_stornirana == false)
  157.                 {
  158.                     cijena = _stavke[i]->_kolicina*_stavke[i]->_proizvod->_cijena;
  159.                     suma += cijena;
  160.                 }
  161.             }
  162.             return suma;
  163.         };
  164.         return lambda();
  165.     }
  166. };
  167. const int Max = 100;
  168.  
  169. /*unutar objekta tipa Market ce se cuvati svi dostupni proizvodi i sve fakture koje se dodaju putem globalnih funkcija */
  170. struct Market
  171. {
  172.     //umjesto brojaca koristite default.ne vrijednosti
  173.     Proizvod* Proizvodi[Max] = { NULL };
  174.     Faktura* Fakture[Max] = { NULL };
  175.  
  176.     void Dealociraj()
  177.     {
  178.         for (size_t i = 0; i < Max; i++)
  179.         {
  180.             delete Proizvodi[i]; Proizvodi[i] = NULL;
  181.         }
  182.         for (size_t i = 0; i < Max; i++)
  183.         {
  184.             delete Fakture[i]; Fakture[i] = NULL;
  185.         }
  186.     }
  187. };
  188. /*dodaje podatke o novom proizvodu u market */
  189. //market, naziv, cijena, i kolicina
  190. //ne dodaje novi proizvod vec postojecem samo povecava kolicinu -> isti naziv proizvoda
  191. void dodaj_proizvod(Market & market, char * naziv, double cijena, int kolicina)
  192. {
  193.     for (int i = 0; i < Max; i++)
  194.     {
  195.         if (market.Proizvodi[i] != nullptr)//niz je vec popunjen, provjeri postoji li isti s istim nazivom, ako ima uvecaj mu kolicinu
  196.         {
  197.             if (strcmp(market.Proizvodi[i]->_naziv, naziv) == 0)
  198.             {
  199.                 market.Proizvodi[i]->_stanjeSkladista += kolicina;
  200.                 cout << "Artikal postoji. Kolicina uvecana! " << endl;
  201.                 return;
  202.             }
  203.  
  204.         }
  205.     }
  206.     for (int i = 0; i < Max; i++)
  207.     {
  208.         if (market.Proizvodi[i] == nullptr)//nema artikla, niz je prazan, dodaj novi proizvod
  209.         {
  210.             market.Proizvodi[i] = new Proizvod;
  211.             market.Proizvodi[i]->Unos(naziv, cijena);
  212.             market.Proizvodi[i]->DodajUSkladiste(kolicina);
  213.             cout << "Dodan proizvod... " << endl;
  214.             return;
  215.         }
  216.     }
  217. }
  218. //market, datum
  219. void kreiraj_fakturu(Market & market, int dan, int mjesec, int godina)
  220. {
  221.     for (int i = 0; i < Max; i++)
  222.     {
  223.         market.Fakture[i] = new Faktura;
  224.         Datum datum;
  225.         datum.Unos(dan, mjesec, godina);
  226.         market.Fakture[i]->Unos(datum);
  227.         cout << "Faktura je kreirana... " << endl;
  228.         return;
  229.     }
  230. }
  231. //dodaje stavku na posljednje kreiranu fakturu, a kolicina prve stavke (proizvoda) je 3.
  232. //prilikom dodavanja stavke, njenu kolicinu na skladistu umanjiti za kolicinu stavke.
  233. //onemoguciti dodavanje proizvoda u slucaju da na skladistu ne postoji unesena kolicina proizvoda.
  234. //u slucaju da je nova stavka vec dodana, na fakturi je potrebno samo uvecati njenu kolicinu
  235. //u slucaju da je nova stavka vec ranije dodana, ali je stornirana:
  236. //onda je potrebno omoguciti dodavanje nove stavke a tom prilikom zadrzati i storniranu
  237. void dodaj_stavku_fakture(Market & market, char * naziv, int kolicina)
  238. {
  239.     Proizvod * temp = nullptr;
  240.  
  241.     //cuvanje lokacije od Proizvoda
  242.     for (int i = 0; i < Max; i++)
  243.     {
  244.         if (strcmp(market.Proizvodi[i]->_naziv, naziv) == 0)
  245.         {
  246.             temp = market.Proizvodi[i];
  247.             break;
  248.         }
  249.     }
  250.     //trazimo posljednju kreiranu fakturu pa petlja ide u nazad
  251.     for (int i = Max - 1; i >= 0; i--)
  252.     {
  253.         if (market.Fakture[i] != nullptr && temp != nullptr)
  254.         {
  255.             if (temp->_stanjeSkladista > kolicina)//ukoliko na skladistu nema unesene kolicine nemoj niti vrsiti dalje provjere (ne dodaji)
  256.             {
  257.                 for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
  258.                 {
  259.                     //ako naziv tj. proizvod je vec unesen/dodan i nije storniran
  260.                     if ((strcmp(market.Fakture[i]->_stavke[j]->_proizvod->_naziv, naziv) == 0) && market.Fakture[i]->_stavke[j]->_stornirana == false)
  261.                     {
  262.                         //potrebno je uvecati njegovu kolicinu i njegovu kolicinu na skladistu umanjiti za kolicinu stavke
  263.                         market.Fakture[i]->_stavke[j]->_kolicina += kolicina;
  264.                         cout << "Isti proizvod pronadjen, kolicina je uvecana." << endl;
  265.                         temp->UkloniSaSkladista(kolicina);//umanjivanje kolicine na skladistu za kolicinu stavke
  266.                         return;
  267.                     }
  268.                     //stavka je vec dodana ranije, ali je i stornirana:
  269.                     if (market.Fakture[i]->_stavke[j]->_stornirana == true)
  270.                     {
  271.                         market.Fakture[i]->dodajStavkufakture(temp, kolicina);//dodaj novu stavku
  272.                         market.Fakture[i]->_stavke[j]->_stornirana = true;  //ali moras zadrzati i storniranu
  273.                         temp->UkloniSaSkladista(kolicina);//uslov da prilikom dodavanja stavke mora se njena kolicina na skladistu umanjiti za kolicinu stavke
  274.                         cout << "Pronadjena stornirana stavka, dodana nova stavka." << endl;
  275.                         return;
  276.                     }
  277.                 }
  278.                 //dodavanje nove stavke
  279.                 market.Fakture[i]->dodajStavkufakture(temp, kolicina);
  280.                 temp->UkloniSaSkladista(kolicina);
  281.                 cout << "Stavka dodana na fakturu." << endl;
  282.                 return;
  283.             }
  284.         }
  285.     }
  286. }
  287. /*stornira sve stavke fakture koje u nazivu sadrze vrijednost parametra npr. "Lub".
  288. u slucaju storniranja stavke (posto se uklanja sa fakture),
  289. uvecati (vratiti na stanje prije kupovine tj. dodavanja proizvoda) stanje na skladistu konkretnog proizvoda za vrijednost _kolicina*/
  290. bool storniraj_stavku(Market & market, char * naziv)
  291. {
  292.     for (int i = 0; i < Max; i++)
  293.     {
  294.         if (market.Fakture[i] != nullptr)
  295.         {
  296.             for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
  297.             {
  298.                 //provjera da li naziv stavke u sebi sadrzi primljeni STRING(strstr)
  299.                 if (strstr(market.Fakture[i]->_stavke[j]->_proizvod->_naziv, naziv) != 0)
  300.                 {
  301.                     //ako je uslov ispunjen tj stavka je nadjena dodaj je u skladiste i zadrzi storniranu
  302.                     market.Fakture[i]->_stavke[j]->_stornirana = true;
  303.                     market.Fakture[i]->_stavke[j]->_proizvod->DodajUSkladiste(market.Fakture[i]->_stavke[j]->_kolicina);
  304.                     cout << "Stavka stornirana i dodana u skladiste opet. " << endl;
  305.                     return true;
  306.                 }
  307.             }
  308.         }
  309.     }
  310.     return false;
  311. }
  312. /*
  313. u nastavku je prikazan primjer fakture(računa) sa njenim stavkama, pri cemu je zanemaren porez
  314. -------------------------------------------
  315. Datum: 07.09.2017
  316. -------------------------------------------
  317. FAKTURA/RAČUN
  318. -------------------------------------------
  319. RB   Naziv      Kol. Cij.     Iznos
  320. 1.Cokolada      10   1,5     15 BAM
  321. 2.Coca-Cola     2    1,2     2,4BAM
  322. 3.Cigarete      1    4,5     4,5BAM (Storno)
  323. -------------------------------------------
  324. UKUPNO:                      17,4BAM
  325. -------------------------------------------
  326. */
  327. /*funkcija printaj prikazuje posljednju fakturu u formatu prikazanom na pocetku zadatka. pored prikazivanja, identican sadrzaj fakture je potrebno
  328. sacuvati unutar tekstualnog fajla koji ce biti imenovan sa vasBrojIndeksa.txt npr. IB150051.txt. prikaz i spasavanje fakture se nece desiti u slucaju
  329. da faktura ne posjeduje niti jednu stavku ili su sve stavke stornirane*/
  330. bool printaj(Market & market)
  331. {
  332.     for (int i = 0; i < Max; i++)
  333.     {
  334.         if (market.Fakture[i] != nullptr)
  335.         {
  336.             if (market.Fakture[i]->_brojStavki == 0)
  337.             {
  338.                 cout << "Faktura ne posjeduje niti jednu stavku... " << endl;
  339.                 return false;
  340.             }
  341.         }
  342.     }
  343.     cout << crt;
  344.     cout << "Datum: ";
  345.     for (int i = 0; i < Max; i++)
  346.     {
  347.         if (market.Fakture[i] != nullptr)
  348.         {
  349.             market.Fakture[i]->_datum.Ispis();
  350.         }
  351.     }
  352.     cout << crt;
  353.     cout << "FAKTURA/RACUN";
  354.     cout << crt;
  355.     cout << "RB\tNaziv\tKol.\tCij.\tIznos" << endl;
  356.     float suma = 0;
  357.     float cijena = 0;
  358.     for (int i = 0; i < Max; i++)
  359.     {
  360.         if (market.Fakture[i] != nullptr)
  361.         {
  362.             for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
  363.             {
  364.                 cijena = market.Fakture[i]->_stavke[j]->_proizvod->_cijena*market.Fakture[i]->_stavke[j]->_kolicina;
  365.                 cout << j + 1 << "." << market.Fakture[i]->_stavke[j]->_proizvod->_naziv << "\t" <<
  366.                     market.Fakture[i]->_stavke[j]->_kolicina << "\t" <<
  367.                     market.Fakture[i]->_stavke[j]->_proizvod->_cijena << "\t" <<
  368.                     cijena;
  369.                 suma += cijena;
  370.                 cout << endl;
  371.             }
  372.             cout << crt;
  373.             cout << "UKUPNO: \t\t\t" << suma;
  374.             cout << crt;
  375.         }
  376.     }
  377.     //*********************************************************** UPISIVANJE U .TXT
  378.     char nazivFajla[20];
  379.     strcpy_s(nazivFajla, "IB140261");
  380.     strcat_s(nazivFajla, ".txt");
  381.     ofstream upis(nazivFajla, ios::out);
  382.     upis << crt;
  383.     upis << "Datum: ";
  384.     for (int i = 0; i < Max; i++)
  385.     {
  386.         if (market.Fakture[i] != nullptr)
  387.         {
  388.             upis << market.Fakture[i]->_datum._dan << "." << market.Fakture[i]->_datum._mjesec << "." << market.Fakture[i]->_datum._godina << endl;
  389.         }
  390.     }
  391.     upis << crt;
  392.     upis << "FAKTURA/RACUN";
  393.     upis << crt;
  394.     upis << "RB\tNaziv\tKol.\tCij.\tIznos" << endl;
  395.     float sumaUpisa = 0;
  396.     float cijenaUpisa = 0;
  397.     for (int i = 0; i < Max; i++)
  398.     {
  399.         if (market.Fakture[i] != nullptr)
  400.         {
  401.             for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
  402.             {
  403.                 cijenaUpisa = market.Fakture[i]->_stavke[j]->_proizvod->_cijena*market.Fakture[i]->_stavke[j]->_kolicina;
  404.                 upis << j + 1 << "." << market.Fakture[i]->_stavke[j]->_proizvod->_naziv << "\t" <<
  405.                     market.Fakture[i]->_stavke[j]->_kolicina << "\t" <<
  406.                     market.Fakture[i]->_stavke[j]->_proizvod->_cijena << "\t" <<
  407.                     cijenaUpisa;
  408.                 sumaUpisa += cijenaUpisa;
  409.                 upis << endl;
  410.             }
  411.             upis << crt;
  412.             upis << "UKUPNO: \t\t\t" << sumaUpisa;
  413.             upis << crt;
  414.         }
  415.     }
  416.     cout << ".txt fajl je spremljen pod nazivom: " << nazivFajla << endl;
  417.     upis.close();
  418.     return true;
  419. }
  420. void main()
  421. {
  422.     Market market;
  423.  
  424.     /*dodaje podatke o novom proizvodu u market */
  425.     //market, naziv, cijena, i kolicina
  426.     dodaj_proizvod(market, "Mlijeko (L)", 1.45, 50);
  427.     //cout << "Dodani podaci o proizvodu... " << endl;
  428.     dodaj_proizvod(market, "Mlijeko (L)", 1.45, 5);//ne dodaje novi proizvod vec postojecem samo povecava kolicinu
  429.     //cout << "Povecana kolicina proizvod... " << endl;
  430.     dodaj_proizvod(market, "Jabuke (kg)", 1.25, 80.4);
  431.     //cout << "Dodani podaci o proizvodu... " << endl;
  432.     dodaj_proizvod(market, "Lubenica (kg)", 0.45, 189);
  433.     //cout << "Dodani podaci o proizvodu... " << endl;
  434.  
  435.     //market, datum
  436.     kreiraj_fakturu(market, 6, 9, 2017);
  437.  
  438.     /*dodaje stavku na posljednje kreiranu fakturu, a kolicina prve stavke (proizvoda) je 3. prilikom dodavanja stavke, njenu kolicinu na skladistu umanjiti
  439.     za kolicinu stavke. onemoguciti dodavanje proizvoda u slucaju da na skladistu
  440.     ne postoji unesena kolicina  proizvoda. u slucaju da je nova stavka vec dodana, na fakturi je potrebno samo uvecati njenu kolicinu
  441.     (npr. ako se Cokolada x 2 nalaze na fakturi, a nakon toga se doda jos Cokolada x 1  onda se na fakturi treba nalaziti samo jedna stavka Cokolada sa kolicinom 3).
  442.     u slucaju da je nova stavka vec ranije dodana, ali je stornirana, onda je potrebno omoguciti dodavanje nove stavke a tom prilikom zadrzati
  443.     i storniranu(u prethodnom   primjeru, ako je stavka Cokolada x 2 stornirana, te se ponovo pokusa dodati stavka Cokolada x 1, onda ce na fakturi biti
  444.     obe stavke istog proizvoda pri cemu je jedna stornirana a druga nije)*/
  445.     dodaj_stavku_fakture(market, "Mlijeko (L)", 3);
  446.     dodaj_stavku_fakture(market, "Mlijeko (L)", 2);//na fakturi, stavka Mlijeko bi sada trebala imati kolicinu 5, a na skladistu (55 - 5 = 50)
  447.     dodaj_stavku_fakture(market, "Lubenica (kg)", 5);
  448.  
  449.     kreiraj_fakturu(market, 7, 9, 2017);
  450.     dodaj_stavku_fakture(market, "Jabuke (kg)", 5);//naredne stavke se dodaju na novu fakturu
  451.     dodaj_stavku_fakture(market, "Lubenica (kg)", 3);
  452.  
  453.     /*stornira sve stavke fakture koje u nazivu sadrze vrijednost parametra npr. "Lub". u slucaju storniranja stavke (posto se uklanja sa fakture),
  454.     uvecati (vratiti na stanje prije kupovine tj. dodavanja proizvoda) stanje na skladistu konkretnog proizvoda za vrijednost _kolicina*/
  455.     if (storniraj_stavku(market, "Lub"))
  456.         cout << "Stavka uspjesno stornirana!" << endl;
  457.     if (!storniraj_stavku(market, "TEST"))
  458.         cout << "Trazena stavka ne postoji na fakturi!" << endl;
  459.  
  460.     /*funkcija printaj prikazuje posljednju fakturu u formatu prikazanom na pocetku zadatka. pored prikazivanja, identican sadrzaj fakture je potrebno
  461.     sacuvati unutar tekstualnog fajla koji ce biti imenovan sa vasBrojIndeksa.txt npr. IB150051.txt. prikaz i spasavanje fakture se nece desiti u slucaju
  462.     da faktura ne
  463.     posjeduje niti jednu stavku ili su sve stavke stornirane*/
  464.     if (printaj(market))
  465.         cout << "Faktura uspjesno prikazana i sacuvana!" << endl;
  466.     market.Dealociraj();
  467.     system("PAUSE");
  468. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement