Advertisement
adnanj

PRII - Ispit od 19. 6. 2017. god.

Jul 1st, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.91 KB | None | 0 0
  1. #include <iostream>
  2. #include <memory>
  3. using namespace std;
  4.  
  5. #pragma warning(disable:4996)
  6.  
  7. char *crt = "\n-------------------------------------------\n";
  8.  
  9. enum eNacinStudiranja { REDOVAN, DL };
  10. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  11.  
  12. struct DatumVrijeme {
  13.     int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  14.     void Unos(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  15.         _dan = new int(dan);
  16.         _mjesec = new int(mjesec);
  17.         _godina = new int(godina);
  18.         _sati = new int(sati);
  19.         _minuti = new int(minuti);
  20.     }
  21.     void Dealociraj() {
  22.         delete _dan; _dan = nullptr;
  23.         delete _mjesec; _mjesec = nullptr;
  24.         delete _godina; _godina = nullptr;
  25.         delete _sati; _sati = nullptr;
  26.         delete _minuti; _minuti = nullptr;
  27.     }
  28.     void Ispis() {
  29.         cout << *_dan << "." << *_mjesec << "." << *_godina << " " << *_sati << ":" << *_minuti << endl;
  30.     }
  31.  
  32.     bool Prije(DatumVrijeme d)
  33.     {
  34.         if (*_godina < *d._godina)
  35.             return true;
  36.         if (*_godina == *d._godina && *_mjesec < *d._mjesec)
  37.             return true;
  38.         if (*_godina == *d._godina && *_mjesec == *d._mjesec && *_dan < *d._dan)
  39.             return true;
  40.         if (*_godina == *d._godina && *_mjesec == *d._mjesec && *_dan == *d._dan && *_sati < *d._sati)
  41.             return true;
  42.         if (*_godina == *d._godina && *_mjesec == *d._mjesec && *_dan == *d._dan && *_sati == *d._sati && *_minuti < *d._minuti)
  43.             return true;
  44.         return false;
  45.     }
  46.  
  47.     bool Poslije(DatumVrijeme d)
  48.     {
  49.         return !Prije(d);
  50.     }
  51.  
  52.     char * GetDatumKaoNizKaraktera()
  53.     {
  54.         char dan[3], mjesec[3], godina[5], sati[3], minuti[3];
  55.         _itoa_s(*_dan, dan, 10);
  56.         _itoa_s(*_mjesec, mjesec, 10);
  57.         _itoa_s(*_godina, godina, 10);
  58.         _itoa_s(*_sati, sati, 10);
  59.         _itoa_s(*_minuti, minuti, 10);
  60.  
  61.         int vel = strlen(dan) + strlen(mjesec) + strlen(godina) + strlen(sati) + strlen(minuti) + 5;
  62.         char * datum = new char[vel];
  63.         strcpy_s(datum, strlen(dan) + 1, dan);
  64.         strcat_s(datum, vel, ".");
  65.         strcat_s(datum, vel, mjesec);
  66.         strcat_s(datum, vel, ".");
  67.         strcat_s(datum, vel, godina);
  68.         strcat_s(datum, vel, " ");
  69.         strcat_s(datum, vel, sati);
  70.         strcat_s(datum, vel, ":");
  71.         strcat_s(datum, vel, minuti);
  72.         return datum;      
  73.     }
  74. };
  75.  
  76. const DatumVrijeme rokZaPrijavu = { new int(5), new int(7), new int(2017), new int(12), new int(30) };
  77.  
  78. struct Predmet {
  79.     char * _naziv;
  80.     int _ocjena;
  81.     DatumVrijeme * _datumUnosa;
  82.     void Unos(char * naziv, int ocjena, DatumVrijeme datumUnosa) {
  83.         int vel = strlen(naziv) + 1;
  84.         _naziv = new char[vel];
  85.         strcpy_s(_naziv, vel, naziv);
  86.         _ocjena = ocjena;
  87.         _datumUnosa = new DatumVrijeme;
  88.         _datumUnosa->Unos(*datumUnosa._dan, *datumUnosa._mjesec, *datumUnosa._godina, *datumUnosa._sati, *datumUnosa._minuti);
  89.     }
  90.     void Dealociraj() {
  91.         delete[] _naziv; _naziv = nullptr;
  92.         _datumUnosa->Dealociraj(); delete _datumUnosa;
  93.     }
  94.  
  95.     void Ispis() {
  96.         cout << _naziv << " (" << _ocjena << ") " << _datumUnosa->GetDatumKaoNizKaraktera() << endl;
  97.     }
  98. };
  99.  
  100. struct Uspjeh {
  101.     eRazred _razred;
  102.     Predmet * _predmeti;
  103.     int _brojPredmeta;
  104.     void Unos(eRazred razred) {
  105.         _razred = razred;
  106.         _predmeti = nullptr;
  107.         _brojPredmeta = 0;
  108.     }
  109.     void Dealociraj() {
  110.         for (size_t i = 0; i < _brojPredmeta; i++)
  111.             _predmeti[i].Dealociraj();
  112.         delete[] _predmeti; _predmeti = nullptr;
  113.     }
  114.  
  115.     void Ispis() {
  116.         cout << crt << "Razred -> " << _razred << crt;
  117.         for (size_t i = 0; i < _brojPredmeta; i++)
  118.             _predmeti[i].Ispis();
  119.     }
  120.  
  121.     float VratiProsjek()
  122.     {
  123.         float suma(0);
  124.         for (size_t i = 0; i < _brojPredmeta; i++) suma += _predmeti[i]._ocjena;
  125.         return suma / _brojPredmeta;
  126.     }
  127. };
  128.  
  129. struct Kandidat {
  130.     eNacinStudiranja _nacinStudiranja;
  131.     char * _imePrezime;
  132.     shared_ptr<Uspjeh> _uspjeh[4];
  133.  
  134.     void Unos(eNacinStudiranja nacinStudiranja, char * imePrezime) {
  135.         int vel = strlen(imePrezime) + 1;
  136.         _imePrezime = new char[vel];
  137.         strcpy_s(_imePrezime, vel, imePrezime);
  138.         _nacinStudiranja = nacinStudiranja;
  139.         for (size_t i = 0; i < 4; i++)
  140.             _uspjeh[i] = nullptr;
  141.     }
  142.     void Dealociraj() {
  143.         delete[] _imePrezime; _imePrezime = nullptr;
  144.         for (size_t i = 0; _uspjeh[i] != nullptr; i++)
  145.             _uspjeh[i]->Dealociraj();
  146.     }
  147.     void Ispis() {
  148.         cout << crt << _imePrezime << " " << _nacinStudiranja;
  149.         for (size_t i = 0; _uspjeh[i] != nullptr; i++)
  150.             _uspjeh[i]->Ispis();
  151.     }
  152.  
  153.     bool DodajPredmet(eRazred r, Predmet p)
  154.     {
  155.         if (r != PRVI && r != DRUGI && r != TRECI && r != CETVRTI) return false;
  156.         if (p._datumUnosa->Poslije(rokZaPrijavu)) return false;
  157.  
  158.         int indeks(-1);
  159.         for (size_t i = 0; i < 4 && indeks == -1; i++)
  160.         {
  161.             if (_uspjeh[i] == nullptr) indeks = i;
  162.             else if (_uspjeh[i]->_razred == r)
  163.             {
  164.                 for (size_t j = 0; j < _uspjeh[i]->_brojPredmeta; j++)
  165.                     if (strcmp(_uspjeh[i]->_predmeti[j]._naziv, p._naziv) == 0)
  166.                         return false;
  167.                 indeks = i;
  168.             }
  169.         }
  170.  
  171.         if (_uspjeh[indeks] == nullptr)
  172.         {
  173.             _uspjeh[indeks] = make_shared<Uspjeh>();
  174.             _uspjeh[indeks]->Unos(r);
  175.         }
  176.  
  177.         Predmet * tempPredmeti = new Predmet[_uspjeh[indeks]->_brojPredmeta + 1];
  178.  
  179.         for (size_t i = 0; i < _uspjeh[indeks]->_brojPredmeta; i++)
  180.         {
  181.             tempPredmeti[i].Unos(_uspjeh[indeks]->_predmeti[i]._naziv, _uspjeh[indeks]->_predmeti[i]._ocjena, *_uspjeh[indeks]->_predmeti[i]._datumUnosa);
  182.             _uspjeh[indeks]->_predmeti[i].Dealociraj();
  183.         }
  184.  
  185.         delete[] _uspjeh[indeks]->_predmeti;
  186.         _uspjeh[indeks]->_predmeti = tempPredmeti;
  187.         _uspjeh[indeks]->_predmeti[_uspjeh[indeks]->_brojPredmeta++].Unos(p._naziv, p._ocjena, *p._datumUnosa);
  188.         return true;
  189.     }
  190. };
  191.  
  192. Kandidat * rekNajboljaOcjena(Kandidat * prijave, int brojKandidata, char * nazivPredmeta, int indeksK = -1, int najveca = -1, int brojacK = 0, int brojacU = 0, int  brojacP = 0)
  193. {
  194.     if (brojacK == brojKandidata)
  195.     {
  196.         if (indeksK == -1) return nullptr;
  197.         return &prijave[indeksK];
  198.     }
  199.  
  200.     if (prijave[brojacK]._uspjeh[brojacU] == nullptr)
  201.         return rekNajboljaOcjena(prijave, brojKandidata, nazivPredmeta, indeksK, najveca, brojacK + 1, brojacU = 0, brojacP = 0);
  202.     if(prijave[brojacK]._uspjeh[brojacU]->_brojPredmeta == brojacP)
  203.         return rekNajboljaOcjena(prijave, brojKandidata, nazivPredmeta, indeksK, najveca, brojacK , brojacU + 1, brojacP = 0);
  204.     if(strcmp(prijave[brojacK]._uspjeh[brojacU]->_predmeti[brojacP]._naziv, nazivPredmeta) == 0 && prijave[brojacK]._uspjeh[brojacU]->_predmeti[brojacP]._ocjena > najveca)
  205.         return rekNajboljaOcjena(prijave, brojKandidata, nazivPredmeta, brojacK, prijave[brojacK]._uspjeh[brojacU]->_predmeti[brojacP]._ocjena, brojacK, brojacU + 1, brojacP = 0);
  206.     return rekNajboljaOcjena(prijave, brojKandidata, nazivPredmeta, indeksK, najveca, brojacK, brojacU, brojacP + 1);
  207. }
  208.  
  209. void main()
  210. {
  211.     DatumVrijeme datum19062017_1015, datum20062017_1115, datum30062017_1215, datum05072017_1231;
  212.     datum19062017_1015.Unos(19, 6, 2017, 10, 15);
  213.     datum20062017_1115.Unos(20, 6, 2017, 11, 15);
  214.     datum30062017_1215.Unos(30, 6, 2017, 12, 15);
  215.     datum05072017_1231.Unos(5, 7, 2017, 12, 31);
  216.  
  217.     cout << datum19062017_1015.GetDatumKaoNizKaraktera() << endl;
  218.  
  219.     Predmet Matematika, Fizika, Hemija, Engleski;
  220.     Matematika.Unos("Matematika", 2, datum19062017_1015);
  221.     Fizika.Unos("Fizika", 5, datum20062017_1115);
  222.     Hemija.Unos("Hemija", 2, datum20062017_1115);
  223.     Engleski.Unos("Engleski", 5, datum05072017_1231);
  224.  
  225.     int brojKandidata = 2;
  226.  
  227.     Kandidat * prijave2017 = new Kandidat[brojKandidata];
  228.     prijave2017[0].Unos(DL, "Jasmin Azemovic");
  229.     prijave2017[1].Unos(REDOVAN, "Indira Hamulic");
  230.  
  231.     if (prijave2017[0].DodajPredmet(DRUGI, Engleski))
  232.         cout << "Predmet uspjesno dodan!" << crt;
  233.     if (prijave2017[0].DodajPredmet(DRUGI, Matematika))
  234.         cout << "Predmet uspjesno dodan!" << crt;
  235.     if (prijave2017[0].DodajPredmet(PRVI, Fizika))
  236.         cout << "Predmet uspjesno dodan!" << crt;
  237.     if (prijave2017[0].DodajPredmet(PRVI, Hemija))
  238.         cout << "Predmet uspjesno dodan!" << crt;
  239.  
  240.     Matematika._ocjena = 5;
  241.     Hemija._ocjena = 3;
  242.  
  243.     if (prijave2017[1].DodajPredmet(PRVI, Matematika))
  244.         cout << "Predmet uspjesno dodan!" << crt;
  245.     if (prijave2017[1].DodajPredmet(PRVI, Matematika))
  246.         cout << "Predmet uspjesno dodan!" << crt;
  247.     if (prijave2017[1].DodajPredmet(TRECI, Hemija))
  248.         cout << "Predmet uspjesno dodan!" << crt;
  249.     if (prijave2017[1].DodajPredmet(DRUGI, Engleski))
  250.         cout << "Predmet uspjesno dodan!" << crt;
  251.  
  252.     auto najboljiUspjeh = [prijave2017, brojKandidata]() -> shared_ptr<Uspjeh> {
  253.         int najbolji = 0, trenutno = 0, indeksK = 0, indeksU = 0;
  254.         for (size_t i = 0; i < brojKandidata; i++)
  255.         {
  256.             for (size_t j = 0; prijave2017[i]._uspjeh[j] != nullptr; j++)
  257.             {
  258.                 trenutno = prijave2017[i]._uspjeh[j]->VratiProsjek();
  259.                 if (trenutno > najbolji)
  260.                 {
  261.                     najbolji = trenutno;
  262.                     indeksK = i; indeksU = j;
  263.                 }
  264.             }
  265.         }
  266.         return prijave2017[indeksK]._uspjeh[indeksU];
  267.     };
  268.  
  269.     shared_ptr<Uspjeh> najbolji = najboljiUspjeh();
  270.     najbolji->Ispis();
  271.  
  272.     Kandidat * kandidatSaNajboljomOcjenom = rekNajboljaOcjena(prijave2017, brojKandidata, "Matematika");
  273.    
  274.     for (size_t i = 0; i < brojKandidata; i++)
  275.     {
  276.         prijave2017[i].Ispis();
  277.         prijave2017[i].Dealociraj();
  278.     }
  279.     delete[] prijave2017;
  280.     prijave2017 = nullptr;
  281.  
  282.     system("pause>0");
  283. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement