Advertisement
Zlaja7

Prvi zad uradjen

Jun 25th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4.  
  5. /*
  6. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  7. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  8. 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
  9. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  10. 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)
  11. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  12. */
  13. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  14. #pragma warning(disable:4996)
  15.  
  16. /*
  17. u nastavku je prikazan primjer fakture(računa) sa njenim stavkama, pri cemu je zanemaren porez
  18. -------------------------------------------
  19. Datum: 07.09.2017
  20. -------------------------------------------
  21. FAKTURA/RAČUN
  22. -------------------------------------------
  23. RB Naziv Kol. Cij. Iznos
  24. 1.Cokolada 10 1,5 15 BAM
  25. 2.Coca-Cola 2 1,2 2,4BAM
  26. 3.Cigarete 1 4,5 4,5BAM (Storno)
  27. -------------------------------------------
  28. UKUPNO: 17,4BAM
  29. -------------------------------------------
  30. */
  31. char * crt = "\n-------------------------------------------\n";
  32. struct Datum {
  33. int _dan;
  34. int _mjesec;
  35. int _godina;
  36. void Unos(int d, int m, int g) {
  37. _dan = d;
  38. _mjesec = m;
  39. _godina = g;
  40. }
  41. void Ispis() {
  42. cout << _dan << "." << _mjesec << "." << _godina << " ";
  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, naziv);
  52. _cijena = cijena;
  53. _stanjeSkladista = 0;
  54. }
  55. void DodajUSkladiste(float kolicina) {
  56. _stanjeSkladista += kolicina;
  57. }
  58. void UkloniSaSkladista(float kolicina) {
  59. _stanjeSkladista -= kolicina;
  60. }
  61. void Ispis() {
  62. cout << _naziv << ", cijena: " << _cijena << "KM, stanje: " << _stanjeSkladista << " " << endl;
  63. }
  64. };
  65.  
  66. struct StavkaFakture {
  67. float _kolicina;
  68. Proizvod* _proizvod; //_proizvod će pokazivati na adresu objekata tipa proizvod koja se nalaze u Market-u, pa nije potrebno vršiti nove alokacije
  69. bool _stornirana;
  70. void Unos(Proizvod* proizvod, float kolicina) {
  71. _kolicina = kolicina;
  72. _proizvod = proizvod;
  73. _stornirana = false;
  74. }
  75. float GetIznos() {
  76. return _kolicina * _proizvod->_cijena;
  77. }
  78. void Ispis() {
  79. cout << _proizvod->_naziv << "\t" << _kolicina << "\t" << _proizvod->_cijena << "\t" << GetIznos() << "BAM";
  80. if (_stornirana)
  81. cout << " Storno";
  82. cout << endl;
  83. }
  84. };
  85. struct Faktura {
  86. Datum _datum;
  87. StavkaFakture ** _stavke;//svaki put se dodaje po jedna stavka
  88. int _brojStavki;
  89. void Unos(Datum datum) {
  90. _datum = datum;
  91. _brojStavki = 0;
  92. _stavke = nullptr;
  93. }
  94. void DodajiStavke(Proizvod *p, float kolicina, bool stornirana)
  95. {
  96. StavkaFakture ** temp = new StavkaFakture*[_brojStavki + 1];
  97. for (int i = 0; i < _brojStavki; i++)
  98. {
  99. temp[i] = new StavkaFakture;
  100. temp[i]->Unos(_stavke[i]->_proizvod, _stavke[i]->_kolicina);
  101. temp[i]->_stornirana = _stavke[i]->_stornirana;
  102. delete _stavke[i]; _stavke[i] = nullptr;
  103. }
  104. delete[]_stavke; _stavke = nullptr;
  105. temp[_brojStavki] = new StavkaFakture;
  106. temp[_brojStavki]->Unos(p, kolicina);
  107. temp[_brojStavki]->_stornirana = stornirana;
  108. _stavke = temp;
  109. _brojStavki++;
  110.  
  111. }
  112. /*iznos fakture izracunati koristeci lambda funkciju koja se poziva putem objekta
  113. tipa auto. u iznos fakture ne racunati stornirane stavke*/
  114. float GetIznosSuma()
  115. {
  116. return 0;
  117. }
  118. };
  119. const int Max = 100;
  120.  
  121. /*unutar objekta tipa Market ce se cuvati svi dostupni proizvodi i sve fakture koje se dodaju putem globalnih funkcija */
  122. struct Market {
  123. //umjesto brojaca koristite default.ne vrijednosti
  124. Proizvod* Proizvodi[Max] = { NULL };
  125. Faktura* Fakture[Max] = { NULL };
  126.  
  127. void Dealociraj() {
  128. for (size_t i = 0; i < Max; i++) {
  129. delete Proizvodi[i]; Proizvodi[i] = NULL;
  130. }
  131. for (size_t i = 0; i < Max; i++) {
  132. delete Fakture[i]; Fakture[i] = NULL;
  133. }
  134. }
  135. };
  136. void dodaj_proizvod(Market &m, char *nazivProizvoda, float cijena, float kolicina) {
  137. for (int i = 0; i < Max; i++)
  138. {
  139. if (m.Proizvodi[i] != nullptr)
  140. {
  141. if (strcmp(m.Proizvodi[i]->_naziv, nazivProizvoda) == 0)
  142. {
  143. m.Proizvodi[i]->DodajUSkladiste(kolicina);
  144. return;
  145. }
  146. }
  147. if (m.Proizvodi[i] == nullptr) {
  148. m.Proizvodi[i] = new Proizvod;
  149. m.Proizvodi[i]->Unos(nazivProizvoda, cijena);
  150. m.Proizvodi[i]->DodajUSkladiste(kolicina);
  151. return;
  152. }
  153. }
  154.  
  155. }
  156. void kreiraj_fakturu(Market &m, int dan, int mjesec, int godina) {
  157. Datum d;
  158. for (int i = 0; i < Max; i++)
  159. {
  160. if (m.Fakture[i] == nullptr)
  161. {
  162. m.Fakture[i] = new Faktura;
  163. d.Unos(dan, mjesec, godina);
  164. m.Fakture[i]->Unos(d);
  165. return;
  166. }
  167. }
  168. }
  169. void dodaj_stavku_fakture(Market &m, char *nazivProizvoda, float kolicina)
  170. {
  171. Proizvod *p = nullptr;
  172. for (int i = 0; i < 100; i++)
  173. {
  174. if (strcmp(m.Proizvodi[i]->_naziv, nazivProizvoda) == 0) {
  175. p = m.Proizvodi[i];
  176. break;
  177. }
  178. }
  179. if (p == nullptr) {
  180. return;
  181. }
  182. if (p->_stanjeSkladista == 0)
  183. {
  184. return;
  185. }
  186.  
  187. for (int i = Max - 1; i >= 0; i--)
  188. {
  189.  
  190. if (m.Fakture[i] != nullptr)
  191. {
  192. for (int j = 0; j < m.Fakture[i]->_brojStavki; j++)
  193. {
  194. if (strcmp(m.Fakture[i]->_stavke[j]->_proizvod->_naziv, nazivProizvoda) == 0)
  195. {
  196.  
  197. m.Fakture[i]->_stavke[j]->_proizvod->UkloniSaSkladista(kolicina);
  198. m.Fakture[i]->_stavke[j]->_kolicina += kolicina;
  199. return;
  200. }
  201. if (strcmp(m.Fakture[i]->_stavke[j]->_proizvod->_naziv, nazivProizvoda) && m.Fakture[i]->_stavke[j]->_stornirana == true)
  202. {
  203. m.Fakture[i]->DodajiStavke(p, kolicina, false);
  204. m.Fakture[i]->_stavke[j]->_proizvod->UkloniSaSkladista(kolicina);
  205. return;
  206. }
  207.  
  208. }
  209. m.Fakture[i]->DodajiStavke(p, kolicina, false);
  210. p->UkloniSaSkladista(kolicina);
  211. return;
  212. }
  213. }
  214. }
  215. bool storniraj_stavku(Market &m, char *sadrzaj)
  216. {
  217. bool jeste = false;
  218. for (int i = Max-1; i >= 0; i--)
  219. {
  220. if (m.Fakture[i] != nullptr)
  221. {
  222.  
  223. for (int j = 0; j < m.Fakture[i]->_brojStavki; j++)
  224. {
  225.  
  226. if (strstr(m.Fakture[i]->_stavke[j]->_proizvod->_naziv, sadrzaj) != 0)
  227. {
  228. m.Fakture[i]->_stavke[j]->_stornirana = true;
  229. m.Fakture[i]->_stavke[j]->_proizvod->DodajUSkladiste(m.Fakture[i]->_stavke[j]->_kolicina);
  230. jeste = true;
  231. }
  232. }
  233. }
  234.  
  235. }
  236. if (jeste == true) {
  237. return true;
  238. }
  239. return false;
  240. }
  241. bool printaj(Market &m) {
  242. bool provjeravajStorniran = false;
  243. for (int i = 0; i < Max; i++)
  244. {
  245. if (m.Fakture[i] != nullptr) {
  246. if (m.Fakture[i]->_brojStavki == 0) {
  247. return false;
  248. }
  249. }
  250. }
  251. for (int i = 0; i < Max; i++)
  252. {
  253. if (m.Fakture[i] != nullptr) {
  254. for (int j = 0; j < m.Fakture[i]->_brojStavki; j++)
  255. {
  256. if (m.Fakture[i]->_stavke[j]->_stornirana == true)
  257. {
  258. provjeravajStorniran == true;
  259. }
  260. if (provjeravajStorniran == true) {
  261. return false;
  262. }
  263. }
  264. }
  265. }
  266. cout << "Faktura " << endl;
  267. ofstream upis("IB170140.txt");
  268. int ukupno = 0;
  269. for (int i = 0; i < Max; i++)
  270. {
  271. if (m.Fakture[i] != nullptr)
  272. {
  273. m.Fakture[i]->_datum.Ispis();
  274. upis << m.Fakture[i]->_datum._dan << "." << m.Fakture[i]->_datum._mjesec << "." << m.Fakture[i]->_datum._godina << endl;
  275. for ( int j = 0; j < m.Fakture[i]->_brojStavki; j++)
  276. {
  277. m.Fakture[i]->_stavke[j]->Ispis();
  278. upis << "Naziv " << m.Fakture[i]->_stavke[j]->_proizvod->_naziv << endl;
  279. upis << "Cijena " << m.Fakture[i]->_stavke[j]->_proizvod->_cijena << endl;
  280. upis << "Kolicina " << m.Fakture[i]->_stavke[j]->_kolicina << endl;
  281. upis << "Iznos " << m.Fakture[i]->_stavke[j]->GetIznos();
  282. if (m.Fakture[i]->_stavke[j]->_stornirana) {
  283. upis << "Storno " << endl;
  284. }
  285.  
  286. }
  287. }
  288. }
  289. return true;
  290.  
  291. }
  292. void main() {
  293.  
  294. Market market;
  295.  
  296. /*dodaje podatke o novom proizvodu u market */
  297. //market, naziv, cijena, i kolicina
  298. dodaj_proizvod(market, "Mlijeko (L)", 1.45, 50);
  299. dodaj_proizvod(market, "Mlijeko (L)", 1.45, 5);//ne dodaje novi proizvod vec postojecem samo povecava kolicinu
  300. dodaj_proizvod(market, "Jabuke (kg)", 1.25, 80.4);
  301. dodaj_proizvod(market, "Lubenica (kg)", 0.45, 189);
  302. /*market.Proizvodi[0]->Ispis();
  303. market.Proizvodi[1]->Ispis();
  304. market.Proizvodi[2]->Ispis();*/
  305.  
  306. /*market, datum*/
  307. kreiraj_fakturu(market, 6, 9, 2017);
  308. /*market.Fakture[0]->_datum.Ispis();*/
  309.  
  310. /*dodaje stavku na posljednje kreiranu fakturu, a kolicina prve stavke (proizvoda) je 3.
  311. prilikom dodavanja stavke, njenu kolicinu na skladistu umanjiti za kolicinu stavke.
  312. onemoguciti dodavanje proizvoda u slucaju da na skladistu ne postoji unesena kolicina proizvoda.
  313. u slucaju da je nova stavka vec dodana, na fakturi je potrebno samo uvecati njenu kolicinu
  314. (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).
  315. 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
  316. (u prethodnom primjeru, ako je stavka Cokolada x 2 stornirana, te se ponovo pokusa dodati stavka Cokolada x 1,
  317. onda ce na fakturi biti obe stavke istog proizvoda pri cemu je jedna stornirana a druga nije)*/
  318. dodaj_stavku_fakture(market, "Mlijeko (L)", 3);
  319. dodaj_stavku_fakture(market, "Mlijeko (L)", 2);//na fakturi, stavka Mlijeko bi sada trebala imati kolicinu 5, a na skladistu (55 - 5 = 50)
  320. dodaj_stavku_fakture(market, "Lubenica (kg)", 5);
  321. /*market.Fakture[0]->_stavke[1]->_proizvod->Ispis();*/
  322. kreiraj_fakturu(market, 7, 9, 2017);
  323. dodaj_stavku_fakture(market, "Jabuke (kg)", 5);//naredne stavke se dodaju na novu fakturu
  324. dodaj_stavku_fakture(market, "Lubenica (kg)", 3);
  325. /*stornira sve stavke fakture koje u nazivu sadrze vrijednost parametra npr. "Lub".
  326. u slucaju storniranja stavke (posto se uklanja sa fakture), uvecati (vratiti na stanje prije kupovine tj. dodavanja proizvoda)
  327. stanje na skladistu konkretnog proizvoda za vrijednost _kolicina*/
  328. if (storniraj_stavku(market, "Lub"))
  329. cout << "Stavka uspjesno stornirana!" << endl;
  330. if (!storniraj_stavku(market, "TEST"))
  331. cout << "Trazena stavka ne postoji na fakturi!" << endl;
  332. /*funkcija printaj prikazuje posljednju fakturu u formatu prikazanom na pocetku zadatka. pored prikazivanja,
  333. identican sadrzaj fakture je potrebno sacuvati unutar tekstualnog fajla koji ce biti imenovan sa vasBrojIndeksa.txt npr. IB150051.txt.
  334. prikaz i spasavanje fakture se nece desiti u slucaju da faktura ne
  335. posjeduje niti jednu stavku ili su sve stavke stornirane*/
  336. if (printaj(market))
  337. cout << "Faktura uspjesno prikazana i sacuvana!" << endl;
  338. market.Dealociraj();
  339. system("pause ");
  340. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement