Advertisement
Guest User

Untitled

a guest
May 11th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.24 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. char * upisiTekst(const char * tekst) {
  5. if (tekst == nullptr)
  6. return nullptr;
  7.  
  8. int size = strlen(tekst) + 1;
  9. char * temp = new char[size];
  10.  
  11. strcpy_s(temp, size, tekst);
  12.  
  13. return temp;
  14.  
  15. }
  16.  
  17. //Klasa čuva podatke o jednom prodajnom artiklu
  18. class Artikal
  19. {
  20. char* _sifra;
  21. char* _naziv;
  22. double _cijena; //U cijenu nije uračunat PDV
  23. int _kolicina; //Stanje na skladištu
  24. public:
  25. Artikal() {
  26. _sifra = nullptr;
  27. _naziv = nullptr;
  28. _cijena = 0;
  29. _kolicina = 0;
  30. }
  31. //Potrebne konstruktor i destruktor funkcije
  32. Artikal(const char * sifra, const char * naziv, double cijena, int kolicina) {
  33. _sifra = upisiTekst(sifra);
  34. _naziv = upisiTekst(naziv);
  35. _cijena = cijena;
  36. _kolicina = kolicina;
  37. }
  38. Artikal(const Artikal & obj) {
  39. _sifra = upisiTekst(obj._sifra);
  40. _naziv = upisiTekst(obj._naziv);
  41. _cijena = obj._cijena;
  42. _kolicina = obj._kolicina;
  43. }
  44. Artikal operator=(const Artikal & obj) {
  45. if (this == &obj)
  46. return *this;
  47.  
  48. delete[]_sifra;
  49. delete[]_naziv;
  50.  
  51. _sifra = upisiTekst(obj._sifra);
  52. _naziv = upisiTekst(obj._naziv);
  53. _cijena = obj._cijena;
  54. _kolicina = obj._kolicina;
  55.  
  56. return *this;
  57. }
  58. ~Artikal() {
  59. delete[]_sifra;
  60. delete[]_naziv;
  61. }
  62. //Preklopiti operator-= na način da se stanje na skladištu artikla umanji za
  63. //proslijeđenu vrijednost.
  64. Artikal& operator-=(int kolicina) {
  65. this->_kolicina -= kolicina;
  66. return *this;
  67. }
  68.  
  69. //Preklopiti operator ++ na način da se količina artikala na stanju uveća za 1.
  70. Artikal& operator++() {
  71. this->_kolicina++;
  72. return *this;
  73. }
  74. //Preklopiti operator -- na način da se količina artikala na stanju umanji za 1.
  75. Artikal& operator--() {
  76. this->_kolicina--;
  77. return *this;
  78. }
  79. //Preklopiti operator== koji treba da uporedi artikle na osnovu njihove šifre.
  80. bool operator==(Artikal & obj) {
  81. return strcmp(this->_sifra, obj._sifra) == 0;
  82. }
  83. //Preklopiti operator za ispis podataka o artiklu.
  84. friend ostream& operator<<(ostream& COUT, Artikal obj) {
  85. COUT << obj._sifra << " - " << obj._naziv << " - " << obj._cijena << "KM" << " - ";
  86. return COUT;
  87. }
  88.  
  89. bool ImaNaStanju(int kolicina) {
  90. return this->_kolicina >= kolicina;
  91. }
  92. double GetCijena() {
  93. return _cijena;
  94. }
  95. bool jeIsti(const char * sifra) {
  96. if (sifra == nullptr && _sifra == nullptr)
  97. return true;
  98. else if (sifra != nullptr && _sifra != nullptr)
  99. return strcmp(_sifra, sifra) == 0;
  100. else
  101. return false;
  102. }
  103. int GetKolicina() {
  104. return _kolicina;
  105. }
  106. };
  107.  
  108. class StavkaRacuna
  109. {
  110. Artikal _artikal;
  111. int* _kolicina;
  112. public:
  113. StavkaRacuna() {
  114. _kolicina = nullptr;
  115. }
  116. //Potrebne konstruktor i destruktor funkcije
  117. StavkaRacuna(Artikal artikal, int kolicina) : _artikal(artikal) {
  118. _kolicina = new int(kolicina);
  119. }
  120. StavkaRacuna(const StavkaRacuna& obj) : _artikal(obj._artikal) {
  121. _kolicina = new int(*obj._kolicina);
  122. }
  123.  
  124. StavkaRacuna& operator=(const StavkaRacuna& obj) {
  125. if (this == &obj)
  126. return *this;
  127. delete _kolicina;
  128.  
  129. _artikal = obj._artikal;
  130. _kolicina = new int(*obj._kolicina);
  131.  
  132. return *this;
  133. }
  134. ~StavkaRacuna() {
  135. delete _kolicina;
  136. }
  137.  
  138. bool jeIstiArtikal(Artikal a) {
  139. return this->_artikal == a;
  140. }
  141. bool jeIstiArtikal(const char * sifra) {
  142. return _artikal.jeIsti(sifra);
  143. }
  144. //Preklopiti odgovarajuće operatore na osnovu potreba zadatka
  145. void UvecajKolicinu(int kolicina) {
  146. *_kolicina += kolicina;
  147. }
  148. double GetCijena() {
  149. return _artikal.GetCijena();
  150. }
  151. int GetKolicina() {
  152. return *_kolicina;
  153. }
  154. Artikal GetArtikal() {
  155. return _artikal;
  156. }
  157. void Ispis() {
  158. cout << _artikal <<*_kolicina <<"KOM"<<endl;
  159. }
  160. };
  161.  
  162. class Racun
  163. {
  164. int _brojRacuna;
  165. StavkaRacuna _stavke[100];
  166. int _brojStavki;
  167. double _iznosBezPDV;
  168. double _iznosSaPDV;
  169. bool _izdato;
  170.  
  171. public:
  172. Racun(int brojRacuna) {
  173. _brojRacuna = brojRacuna;
  174. _brojStavki = 0;
  175. _iznosBezPDV = 0;
  176. _iznosSaPDV = 0;
  177. _izdato = false;
  178. }
  179.  
  180. //Operator() - Dodaje nove artikle u stavke računa (ulazni parametri su artikal i količina), količina nije obavezni parametar;
  181. //Voditi računa o tome da li je račun već naplaćen;
  182.  
  183. //Ukoliko nema dovoljno artikala na stanju, potrebno ispisati odgovarajuću poruku;
  184.  
  185. //Ukoliko artikal već postoji potrebno je samo uvećati količinu za odgovarajuću stavku;
  186. //Prilikom svakog dodavanja novog artikla ažurirati vrijednosti atributa _iznosBezPDV i _iznosSaPDV.
  187.  
  188. void azurirajCijenu(double cijena, int kolicina) {
  189.  
  190. double ukupnacijena = cijena * kolicina;
  191. _iznosBezPDV += ukupnacijena;
  192. _iznosSaPDV += (ukupnacijena) + 0.17*ukupnacijena;
  193.  
  194. }
  195. void operator()(Artikal artikal, int kolicina = 1) {
  196. if (_izdato) {
  197. cout << "Racun je vec naplacen" << endl;
  198. return;
  199. }
  200. if (! artikal.ImaNaStanju(kolicina)) {
  201. cout << "Nemate dovoljno artikala na stanju" << endl;
  202. return;
  203. }
  204.  
  205. azurirajCijenu(artikal.GetCijena(), kolicina);
  206.  
  207.  
  208. for (int i = 0; i < _brojStavki; i++)
  209. {
  210. if (_stavke[i].jeIstiArtikal(artikal))
  211. {
  212. _stavke[i].UvecajKolicinu(kolicina);
  213. return;
  214. }
  215. }
  216.  
  217. StavkaRacuna stavka(artikal, kolicina);
  218. _stavke[_brojStavki] = stavka;
  219. _brojStavki++;
  220. }
  221. int lokacijaArtikla(const char * sifra) {
  222. for (size_t i = 0; i < _brojStavki; i++)
  223. {
  224. if (_stavke[i].jeIstiArtikal(sifra)) {
  225. return i;
  226. }
  227. }
  228.  
  229. return -1;
  230. }
  231. //Operator-= - Uklanja artikal sa računa na osnovu njegove šifre.
  232. void operator-=(const char *sifra) {
  233. int lokacija = lokacijaArtikla(sifra);
  234. if (lokacija == -1)
  235. return;
  236.  
  237. azurirajCijenu(_stavke[lokacija].GetCijena(), _stavke[lokacija].GetKolicina() * -1);
  238.  
  239. for (int i = lokacija; i < _brojStavki-1; i++)
  240. {
  241. _stavke[i] = _stavke[i + 1];
  242. }
  243. _brojStavki--;
  244. }
  245.  
  246. //Operator[] - Vraća stavku računa na osnovu šifre artikla
  247. StavkaRacuna operator[](const char * sifra) {
  248. int lokacija = lokacijaArtikla(sifra);
  249. return _stavke[lokacija];
  250. }
  251. //Operator/ - Zaračunava definisani popust na kompletan račun
  252. double operator/(float popust_u_postotku) {
  253. return _iznosBezPDV * popust_u_postotku;
  254. }
  255. //Operator+ - Formira jedan račun na osnovu računa koji učestvuju u operaciji +.
  256. //Pri tome se u slučaju ponavljanja artikala mijenja samo količina;
  257. //Operator implementirati kao globalnu funkciju.
  258. friend Racun operator+(Racun obj1, Racun obj2) {
  259. Racun rezultat(obj1);
  260.  
  261. for (size_t i = 0; i < obj2._brojStavki; i++)
  262. {
  263. Artikal a = obj2._stavke[i].GetArtikal();
  264. int kolicina =obj2._stavke[i].GetKolicina();
  265. rezultat(a,kolicina);
  266. }
  267.  
  268. return rezultat;
  269. }
  270.  
  271. //Funkcija PrintRacun treba ispisati sve stavke računa zajedno sa iznosom za plaćanje;
  272. //Omogućiti da se unese iznos novca koji je klijent platio, a kao povratnu vrijednost funkcije vratiti iznos kusura.
  273. double PrintRacun() {
  274. for (int i = 0; i < _brojStavki; i++)
  275. {
  276. _stavke[i].Ispis();
  277. }
  278. return 0;
  279. }
  280.  
  281. };
  282.  
  283. void main()
  284. {
  285. Artikal mlijeko("mlijeko", "Mlijeko", 1.5, 10);
  286. Artikal sok("sok", "Sok Sprite", 2.5, 15);
  287. Artikal kruh("kruh", "Kruh bijeli", 1.5,15);
  288.  
  289.  
  290. Racun racun(53);
  291.  
  292. racun(mlijeko, 5);
  293. racun(mlijeko, 5);
  294.  
  295. racun(sok, 5);
  296. racun(sok, 3);
  297.  
  298. racun(kruh, 15);
  299.  
  300. racun -= "mlijeko";
  301. racun.PrintRacun();
  302. //Testirati sve dostupne funkcionalnosti
  303.  
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement