Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Izvršiti definiciju funkcija na naèin koji odgovara opisu(komentarima) datom neposredno uz pozive ili nazive funkcija.
- //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.Takoðer, možete dodati dodatne funkcije koje æe vam olakšati implementaciju programa.
- #include <iostream>
- #include <fstream>
- using namespace std;
- /*
- 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEÆE BODOVATI
- 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
- 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
- 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
- 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)
- 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAÐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
- */
- //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
- #pragma warning(disable:4996)
- const char * crt = "\n-------------------------------------------\n";
- struct Datum
- {
- int _dan;
- int _mjesec;
- int _godina;
- void Unos(int d, int m, int g)
- {
- _dan = d;
- _mjesec = m;
- _godina = g;
- }
- void Ispis()
- {
- cout << _dan << "." << _mjesec << "." << _godina << " ";
- }
- };
- struct Proizvod
- {
- char _naziv[20];
- float _cijena;
- float _stanjeSkladista;//svaki proizvod ce cuvati informaciju o tome koliko je trenutno stanje tog proizvoda na skladistu
- void Unos(const char* naziv, float cijena)
- {
- strcpy_s(_naziv, naziv);
- _cijena = cijena;
- _stanjeSkladista = 0;
- }
- void DodajUSkladiste(float kolicina)
- {
- _stanjeSkladista += kolicina;
- }
- void UkloniSaSkladista(float kolicina)
- {
- _stanjeSkladista -= kolicina;
- }
- void Ispis()
- {
- cout << _naziv << ", cijena: " << _cijena << "KM, stanje: " << _stanjeSkladista << " " << endl;
- }
- };
- struct StavkaFakture
- {
- float _kolicina;
- Proizvod* _proizvod; //_proizvod æe pokazivati na adresu objekata tipa proizvod koja se nalaze u Market-u, pa nije potrebno vršiti nove alokacije
- bool _stornirana;
- void Unos(Proizvod* proizvod, float kolicina)
- {
- _kolicina = kolicina;
- _proizvod = proizvod;
- _stornirana = false;
- }
- float GetIznos()
- {
- return _kolicina * _proizvod->_cijena;
- }
- void Ispis()
- {
- cout << _proizvod->_naziv << "\t" << _kolicina << "\t" << _proizvod->_cijena << "\t" << GetIznos() << "BAM";
- if (_stornirana)
- cout << " Storno";
- cout << endl;
- }
- };
- struct Faktura
- {
- Datum _datum;
- StavkaFakture ** _stavke;//svaki put se dodaje po jedna stavka
- int _brojStavki;
- void Ispis()
- {
- for (int i = 0; i < _brojStavki; i++)
- {
- _stavke[i]->Ispis();
- }
- }
- bool dodajStavkuFaktura(Proizvod* proizvod, float kolicina)
- {
- StavkaFakture ** temp = new StavkaFakture *[_brojStavki + 1];
- for (int i = 0; i < _brojStavki; i++)
- {
- temp[i] = new StavkaFakture;
- temp[i]->Unos(_stavke[i]->_proizvod, _stavke[i]->_kolicina);
- }
- temp[_brojStavki] = new StavkaFakture;
- temp[_brojStavki]->Unos(proizvod, kolicina);
- delete[]_stavke;
- _stavke = temp;
- _brojStavki++;
- return true;
- }
- void Unos(Datum datum)
- {
- //_datum.Unos(datum._dan, datum._mjesec, datum._godina);
- _datum = datum;
- _brojStavki = 0;
- _stavke = nullptr;
- }
- /*iznos fakture izracunati koristeci lambda funkciju koja se poziva putem objekta
- tipa auto. u iznos fakture ne racunati stornirane stavke*/
- float GetIznosSuma()
- {
- auto lambda = [&]()
- {
- float rez = 0;
- for (int i = 0; i < _brojStavki; i++)
- {
- if (_stavke[i]->_stornirana == false)
- break;
- else
- rez += _stavke[i]->GetIznos();
- }
- return rez;
- };
- return lambda();
- }
- };
- const int Max = 100;
- /*unutar objekta tipa Market ce se cuvati svi dostupni proizvodi i sve fakture koje se dodaju putem globalnih funkcija */
- struct Market
- {
- //umjesto brojaca koristite default.ne vrijednosti
- Proizvod* Proizvodi[Max] = { NULL };
- Faktura* Fakture[Max] = { NULL };
- void Dealociraj()
- {
- for (size_t i = 0; i < Max; i++) {
- delete Proizvodi[i]; Proizvodi[i] = NULL;
- }
- for (size_t i = 0; i < Max; i++) {
- delete Fakture[i]; Fakture[i] = NULL;
- }
- }
- };
- /*dodaje podatke o novom proizvodu u market */
- //ne dodaje novi proizvod vec postojecem samo povecava kolicinu - ako je isti
- void dodaj_proizvod(Market & market, const char * naziv, float cijena, float kolicina)
- {
- for (int i = 0; i < Max; i++)
- {
- //provjera da li je isti proizvod
- if (market.Proizvodi[i] != nullptr)//da bi provjerio da li taj proizod postoji prvo moras provjeriti da li ima ikakv proizvod
- {
- if (strcmp(market.Proizvodi[i]->_naziv, naziv) == 0)
- {
- //uvecaj mu kolicinu
- market.Proizvodi[i]->DodajUSkladiste(kolicina);
- cout << "Proizvod broj: " << i << " i naziv: " << naziv << " vec postoji. Ne dodaje se, uvecava mu se kolicina..."
- "Kolicina proizvoda je: " << market.Proizvodi[i]->_stanjeSkladista << endl;
- return;
- }
- }
- }
- //dodaj novi proizvod
- for (int i = 0; i < Max; i++)
- {
- if (market.Proizvodi[i] == nullptr)
- {
- market.Proizvodi[i] = new Proizvod;
- market.Proizvodi[i]->Unos(naziv, cijena);
- market.Proizvodi[i]->DodajUSkladiste(kolicina);
- cout << "Proizvod broj: " << i << " i naziv: " << naziv << " je uspjesno dodan. " << endl;
- return;
- }
- }
- }
- void kreiraj_fakturu(Market & market, int dan, int mjesec, int godina)
- {
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] == nullptr)
- {
- market.Fakture[i] = new Faktura;
- Datum datum;
- datum.Unos(dan, mjesec, godina);
- market.Fakture[i]->Unos(datum);
- cout << "Faktura broj: " << i << " je uspjesno kreirana. " << endl;
- return;
- }
- }
- }
- /*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 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)*/
- void dodaj_stavku_fakture(Market & market, const char * nazivProizvoda, int kolicina)
- {
- //provjere
- for (int i = Max - 1; i >= 0; i--)
- {
- if (market.Fakture[i] != nullptr)
- for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
- {
- if (market.Fakture[i]->_stavke[j]->_kolicina == 0)//proizvod se ne dodaje jer nema unesene kolicine
- {
- cout << "Proizvod nema unesenu kolicinu... " << endl;
- return;
- }
- if (strcmp(market.Proizvodi[i]->_naziv, nazivProizvoda) == 0)//nova dodana stavka vec je prije dodana, uvecavas samo njenu kolicinu
- {
- cout << "Stavka je vec dodana..." << endl;
- market.Proizvodi[i]->DodajUSkladiste(kolicina);
- return;
- }
- 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
- {
- Proizvod * proizvod = nullptr;
- market.Fakture[i]->_stavke[j] = new StavkaFakture;
- market.Fakture[i]->dodajStavkuFaktura(proizvod, kolicina);
- market.Fakture[i]->_stavke[j]->_stornirana = true;
- cout << "Stavka je dodana skupa s storniranom" << endl;
- return;
- }
- if (market.Fakture[i] == NULL)//nema niti jedne stavke fakture, kreiram prvu
- {
- for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
- {
- Proizvod * proizvod = nullptr;
- market.Fakture[i]->_stavke[j] = new StavkaFakture;
- market.Fakture[i]->dodajStavkuFaktura(proizvod, kolicina);
- market.Fakture[i]->_stavke[0]->_kolicina = 3;
- market.Fakture[i]->_stavke[j]->_proizvod->UkloniSaSkladista(kolicina);
- return;
- }
- }
- }
- }
- }
- /*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*/
- bool storniraj_stavku(Market & market, const char * lub)
- {
- for (int i = 0; i < Max; i++)
- {
- if (market.Proizvodi[i] != nullptr)
- if (strstr(market.Proizvodi[i]->_naziv, lub) != NULL) //!=NULL je nasla dio trazenog stringa unutar glavnog stringa
- {
- if (market.Fakture[i] != nullptr)
- for (int j = 0; i < market.Fakture[i]->_brojStavki; i++)
- {
- market.Fakture[i]->_stavke[j]->_stornirana == true;//stavka je sada stornirana
- market.Fakture[i]->_stavke[j]->_proizvod->DodajUSkladiste(market.Fakture[i]->_stavke[j]->_kolicina);//uvecavanje na skladistu se vrsi u funkciji dodajUSkladiste
- cout << "Stavka uspjesno stornirana... " << endl;
- return true;
- }
- }
- }
- return false;
- }
- /*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
- posjeduje niti jednu stavku ili su sve stavke stornirane*/
- /*
- u nastavku je prikazan primjer fakture(raèuna) sa njenim stavkama, pri cemu je zanemaren porez
- -------------------------------------------
- Datum: 07.09.2017
- -------------------------------------------
- FAKTURA/RAÈUN
- -------------------------------------------
- RB Naziv Kol. Cij. Iznos
- 1.Cokolada 10 1,5 15 BAM
- 2.Coca-Cola 2 1,2 2,4BAM
- 3.Cigarete 1 4,5 4,5BAM (Storno)
- -------------------------------------------
- UKUPNO: 17,4BAM
- -------------------------------------------
- */
- bool printaj(Market & market)
- {
- //provjera
- //faktura posjeduje niti jednu stavku ili su sve stavke stornirane
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] != nullptr)
- {
- for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
- {
- if (market.Fakture[i]->_stavke[j]->_stornirana == true || market.Fakture[i]->_brojStavki == 0)
- {
- cout << "Stavke nema ili je stronirana te se ne ispisuje niti spasava... " << endl;
- return false;
- }
- }
- }
- }
- cout << crt;
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[1] != nullptr)
- {
- cout << "Datum: ";
- market.Fakture[1]->_datum.Ispis();
- cout << crt;
- break;
- }
- }
- cout << "FAKTURA/RAÈUN";
- cout << crt;
- cout << "RB \tNaziv \tKol. \tCij. \tIznos" << endl;
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[1] != nullptr)
- {
- cout << i + 1 << ": " << endl;
- market.Fakture[1]->Ispis();
- break;
- }
- }
- int cijena = 0;
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] != nullptr)
- {
- for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
- {
- cijena = market.Proizvodi[i]->_cijena*market.Fakture[i]->_stavke[j]->_kolicina;
- }
- }
- }
- cout << crt;
- cout << "UKUPNO: " << cijena;
- cout << crt;
- //unutar tekstualnog fajla koji ce biti imenovan sa vasBrojIndeksa.txt npr. IB150051.txt.
- char brojIndeksa[20];
- strcpy_s(brojIndeksa, "IB140261");
- strcat_s(brojIndeksa, ".txt");
- ofstream upis(brojIndeksa);
- cout << crt;
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[1] != nullptr)
- {
- upis << "Datum: ";
- upis << market.Fakture[1]->_datum._dan << "." << market.Fakture[1]->_datum._mjesec << "." << market.Fakture[1]->_datum._godina;
- upis << crt;
- break;
- }
- }
- upis << "FAKTURA/RAÈUN";
- upis << crt;
- upis << "RB \tNaziv \tKol. \tCij. \tIznos" << endl;
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[1] != nullptr)
- {
- upis << i + 1 << ": " << endl;
- market.Fakture[1]->Ispis();
- break;
- }
- }
- int cijenaUpis = 0;
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] != nullptr)
- {
- for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
- {
- cijenaUpis = market.Proizvodi[i]->_cijena*market.Fakture[i]->_stavke[j]->_kolicina;
- }
- }
- }
- upis << crt;
- upis << "UKUPNO: " << cijena;
- upis << crt;
- if (upis.fail())
- cout << "Greska prilikom upisa u .txt fajl ->" << brojIndeksa << endl;
- else
- cout << "Fajl: " << brojIndeksa << " uspjesno upisan u .txt file... " << endl;
- upis.close();
- return true;
- }
- void main()
- {
- Market market;
- /*dodaje podatke o novom proizvodu u market */
- //market, naziv, cijena, i kolicina
- dodaj_proizvod(market, "Mlijeko (L)", 1.45, 50);
- dodaj_proizvod(market, "Mlijeko (L)", 1.45, 5);//ne dodaje novi proizvod vec postojecem samo povecava kolicinu
- dodaj_proizvod(market, "Jabuke (kg)", 1.25, 80.4);
- dodaj_proizvod(market, "Lubenica (kg)", 0.45, 189);
- //market, datum
- kreiraj_fakturu(market, 6, 9, 2017);
- /*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
- 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)*/
- dodaj_stavku_fakture(market, "Mlijeko (L)", 3);
- dodaj_stavku_fakture(market, "Mlijeko (L)", 2);//na fakturi, stavka Mlijeko bi sada trebala imati kolicinu 5, a na skladistu (55 - 5 = 50)
- dodaj_stavku_fakture(market, "Lubenica (kg)", 5);
- kreiraj_fakturu(market, 7, 9, 2017);
- dodaj_stavku_fakture(market, "Jabuke (kg)", 5);//naredne stavke se dodaju na novu fakturu
- dodaj_stavku_fakture(market, "Lubenica (kg)", 3);
- /*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*/
- if (storniraj_stavku(market, "Lub"))
- cout << "Stavka uspjesno stornirana!" << endl;
- if (!storniraj_stavku(market, "TEST"))
- cout << "Trazena stavka ne postoji na fakturi!" << endl;
- /*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
- posjeduje niti jednu stavku ili su sve stavke stornirane*/
- if (printaj(market))
- cout << "Faktura uspjesno prikazana i sacuvana!" << endl;
- market.Dealociraj();
- system("PAUSE");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement