Advertisement
limun11

Market, fakture

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