Advertisement
Guest User

Zadatak klasa

a guest
Dec 19th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.18 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class NedozvoljenaOperacija : public exception {
  5. int linijaKoda;
  6. public:
  7. NedozvoljenaOperacija(const char * poruka, int lin):exception(poruka), linijaKoda(lin){
  8. }
  9. void ErrorInfo() {
  10. cout << "Error: " << exception::what() << endl;
  11. cout << "Linija koda: " << linijaKoda << endl;
  12. }
  13. };
  14.  
  15. char * AlocirajNizKaraktera(const char * sadrzaj) {
  16. if (sadrzaj == nullptr)
  17. return nullptr;
  18.  
  19. int vel = strlen(sadrzaj) + 1;
  20. char * temp = new char[vel];
  21. strcpy_s(temp, vel, sadrzaj);
  22.  
  23. return temp;
  24. }
  25.  
  26. template<class T>
  27. class Kolekcija
  28. {
  29. T* _elementi;
  30. int _trenutno;
  31. public:
  32. //Kolekciju dopuniti u skladu sa potrebama zadatka
  33. Kolekcija()
  34. {
  35. _elementi = nullptr;
  36. _trenutno = 0;
  37. }
  38. ~Kolekcija()
  39. {
  40. delete[] _elementi;
  41. _elementi = nullptr;
  42. }
  43.  
  44. void AddElement(const T& el)
  45. {
  46. T* temp = new T[_trenutno + 1];
  47. for (int i = 0; i < _trenutno; i++)
  48. {
  49. temp[i] = _elementi[i];
  50. }
  51.  
  52. delete[] _elementi;
  53. _elementi = temp;
  54.  
  55. _elementi[_trenutno++] = el;
  56. }
  57.  
  58. int GetTrenutno()const { return _trenutno; }
  59.  
  60. T& operator[](int index)
  61. {
  62. if (index < 0 || index >= _trenutno)
  63. throw NedozvoljenaOperacija("Index nije validan", __LINE__);
  64. return _elementi[index];
  65. }
  66.  
  67. friend ostream& operator<<(ostream&, const Kolekcija&);
  68. };
  69.  
  70. template<class T>
  71. ostream& operator<<(ostream& cout, const Kolekcija<T>& kol)
  72. {
  73. for (int i = 0; i < kol._trenutno; i++)
  74. {
  75. cout << kol._elementi[i] << endl;
  76. }
  77.  
  78. return cout;
  79. }
  80.  
  81. //Kataloška prodaja
  82. class Proizvod{
  83. protected:
  84. char _sifra[10];
  85. char* _naziv;
  86. double _cijena;
  87. double _popust; //Izrazen procentualno
  88. //Dostupno proizvoda
  89. int _kolicina;
  90. public:
  91. //Konstruktor i destruktor funkcije
  92. Proizvod(const char* sifra="00", const char* naziv="no_value", double cijena = 0, int kolicina= 0 )
  93. {
  94. //U slučaju nedozvoljenih vrijednosti za cijenu, popust i količinu baciti izuzetak
  95. if (cijena < 0 || naziv == nullptr || kolicina < 0)
  96. throw NedozvoljenaOperacija("Greska u validaciji podataka", __LINE__);
  97. strncpy_s(_sifra, sifra, _TRUNCATE);
  98.  
  99. _naziv = AlocirajNizKaraktera(naziv);
  100.  
  101. _cijena = cijena;
  102. _kolicina = kolicina;
  103. _popust = 0;
  104. }
  105. Proizvod(Proizvod &p) {
  106. /*if (p._cijena < 0 || p._naziv == nullptr || p._kolicina < 0)
  107. throw NedozvoljenaOperacija("Greska u validaciji podataka", __LINE__);*/
  108.  
  109. strncpy_s(_sifra, p._sifra, _TRUNCATE);
  110.  
  111. _naziv = AlocirajNizKaraktera(p._naziv);
  112.  
  113. _cijena = p._cijena;
  114. _kolicina = p._kolicina;
  115. _popust = p._popust;
  116. }
  117. Proizvod &operator=(Proizvod &p) {
  118. if (p._cijena < 0 || p._naziv == nullptr || p._kolicina < 0)
  119. throw NedozvoljenaOperacija("Greska u validaciji podataka", __LINE__);
  120. strncpy_s(_sifra, p._sifra, _TRUNCATE);
  121.  
  122. _naziv = AlocirajNizKaraktera(p._naziv);
  123.  
  124. _cijena = p._cijena;
  125. _kolicina = p._kolicina;
  126. _popust = p._popust;
  127. return *this;
  128. }
  129. bool operator==(Proizvod p) {
  130. return strcmp(_sifra, p._sifra) == 0;
  131. }
  132. ~Proizvod()
  133. {
  134. delete[] _naziv;
  135. _naziv = nullptr;
  136. }
  137. virtual void Info() {
  138. cout << "Sifra: " << _sifra << endl;
  139. cout << "Naziv: " << _naziv << endl;
  140. cout << "Cijena: " << _cijena << endl;
  141. if (_popust == 0)
  142. cout << "Zao nam je ali nema popusta." << endl;
  143. else
  144. cout << "Popust: " << _popust << endl;
  145. cout << "Kolicina: " << _kolicina << endl;
  146. }
  147. //Implementirati potrebne funkcije za rad sa klasom
  148. };
  149.  
  150. //Implementirati nasljeđivanje
  151. class Odjeca : public Proizvod
  152. {
  153. Kolekcija<char*> _velicine;
  154. Kolekcija<char*> _boje;
  155. char _kategorija[50];
  156. public:
  157. Odjeca(const char* sifra, const char* naziv, double cijena, int kolicina, const char *kategorija) :
  158. Proizvod(sifra, naziv, cijena, kolicina)
  159. {
  160. strncpy_s(_kategorija, kategorija, _TRUNCATE);
  161. }
  162. Odjeca(Odjeca &o): Proizvod (o)
  163. {
  164. char * tempVelicina= nullptr;
  165. char * tempBoja = nullptr;
  166. strncpy_s(_kategorija, o._kategorija, _TRUNCATE);
  167. for (int i = 0; i < o._velicine.GetTrenutno(); i++)
  168. {
  169. tempVelicina = AlocirajNizKaraktera(o._velicine[i]);
  170. if (tempVelicina == nullptr)
  171. throw NedozvoljenaOperacija("Nema podataka", __LINE__);
  172. _velicine.AddElement(tempVelicina);
  173. }
  174. for (int i = 0; i < _boje.GetTrenutno(); i++)
  175. {
  176. tempBoja = AlocirajNizKaraktera(o._velicine[i]);
  177. if (tempBoja == nullptr)
  178. throw NedozvoljenaOperacija("Nema podataka", __LINE__);
  179. _velicine.AddElement(tempBoja);
  180. }
  181. }
  182. Odjeca &operator= (Odjeca &o) {
  183. (Proizvod&)(*this) = o;
  184. char * tempVelicina = nullptr;
  185. char * tempBoja = nullptr;
  186. strncpy_s(_kategorija, o._kategorija, _TRUNCATE);
  187. for (int i = 0; i < o._velicine.GetTrenutno(); i++)
  188. {
  189. tempVelicina = AlocirajNizKaraktera(o._velicine[i]);
  190. if (tempVelicina == nullptr)
  191. throw NedozvoljenaOperacija("Nema podataka", __LINE__);
  192. _velicine.AddElement(tempVelicina);
  193. }
  194. for (int i = 0; i < _boje.GetTrenutno(); i++)
  195. {
  196. tempBoja = AlocirajNizKaraktera(o._velicine[i]);
  197. if (tempBoja == nullptr)
  198. throw NedozvoljenaOperacija("Nema podataka", __LINE__);
  199. _velicine.AddElement(tempBoja);
  200. }
  201.  
  202. }
  203. //Potrebne konstruktor i destruktor funkcije
  204. ~Odjeca()
  205. {
  206. for (int i = 0; i < _velicine.GetTrenutno(); i++)
  207. {
  208. delete _velicine[i];
  209. }
  210. for (int i = 0; i < _boje.GetTrenutno(); i++)
  211. {
  212. delete _boje[i];
  213. }
  214. }
  215. //Implementirati potrebne funkcije za rad sa klasom
  216. void AddVelicine(const char *element) {
  217. _velicine.AddElement(AlocirajNizKaraktera(element));
  218. }
  219. void AddBoje(const char *element) {
  220. _velicine.AddElement(AlocirajNizKaraktera(element));
  221. }
  222. };
  223.  
  224. class Katalog
  225. {
  226. char* _naslov;
  227. char* _vrijediDo; //Datum u formatu dd.MM.yyyy
  228. Kolekcija<Proizvod*> _proizvodi;
  229. public:
  230. //Potrebne konstruktor i destruktor funkcije
  231. bool DaLiJeBroj(const char broj) {
  232. if (isdigit(broj))
  233. return true;
  234. return false;
  235. }
  236. Katalog(const char* naslov, const char* vrijediDo)
  237. {
  238. /*for (size_t i = 0; i < strlen(vrijediDo); i++)
  239. {
  240. if (_vrijediDo[i] != '.' && !DaLiJeBroj(_vrijediDo[i]))
  241. throw NedozvoljenaOperacija("Nije ispravan datum", __LINE__);
  242. }*/
  243. //U slučaju da datum ne ispunjava zadati format baciti izuzetak
  244. _naslov = AlocirajNizKaraktera(naslov);
  245. _vrijediDo = AlocirajNizKaraktera(vrijediDo);
  246. }
  247.  
  248. ~Katalog()
  249. {
  250. delete[] _naslov;
  251. _naslov = nullptr;
  252.  
  253. delete[] _vrijediDo;
  254. _vrijediDo = nullptr;
  255.  
  256. for (size_t i = 0; i < _proizvodi.GetTrenutno(); i++)
  257. {
  258. delete _proizvodi[i];
  259. _proizvodi[i] = nullptr;
  260. }
  261. }
  262. bool DodajProizvode(Proizvod &p) {
  263. for (int i = 0; i < _proizvodi.GetTrenutno(); i++)
  264. {
  265. if (p == *_proizvodi[i])
  266. throw NedozvoljenaOperacija("Proizvodi imaju isti naziv", __LINE__);
  267.  
  268. }
  269. Odjeca * pok = dynamic_cast<Odjeca*>(&p);
  270. if (pok != nullptr)
  271. _proizvodi.AddElement(new Odjeca(*pok));
  272. else
  273. _proizvodi.AddElement(new Proizvod(p));
  274. }
  275. //Kreirati funkciju za dodavanje proizvoda u katalog i pri tome provjeriti da li se radi
  276. //o objektu izvedene ili osnovne klase.
  277. //Onemogućiti dodavanje identičnih proizvoda u jedan katalog (proizvode razlikovati samo na osnovu šifre).
  278. //U slučaju pokušaja dodavanja istih proizvoda baciti izuzetak.
  279.  
  280. //Funkciju za uklanjanje proizvoda iz kataloga na osnovu šifre.
  281. //Ukoliko se ne pronađe traženi proizvod baciti izuzetak.
  282.  
  283. //Preklopiti operator za ispis kataloške ponude
  284. };
  285.  
  286. class Narudzba
  287. {
  288. int _broj;
  289. char* _datumIsporuke; //Datum u formatu dd.MM.yyyy
  290. Kolekcija<Proizvod*> _naruceniProizvodi;
  291. bool otkazana;
  292. public:
  293. //Potrebne konstruktor i destruktor funkcije
  294. //U slučaju da datum ne ispunjava zadati format baciti izuzetak.
  295.  
  296. //Kreirati funkciju za dodavanje proizvoda narudžbe sa povratnom vrijednošću tipa bool.
  297. //Ukoliko proizvod više nije dostupan baciti izuzetak.
  298. //Dozvoliti dodavanje istog proizvoda više puta.
  299.  
  300. //Funkciju za uklanjanje određenog proizvoda iz narudžbe. Voditi računa da narudžba može
  301. //imati više puta isti proizvod.
  302.  
  303. //Dodati funkciju za proračun ukupne cijene narudžbe.
  304. //Voditi računa o mogućnosti dodavanja više istih proizvoda (količina).
  305. //Uračunati popust u slučaju da je definisan.
  306.  
  307. //Preklopiti operator za ispis podataka o narudžbi zajedno sa cijenom.
  308. };
  309.  
  310. //U posljednjoj klasi samostalno prepoznati izuzetne situacije
  311. class Prodavac
  312. {
  313. char* _imePrezime;
  314. Kolekcija<Narudzba>* _narudzbe;
  315. public:
  316. //Potrebne konstruktor i destruktor funkcije
  317.  
  318. //Omogućiti dodavanje narudžbi za prodavača
  319.  
  320. //Omogućiti otkazivanje narudžbe na osnovu njenog broja.
  321.  
  322. //Ispis svih podataka o prodavaču i kratke informacije o
  323. //svim narudžbama (datum, broj proizvoda i cijena). Posebno izdvojiti otkazane narudžbe.
  324.  
  325. //Implementirati metodu koja u svim aktivnim narudžbama pronalazi proizvod koji se najviše prodavao
  326. //sa informacijom o tome da li se radi o odjeći ili osnovnom proizvodu.
  327.  
  328. };
  329.  
  330. int main()
  331. {
  332. //Dodati minimalno 5 proizvoda u katalog.
  333. //Ispisati ponudu kupcu
  334. //Omogućiti kreiranje narudžbe za jednog prodavača na osnovu izbora kupca.
  335. Proizvod p("123", "Cigare", 10, 10);
  336. Proizvod p1("123", "Cigare", 10, 10);
  337. Katalog k("Gloria", "12.1.2019");
  338. try
  339. {
  340.  
  341. }
  342. catch (NedozvoljenaOperacija &n)
  343. {
  344. n.ErrorInfo();
  345. }
  346.  
  347.  
  348.  
  349. system("pause");
  350. return 0;
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement