Advertisement
adnanj

PRII - Komentari na zadatak

Sep 24th, 2017 (edited)
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.59 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. /*
  5. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  6. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  7. 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
  8. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  9. 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)
  10. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  11. */
  12. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  13. #pragma warning(disable:4996)
  14.  
  15. /*
  16. u nastavku je prikazan primjer fakture(računa) sa njenim stavkama, pri cemu je zanemaren porez
  17. -------------------------------------------
  18. Datum: 07.09.2017
  19. -------------------------------------------
  20. FAKTURA/RAČUN
  21. -------------------------------------------
  22. RB   Naziv      Kol. Cij.     Iznos
  23. 1.Cokolada      10   1,5     15 BAM
  24. 2.Coca-Cola     2    1,2     2,4BAM
  25. 3.Cigarete      1    4,5     4,5BAM (Storno)
  26. -------------------------------------------
  27. UKUPNO:                      17,4BAM
  28. -------------------------------------------
  29. */
  30. char * crt = "\n-------------------------------------------\n";
  31. struct Datum {
  32.     int _dan;
  33.     int _mjesec;
  34.     int _godina;
  35.     void Unos(int d, int m, int g) {
  36.         _dan = d;
  37.         _mjesec = m;
  38.         _godina = g;
  39.     }
  40.     void Ispis() {
  41.         cout << _dan << "." << _mjesec << "." << _godina << " ";
  42.     }
  43. };
  44.  
  45. struct Proizvod {
  46.     char _naziv[20];
  47.     float _cijena;
  48.     float _stanjeSkladista;// svaki proizvod ce cuvati informaciju o tome koliko je trenutno stanje tog proizvoda na skladistu
  49.  
  50.     void Unos(char* naziv, float cijena) {
  51.         strcpy_s(_naziv, strlen(naziv) + 1, naziv);
  52.  
  53.         _cijena = cijena;
  54.         _stanjeSkladista = 0; //Proizvodi u skladistu
  55.     }
  56.  
  57.     void DodajUSkladiste(float kolicina) {
  58.         _stanjeSkladista += kolicina;
  59.     }
  60.     void UkloniSaSkladista(float kolicina) {
  61.         _stanjeSkladista -= kolicina;
  62.     }
  63.     void Ispis() {
  64.         cout << _naziv << ", cijena: " << _cijena << "KM, stanje: " << _stanjeSkladista << " " << endl;
  65.     }
  66. };
  67.  
  68. struct StavkaFakture {
  69.     float _kolicina;
  70.     Proizvod* _proizvod; //_proizvod će pokazivati na adresu objekata tipa proizvod koja se nalaze u Market-u, pa nije potrebno vršiti nove alokacije
  71.     bool _stornirana;
  72.  
  73.     void Unos(Proizvod* proizvod, float kolicina) {
  74.         _kolicina = kolicina;
  75.         _proizvod = proizvod;
  76.         _stornirana = false;
  77.     }
  78.  
  79.     float GetIznos() {
  80.         return _kolicina * _proizvod->_cijena;
  81.     }
  82.  
  83.     void Ispis() {
  84.         cout << _proizvod->_naziv << "\t" << _kolicina << "\t" << _proizvod->_cijena << "\t" << GetIznos() << "BAM";
  85.         if (_stornirana)
  86.             cout << " Storno";
  87.         cout << endl;
  88.     }
  89. };
  90.  
  91. struct Faktura {
  92.     Datum _datum;
  93.     StavkaFakture ** _stavke;//svaki put se dodaje po jedna stavka
  94.     int _brojStavki;
  95.     void Unos(Datum datum) {
  96.         _datum = datum;
  97.         _brojStavki = 0;
  98.  
  99.         _stavke = nullptr;
  100.     }
  101.  
  102.     /*iznos fakture izracunati koristeci lambda funkciju koja se poziva putem objekta
  103.     tipa auto. u iznos fakture ne racunati stornirane stavke*/
  104.     float GetIznosSuma()
  105.     {
  106.  
  107.     }
  108. };
  109. const int Max = 100;
  110.  
  111. /*unutar objekta tipa Market ce se cuvati svi dostupni proizvodi i sve fakture koje se dodaju putem globalnih funkcija */
  112. struct Market {
  113.     //umjesto brojaca koristite default.ne vrijednosti
  114.     Proizvod* Proizvodi[Max] = { NULL };
  115.     Faktura* Fakture[Max] = { NULL };
  116.  
  117.  
  118.     void Dealociraj() {
  119.         for (size_t i = 0; i < Max; i++) {
  120.             delete Proizvodi[i]; Proizvodi[i] = NULL;
  121.         }
  122.         for (size_t i = 0; i < Max; i++) {
  123.             delete Fakture[i]; Fakture[i] = NULL;
  124.         }
  125.     }
  126. };
  127.  
  128. void dodaj_proizvod(Market &market, char*proizvod, float cijena, int kolicinaProizvoda) {
  129.     for (int i = 0; i < Max; i++) {
  130.         if (market.Proizvodi[i] != nullptr) { //Ispituje da li je nullirano sve kako treba
  131.             if (strcmp(market.Proizvodi[i]->_naziv, proizvod) == 0) {
  132.                 market.Proizvodi[i]->DodajUSkladiste(kolicinaProizvoda); //Dodaje na skladište postojeceg proizvoda odgovarajuću kolicinu
  133.                 cout << "Kolicina " << market.Proizvodi[i]->_naziv << " iznosi " << market.Proizvodi[i]->_stanjeSkladista << endl;
  134.                 return;
  135.             }
  136.         }
  137.         else if (market.Proizvodi[i] == nullptr) {
  138.             market.Proizvodi[i] = new Proizvod; //Alocira prostor za novi proizvod
  139.             market.Proizvodi[i]->Unos(proizvod, cijena); //Unosi novi proizvod
  140.             //Potrebno je postaviti i početno stanje na skladištu!
  141.             market.Proizvodi[i]->_stanjeSkladista = kolicinaProizvoda;
  142.             cout << "Proizvod " << market.Proizvodi[i]->_naziv << " uspjesno dodan u listu proizvoda " << endl;
  143.             return;
  144.         }
  145.     }
  146. }
  147.  
  148. void kreiraj_fakturu(Market &market, int dan, int mjesec, int godina) {
  149.     Datum date;
  150.     date.Unos(dan, mjesec, godina);//Kreiramo novi element date, kako bismo ga proslijedili u funkciju Unos kao parametar
  151.  
  152.     //Nikako ne bi smio da uništavaš sve prethodne fakture!
  153.  
  154.     /*for (int i = 0; i < Max; i++) {
  155.         if (market.Fakture[i] != nullptr) {//Ovdje sve postojeće fakture postavljaš na "nullptr", što svakako nije ideja
  156.             market.Fakture[i] = nullptr;
  157.         }
  158.         else if (market.Fakture[i] == nullptr) {
  159.             market.Fakture[i] = new Faktura;
  160.             market.Fakture[i]->Unos(date);
  161.             cout << "Faktura uspjesno dodana" << endl;
  162.             return;
  163.         }
  164.     }*/
  165.  
  166.     //Na prvo slobodno mjesto umjetni novu fakturu (pravilno), a dodavanje stavke na posljednju dodanu fakturu je demonstrirano u funkciji "dodaj_stavku_na_fakturu"
  167.     for (int i = 0; i < Max; i++) {
  168.         if (market.Fakture[i] == nullptr) {
  169.             market.Fakture[i] = new Faktura;
  170.             market.Fakture[i]->Unos(date);
  171.             cout << "Faktura uspjesno dodana" << endl;
  172.             return;
  173.         }
  174.     }
  175. }
  176. /*dodaje stavku na posljednje kreiranu fakturu, a kolicina prve stavke (proizvoda) je 3.
  177. prilikom dodavanja stavke, njenu kolicinu na skladistu umanjiti za kolicinu stavke.
  178. onemoguciti dodavanje proizvoda u slucaju da na skladistu
  179. ne postoji unesena kolicina  proizvoda. u slucaju da je nova stavka vec dodana,
  180. na fakturi je potrebno samo uvecati njenu kolicinu (npr. ako se Cokolada x 2 nalaze na fakturi, a nakon toga se doda jos Cokolada x 1
  181. onda se na fakturi treba nalaziti samo jedna*/
  182.  
  183. void dodaj_stavku_fakture(Market &market, char*proizvod, int kolicinaStavke) {
  184.    
  185.     // Stavku dodajemo na posljednju dodanu fakturu, a ne na prvu koju pronađemo, stoga je potrebno da zapamtimo indeks posljednje dodane fakture
  186.     int indeksPosljednjeFakture = -1;
  187.     for (int i = 0; market.Fakture[i] != nullptr; i++)
  188.             indeksPosljednjeFakture = i;
  189.  
  190.     //Ako nije pronađena niti jedna faktura (petlja nije uspjela postaviti indeks, odnosno promijeniti vrijednost promjenljive "indeksPosljednjeFakture", prekidamo rad funkcije
  191.     if (indeksPosljednjeFakture == -1)
  192.         return;
  193.  
  194.     //Treba da provjerimo da li navedeni proizvod postoji na skladištu u željenoj količini
  195.     for(int i = 0; market.Proizvodi[i] != nullptr; i++)
  196.         if (strcmp(market.Proizvodi[i]->_naziv, proizvod) == 0) //Ako se radi o proizvodu koji dodajemo
  197.         {
  198.             if (market.Proizvodi[i]->_stanjeSkladista < kolicinaStavke) //Nema dovoljno na skladištu, ispisujemo grešku i prekidamo funkciju
  199.             {
  200.                 cout << "GRESKA: Na skladistu nema dovoljno proizvoda \"" << proizvod << "\"..." << endl;
  201.                 return;
  202.             }
  203.             //U suprotnom, u skladištu umanjujemo stanje za proslijeđenu količinu
  204.             market.Proizvodi[i]->UkloniSaSkladista(kolicinaStavke);
  205.  
  206.             int trenutnoStavki = market.Fakture[indeksPosljednjeFakture]->_brojStavki;
  207.  
  208.             //Sada treba da provjerimo da li se navedeni proizvod već nalazi u stavkama fakture, ako postoji - samo uvećavamo količinu
  209.             for (int j = 0; j < trenutnoStavki; j++)
  210.                 if (market.Fakture[indeksPosljednjeFakture]->_stavke[j]->_proizvod == market.Proizvodi[i]) //Poredimo adrese pokazivača!
  211.                 {
  212.                     market.Fakture[indeksPosljednjeFakture]->_stavke[j]->_kolicina += kolicinaStavke;
  213.                     cout << "Proizvod \"" << proizvod << "\" vec postoji na fakturi, uvecavam kolicinu za " << kolicinaStavke << "!" << endl;
  214.                     return;
  215.                 }
  216.  
  217.             //Ako ne postoji na fakturi, onda pronađeni proizvod u skladištu (market.Proizvodi[i]) dodajemo kao stavku posljednje fakture čiji smo indeks zapamtili na početku funkcije
  218.             //Prvo treba da "proširimo" niz pokazivača na stavke faktura i da u novoprošireni niz preusmjerimo pokazivače iz originalnog
  219.             StavkaFakture** tempStavke = new StavkaFakture*[trenutnoStavki + 1];
  220.  
  221.             for (int i = 0; i < trenutnoStavki; i++)
  222.                 tempStavke[i] = market.Fakture[indeksPosljednjeFakture]->_stavke[i]; //Preusmjeravamo pokazivače
  223.  
  224.             delete[] market.Fakture[indeksPosljednjeFakture]->_stavke; //Brišemo stari pokazivač na niz pokazivača
  225.             market.Fakture[indeksPosljednjeFakture]->_stavke = tempStavke; //Preusmjeravamo pokazivač na pokazivač "stavke" na novi pokazivač na pokazivač "tempStavke" koji ima prostora za još jednu stavku
  226.             //Dodajemo novu stavku (psoljeđujemo adresu proizvoda koji smo pronašli na skladištu, ne pravimo novi proizvod s "new" operatorom)
  227.             market.Fakture[indeksPosljednjeFakture]->_stavke[trenutnoStavki] = new StavkaFakture;
  228.             market.Fakture[indeksPosljednjeFakture]->_stavke[trenutnoStavki]->Unos(market.Proizvodi[i], kolicinaStavke);
  229.             market.Fakture[indeksPosljednjeFakture]->_brojStavki++; //Uvećavamo broj stavki
  230.             //Ispisujemo poruku o uspješnosti i prekidamo funkciju    
  231.             cout << "Proizvod \"" << proizvod << "\" je uspjesno dodan na fakturu u kolicini " << kolicinaStavke << "!" << endl;
  232.             return;
  233.         }
  234.  
  235.     //Ako u prethodnoj petlji nije došlo do uvećavanja količine ili dodavanje nove stavke, onda proizvod ne postoji na skladištu, te ispisujemo grešku i prekidamo funkcije
  236.     cout << "GRESKA: Proizvod \"" << proizvod << "\" ne postoji na skladistu!" << endl;
  237.     return;
  238. }
  239.  
  240. void main() {
  241.     Proizvod p;
  242.     p.Unos("Cigare", 1.20);
  243.  
  244.     StavkaFakture F;
  245.     F.Unos(&p, 5);
  246.     F.Ispis();
  247.     Market market;
  248.  
  249.     /*dodaje podatke o novom proizvodu u market */
  250.     //market, naziv, cijena, i kolicina
  251.     dodaj_proizvod(market, "Mlijeko (L)", 1.45, 50);
  252.     dodaj_proizvod(market, "Mlijeko (L)", 1.45, 5);//ne dodaje novi proizvod vec postojecem samo povecava kolicinu
  253.     dodaj_proizvod(market, "Jabuke (kg)", 1.25, 80.4);
  254.     dodaj_proizvod(market, "Lubenica (kg)", 0.45, 189);
  255.     cout << crt;
  256.     //market, datum
  257.     kreiraj_fakturu(market, 6, 9, 2017);
  258.  
  259.     /*dodaje stavku na posljednje kreiranu fakturu, a kolicina prve stavke (proizvoda) je 3. prilikom dodavanja stavke, njenu kolicinu na skladistu umanjiti za kolicinu stavke. onemoguciti    dodavanje proizvoda u slucaju da na skladistu
  260.     ne postoji unesena kolicina  proizvoda. u slucaju da je nova stavka vec dodana, na fakturi je potrebno samo uvecati njenu kolicinu (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).u slucaju da je nova stavka vec ranije dodana, ali je stornirana, onda je potrebno omoguciti dodavanje nove stavke a tom prilikom zadrzati 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 obe stavke istog proizvoda pri cemu je jedna stornirana a druga nije)*/
  261.     dodaj_stavku_fakture(market, "Mlijeko (L)", 3);
  262.     dodaj_stavku_fakture(market, "Mlijeko (L)", 2);//na fakturi, stavka Mlijeko bi sada trebala imati kolicinu 5, a na skladistu (55 - 5 = 50)
  263.     dodaj_stavku_fakture(market, "Lubenica (kg)", 5);
  264.  
  265.     kreiraj_fakturu(market, 7, 9, 2017);
  266.     dodaj_stavku_fakture(market, "Jabuke (kg)", 5);//naredne stavke se dodaju na novu fakturu
  267.     dodaj_stavku_fakture(market, "Lubenica (kg)", 3);
  268.     //
  269.     //  /*stornira sve stavke fakture koje u nazivu sadrze vrijednost parametra npr. "Lub". u slucaju storniranja stavke (posto se uklanja sa fakture), uvecati (vratiti na stanje prije kupovine tj. dodavanja proizvoda) stanje na skladistu konkretnog proizvoda za vrijednost _kolicina*/
  270.     //  if (storniraj_stavku(market, "Lub"))
  271.     //      cout << "Stavka uspjesno stornirana!" << endl;
  272.     //  if (!storniraj_stavku(market, "TEST"))
  273.     //      cout << "Trazena stavka ne postoji na fakturi!" << endl;
  274.     //
  275.     //  /*funkcija printaj prikazuje posljednju fakturu u formatu prikazanom na pocetku zadatka. pored prikazivanja, identican sadrzaj fakture je potrebno sacuvati unutar tekstualnog fajla koji ce biti imenovan sa vasBrojIndeksa.txt npr. IB150051.txt. prikaz i spasavanje fakture se nece desiti u slucaju da faktura ne
  276.     //  posjeduje niti jednu stavku ili su sve stavke stornirane*/
  277.     //  if (printaj(market))
  278.     //      cout << "Faktura uspjesno prikazana i sacuvana!" << endl;
  279.     //  market.Dealociraj();
  280. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement