Advertisement
Guest User

Untitled

a guest
Jan 16th, 2017
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.54 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. template<class T1, class T2>
  5. class Kolekcija
  6. {
  7. T1* _elementi1;
  8. T2* _elementi2;
  9. int _trenutno;
  10. public:
  11. Kolekcija()
  12. {
  13. _trenutno = 0;
  14. _elementi1 = nullptr;
  15. _elementi2 = nullptr;
  16. }
  17. T1& getElement1(int i) { return _elementi1[i]; }
  18. T2& getElement2(int i) { return _elementi2[i]; }
  19. void setE2(int i, T2& kolicina) {
  20. _elementi2[i] += kolicina;
  21. }
  22.  
  23. ~Kolekcija()
  24. {
  25. delete[] _elementi1;
  26. _elementi1 = nullptr;
  27.  
  28. delete[] _elementi2;
  29. _elementi2 = nullptr;
  30. }
  31. Kolekcija& operator=(const Kolekcija& original) {
  32. _trenutno = original._trenutno;
  33.  
  34. delete[] _elementi1;
  35. delete[] _elementi2;
  36.  
  37. _elementi1 = new T1[_trenutno];
  38. _elementi2 = new T2[_trenutno];
  39.  
  40. for (int i = 0; i < _trenutno; i++)
  41. {
  42. _elementi1[i] = original._elementi1[i];
  43. _elementi2[i] = original._elementi2[i];
  44. }
  45. return *this;
  46. }
  47.  
  48. void DodajElemente(T1& el1, T2& el2)
  49. {
  50. T1* temp1 = new T1[_trenutno + 1];
  51. T2* temp2 = new T2[_trenutno + 1];
  52.  
  53. for (int i = 0; i < _trenutno; i++)
  54. {
  55. temp1[i] = _elementi1[i];
  56. temp2[i] = _elementi2[i];
  57. }
  58.  
  59. delete[] _elementi1;
  60. delete[] _elementi2;
  61.  
  62. _elementi1 = temp1;
  63. _elementi2 = temp2;
  64.  
  65. _elementi1[_trenutno] = el1;
  66. _elementi2[_trenutno] = el2;
  67. _trenutno++;
  68. }
  69.  
  70. int GetTrenutno() const { return _trenutno; }
  71.  
  72. friend ostream& operator<<<>(ostream&, const Kolekcija&);
  73. };
  74. template<class T1, class T2>
  75. ostream& operator<<<>(ostream& cout, const Kolekcija<T1, T2>& k)
  76. {
  77. for (int i = 0; i < k._trenutno; i++)
  78. {
  79. cout << *k._elementi1[i] << "\t" << k._elementi2[i] << endl;
  80. }
  81.  
  82. return cout;
  83. }
  84.  
  85.  
  86. //U programu implementirati nasljeđivanje između odgovarajućih klasa
  87. //Klasu Osoba deklarisati kao apstraktnu.
  88. class Osoba
  89. {
  90. public:
  91. char* _ime;
  92. char* _prezime;
  93. char* _adresa;
  94. char _telefon[15];
  95. public:
  96.  
  97. Osoba(char* ime, char* prezime, char* adresa, char* telefon)
  98. {
  99. int vel = strlen(ime) + 1;
  100. _ime = new char[vel];
  101. strcpy_s(_ime, vel, ime);
  102.  
  103. vel = strlen(prezime) + 1;
  104. _prezime = new char[vel];
  105. strcpy_s(_prezime, vel, prezime);
  106.  
  107. vel = strlen(adresa) + 1;
  108. _adresa = new char[vel];
  109. strcpy_s(_adresa, vel, adresa);
  110.  
  111. strcpy_s(_telefon, 15, telefon);
  112. }
  113.  
  114. virtual ~Osoba()
  115. {
  116. delete[] _ime;
  117. _ime = nullptr;
  118. delete[] _prezime;
  119. _prezime = nullptr;
  120. delete[] _adresa;
  121. _adresa = nullptr;
  122. }
  123.  
  124. void Info()
  125. {
  126. cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
  127. cout << "Adresa: " << _adresa << endl;
  128. cout << "Telefon: " << _telefon << endl;
  129. }
  130. };
  131.  
  132. class Proizvod
  133. {
  134. char* _naziv;
  135. char* _opis;
  136. double _cijena;
  137. public:
  138. double getCijena() { return _cijena; }
  139. Proizvod(char* naziv, char* opis, double cijena)
  140. {
  141. int vel = strlen(naziv) + 1;
  142. _naziv = new char[vel];
  143. strcpy_s(_naziv, vel, naziv);
  144.  
  145. vel = strlen(opis) + 1;
  146. _opis = new char[vel];
  147. strcpy_s(_opis, vel, opis);
  148.  
  149. _cijena = cijena;
  150. }
  151. bool operator==(const Proizvod& p) {
  152. return(strcmp(p._naziv, _naziv) == 0 && _cijena == p._cijena);
  153. }
  154.  
  155. ~Proizvod()
  156. {
  157. delete[] _naziv;
  158. _naziv = nullptr;
  159.  
  160. delete[] _opis;
  161. _opis = nullptr;
  162. }
  163.  
  164. friend ostream& operator<<(ostream&, const Proizvod&);
  165.  
  166. };
  167. ostream& operator<<(ostream& cout, const Proizvod& p)
  168. {
  169. cout << "Naziv: " << p._naziv << endl;
  170. cout << "Opis: " << p._opis << endl;
  171. cout << "Cijena: " << p._cijena << endl;
  172.  
  173. return cout;
  174. }
  175. class Narudzba {
  176. char _datum[12]; //Format: dd.MM.yyyy.
  177. Kolekcija<Proizvod*, int> _proizvodi; //Podaci o naručenim proizvodima i količinama
  178. public:
  179. //Potrebne osnovne funkcije za rad sa klasom
  180. Narudzba(char *datum = "28.2.1997.") {
  181. strncpy_s(_datum, 12, datum, _TRUNCATE);
  182. }
  183. Narudzba& operator=(const Narudzba& original) {
  184. strncpy_s(_datum, 12, original._datum, _TRUNCATE);
  185. _proizvodi = original._proizvodi;
  186. return *this;
  187. }
  188. void DodajProizvod(Proizvod* p, int kolicina) {
  189. for (int i = 0; i < _proizvodi.GetTrenutno(); i++)
  190. {
  191. if (*p == *_proizvodi.getElement1(i))//zasto ovdje treba dereferencirati element1
  192. {
  193. _proizvodi.setE2(i, kolicina);
  194. return;
  195. }
  196. }
  197. _proizvodi.DodajElemente(p, kolicina);
  198.  
  199. }
  200. bool operator==(int mjesec) {
  201. char temp[7];
  202. strcpy_s(temp, 7, ".");
  203. _itoa_s(mjesec, temp + 1, 6, 10);
  204. strcat_s(temp, 7, ".");
  205. return (strstr(_datum, temp) != nullptr);
  206. }
  207.  
  208. //Funkciju GetIznosNarudzbe koja vraća ukupan iznos narudžbe na osnovu
  209. //podataka o cijenama proizvoda i naručenim količinama. Funkcija prima neobavezni parametar popust
  210. //koji inicijalno ima vrijednost 0, što znači da ne postoji popust na postojeće cijene proizvoda.
  211. double GetIznosNarudzbe(double popust = 0) {
  212. double suma = 0;
  213. for (int i = 0; i < _proizvodi.GetTrenutno(); i++)
  214. {
  215. suma += _proizvodi.getElement1(i)->getCijena()*_proizvodi.getElement2(i);
  216.  
  217. }
  218. return suma - (suma*popust);
  219.  
  220.  
  221. }
  222.  
  223. //Funkciju za ispis svih vrijednosti atributa klase.
  224. friend ostream& operator<<(ostream& cout, Narudzba& n);
  225.  
  226. };
  227. ostream& operator<<(ostream& cout, Narudzba& n) {
  228. cout << "Datum:" << n._datum << endl;
  229. cout << "Narudzba" << n._proizvodi << endl;
  230.  
  231. return cout;
  232. }
  233.  
  234.  
  235. class Klijent :public Osoba
  236. {
  237. protected:
  238. static int brojac;
  239. int _id;
  240. char* _email;
  241. Kolekcija<Narudzba, double> _narudzbe; //Podaci o narudžbama sa ukupnim utrošenim iznosom u KM
  242. public:
  243. //Potrebne konstruktor i destruktor funkcije.
  244. Klijent(char* ime, char* prezime, char* adresa, char* telefon,char *email)
  245. :Osoba(ime, prezime, adresa, telefon)
  246. {
  247. //_id = id;
  248. _id = brojac++;
  249. int size = strlen(email) + 1;
  250. _email = new char[size];
  251. strcpy_s(_email, size, email);
  252. }
  253. ~Klijent() {
  254. if (_email != nullptr) {
  255. delete[] _email;
  256. _email = nullptr;
  257. }
  258. }
  259.  
  260. //Funkciju za evidenciju nove narudžbe.
  261. void DodajNarudzbu(Narudzba n, double iznos) {
  262. _narudzbe.DodajElemente(n, iznos);
  263. }
  264.  
  265. //Funkciju koja vraća logičku vrijednost true ukoliko je klijent za odabrani mjesec u godini imao
  266. //potrošnju veću od zadate. Prototip funkcije: bool IsPotrosnjaVeca(int mjesec, double potrosnja);
  267. //Za pronalazak potrosnje po mjesecima koristiti podatak o datumu narudžbe.
  268. bool IsPotrosnjaVeca(int mjesec, double potrosnja) {
  269. double suma = 0;
  270. for (int i = 0; i < _narudzbe.GetTrenutno(); i++)
  271. {
  272. if (_narudzbe.getElement1(i) == mjesec)
  273. suma += _narudzbe.getElement2(i);
  274. }
  275. return(suma > potrosnja);
  276. }
  277.  
  278. //Funkciju za izmjenu e-mail adrese.
  279. void ChangeEmail(char* novi) {
  280. delete[]_email;
  281. _email = new char[strlen(novi) + 1];
  282. strcpy_s(_email, strlen(novi) + 1, novi);
  283. }
  284.  
  285. //Funkciju za ispis svih vrijednosti atributa klase.
  286. friend ostream& Klijent(ostream& cout, Klijent& kl) {
  287. Osoba *pok = static_cast<Osoba*>(&kl);
  288. pok->Info();
  289. cout << "ID:" << kl._id << endl;
  290. cout << "Email:" << kl._email << endl;
  291. cout << "Narudzbe:" << kl._narudzbe << endl;
  292. return cout;
  293. }
  294.  
  295. };
  296. int Klijent::brojac = 1;
  297.  
  298.  
  299.  
  300. class VIPKlijent
  301. {
  302. char* _parkingOznaka;
  303. double _popust;
  304. public:
  305. //Potrebne konstruktor i destruktor funkcije
  306.  
  307. //Funkciju za evidenciju nove narudžbe sa zaračunatim popustom na sve proizvode.
  308.  
  309. //Funkciju koja posljednjoj narudžbi klijenta dodaje gratis proizvod proslijeđen kao parametar.
  310.  
  311. //Funkciju za ispis svih vrijednosti atributa klase
  312.  
  313. };
  314.  
  315. //Funkcija treba da pronađe sve one klijente koji su za odabrani mjesec ostvarili potrošnju veću
  316. //od zadate. Ispisati njihove podatke i vratiti ukupan broj pronađenih klijenata.
  317. int PronadjiKlijentePoPotrosnji(Osoba* niz[], int max);
  318.  
  319. //Pronaći sve VIP klijente, te im dodati gratis proizvod proslijeđen kao parametar.
  320. void UkljuciGratisProizvodVIPKlijentima(Osoba* niz[], int max, const Proizvod& p);
  321.  
  322. //Svim klijentima postaviti mail adresu u formatu: ime.prezime@firma.ba.
  323. void GenerisiMailAdreseKlijentima(Osoba* niz[], int max);
  324.  
  325. //Omogućiti pretragu klijenata po imenu ili prezimenu (ispisati informacije
  326. //o svim klijentima koji sadrže uneseni tekst u dijelu imena ili prezimena.
  327. void PronadjiKlijentePoImenuPrezimenu(Osoba* niz[], int max);
  328.  
  329. void main()
  330. {
  331. //Testirati sve dostupne funkcionalnosti uz obaveznu provjeru globalnih funkcija.
  332. //VIP klijentima sve narudžbe kreirati uz zaračunati popust pozivom odgovarajuće funkcije.
  333. Proizvod p1("cokolada", "crna", 1.5);
  334. Proizvod p3("cokolada", "crna", 1.5);
  335.  
  336. Proizvod p2("vino", "bijelo", 155);
  337. Narudzba n("5.5.2015.");
  338. n.DodajProizvod(&p1, 2);
  339. n.DodajProizvod(&p3, 2);
  340. cout << n.GetIznosNarudzbe();
  341. cout << n;
  342. Osoba *osobe[3];
  343. osobe[0] = new Klijent();
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354. system("pause>0");
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement