Advertisement
Nedzla

26.06.2018

Sep 21st, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.82 KB | None | 0 0
  1. #include"stdafx.h"
  2. #include<iostream>
  3. #include<tuple>
  4. using namespace std;
  5.  
  6. enum VrstaAktivnosti { Tehnike, Kata, Borba };
  7. const char *VrstaAktivnostiChar[] = { "Tehnike", "Kata", "Borba" };
  8. enum Pojas { Zuti, Narandzasti, Zeleni, Plavi, Smedji, Crni };
  9. const char *PojasChar[] = { "Zuti", "Narandzasti", "Zeleni", "Plavi", "Smedji", "Crni" };
  10.  
  11. struct Datum {
  12.     int * _dan, *_mjesec, *_godina;
  13.     void Unos(int d, int m, int g) {
  14.         _dan = new int(d);
  15.         _mjesec = new int(m);
  16.         _godina = new int(g);
  17.     }
  18.     void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
  19.     void Dealociraj() { delete _dan; delete _mjesec; delete _godina; }
  20.     int PretvoriUDane()
  21.     {
  22.         return *_godina * 365 + *_mjesec * 30 + *_dan;
  23.     }
  24. };
  25.  
  26. struct Aktivnost {
  27.     unique_ptr<VrstaAktivnosti> _vrsta;
  28.     Datum _datumIzvrsenja;
  29.     char * _nazivOpis;
  30.     int _ocjena; // 1 - 10
  31.     void Unos(VrstaAktivnosti vrsta, Datum * datum, int ocjena, const char * nazivOpis) {
  32.         _vrsta = make_unique<VrstaAktivnosti>(vrsta);//dodala
  33.         _datumIzvrsenja.Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
  34.         _ocjena = ocjena;
  35.         int size = strlen(nazivOpis) + 1;
  36.         _nazivOpis = new char[size];
  37.         strcpy_s(_nazivOpis, size, nazivOpis);
  38.     }
  39.     void Ispis() {
  40.         cout << VrstaAktivnostiChar[*_vrsta] << " " << _ocjena << " " << _nazivOpis;//dodala niz
  41.         _datumIzvrsenja.Ispis();
  42.         cout << endl;
  43.     }
  44.     void Dealociraj() {
  45.         _datumIzvrsenja.Dealociraj();
  46.         delete[] _nazivOpis; _nazivOpis = nullptr;
  47.     }
  48. };
  49.  
  50. struct KaratePojas {
  51.     Datum * _datumPolaganja;//datum koji ce se evidentirati kao datum polaganja pojasa tj. kada su ispunjene sve aktivnosti/obaveze
  52.     Pojas _pojas;
  53.     Aktivnost * _listaIzvrsenihAktivnosti;
  54.     int _trenutnoIzvrsenihAktivnosti;
  55.     void Unos(Pojas pojas) {
  56.         _listaIzvrsenihAktivnosti = nullptr;
  57.         _trenutnoIzvrsenihAktivnosti = 0;
  58.         _datumPolaganja = nullptr;
  59.         _pojas = pojas;
  60.     }
  61.     void Dealociraj() {
  62.         if (_datumPolaganja != nullptr)//dodala
  63.             _datumPolaganja->Dealociraj(); _datumPolaganja = nullptr;
  64.         for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
  65.             _listaIzvrsenihAktivnosti[i].Dealociraj();
  66.         delete[] _listaIzvrsenihAktivnosti;
  67.         _listaIzvrsenihAktivnosti = nullptr;
  68.     }
  69.     void Ispis() {
  70.         if (_datumPolaganja != nullptr)//dodala
  71.             _datumPolaganja->Ispis();
  72.         cout << PojasChar[_pojas] << endl;//dodala niz
  73.         for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
  74.             _listaIzvrsenihAktivnosti[i].Ispis();
  75.     }
  76.     bool DodajIzvrsenuAktivnost(Aktivnost *aktivnost)
  77.     {
  78.         if (_datumPolaganja != nullptr)
  79.             return false;
  80.  
  81.         for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
  82.         {
  83.             if (_listaIzvrsenihAktivnosti[i]._vrsta == aktivnost->_vrsta)
  84.             {
  85.                 if (_listaIzvrsenihAktivnosti[i]._datumIzvrsenja.PretvoriUDane() == aktivnost->_datumIzvrsenja.PretvoriUDane() &&
  86.                     _listaIzvrsenihAktivnosti[i]._ocjena < 6)
  87.                     return true;
  88.  
  89.                 if (abs((aktivnost->_datumIzvrsenja.PretvoriUDane()) - (_listaIzvrsenihAktivnosti[i]._datumIzvrsenja.PretvoriUDane()))< 15)
  90.                     return false;
  91.             }
  92.         }
  93.  
  94.         if (aktivnost->_ocjena < 5)
  95.             return false;
  96.  
  97.         Aktivnost *temp = new Aktivnost[_trenutnoIzvrsenihAktivnosti + 1];
  98.         for (int i = 0; i <_trenutnoIzvrsenihAktivnosti; i++)
  99.         {
  100.             temp[i].Unos(*_listaIzvrsenihAktivnosti[i]._vrsta, &_listaIzvrsenihAktivnosti[i]._datumIzvrsenja, _listaIzvrsenihAktivnosti[i]._ocjena,
  101.                 _listaIzvrsenihAktivnosti[i]._nazivOpis);
  102.             _listaIzvrsenihAktivnosti[i].Dealociraj();
  103.         }
  104.         temp[_trenutnoIzvrsenihAktivnosti].Unos(*aktivnost->_vrsta, &aktivnost->_datumIzvrsenja, aktivnost->_ocjena, aktivnost->_nazivOpis);
  105.         _listaIzvrsenihAktivnosti = temp;
  106.         _trenutnoIzvrsenihAktivnosti++;
  107.         return true;
  108.     }
  109.     void Sortiraj()
  110.     {
  111.         bool prolaz = true;
  112.         while (prolaz)
  113.         {
  114.             prolaz = false;
  115.             for (int i = 0; i < _trenutnoIzvrsenihAktivnosti - 1; i++)
  116.             {
  117.                 if (_listaIzvrsenihAktivnosti[i]._ocjena < _listaIzvrsenihAktivnosti[i + 1]._ocjena)
  118.                 {
  119.                     swap(_listaIzvrsenihAktivnosti[i], _listaIzvrsenihAktivnosti[i + 1]);
  120.                     prolaz = true;
  121.                 }
  122.             }
  123.         }
  124.     }
  125.     void IspisOcjena()
  126.     {
  127.         for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
  128.         {
  129.             cout << _listaIzvrsenihAktivnosti[i]._ocjena << endl;
  130.         }
  131.     }
  132.     bool DaLiJePolozen()
  133.     {
  134.         /* Karate pojas zahtijeva uspjesnu realizaciju svih planiranih aktivnosti, a one se za jedan povecavaju sa svakim novim pojasom, npr.
  135.         zuti pojas: 1 x tehnika, 1 x kata, 1 x borba;   narandzasti pojas: 2 x tehnika, 2 x kata, 2 x borba; i td...
  136.         Funkcija vraca false u slucaju da: su kandidatu u listu aktivnosti evidentirane tri negativno ocijenjene identicne vrste aktivnosti
  137.         (npr. tri negativne ocjene iz borbi), onda se taj pojas ne moze smatrati uspjesno stecenim
  138.         i, te ukoliko nedostaje bilo koja od aktivnosti zahtijevanih u okviru tog pojasa. Ukoliko je kandidat uspjesno realizovao sve aktivnost,
  139.         datum polaganja se postavlja na datum posljednje uspjesno realizovane aktivnosti*/
  140.         int brojacNegTehnika = 0, brojacNegKata = 0, brojacNegBorba = 0, brojacPozitivnih = 0;
  141.         int lokacija = 0;
  142.         for (int j = 0; j < _trenutnoIzvrsenihAktivnosti; j++)
  143.         {
  144.             if (_listaIzvrsenihAktivnosti[j]._ocjena < 6)
  145.             {
  146.                 if (*_listaIzvrsenihAktivnosti[j]._vrsta == Tehnike)
  147.                     brojacNegTehnika++;
  148.                 else if (*_listaIzvrsenihAktivnosti[j]._vrsta == Kata)
  149.                     brojacNegKata++;
  150.                 else if (*_listaIzvrsenihAktivnosti[j]._vrsta == Borba)
  151.                     brojacNegBorba++;
  152.             }
  153.             else brojacPozitivnih++;
  154.  
  155.             if (_listaIzvrsenihAktivnosti[j]._datumIzvrsenja.PretvoriUDane() > lokacija && _listaIzvrsenihAktivnosti[j]._ocjena > 5)
  156.                 lokacija = _listaIzvrsenihAktivnosti[j]._datumIzvrsenja.PretvoriUDane();
  157.         }
  158.         if (brojacNegTehnika < 3 && brojacNegKata < 3 && brojacNegBorba < 3 && brojacPozitivnih == 3)
  159.         {
  160.             for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
  161.             {
  162.                 if (_listaIzvrsenihAktivnosti[i]._datumIzvrsenja.PretvoriUDane() == lokacija)
  163.                 {
  164.                     _datumPolaganja = new Datum();
  165.                     _datumPolaganja->Unos(*_listaIzvrsenihAktivnosti[i]._datumIzvrsenja._dan, *_listaIzvrsenihAktivnosti[i]._datumIzvrsenja._mjesec,
  166.                         *_listaIzvrsenihAktivnosti[i]._datumIzvrsenja._godina);
  167.                 }
  168.             }
  169.             return true;
  170.         }
  171.         return false;
  172.     }
  173.     float PretragaRekrzivno(const char *rijec, int i = 0, int brojac = 0, float prosjek = 0)
  174.     {
  175.         /*Funkcija vraca prosjecnu ocjenu svih uspjesno realizovanih aktivnosti koja u nazivu ili opisu sadrze vrijednost primljenog parametra. Ukoliko smatrate da
  176.         je potrebno, mozete dodati i druge parametre za potrebe implementacije ove funkcije*/
  177.         if (_trenutnoIzvrsenihAktivnosti == i)
  178.             return prosjek / brojac;
  179.         if (strstr(_listaIzvrsenihAktivnosti[i]._nazivOpis, rijec) != nullptr)
  180.         {
  181.             return PretragaRekrzivno(rijec, i + 1, brojac + 1, prosjek + _listaIzvrsenihAktivnosti[i]._ocjena);
  182.         }
  183.         return PretragaRekrzivno(rijec, i + 1, brojac, prosjek);
  184.     }
  185.  
  186. };
  187.  
  188. struct Kandidat {
  189.     char * _imePrezime;
  190.     shared_ptr<KaratePojas> _pojasevi[6];
  191.     void Unos(const char * imePrezime) {
  192.         int size = strlen(imePrezime) + 1;
  193.         _imePrezime = new char[size];
  194.         strcpy_s(_imePrezime, size, imePrezime);
  195.         for (size_t i = 0; i < 6; i++)
  196.             _pojasevi[i] = nullptr;
  197.     }
  198.     void Dealociraj() {
  199.         delete[] _imePrezime; _imePrezime = nullptr;
  200.         for (size_t i = 0; i < 6; i++)
  201.             if (_pojasevi[i] != nullptr) {
  202.                 _pojasevi[i]->Dealociraj();
  203.                 _pojasevi[i].reset();
  204.             }
  205.     }
  206.     void Ispis() {
  207.         cout << _imePrezime << endl;
  208.         for (size_t i = 0; i < 6; i++)
  209.             if (_pojasevi[i] != nullptr)
  210.                 _pojasevi[i]->Ispis();
  211.     }
  212.     bool DodajPojas(KaratePojas pojasZuti)
  213.     {
  214.         /*Karate pojasevi se moraju dodavati po redoslijedu tj. ne smije se dozvoliti dodavanje zelenog pojasa ukoliko prethodno nije dodan zuti i narandzasti.
  215.         Za provjeru lokacije (unutar funkcije DodajPojas) na koju ce se dodati novi karate pojas, te da li su nizi pojasevi prethodno dodani koristiti lambda
  216.         funkciju.pojasZuti, pojasNarandzasti, pojasZeleni;*/
  217.         auto lambda = [pojasZuti, this]()->bool
  218.         {
  219.             for (int i = 0; i < 6; i++)
  220.             {
  221.                 if (pojasZuti._pojas == Zuti)
  222.                     return true;
  223.                 if (_pojasevi[i]->_pojas == Zuti && pojasZuti._pojas == Narandzasti)
  224.                     return true;
  225.                 if (_pojasevi[i]->_pojas == Zuti && _pojasevi[i]->_pojas == Narandzasti && pojasZuti._pojas == Zeleni)
  226.                     return true;
  227.             }
  228.             return false;
  229.         };
  230.         if (lambda() == true)
  231.         {
  232.             for (int i = 0; i < 6; i++)
  233.             {
  234.                 _pojasevi[i] = make_shared<KaratePojas>();
  235.                 _pojasevi[i]->Unos(pojasZuti._pojas);
  236.             }
  237.             return true;
  238.         }
  239.     }
  240.     pair<Pojas, float>GetNajbolji() {
  241.         float prosjecna = 0, temp = 0;
  242.         int brojac = 0;
  243.         Pojas pojas;
  244.         for (size_t i = 0; i < 6; i++)
  245.         {
  246.             if (_pojasevi[i] != nullptr)
  247.             {
  248.                 for (size_t j = 0; j < _pojasevi[i]->_trenutnoIzvrsenihAktivnosti; j++)
  249.                 {
  250.                     if (_pojasevi[i]->_listaIzvrsenihAktivnosti[j]._ocjena > 5)
  251.                     {
  252.                         temp += _pojasevi[i]->_listaIzvrsenihAktivnosti[j]._ocjena;
  253.                         brojac++;
  254.                     }
  255.                 }
  256.                 temp /= brojac;
  257.                 if (temp > prosjecna)
  258.                 {
  259.                     prosjecna = temp;
  260.                     pojas = _pojasevi[i]->_pojas;
  261.                 }
  262.                 brojac = 0;
  263.                 temp = 0;
  264.             }
  265.         }
  266.         return make_pair(pojas, prosjecna);
  267.     }
  268. };
  269.  
  270. void main() {
  271.  
  272.     //BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA
  273.     //STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  274.     Datum datumPolaganja1, datumPolaganja2, datumPolaganja3, datumPolaganja4;
  275.     datumPolaganja1.Unos(10, 6, 2018);
  276.     datumPolaganja2.Unos(18, 6, 2018);
  277.     datumPolaganja3.Unos(22, 3, 2018);
  278.     datumPolaganja4.Unos(22, 7, 2018);
  279.  
  280.     Aktivnost aktivnost1, aktivnost2, aktivnost3, aktivnost4, aktivnost5;
  281.     aktivnost1.Unos(Tehnike, &datumPolaganja1, 6, "Tehnike za zuti pojas");
  282.     //aktivnost1.Ispis();
  283.     aktivnost2.Unos(Kata, &datumPolaganja1, 8, "Taiki joko shodan - zuti pojas");
  284.     //aktivnost2.Ispis();
  285.     aktivnost3.Unos(Borba, &datumPolaganja1, 2, "Jednostavne borbene tehnike sa partnerom");
  286.     aktivnost4.Unos(Borba, &datumPolaganja1, 6, "Jednostavne borbene tehnike sa partnerom");
  287.     aktivnost5.Unos(Borba, &datumPolaganja4, 6, "Jednostavne borbene tehnike sa partnerom");
  288.  
  289.     KaratePojas pojasZuti, pojasNarandzasti, pojasZeleni;
  290.     pojasZuti.Unos(Zuti);
  291.     pojasNarandzasti.Unos(Narandzasti);
  292.     pojasZeleni.Unos(Zeleni);
  293.  
  294.     /*Na osnovu vrijednosti primljenog parametra osigurati dodavanje novoizvrsene aktivnosti za potrebe stjecanja odredjenog pojasa. Broj aktivnosti nije ogranicen.
  295.     Identicna aktivnost se moze dodati jedino u slucaju kada je prethodna (identivna aktivnost po vrsti i datumu izvrsenja) imala ocjenu manju od 6.
  296.     Uspjesnom aktivnoscu se smatraju one aktivnosti koje imaju ocjenu vecu od 5, a svaka naredna identicna aktivnost, bez obzira da li je uspjesna ili ne,
  297.     moze biti dodana jedino ako je proslo najmanje 15 dana od izvrsenja prethodne. Onemoguciti dodavanje aktivnosti uspjesno polozenom pojasu.*/
  298.     if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost1))
  299.         cout << "Aktivnost uspjesno dodana!" << endl;
  300.     if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost2))
  301.         cout << "Aktivnost uspjesno dodana!" << endl;
  302.     if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost3))
  303.         cout << "Aktivnost uspjesno dodana!" << endl;
  304.     if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost4))//15 dana...
  305.         cout << "Aktivnost uspjesno dodana!" << endl;
  306.     if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost5))
  307.         cout << "Aktivnost uspjesno dodana!" << endl;
  308.  
  309.     pojasZuti.Ispis();
  310.     //Koristeci neki od obradjenih algoritama, po ocjeni sortirati aktivnosti u okviru odredjenog pojasa
  311.     pojasZuti.Sortiraj();
  312.     pojasZuti.IspisOcjena();
  313.  
  314.     /* Karate pojas zahtijeva uspjesnu realizaciju svih planiranih aktivnosti, a one se za jedan povecavaju sa svakim novim pojasom, npr.
  315.     zuti pojas: 1 x tehnika, 1 x kata, 1 x borba;   narandzasti pojas: 2 x tehnika, 2 x kata, 2 x borba; i td...
  316.     Funkcija vraca false u slucaju da: su kandidatu u listu aktivnosti evidentirane tri negativno ocijenjene identicne vrste aktivnosti
  317.     (npr. tri negativne ocjene iz borbi), onda se taj pojas ne moze smatrati uspjesno stecenim
  318.     i, te ukoliko nedostaje bilo koja od aktivnosti zahtijevanih u okviru tog pojasa. Ukoliko je kandidat uspjesno realizovao sve aktivnost,
  319.     datum polaganja se postavlja na datum posljednje uspjesno realizovane aktivnosti*/
  320.     if (pojasZuti.DaLiJePolozen())
  321.         pojasZuti.Ispis();
  322.  
  323.     /*Funkcija vraca prosjecnu ocjenu svih uspjesno realizovanih aktivnosti koja u nazivu ili opisu sadrze vrijednost primljenog parametra. Ukoliko smatrate da
  324.     je potrebno, mozete dodati i druge parametre za potrebe implementacije ove funkcije*/
  325.     cout << "Prosjecna ocjena za zuti pojas -> " << pojasZuti.PretragaRekrzivno("pojas") << endl;
  326.  
  327.     //ispisuje sve dostupne podatke o pojasu
  328.     pojasZuti.Ispis();
  329.  
  330.     Kandidat jasmin;
  331.     jasmin.Unos("Jasmin Azemovic");
  332.  
  333.     /*Karate pojasevi se moraju dodavati po redoslijedu tj. ne smije se dozvoliti dodavanje zelenog pojasa ukoliko prethodno nije dodan zuti i narandzasti.
  334.     Za provjeru lokacije (unutar funkcije DodajPojas) na koju ce se dodati novi karate pojas, te da li su nizi pojasevi prethodno dodani koristiti lambda
  335.     funkciju.*/
  336.     if (jasmin.DodajPojas(pojasZuti))
  337.         cout << "Pojas uspjesno dodan!" << endl;
  338.     if (jasmin.DodajPojas(pojasZeleni))//prethodno je trebao biti dodan narandzasti pojas
  339.         cout << "Pojas uspjesno dodan!" << endl;
  340.     if (jasmin.DodajPojas(pojasNarandzasti))
  341.         cout << "Pojas uspjesno dodan!" << endl;
  342.  
  343.     float prosjek = 0;
  344.     Pojas pojas;
  345.     //Funkcija GetNajbolji vraca par koji sadrzi oznaku i prosjecnu ocjenu (uspjesno okoncanih aktivnosti) pojasa sa najvecim prosjekom
  346.     tie(pojas, prosjek) = jasmin.GetNajbolji();
  347.     cout << "Najbolji rezultat od " << prosjek << " je ostvaren tokom stjecanja pojasa " << pojas << endl;
  348.  
  349.  
  350.     datumPolaganja1.Dealociraj(), datumPolaganja2.Dealociraj(), datumPolaganja3.Dealociraj(), datumPolaganja4.Dealociraj();
  351.     aktivnost1.Dealociraj(), aktivnost2.Dealociraj(), aktivnost3.Dealociraj(), aktivnost4.Dealociraj(), aktivnost5.Dealociraj();
  352.     pojasZuti.Dealociraj(), pojasNarandzasti.Dealociraj(), pojasZeleni.Dealociraj();
  353.     jasmin.Dealociraj();
  354.  
  355.     system("pause");
  356. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement