Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //1. ZADATAK
- //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)
- /*
- 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
- -------------------------------------------
- */
- 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 << " ";
- }
- char * getDatumKaoNizKaraktera()
- {
- char dan[3], mjesec[3], godina[5];
- _itoa_s(_dan, dan, 10);
- _itoa_s(_mjesec, mjesec, 10);
- _itoa_s(_godina, godina, 10);
- int size = strlen(dan) + 1 + strlen(mjesec) + 1 + strlen(godina) + 1 + 1 + 1;
- char * niz = new char[size];
- strcpy_s(niz, size, dan);
- strcat_s(niz, size, ".");
- strcat_s(niz, size, mjesec);
- strcat_s(niz, size, ".");
- strcat_s(niz, size, godina);
- return niz;
- }
- };
- 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(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;
- bool dodajStavkufakture(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 = 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 suma = 0;
- float cijena = 0;
- for (int i = 0; i < _brojStavki; i++)
- {
- if (_stavke[i]->_stornirana == false)
- {
- cijena = _stavke[i]->_kolicina*_stavke[i]->_proizvod->_cijena;
- suma += cijena;
- }
- }
- return suma;
- };
- 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 */
- //market, naziv, cijena, i kolicina
- //ne dodaje novi proizvod vec postojecem samo povecava kolicinu -> isti naziv proizvoda
- void dodaj_proizvod(Market & market, char * naziv, double cijena, int kolicina)
- {
- for (int i = 0; i < Max; i++)
- {
- if (market.Proizvodi[i] != nullptr)//niz je vec popunjen, provjeri postoji li isti s istim nazivom, ako ima uvecaj mu kolicinu
- {
- if (strcmp(market.Proizvodi[i]->_naziv, naziv) == 0)
- {
- market.Proizvodi[i]->_stanjeSkladista += kolicina;
- cout << "Artikal postoji. Kolicina uvecana! " << endl;
- return;
- }
- }
- }
- for (int i = 0; i < Max; i++)
- {
- if (market.Proizvodi[i] == nullptr)//nema artikla, niz je prazan, dodaj novi proizvod
- {
- market.Proizvodi[i] = new Proizvod;
- market.Proizvodi[i]->Unos(naziv, cijena);
- market.Proizvodi[i]->DodajUSkladiste(kolicina);
- cout << "Dodan proizvod... " << endl;
- return;
- }
- }
- }
- //market, datum
- void kreiraj_fakturu(Market & market, int dan, int mjesec, int godina)
- {
- for (int i = 0; i < Max; i++)
- {
- market.Fakture[i] = new Faktura;
- Datum datum;
- datum.Unos(dan, mjesec, godina);
- market.Fakture[i]->Unos(datum);
- cout << "Faktura je 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
- //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
- void dodaj_stavku_fakture(Market & market, char * naziv, int kolicina)
- {
- Proizvod * temp = nullptr;
- //cuvanje lokacije od Proizvoda
- for (int i = 0; i < Max; i++)
- {
- if (strcmp(market.Proizvodi[i]->_naziv, naziv) == 0)
- {
- temp = market.Proizvodi[i];
- break;
- }
- }
- //trazimo posljednju kreiranu fakturu pa petlja ide u nazad
- for (int i = Max - 1; i >= 0; i--)
- {
- if (market.Fakture[i] != nullptr && temp != nullptr)
- {
- if (temp->_stanjeSkladista > kolicina)//ukoliko na skladistu nema unesene kolicine nemoj niti vrsiti dalje provjere (ne dodaji)
- {
- for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
- {
- //ako naziv tj. proizvod je vec unesen/dodan i nije storniran
- if ((strcmp(market.Fakture[i]->_stavke[j]->_proizvod->_naziv, naziv) == 0) && market.Fakture[i]->_stavke[j]->_stornirana == false)
- {
- //potrebno je uvecati njegovu kolicinu i njegovu kolicinu na skladistu umanjiti za kolicinu stavke
- market.Fakture[i]->_stavke[j]->_kolicina += kolicina;
- cout << "Isti proizvod pronadjen, kolicina je uvecana." << endl;
- temp->UkloniSaSkladista(kolicina);//umanjivanje kolicine na skladistu za kolicinu stavke
- return;
- }
- //stavka je vec dodana ranije, ali je i stornirana:
- if (market.Fakture[i]->_stavke[j]->_stornirana == true)
- {
- market.Fakture[i]->dodajStavkufakture(temp, kolicina);//dodaj novu stavku
- market.Fakture[i]->_stavke[j]->_stornirana = true; //ali moras zadrzati i storniranu
- temp->UkloniSaSkladista(kolicina);//uslov da prilikom dodavanja stavke mora se njena kolicina na skladistu umanjiti za kolicinu stavke
- cout << "Pronadjena stornirana stavka, dodana nova stavka." << endl;
- return;
- }
- }
- //dodavanje nove stavke
- market.Fakture[i]->dodajStavkufakture(temp, kolicina);
- temp->UkloniSaSkladista(kolicina);
- cout << "Stavka dodana na fakturu." << endl;
- 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, char * naziv)
- {
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] != nullptr)
- {
- for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
- {
- //provjera da li naziv stavke u sebi sadrzi primljeni STRING(strstr)
- if (strstr(market.Fakture[i]->_stavke[j]->_proizvod->_naziv, naziv) != 0)
- {
- //ako je uslov ispunjen tj stavka je nadjena dodaj je u skladiste i zadrzi storniranu
- market.Fakture[i]->_stavke[j]->_stornirana = true;
- market.Fakture[i]->_stavke[j]->_proizvod->DodajUSkladiste(market.Fakture[i]->_stavke[j]->_kolicina);
- cout << "Stavka stornirana i dodana u skladiste opet. " << endl;
- return true;
- }
- }
- }
- }
- return false;
- }
- /*
- 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
- -------------------------------------------
- */
- /*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*/
- bool printaj(Market & market)
- {
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] != nullptr)
- {
- if (market.Fakture[i]->_brojStavki == 0)
- {
- cout << "Faktura ne posjeduje niti jednu stavku... " << endl;
- return false;
- }
- }
- }
- cout << crt;
- cout << "Datum: ";
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] != nullptr)
- {
- market.Fakture[i]->_datum.Ispis();
- }
- }
- cout << crt;
- cout << "FAKTURA/RACUN";
- cout << crt;
- cout << "RB\tNaziv\tKol.\tCij.\tIznos" << endl;
- float suma = 0;
- float 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.Fakture[i]->_stavke[j]->_proizvod->_cijena*market.Fakture[i]->_stavke[j]->_kolicina;
- cout << j + 1 << "." << market.Fakture[i]->_stavke[j]->_proizvod->_naziv << "\t" <<
- market.Fakture[i]->_stavke[j]->_kolicina << "\t" <<
- market.Fakture[i]->_stavke[j]->_proizvod->_cijena << "\t" <<
- cijena;
- suma += cijena;
- cout << endl;
- }
- cout << crt;
- cout << "UKUPNO: \t\t\t" << suma;
- cout << crt;
- }
- }
- //*********************************************************** UPISIVANJE U .TXT
- char nazivFajla[20];
- strcpy_s(nazivFajla, "IB140261");
- strcat_s(nazivFajla, ".txt");
- ofstream upis(nazivFajla, ios::out);
- upis << crt;
- upis << "Datum: ";
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] != nullptr)
- {
- upis << market.Fakture[i]->_datum._dan << "." << market.Fakture[i]->_datum._mjesec << "." << market.Fakture[i]->_datum._godina << endl;
- }
- }
- upis << crt;
- upis << "FAKTURA/RACUN";
- upis << crt;
- upis << "RB\tNaziv\tKol.\tCij.\tIznos" << endl;
- float sumaUpisa = 0;
- float cijenaUpisa = 0;
- for (int i = 0; i < Max; i++)
- {
- if (market.Fakture[i] != nullptr)
- {
- for (int j = 0; j < market.Fakture[i]->_brojStavki; j++)
- {
- cijenaUpisa = market.Fakture[i]->_stavke[j]->_proizvod->_cijena*market.Fakture[i]->_stavke[j]->_kolicina;
- upis << j + 1 << "." << market.Fakture[i]->_stavke[j]->_proizvod->_naziv << "\t" <<
- market.Fakture[i]->_stavke[j]->_kolicina << "\t" <<
- market.Fakture[i]->_stavke[j]->_proizvod->_cijena << "\t" <<
- cijenaUpisa;
- sumaUpisa += cijenaUpisa;
- upis << endl;
- }
- upis << crt;
- upis << "UKUPNO: \t\t\t" << sumaUpisa;
- upis << crt;
- }
- }
- cout << ".txt fajl je spremljen pod nazivom: " << nazivFajla << 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);
- //cout << "Dodani podaci o proizvodu... " << endl;
- dodaj_proizvod(market, "Mlijeko (L)", 1.45, 5);//ne dodaje novi proizvod vec postojecem samo povecava kolicinu
- //cout << "Povecana kolicina proizvod... " << endl;
- dodaj_proizvod(market, "Jabuke (kg)", 1.25, 80.4);
- //cout << "Dodani podaci o proizvodu... " << endl;
- dodaj_proizvod(market, "Lubenica (kg)", 0.45, 189);
- //cout << "Dodani podaci o proizvodu... " << endl;
- //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