Advertisement
Chessbrain94

Untitled

Jun 26th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include<sstream>
  4.  
  5. using namespace std;
  6. char * crt = "\n----------------------------------------------------\n";
  7. template<class T1, class T2>
  8. class Kolekcija {
  9.     T1 * _elementi1;
  10.     T2 * _elementi2;
  11.     int * _trenutno;
  12. public:
  13.     Kolekcija()
  14.     {
  15.         _elementi1 = nullptr;
  16.         _elementi2 = nullptr;
  17.         _trenutno = new int(0);
  18.     }
  19.     //1. potrebne funkcije
  20.     T1 getElement1(int i) {
  21.         return _elementi1[i];
  22.     }
  23.     T2  getElement2(int i) {
  24.         return _elementi2[i];
  25.     }
  26.     void uvecajelement2(int i, int br) {
  27.         _elementi2[i] += br;
  28.     }
  29.     int getTrenutno() {
  30.         return *_trenutno;
  31.  
  32.     }
  33.     Kolekcija(Kolekcija & k) {
  34.         _elementi1 = new T1[k.getTrenutno()];
  35.         _elementi2 = new T2[k.getTrenutno()];
  36.         _trenutno = new int(k.getTrenutno());
  37.  
  38.         for (int i = 0; i < k.getTrenutno(); i++)
  39.         {
  40.             _elementi1[i] = k._elementi1[i];
  41.             _elementi2[i] = k._elementi2[i];
  42.         }
  43.        
  44.  
  45.     }
  46.  
  47.     void operator=(Kolekcija & k) {
  48.  
  49.         delete[]_elementi1;
  50.         delete[]_elementi2;
  51.         delete _trenutno;
  52.  
  53.         _elementi1 = new T1[k.getTrenutno()];
  54.         _elementi2 = new T2[k.getTrenutno()];
  55.         _trenutno = new int(k.getTrenutno());
  56.  
  57.         for (int i = 0; i < k.getTrenutno(); i++)
  58.         {
  59.             _elementi1[i] = k._elementi1[i];
  60.             _elementi2[i] = k._elementi2[i];
  61.         }
  62.  
  63.     }
  64.     void AddElement( const T1 & el1,const T2 & el2) {
  65.         T1 * temp1 = new T1[*_trenutno + 1];
  66.         T2 * temp2 = new T2[*_trenutno + 1];
  67.  
  68.         for (int i = 0; i < *_trenutno; i++)
  69.         {
  70.             temp1[i] = _elementi1[i];
  71.             temp2[i] = _elementi2[i];
  72.  
  73.         }
  74.         temp1[*_trenutno] = el1;
  75.         temp2[*_trenutno] = el2;
  76.  
  77.         delete[] _elementi1;
  78.         delete[] _elementi2;
  79.  
  80.         _elementi1 = temp1;
  81.         _elementi2 = temp2;
  82.         (*_trenutno)++;
  83.     }
  84.         ~Kolekcija()
  85.     {
  86.         delete[]_elementi1; _elementi1 = nullptr;
  87.         delete[]_elementi2; _elementi2 = nullptr;
  88.         delete _trenutno; _trenutno = nullptr;
  89.     }
  90.         friend ostream & operator<<(ostream & cout, Kolekcija<T1, T2> & kolek) {
  91.            
  92.             for (int i = 0; i < kolek.getTrenutno(); i++)
  93.             {
  94.                 cout << kolek.getElement1(i)<<" ";
  95.                 cout << kolek.getElement2(i)<<endl;
  96.             }
  97.  
  98.             return cout;
  99.         }
  100.         friend ostream & operator<<(ostream & cout, Kolekcija<T1 *, T2> & kolek) {
  101.  
  102.             for (int i = 0; i < kolek.getTrenutno(); i++)
  103.             {
  104.                 cout << **kolek.getElement1(i) << " ";
  105.                 cout << kolek.getElement2(i) << endl;
  106.             }
  107.  
  108.             return cout;
  109.         }
  110. };
  111. class Datum {
  112.     int *_dan, *_mjesec, *_godina;
  113. public:
  114.     Datum(int dan = 1, int mjesec = 1, int godina = 2000) {
  115.         _dan = new int(dan);
  116.         _mjesec = new int(mjesec);
  117.         _godina = new int(godina);
  118.     }
  119.     Datum(Datum & d) {
  120.         _dan = new int(*d._dan);
  121.         _mjesec = new int(*d._mjesec);
  122.         _godina = new int(*d._godina);
  123.  
  124.  
  125.     }
  126.     void operator=(Datum & d) {
  127.        
  128.             delete _dan;
  129.             delete _mjesec;
  130.             delete _godina;
  131.         _dan = new int(*d._dan);
  132.         _mjesec = new int(*d._mjesec);
  133.         _godina = new int(*d._godina);
  134.     }
  135.     ~Datum() {
  136.         delete _dan; _dan = nullptr;
  137.         delete _mjesec; _mjesec = nullptr;
  138.         delete _godina; _godina = nullptr;
  139.     }
  140.     friend ostream& operator<< (ostream &COUT, const Datum &obj) {
  141.         COUT << *obj._dan << " " << *obj._mjesec << " " << *obj._godina;
  142.         return COUT;
  143.     }
  144.     //1. potrebne funkcije
  145.  
  146. };
  147. class Osoba {
  148. protected:
  149.     char * _imePrezime;
  150.     Datum * _datumRodjenja;
  151. public:
  152.     Osoba(char * imePrezime, Datum datum) {
  153.         _imePrezime = new char[strlen(imePrezime) + 1];
  154.         strcpy_s(_imePrezime, strlen(imePrezime) + 1, imePrezime);
  155.         _datumRodjenja = new Datum(datum);
  156.     }
  157.     Osoba(const Osoba & obj) {
  158.         _imePrezime = new char[strlen(obj._imePrezime) + 1];
  159.         strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
  160.         _datumRodjenja = new Datum(*obj._datumRodjenja);
  161.     }
  162.     void operator=(Osoba & obj) {
  163.         delete[]_imePrezime; delete _datumRodjenja;
  164.         _imePrezime = new char[strlen(obj._imePrezime) + 1];
  165.         strcpy_s(_imePrezime, strlen(obj._imePrezime) + 1, obj._imePrezime);
  166.         _datumRodjenja = new Datum(*obj._datumRodjenja);
  167.     }
  168.     virtual ~Osoba() {
  169.         cout << "POZIV DESTRUKTORA OSOBA" << endl;
  170.         delete[] _imePrezime;
  171.     _imePrezime = nullptr;
  172.     delete _datumRodjenja;
  173.     _datumRodjenja = nullptr; }
  174.     //1. potrebne funkcije
  175.  
  176. };
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183. class Kupac: public Osoba {
  184.     //svaki kupac ima popust koji mu se zaracunava prilikom svake kupovine
  185.     //pocetni popust je 0.10%
  186.     //svaka kupovina u iznosu 100 - 500KM povecava iznos popusta za 0.15%
  187.     //svaka kupovina u iznosu 500 - 1000KM povecava iznos popusta za 0.25%
  188.     //svaka kupovina u iznosu vecem od 1000KM povecava iznos popusta za 0.30%
  189.     float _odobreniPopust;
  190. public:
  191.     //1. potrebne funkcije
  192.     Kupac(char * ime, Datum & dat) :Osoba(ime,dat) {
  193.         _odobreniPopust = 0.10;
  194.  
  195.     }
  196.     virtual ~Kupac() {
  197.         cout << "POZIV DESTRUKTORA KUPAC" << endl;
  198.     }
  199.     void UvecajPopust100() {
  200.         _odobreniPopust += 0.15;
  201.     }
  202.     void UvecajPopust500() {
  203.         _odobreniPopust += 0.25;
  204.     }
  205.     void UvecajPopust1000() {
  206.         _odobreniPopust += 0.30;
  207.     }
  208.     Kupac(Kupac * k) :Osoba(*k) {
  209.         _odobreniPopust = k->_odobreniPopust;
  210.  
  211.     }
  212.     void operator=(Kupac & k)  {
  213.         Osoba::operator=(k);
  214.         _odobreniPopust = k._odobreniPopust;
  215.     }
  216.     friend ostream & operator<<(ostream & cout,const Kupac & k) {
  217.         cout << k._imePrezime <<" Popust: "<< k._odobreniPopust <<"  Datum Rodenja:  "<< *k._datumRodjenja << endl;
  218.         return cout;
  219.     }
  220. };
  221. class Artikal {
  222.     string _barCode;
  223.     char * _naziv;
  224.     float _cijena;
  225. public:
  226.     Artikal(char * naziv, float cijena, string barCode) {
  227.         int vel = strlen(naziv) + 1;
  228.         _naziv = new char[vel];
  229.         strcpy_s(_naziv, vel, naziv);
  230.         _cijena = cijena;
  231.         _barCode = barCode;
  232.     }
  233.     Artikal(Artikal & a) {
  234.         _barCode = a._barCode;
  235.         int vel = strlen(a._naziv) + 1;
  236.         _naziv = new char[vel];
  237.         strcpy_s(_naziv, vel, a._naziv);
  238.         _cijena = a._cijena;
  239.     }
  240.     bool operator==(Artikal & a) {
  241.         if (strcmp(_naziv, a._naziv) == 0 && _barCode.compare(a._barCode) == 0)
  242.             return true;
  243.         return false;
  244.  
  245.     }
  246.     void operator=(Artikal & a) {
  247.         _barCode = a._barCode;
  248.         delete[] _naziv;
  249.         int vel = strlen(a._naziv) + 1;
  250.         _naziv = new char[vel];
  251.         strcpy_s(_naziv, vel, a._naziv);
  252.         _cijena = a._cijena;
  253.     }
  254.     ~Artikal() { delete[]_naziv; _naziv = nullptr; }
  255.     friend ostream& operator<< (ostream &COUT, const Artikal &obj) { COUT << obj._naziv << " " << obj._cijena << " KM" << endl; return COUT; }
  256.     //1. potrebne funkcije
  257.  
  258. };
  259. int posljednjiBroj = 1;
  260. char * GenerisiSljedeciBrojRacuna() {
  261.     char * brojRacuna = new char[10];
  262.     int tmp = posljednjiBroj,
  263.         brojac = 0;
  264.  
  265.     strcpy_s(brojRacuna, 10, "RN0000000");
  266.  
  267.     do {
  268.         tmp /= 10;
  269.         brojac++;
  270.     } while (tmp != 0);
  271.  
  272.     _itoa_s(posljednjiBroj, &brojRacuna[9 - brojac], 10, 10);
  273.  
  274.     posljednjiBroj++;
  275.    
  276.     return brojRacuna;
  277. }
  278.  
  279. class Racun {
  280.     //format broja racuna: RN6005491
  281.     //osigurati automatsko generisanje broja racuna pocevsi od RN0000001
  282.     char _brojRacuna[10];
  283.     Datum _datumKreiranja;
  284.     //prvi argument je Artikal, a drugi kolicina/broj artikala koju je kupac uzeo
  285.     Kolekcija<Artikal *, int> * _stavkeRacuna;
  286.     Kupac * _kupac;
  287. public:
  288.     /*
  289.     1. potrebne (de)konstruktor i druge funkcije
  290.     2. DodajArtikal - dodaje novi artikal u listu artikala zajedno sa njegovom kolicinom. Onemoguciti ponavljanje artikala na nacin da se uvecava samo kolicina ukoliko korisnik vise puta pokusa dodati isti artikal.
  291.     3. operator<< - ispisuje racun u formatu prikazanom na slici(nije obavezno da bude identican, ali je svakako pozeljno).Nakon ispisa svakog racuna, ukoliko su ispunjeni definisani uslovi, kupcu se uvecava popust.
  292.     4. Sortiraj - sortira artikle (rastuci) po kolicini novca kojom ucestvuju u ukupnom iznosu racuna
  293.     */
  294.     Racun(char * brojrac,Datum & datumkreiranja, Kupac * kupac):_datumKreiranja(datumkreiranja) {
  295.         strncpy_s(_brojRacuna, brojrac, _TRUNCATE);
  296.         _kupac = new Kupac(kupac);     
  297.         _stavkeRacuna = new Kolekcija<Artikal *, int>;
  298.     }
  299.     Racun(Racun & r):_datumKreiranja(r._datumKreiranja) {
  300.         strncpy_s(_brojRacuna ,r._brojRacuna,_TRUNCATE);
  301.        
  302.         _stavkeRacuna = new Kolekcija<Artikal *, int>;
  303.         for (int i = 0; i < _stavkeRacuna->getTrenutno(); i++)
  304.         {
  305.             _stavkeRacuna->AddElement(r._stavkeRacuna->getElement1(i), r._stavkeRacuna->getElement2(i));
  306.         }
  307.         _kupac = new Kupac(r._kupac);
  308.  
  309.     }
  310.     void operator=(Racun & r) {
  311.         delete _kupac;
  312.         delete _stavkeRacuna;
  313.         strncpy_s(_brojRacuna, r._brojRacuna, _TRUNCATE);
  314.         _datumKreiranja = r._datumKreiranja;
  315.         _stavkeRacuna = new Kolekcija<Artikal *, int>;
  316.         for (int i = 0; i < _stavkeRacuna->getTrenutno(); i++)
  317.         {
  318.             _stavkeRacuna->AddElement(r._stavkeRacuna->getElement1(i), r._stavkeRacuna->getElement2(i));
  319.         }
  320.         _kupac = new Kupac(*r._kupac);
  321.     }
  322.     ~Racun() {
  323.         delete _kupac;
  324.         delete _stavkeRacuna;
  325.     }
  326.     void DodajArtikal(Artikal & a, int br) {
  327.         for (int i = 0; i < _stavkeRacuna->getTrenutno(); i++)
  328.         {
  329.             if (*_stavkeRacuna[i].getElement1(i) == a)
  330.             {
  331.                 _stavkeRacuna[i].uvecajelement2(i,br);
  332.                 return;
  333.  
  334.             }
  335.         }
  336.         _stavkeRacuna->AddElement(&a, br);
  337.  
  338.     }
  339.     void Sortiraj() {
  340.  
  341.     }
  342.     friend ostream & operator<<(ostream & cout,const Racun & r) {
  343.         cout << " " << r._brojRacuna << endl;
  344.         cout << " " << r._datumKreiranja << endl;
  345.             cout<< " "<<*r._kupac<<endl;
  346.         cout << *r._stavkeRacuna;
  347.         return cout;
  348.     }
  349.    
  350. };
  351. void main() {
  352.  
  353.     /****************************************************************************
  354.     1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  355.     2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
  356.     3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA
  357.     4. PROGRAMSKI CODE SE TAKODJER NALAZI U FAJLU CODE_.TXT
  358.     5. NAZIV I LISTA PARAMETARA FUNKCIJA MORAJU BITI IDENTICNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U.
  359.     6. NIJE POTREBNO BACATI IZUZETKE.
  360.     ****************************************************************************/
  361. #pragma region TestiranjeDatuma
  362.     Datum danas(26, 11, 2015);
  363.     Datum sutra(danas);
  364.     Datum prekosutra;
  365.     prekosutra = danas;
  366.     /*cout << danas << endl << sutra << endl << prekosutra << crt;*/
  367. #pragma endregion
  368. #pragma region TestiranjeKolekcije
  369.     Kolekcija<int, int> kolekcija1;
  370.     int brojElemenata = 15;
  371.     for (int i = 0; i < brojElemenata; i++)
  372.         kolekcija1.AddElement(i, i);
  373.     cout << kolekcija1.getElement1(0) << " " << kolekcija1.getElement2(0) << endl;
  374.     cout << kolekcija1 << endl;
  375.     Kolekcija<int, int> kolekcija2;
  376.     kolekcija2 = kolekcija1;
  377.     cout << kolekcija2 << crt;
  378.     if (kolekcija1.getTrenutno() == kolekcija2.getTrenutno())
  379.         cout << "ISTI BROJ ELEMENATA" << endl;
  380.     Kolekcija<int, int> kolekcija3(kolekcija2);
  381.     cout <<"kolekcija3" <<kolekcija3 << crt;
  382. #pragma endregion
  383. #pragma region TestiranjeKupca
  384.     Kupac jasmin("Jasmin Azemovic", Datum(15, 2, 1980));
  385.     Kupac adel("Adel Handzic", Datum(15, 10, 1981));
  386.     Kupac jasmin2 = jasmin;
  387.     cout << jasmin << endl << jasmin2 << endl;
  388.     jasmin = jasmin2;
  389.     cout << jasmin << endl << jasmin2 << endl;
  390. #pragma endregion
  391. #pragma region TestiranjeArtikla
  392.     Artikal sokCppyNarandza("Cappy narandza", 2.10, "699511236545");
  393.     Artikal cokoladaMilkaMilkins("Milka Milkins", 2.55, "622445875463");
  394.     Artikal jogurtMeggle("Meggle jogurt", 2.55, "155338774458");
  395.  
  396.     cout << sokCppyNarandza << cokoladaMilkaMilkins << jogurtMeggle << endl;
  397.     sokCppyNarandza = cokoladaMilkaMilkins;
  398.     cout << sokCppyNarandza << endl;
  399.     if (sokCppyNarandza == cokoladaMilkaMilkins)
  400.         cout << "Artikli su isti" << endl;
  401. #pragma endregion
  402. #pragma region TestiranjeRacuna
  403.  
  404.     /*GenerisiSljedeciBrojRacuna - globalna funkcija koja generise i vraca naredni broj racuna u prethodno definisanom formatu*/
  405.     Racun racun1(GenerisiSljedeciBrojRacuna(), danas, &jasmin);
  406.  
  407.     //racun1.DodajArtikal(cokoladaMilkaMilkins, 15);
  408.     //racun1.DodajArtikal(sokCppyNarandza, 20);
  409.     //racun1.DodajArtikal(jogurtMeggle, 20);
  410.  
  411.     //cout << racun1 << endl;
  412.  
  413.  
  414.  
  415.  
  416.     /*Racun racun2(GenerisiSljedeciBrojRacuna(), sutra, &jasmin);
  417.     racun2.DodajArtikal(cokoladaMilkaMilkins, 15);
  418.     racun2.DodajArtikal(sokCppyNarandza, 20);
  419.     racun2.DodajArtikal(jogurtMeggle, 20);
  420.     cout << racun2 << endl;*/
  421.  
  422.     /*Racun racun3(racun2);*/
  423.     /*cout << racun3 << endl;*/
  424.     /*racun3.Sortiraj();*/
  425.     //popust mozete izracunati kao procenat od ukupne sume racuna (pozeljna opcija) ili kao vrijednost u KM-ovima (kao u nastavku)
  426. #pragma endregion
  427.    
  428.    
  429.     system("pause");
  430. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement