Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.66 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.  
  18. ~Kolekcija()
  19. {
  20. delete[] _elementi1;
  21. _elementi1 = nullptr;
  22. delete[] _elementi2;
  23. _elementi2 = nullptr;
  24. }
  25.  
  26. void DodajElemente( T1& el1, T2& el2)
  27. {
  28. T1* temp1 = new T1[_trenutno + 1]; //ovdje ce se praviti niz narudzbi, zato treba defalutni konstruktor //Proizvod** temp1 = new Proizvod*[t+1];
  29. T2* temp2 = new T2[_trenutno + 1];
  30.  
  31. for (int i = 0; i < _trenutno; i++)
  32. {
  33. temp1[i] = _elementi1[i]; //proizvod** temp [i]= proizvod **elementi1[i]
  34. temp2[i] = _elementi2[i];
  35. }
  36.  
  37. delete[] _elementi1;
  38. delete[] _elementi2;
  39.  
  40. _elementi1 = temp1;
  41. _elementi2 = temp2;
  42.  
  43. _elementi1[_trenutno] = el1;
  44. _elementi2[_trenutno] = el2;
  45. _trenutno++;
  46. }
  47.  
  48. Kolekcija& operator=(Kolekcija& org)
  49. {
  50. if (this!=&org)
  51. {
  52. delete[] _elementi1;
  53. delete[] _elementi2;
  54.  
  55. _trenutno = org._trenutno;
  56. _elementi1 = new T1[_trenutno];
  57. _elementi2 = new T2[_trenutno];
  58. for (int i = 0; i < _trenutno; i++)
  59. {
  60. _elementi1[i] = org._elementi1[i];
  61. _elementi2[i] = org._elementi2[i];
  62. }
  63. }
  64. return *this;
  65. }
  66.  
  67. int GetTrenutno() const { return _trenutno; }
  68.  
  69. T1& getPrviElement(int lokacija)const {
  70. if(lokacija>=0 && lokacija<_trenutno)
  71. return _elementi1[lokacija];
  72. }
  73.  
  74. T2& getDrugiElement(int lokacija)const {
  75. if (lokacija >= 0 && lokacija < _trenutno)
  76. return _elementi2[lokacija];
  77. }
  78.  
  79. friend ostream& operator<<<>(ostream&, const Kolekcija&);
  80. };
  81. template<class T1, class T2>
  82. ostream& operator<<<>(ostream& cout, const Kolekcija<T1, T2>& k)
  83. {
  84. for (int i = 0; i < k._trenutno; i++)
  85. cout << k._elementi1[i] << "\t" << k._elementi2[i] << endl;
  86. return cout;
  87. }
  88.  
  89. class Proizvod
  90. {
  91. char* _naziv;
  92. char* _opis;
  93. double _cijena;
  94. public:
  95. Proizvod(const char* naziv, const char* opis, double cijena)
  96. {
  97. int vel = strlen(naziv) + 1;
  98. _naziv = new char[vel];
  99. strcpy_s(_naziv, vel, naziv);
  100.  
  101. vel = strlen(opis) + 1;
  102. _opis = new char[vel];
  103. strcpy_s(_opis, vel, opis);
  104.  
  105. _cijena = cijena;
  106. }
  107.  
  108. ~Proizvod()
  109. {
  110. delete[] _naziv;
  111. _naziv = nullptr;
  112. delete[] _opis;
  113. _opis = nullptr;
  114. }
  115.  
  116. //Proizvod& operator=(Proizvod& org)
  117. //{
  118. // if (this != &org)
  119. // {
  120. // delete[] _naziv;
  121. // delete[] _opis;
  122. // int vel = strlen(org._naziv) + 1;
  123. // _naziv = new char[vel];
  124. // strcpy_s(_naziv, vel, org._naziv);
  125. // vel = strlen(org._opis) + 1;
  126. // _opis = new char[vel];
  127. // strcpy_s(_opis, vel, org._opis);
  128. // _cijena = org._cijena;
  129. // }
  130. // return *this;
  131. //}
  132.  
  133. double getCijenu()const { return _cijena; }
  134. const char* getNaziv()const { return _naziv; }
  135.  
  136. friend ostream& operator<<(ostream&, const Proizvod&);
  137. };
  138. ostream& operator<<(ostream& cout, const Proizvod& p)
  139. {
  140. cout << "Naziv: " << p._naziv << endl;
  141. cout << "Opis: " << p._opis << endl;
  142. cout << "Cijena: " << p._cijena << endl;
  143.  
  144. return cout;
  145. }
  146.  
  147.  
  148. //U programu implementirati nasljeđivanje između odgovarajućih klasa
  149. //Klasu Osoba deklarisati kao apstraktnu.
  150. class Osoba
  151. {
  152. char* _ime;
  153. char* _prezime;
  154. char* _adresa;
  155. char _telefon[15];
  156. public:
  157. //Klasu Osoba deklarisati kao apstraktnu.
  158. virtual void nekaFunkcija() = 0;
  159.  
  160. Osoba(const char* ime, const char* prezime, const char* adresa, const char* telefon)
  161. {
  162. int vel = strlen(ime) + 1;
  163. _ime = new char[vel];
  164. strcpy_s(_ime, vel, ime);
  165. cout << "* Osoba " << _ime << " konstruktor *" << endl;
  166.  
  167.  
  168. vel = strlen(prezime) + 1;
  169. _prezime = new char[vel];
  170. strcpy_s(_prezime, vel, prezime);
  171.  
  172. vel = strlen(adresa) + 1;
  173. _adresa = new char[vel];
  174. strcpy_s(_adresa, vel, adresa);
  175.  
  176. strncpy_s(_telefon, 15, telefon,_TRUNCATE);
  177. }
  178.  
  179. virtual ~Osoba() //dobra praksa
  180. {
  181. cout << "* Osoba " << _ime << " destruktor *" << endl;
  182.  
  183. delete[] _ime;
  184. _ime = nullptr;
  185. delete[] _prezime;
  186. _prezime = nullptr;
  187. delete[] _adresa;
  188. _adresa = nullptr;
  189. }
  190.  
  191. const char* getIme()const { return _ime; }
  192. const char* getPrezime()const { return _prezime; }
  193.  
  194. virtual void Info(double popust = 0)
  195. {
  196. cout << "Ime i prezime: " << _ime << " " << _prezime << endl;
  197. cout << "Adresa: " << _adresa << endl;
  198. cout << "Telefon: " << _telefon << endl;
  199. }
  200. virtual void setEmail(const char* email) = 0;
  201.  
  202.  
  203. virtual bool IsPotrosnjaVeca(int mjesec, double potrosnja) = 0;
  204. virtual void DodajGratisProizvod( Proizvod * p) = 0;
  205.  
  206. };
  207.  
  208. class Narudzba {
  209. char _datum[12]; //Format: dd.MM.yyyy.
  210. Kolekcija<Proizvod*, int> _proizvodi; //Podaci o naručenim proizvodima i količinama
  211. public:
  212.  
  213. int getMjesecNarudzbe() {
  214. char m[2];
  215. int b = 0;
  216. for (int i = 3; i < 5; i++)
  217. {
  218. m[b] = _datum[i];
  219. b++;
  220. }
  221. int mjesec = atoi(m);
  222. return mjesec;
  223. }
  224.  
  225. //Potrebne osnovne funkcije za rad sa klasom
  226. Narudzba(const char* datum="---")
  227. {
  228. strncpy_s(_datum, 12, datum, _TRUNCATE);
  229.  
  230. }
  231.  
  232. //...
  233. void DodajProizvode(Proizvod * p, int kolicina) ///uzas
  234. {
  235. _proizvodi.DodajElemente(p, kolicina);
  236. }
  237.  
  238. //Funkciju GetIznosNarudzbe koja vraća ukupan iznos narudžbe na osnovu
  239. //podataka o cijenama proizvoda i naručenim količinama. Funkcija prima neobavezni parametar popust
  240. //koji inicijalno ima vrijednost 0, što znači da ne postoji popust na postojeće cijene proizvoda.
  241. double GetIznosNarudzbe (double popust = 0) const
  242. {
  243. int v = _proizvodi.GetTrenutno();
  244. double suma = 0;
  245. for (int i = 0; i < v; i++)
  246. {
  247. suma += _proizvodi.getPrviElement(i)->getCijenu() * _proizvodi.getDrugiElement(i);
  248. }
  249.  
  250. if (popust > 0) //pretpostavljam da je procent tj. da se salje kao 10 % a ne 0.1
  251. return suma - (suma * popust / 100);
  252. else
  253. return suma;
  254.  
  255. }
  256.  
  257. //Funkciju za ispis svih vrijednosti atributa klase.
  258. void Ispis() {
  259. cout << "--------------------------------------\n";
  260. cout << "Narudzba na dan: " << _datum << endl;
  261. int v = _proizvodi.GetTrenutno();
  262.  
  263. for (int i = 0; i < v; i++)
  264. cout << _proizvodi.getPrviElement(i)->getNaziv() << " " << _proizvodi.getDrugiElement(i) << " kol * "<<_proizvodi.getPrviElement(i)->getCijenu()<<" KM "<< endl;
  265.  
  266. /* cout << "Ukupno: \t\t" << GetIznosNarudzbe() <<" KM"<< endl;
  267. cout << "--------------------------------------\n";*/
  268.  
  269. }
  270. };
  271.  
  272. class Klijent : public Osoba
  273. {
  274. int _id;
  275. char* _email;
  276. Kolekcija<Narudzba, double> _narudzbe; //Podaci o narudžbama sa ukupnim utrošenim iznosom u KM
  277.  
  278. public:
  279.  
  280. void nekaFunkcija() override { cout << "nidje veze"; }
  281.  
  282. //Potrebne konstruktor i destruktor funkcije.
  283. //Klijent(int ID = 0, const char* ime = "---", const char* prezime = "---", const char* adresa = "---", const char* telefon = "---", const char* email = "---")
  284. Klijent(int ID, const char* ime, const char* prezime , const char* adresa , const char* telefon, const char* email)
  285. : Osoba(ime, prezime, adresa, telefon)
  286. {
  287. cout << "** Klijent "<<getIme()<<" konstruktor **" << endl;
  288.  
  289. int v = strlen(email) + 1;
  290. _email = new char[v];
  291. strcpy_s(_email, v, email);
  292. _id = ID;
  293. }
  294.  
  295. ~Klijent() {
  296. cout << "** Klijent " << getIme() << " destruktor **" << endl;
  297. delete[]_email;
  298. _email = nullptr;
  299. }
  300.  
  301. //Funkciju za evidenciju nove narudžbe.
  302. void EvidentirajNarudzbu( Narudzba& n, int popust=0)
  303. {
  304. double utroseno = n.GetIznosNarudzbe(popust);
  305. _narudzbe.DodajElemente(n, utroseno);
  306. }
  307.  
  308. //Funkciju koja vraća logičku vrijednost true ukoliko je klijent za odabrani mjesec u godini imao
  309. //potrošnju veću od zadate. Prototip funkcije: bool IsPotrosnjaVeca(int mjesec, double potrosnja);
  310. //Za pronalazak potrosnje po mjesecima koristiti podatak o datumu narudžbe.
  311. bool IsPotrosnjaVeca(int mjesec, double potrosnja)
  312. {
  313. int v = _narudzbe.GetTrenutno();
  314. for (int i = 0; i < v; i++)
  315. {
  316. if (_narudzbe.getPrviElement(i).getMjesecNarudzbe() == mjesec &&
  317. _narudzbe.getDrugiElement(i) > potrosnja)
  318. return true;
  319. }
  320. return false;
  321. }
  322.  
  323. //Funkciju za izmjenu e-mail adrese.
  324. void setEmail(const char* email)
  325. {
  326. delete[]_email;
  327. int v = strlen(email) + 1;
  328. _email = new char[v];
  329. strcpy_s(_email, v, email);
  330. }
  331. //Funkciju za ispis svih vrijednosti atributa klase.
  332. virtual void Info(double popust=0) override
  333. {
  334. cout << "ID: " << _id << endl;
  335. Osoba::Info();
  336. cout << "Email: " << _email << endl;
  337. int v = _narudzbe.GetTrenutno();
  338. for (int i = 0; i < v; i++)
  339. {
  340. _narudzbe.getPrviElement(i).Ispis();
  341. cout << "Ukupno: \t\t" << _narudzbe.getPrviElement(i).GetIznosNarudzbe(popust) << " KM" << endl;
  342. cout << "--------------------------------------\n";
  343. }
  344.  
  345. }
  346.  
  347. void DodajGratisProizvod( Proizvod* p)
  348. {
  349. int lok = _narudzbe.GetTrenutno()-1;
  350. if (lok < 0)
  351. return;
  352.  
  353. _narudzbe.getPrviElement(lok).DodajProizvode(p, 1);
  354. }
  355.  
  356. };
  357.  
  358. class VIPKlijent : public Klijent
  359. {
  360. char* _parkingOznaka;
  361. double _popust;
  362. public:
  363. //Potrebne konstruktor i destruktor funkcije
  364. VIPKlijent(int ID, const char* ime, const char* prezime, const char* adresa, const char* telefon, const char* email, const char* parkingOznaka, double popust)
  365. : Klijent(ID, ime, prezime, adresa, telefon, email)
  366. {
  367. cout << "*** VIPKlijent " << getIme() << " konstruktor ***" << endl;
  368.  
  369. int v = strlen(parkingOznaka) + 1;
  370. _parkingOznaka = new char[v];
  371. strcpy_s(_parkingOznaka, v, parkingOznaka);
  372. _popust = popust;
  373. }
  374.  
  375. ~VIPKlijent() {
  376. cout << "*** VIPKlijent " << getIme() << " destruktor ***" << endl;
  377. delete[]_parkingOznaka;
  378. _parkingOznaka = nullptr;
  379. }
  380. //Funkciju za evidenciju nove narudžbe sa zaračunatim popustom na sve proizvode.
  381. void EvidentirajNarudzbu( Narudzba& n)
  382. {
  383. Klijent::EvidentirajNarudzbu(n, _popust);
  384. }
  385. //Funkciju koja posljednjoj narudžbi klijenta dodaje gratis proizvod proslijeđen kao parametar.
  386. void DodajGratisProizvod( Proizvod * p)
  387. {
  388. Klijent::DodajGratisProizvod(p);
  389. }
  390.  
  391. //Funkciju za ispis svih vrijednosti atributa klase
  392. virtual void Info(double popust = 0) override
  393. {
  394. cout << endl;
  395. Klijent::Info(_popust);
  396. cout << "Popust: " << _popust << " % " << endl;
  397. cout << "Parking Oznaka: " << _parkingOznaka << endl << endl;
  398. }
  399. };
  400.  
  401. //Funkcija treba da pronađe sve one klijente koji su za odabrani mjesec ostvarili potrošnju veću
  402. //od zadate. Ispisati njihove podatke i vratiti ukupan broj pronađenih klijenata.
  403. int PronadjiKlijentePoPotrosnji(Osoba* niz[], int max, double potrosnja, int mjesec) /// valjda trebam i tu zadatu potrosnju i mjesec proslijediti?
  404. {
  405. int prebrojKlijente = 0;
  406. for (int i = 0; i < max; i++)
  407. {
  408. if (niz[i]->IsPotrosnjaVeca(mjesec, potrosnja))
  409. {
  410. prebrojKlijente++;
  411. niz[i]->Info();
  412. }
  413. }
  414. return prebrojKlijente;
  415. }
  416.  
  417. //Pronaći sve VIP klijente, te im dodati gratis proizvod proslijeđen kao parametar.
  418. void UkljuciGratisProizvodVIPKlijentima(Osoba* niz[], int max, const Proizvod& p)
  419. {
  420. for (int i = 0; i < max; i++)
  421. {
  422. niz[i]->DodajGratisProizvod(&const_cast<Proizvod&>(p));
  423. }
  424. }
  425.  
  426. //Svim klijentima postaviti mail adresu u formatu: ime.prezime@firma.ba.
  427. void GenerisiMailAdreseKlijentima(Osoba* niz[], int max){
  428. for (int i = 0; i < max; i++)
  429. {
  430. int v= strlen(niz[i]->getIme()) + strlen(niz[i]->getPrezime()) + 11;
  431. char*mail = new char[v];
  432. strcpy_s(mail,v,niz[i]->getIme());
  433. strcat_s(mail, v, ".");
  434. strcat_s(mail, v, niz[i]->getPrezime());
  435. strcat_s(mail, v, "@firma.ba");
  436. niz[i]->setEmail(mail);
  437. delete[]mail;
  438. }
  439. }
  440.  
  441. //Omogućiti pretragu klijenata po imenu ili prezimenu (ispisati informacije
  442. //o svim klijentima koji sadrže uneseni tekst u dijelu imena ili prezimena.
  443. void PronadjiKlijentePoImenuPrezimenu(Osoba* niz[], int max){
  444. cout << "Unesite ime ili prezime trazenog klijenta: " << endl;
  445. char pretraga[15];
  446. cin.getline(pretraga, 15);
  447. bool nadjen = false;
  448. for (int i = 0; i < max; i++)
  449. {
  450. if (strstr(niz[i]->getIme(), pretraga) != nullptr or
  451. strstr(niz[i]->getPrezime(), pretraga) != nullptr)
  452. {
  453. niz[i]->Info();
  454. nadjen = true;
  455. }
  456.  
  457. }
  458. if (!nadjen)
  459. cout << "Ne postoji klijent sa tim imenom / prezimenom" << endl;
  460. }
  461.  
  462. int main()
  463. {/*
  464. Proizvod* pokPiva=new Proizvod("Sarajevka", "uzas", 3.5);
  465. Proizvod* pokRakija = new Proizvod("Visnja", " : ) ", 1.5);
  466. Proizvod* pokKafa = new Proizvod("Ness", "uzasnija", 2.5);
  467. Proizvod* pokKisela = new Proizvod("Kiseljak", "blagi uzas", 1);*/
  468.  
  469. Proizvod Piva ("Sarajevska", "uzas", 3.5);
  470. Proizvod Rakija ("Visnja", " : ) ", 1.5);
  471. Proizvod Kafa ("Ness", "uzasnija", 2.5);
  472. Proizvod Kisela("Kiseljak", "blagi uzas", 1);
  473.  
  474. Narudzba prvaNar("28.07.2018.");
  475. prvaNar.DodajProizvode(&Piva,2);
  476. prvaNar.DodajProizvode(&Kafa, 2);
  477. prvaNar.Ispis();
  478.  
  479. Narudzba drugaNar("29.08.2018.");
  480. drugaNar.DodajProizvode(&Kafa, 1);
  481. drugaNar.DodajProizvode(&Kisela, 1);
  482. drugaNar.Ispis();
  483.  
  484. cout << "\nMjesec prve narudzbe: " << prvaNar.getMjesecNarudzbe() << endl;
  485. cout << "Mjesec druge narudzbe: " << drugaNar.getMjesecNarudzbe() << endl<<endl;
  486.  
  487.  
  488. Klijent pero (1, "Pero", "Peric", "Trg Pere 12", "061/456-789", "pero@mail.com");
  489. pero.EvidentirajNarudzbu(prvaNar);
  490. pero.EvidentirajNarudzbu(drugaNar);
  491. pero.Info();
  492. cout << "\nDa li je Pero u 7 mjesecu potrosio vise od 5 KM: " << boolalpha << pero.IsPotrosnjaVeca(7, 5) << endl << endl;
  493.  
  494. //Klijent *nizKlijenata[3];
  495. //nizKlijenata[0] = new Klijent(20, "prvi", "klijent", "adresna", "1234", "mail");
  496. //nizKlijenata[0]->EvidentirajNarudzbu(prvaNar);
  497. //nizKlijenata[1] = new Klijent(21, "drugi", "klijent", "adresna", "5678", "mail");
  498. //nizKlijenata[1]->EvidentirajNarudzbu(prvaNar);
  499. //nizKlijenata[2] = new Klijent(22, "treci", "klijent", "adresna", "9012", "mail");
  500. //nizKlijenata[2]->EvidentirajNarudzbu(prvaNar);
  501.  
  502. Klijent prvi (20, "prvi", "klijent", "adresna", "1234", "mail");
  503. prvi.EvidentirajNarudzbu(prvaNar);
  504. Klijent drugi (21, "drugi", "klijent", "adresna", "5678", "mail");
  505. //drugi.EvidentirajNarudzbu(prvaNar);
  506. Klijent treci(22, "treci", "klijent", "adresna", "9012", "mail");
  507. treci.EvidentirajNarudzbu(prvaNar);
  508.  
  509. Osoba* nizKlijenata[3];
  510. nizKlijenata[0] = &prvi;
  511. nizKlijenata[1] = &drugi;
  512. nizKlijenata[2] = &treci;
  513. GenerisiMailAdreseKlijentima(nizKlijenata, 3);
  514. cout << "-------------------------------------------------------------------\n";
  515. cout <<"Pronadjeno "<< PronadjiKlijentePoPotrosnji(nizKlijenata, 3, 2, 7) <<" klijenata"<< endl;
  516. cout << "-------------------------------------------------------------------\n";
  517.  
  518.  
  519. VIPKlijent sero(2, "Sero", "Seric", "Trg Sere 13", "062/123-456", "sero@mail.com", "Pvip01", 30);
  520. sero.EvidentirajNarudzbu(drugaNar);
  521. sero.EvidentirajNarudzbu(prvaNar);
  522. sero.DodajGratisProizvod(&Rakija);
  523. sero.Info();
  524.  
  525. VIPKlijent prviVip(30, "prviVIP", "klijent", "adresna", "1234", "mail", "pVip01", 10);
  526. prviVip.EvidentirajNarudzbu(prvaNar);
  527. prviVip.EvidentirajNarudzbu(drugaNar);
  528. VIPKlijent drugiVip(30, "drugiVIP", "klijent", "adresna", "4567", "mail", "pVip02", 20);
  529. VIPKlijent treciVip(30, "treciVIP", "klijent", "adresna", "8910", "mail", "pVip03", 30);
  530. treciVip.EvidentirajNarudzbu(prvaNar);
  531.  
  532. Osoba* vipKlijenti[3];
  533. vipKlijenti[0] = &prviVip;
  534. vipKlijenti[1] = &drugiVip;
  535. vipKlijenti[2] = &treciVip;
  536. GenerisiMailAdreseKlijentima(vipKlijenti, 3);
  537. cout << "-------------------------------------------------------------------\n";
  538. cout << "Dodaj gratis proizvode " << endl;
  539. UkljuciGratisProizvodVIPKlijentima(vipKlijenti, 3, Rakija);
  540. for (int i = 0; i < 3; i++)
  541. {
  542. vipKlijenti[i]->Info();
  543. }
  544. cout << "-------------------------------------------------------------------\n";
  545.  
  546. PronadjiKlijentePoImenuPrezimenu(vipKlijenti, 3);
  547.  
  548. //Testirati sve dostupne funkcionalnosti uz obaveznu provjeru globalnih funkcija.
  549. //VIP klijentima sve narudžbe kreirati uz zaračunati popust pozivom odgovarajuće funkcije.
  550. system("pause");
  551. return 0;
  552. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement