Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- 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 << " ";
- }
- };
- 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, strlen(naziv) + 1, naziv);
- _cijena = cijena;
- _stanjeSkladista = 0; //Proizvodi u skladistu
- }
- 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 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()
- {
- }
- };
- 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;
- }
- }
- };
- void dodaj_proizvod(Market &market, char*proizvod, float cijena, int kolicinaProizvoda) {
- for (int i = 0; i < Max; i++) {
- if (market.Proizvodi[i] != nullptr) { //Ispituje da li je nullirano sve kako treba
- if (strcmp(market.Proizvodi[i]->_naziv, proizvod) == 0) {
- market.Proizvodi[i]->DodajUSkladiste(kolicinaProizvoda); //Dodaje na skladište postojeceg proizvoda odgovarajuću kolicinu
- cout << "Kolicina " << market.Proizvodi[i]->_naziv << " iznosi " << market.Proizvodi[i]->_stanjeSkladista << endl;
- return;
- }
- }
- else if (market.Proizvodi[i] == nullptr) {
- market.Proizvodi[i] = new Proizvod; //Alocira prostor za novi proizvod
- market.Proizvodi[i]->Unos(proizvod, cijena); //Unosi novi proizvod
- //Potrebno je postaviti i početno stanje na skladištu!
- market.Proizvodi[i]->_stanjeSkladista = kolicinaProizvoda;
- cout << "Proizvod " << market.Proizvodi[i]->_naziv << " uspjesno dodan u listu proizvoda " << endl;
- return;
- }
- }
- }
- void kreiraj_fakturu(Market &market, int dan, int mjesec, int godina) {
- Datum date;
- date.Unos(dan, mjesec, godina);//Kreiramo novi element date, kako bismo ga proslijedili u funkciju Unos kao parametar
- //Nikako ne bi smio da uništavaš sve prethodne fakture!
- /*for (int i = 0; i < Max; i++) {
- if (market.Fakture[i] != nullptr) {//Ovdje sve postojeće fakture postavljaš na "nullptr", što svakako nije ideja
- market.Fakture[i] = nullptr;
- }
- else if (market.Fakture[i] == nullptr) {
- market.Fakture[i] = new Faktura;
- market.Fakture[i]->Unos(date);
- cout << "Faktura uspjesno dodana" << endl;
- return;
- }
- }*/
- //Na prvo slobodno mjesto umjetni novu fakturu (pravilno), a dodavanje stavke na posljednju dodanu fakturu je demonstrirano u funkciji "dodaj_stavku_na_fakturu"
- for (int i = 0; i < Max; i++) {
- if (market.Fakture[i] == nullptr) {
- market.Fakture[i] = new Faktura;
- market.Fakture[i]->Unos(date);
- cout << "Faktura uspjesno dodana" << 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*/
- void dodaj_stavku_fakture(Market &market, char*proizvod, int kolicinaStavke) {
- // Stavku dodajemo na posljednju dodanu fakturu, a ne na prvu koju pronađemo, stoga je potrebno da zapamtimo indeks posljednje dodane fakture
- int indeksPosljednjeFakture = -1;
- for (int i = 0; market.Fakture[i] != nullptr; i++)
- indeksPosljednjeFakture = i;
- //Ako nije pronađena niti jedna faktura (petlja nije uspjela postaviti indeks, odnosno promijeniti vrijednost promjenljive "indeksPosljednjeFakture", prekidamo rad funkcije
- if (indeksPosljednjeFakture == -1)
- return;
- //Treba da provjerimo da li navedeni proizvod postoji na skladištu u željenoj količini
- for(int i = 0; market.Proizvodi[i] != nullptr; i++)
- if (strcmp(market.Proizvodi[i]->_naziv, proizvod) == 0) //Ako se radi o proizvodu koji dodajemo
- {
- if (market.Proizvodi[i]->_stanjeSkladista < kolicinaStavke) //Nema dovoljno na skladištu, ispisujemo grešku i prekidamo funkciju
- {
- cout << "GRESKA: Na skladistu nema dovoljno proizvoda \"" << proizvod << "\"..." << endl;
- return;
- }
- //U suprotnom, u skladištu umanjujemo stanje za proslijeđenu količinu
- market.Proizvodi[i]->UkloniSaSkladista(kolicinaStavke);
- int trenutnoStavki = market.Fakture[indeksPosljednjeFakture]->_brojStavki;
- //Sada treba da provjerimo da li se navedeni proizvod već nalazi u stavkama fakture, ako postoji - samo uvećavamo količinu
- for (int j = 0; j < trenutnoStavki; j++)
- if (market.Fakture[indeksPosljednjeFakture]->_stavke[j]->_proizvod == market.Proizvodi[i]) //Poredimo adrese pokazivača!
- {
- market.Fakture[indeksPosljednjeFakture]->_stavke[j]->_kolicina += kolicinaStavke;
- cout << "Proizvod \"" << proizvod << "\" vec postoji na fakturi, uvecavam kolicinu za " << kolicinaStavke << "!" << endl;
- return;
- }
- //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
- //Prvo treba da "proširimo" niz pokazivača na stavke faktura i da u novoprošireni niz preusmjerimo pokazivače iz originalnog
- StavkaFakture** tempStavke = new StavkaFakture*[trenutnoStavki + 1];
- for (int i = 0; i < trenutnoStavki; i++)
- tempStavke[i] = market.Fakture[indeksPosljednjeFakture]->_stavke[i]; //Preusmjeravamo pokazivače
- delete[] market.Fakture[indeksPosljednjeFakture]->_stavke; //Brišemo stari pokazivač na niz pokazivača
- market.Fakture[indeksPosljednjeFakture]->_stavke = tempStavke; //Preusmjeravamo pokazivač na pokazivač "stavke" na novi pokazivač na pokazivač "tempStavke" koji ima prostora za još jednu stavku
- //Dodajemo novu stavku (psoljeđujemo adresu proizvoda koji smo pronašli na skladištu, ne pravimo novi proizvod s "new" operatorom)
- market.Fakture[indeksPosljednjeFakture]->_stavke[trenutnoStavki] = new StavkaFakture;
- market.Fakture[indeksPosljednjeFakture]->_stavke[trenutnoStavki]->Unos(market.Proizvodi[i], kolicinaStavke);
- market.Fakture[indeksPosljednjeFakture]->_brojStavki++; //Uvećavamo broj stavki
- //Ispisujemo poruku o uspješnosti i prekidamo funkciju
- cout << "Proizvod \"" << proizvod << "\" je uspjesno dodan na fakturu u kolicini " << kolicinaStavke << "!" << endl;
- return;
- }
- //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
- cout << "GRESKA: Proizvod \"" << proizvod << "\" ne postoji na skladistu!" << endl;
- return;
- }
- void main() {
- Proizvod p;
- p.Unos("Cigare", 1.20);
- StavkaFakture F;
- F.Unos(&p, 5);
- F.Ispis();
- 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);
- cout << crt;
- //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();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement