Advertisement
wiuu23

PR2-Ispit-shared_ptr-nizKaraktera

Sep 2nd, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <memory>
  3. using namespace std;
  4. /*
  5. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEÆE BODOVATI
  6. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  7. 3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB160061.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  8. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  9. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI ÆETE KOPIRATI VAŠA RJEŠENJA)
  10. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAÐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  11. */
  12. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  13. #pragma warning(disable:4996)
  14.  
  15. char *crt = "\n-------------------------------------------\n";
  16.  
  17. enum eNacinStudiranja { REDOVAN, DL };
  18. enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  19.  
  20.  
  21. struct DatumVrijeme
  22. {
  23.     int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  24.     void Unos(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0)
  25.     {
  26.         _dan = new int(dan);
  27.         _mjesec = new int(mjesec);
  28.         _godina = new int(godina);
  29.         _sati = new int(sati);
  30.         _minuti = new int(minuti);
  31.     }
  32.     void Dealociraj()
  33.     {
  34.         delete _dan; _dan = nullptr;
  35.         delete _mjesec; _mjesec = nullptr;
  36.         delete _godina; _godina = nullptr;
  37.         delete _sati; _sati = nullptr;
  38.         delete _minuti; _minuti = nullptr;
  39.     }
  40.     void Ispis()
  41.     {
  42.         cout << *_dan << "." << *_mjesec << "." << *_godina << " " << *_sati << ":" << *_minuti << endl;
  43.     }
  44.     bool rokPrijaveProvejra(DatumVrijeme datum)
  45.     {
  46.         if (*datum._godina > *_godina)
  47.             return false;
  48.         else if (*datum._godina == *_godina && *datum._mjesec > *_mjesec)
  49.             return false;
  50.         else if (*datum._godina == *_godina && *datum._mjesec == *_mjesec && *datum._dan > *_dan)
  51.             return false;
  52.         else if (*datum._godina == *_godina && *datum._mjesec == *_mjesec && *datum._dan == *_dan && *datum._sati > *_sati)
  53.             return false;
  54.         else if (*datum._godina == *_godina && *datum._mjesec == *_mjesec && *datum._dan == *_dan && *datum._sati == *_sati && *datum._minuti > *_minuti)
  55.             return false;
  56.         else return true;
  57.     }
  58.     bool istiDatum(DatumVrijeme datum)
  59.     {
  60.         if (*datum._godina == *_godina && *datum._mjesec == *_mjesec && *datum._dan == *_dan && *datum._sati == *_sati && *datum._minuti == *_minuti)
  61.             return true;
  62.         return false;
  63.     }
  64.     //kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera
  65.     char * GetDatumKaoNizKaraktera()
  66.     {
  67.         // itoa integer to string itoa(int value, char * str, int base - 10)
  68.         // strcpy (char * destination, const char * source) kopria izvorni string u destinacijski string
  69.         // strcat (char * destination, const char * source) spaja dva stringa
  70.         //.
  71.         //:
  72.         //5.7.2017. 12:30
  73.         char dan[3], mjesec[3], godina[5], sati[3], minute[3];
  74.  
  75.         _itoa_s(*_godina, godina, 10);
  76.         _itoa_s(*_mjesec, mjesec, 10);
  77.         _itoa_s(*_dan, dan, 10);
  78.         _itoa_s(*_sati, sati, 10);
  79.         _itoa_s(*_minuti, minute, 10);
  80.  
  81.         int size = strlen(godina) + 1 + strlen(mjesec) + 1 + strlen(dan) + 1 + strlen(sati) + 1 + strlen(minute) + 1 + 1;
  82.         char * niz = new char[size];
  83.  
  84.         strcpy_s(niz, size, dan); // u niz smjesti dan
  85.         strcat_s(niz, size, "."); // na niz dan dodaj .
  86.         strcat_s(niz, size, mjesec); //nadovezi mjesec
  87.         strcat_s(niz, size, "."); //nadovezi tacku
  88.         strcat_s(niz, size, godina); //nadovezi godinu
  89.         strcat_s(niz, size, "."); //nadovezi tacku
  90.         strcat_s(niz, size, " "); //nadovezi space, odvoji dd/mm/yyyy od hh:mm
  91.         strcat_s(niz, size, sati); //dodaj sate
  92.         strcat_s(niz, size, ":"); //dodaj dvotacku na satima
  93.         strcat_s(niz, size, minute);//nadovezi minute
  94.  
  95.         return niz; // vrati napravljen niz
  96.     }
  97. };
  98.  
  99. const DatumVrijeme rokZaPrijavu = { new int(5), new int(7), new int(2017), new int(12), new int(30) };
  100.  
  101.  
  102. struct Predmet
  103. {
  104.     char * _naziv;
  105.     int _ocjena;
  106.     DatumVrijeme * _datumUnosa;
  107.     void Unos(char * naziv, int ocjena, DatumVrijeme datumUnosa)
  108.     {
  109.         int vel = strlen(naziv) + 1;
  110.         _naziv = new char[vel];
  111.         strcpy_s(_naziv, vel, naziv);
  112.         _ocjena = ocjena;
  113.         _datumUnosa = new DatumVrijeme;
  114.         _datumUnosa->Unos(*datumUnosa._dan, *datumUnosa._mjesec, *datumUnosa._godina, *datumUnosa._sati, *datumUnosa._minuti);
  115.     }
  116.     void Dealociraj()
  117.     {
  118.         delete[] _naziv; _naziv = nullptr;
  119.         _datumUnosa->Dealociraj(); delete _datumUnosa;
  120.     }
  121.  
  122.     void Ispis()
  123.     {
  124.         //kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera
  125.         cout << _naziv << " (" << _ocjena << ") " << _datumUnosa->GetDatumKaoNizKaraktera() << endl;
  126.     }
  127.     bool istiPredmet(Predmet predmet)
  128.     {
  129.         if (strcmp(_naziv, predmet._naziv) == 0 && _ocjena == predmet._ocjena && _datumUnosa->istiDatum(*predmet._datumUnosa))
  130.             return true;
  131.         return false;
  132.     }
  133.  
  134. };
  135.  
  136. struct Uspjeh
  137. {
  138.     eRazred _razred;
  139.     Predmet * _predmeti;
  140.     int _brojPredmeta;
  141.     void Unos(eRazred razred)
  142.     {
  143.         _razred = razred;
  144.         _predmeti = nullptr;
  145.         _brojPredmeta = 0;
  146.     }
  147.     void Dealociraj()
  148.     {
  149.         for (size_t i = 0; i < _brojPredmeta; i++)
  150.             _predmeti[i].Dealociraj();
  151.         delete[] _predmeti; _predmeti = nullptr;
  152.     }
  153.  
  154.     void Ispis()
  155.     {
  156.         cout << crt << "Razred -> " << _razred << crt;
  157.         for (size_t i = 0; i < _brojPredmeta; i++)
  158.         {
  159.             _predmeti[i].Ispis();
  160.         }
  161.     }
  162.     bool dodajPredmet(Predmet predmet)
  163.     {
  164.         Predmet * temp = new Predmet[_brojPredmeta + 1];
  165.         for (int i = 0; i < _brojPredmeta; i++)
  166.         {
  167.             temp[i].Unos(_predmeti[i]._naziv, _predmeti[i]._ocjena, *_predmeti[i]._datumUnosa);
  168.         }
  169.         temp[_brojPredmeta].Unos(predmet._naziv, predmet._ocjena, *predmet._datumUnosa);
  170.         for (int i = 0; i < _brojPredmeta; i++)
  171.         {
  172.             _predmeti[i].Dealociraj();
  173.         }
  174.         delete[] _predmeti;
  175.         _predmeti = temp;
  176.         _brojPredmeta++;
  177.         return true;
  178.     }
  179. };
  180.  
  181. struct Kandidat
  182. {
  183.     eNacinStudiranja _nacinStudiranja;
  184.     char * _imePrezime;
  185.     shared_ptr<Uspjeh> _uspjeh[4];
  186.  
  187.     void Unos(eNacinStudiranja nacinStudiranja, char * imePrezime)
  188.     {
  189.         int vel = strlen(imePrezime) + 1;
  190.         _imePrezime = new char[vel];
  191.         strcpy_s(_imePrezime, vel, imePrezime);
  192.         _nacinStudiranja = nacinStudiranja;
  193.         for (size_t i = 0; i < 4; i++)
  194.             _uspjeh[i] = nullptr;
  195.     }
  196.     void Dealociraj()
  197.     {
  198.         delete[] _imePrezime; _imePrezime = nullptr;
  199.         for (size_t i = 0; i < 4; i++)
  200.         {
  201.             if (_uspjeh[i] != nullptr)
  202.                 _uspjeh[i]->Dealociraj();
  203.         }
  204.     }
  205.     void Ispis()
  206.     {
  207.         cout << crt << _imePrezime << " " << _nacinStudiranja;
  208.         for (size_t i = 0; i < 4; i++)
  209.         {
  210.             if (_uspjeh[i] != nullptr)
  211.                 _uspjeh[i]->Ispis();
  212.         }
  213.     }
  214.     /*
  215.     uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  216.     prilikom dodavanja onemoguciti:
  217.     - dodavanje predmeta za razrede koji nisu definisani enumeracijom,
  218.     - dodavanje istoimenih predmeta na nivou jednog razreda,
  219.     - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
  220.     razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.).
  221.     Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  222.     */
  223.     bool DodajPredmet(eRazred razred, Predmet predmet)
  224.     {
  225.         //enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
  226.  
  227.         int pozicijaRazreda = razred - 1;
  228.         if (_uspjeh[pozicijaRazreda] == nullptr)
  229.         {
  230.             _uspjeh[pozicijaRazreda] = make_shared <Uspjeh>();
  231.             _uspjeh[pozicijaRazreda]->Unos(razred);
  232.  
  233.         }
  234.         if (razred != PRVI && razred != DRUGI && razred != TRECI && razred != CETVRTI)
  235.         {
  236.             cout << "Razred nije definisan enumeracijom." << crt;
  237.             return false;
  238.         }
  239.         if (predmet._datumUnosa->rokPrijaveProvejra(rokZaPrijavu))
  240.         {
  241.             cout << "Prosao rok za prijavu." << crt;
  242.             return false;
  243.         }
  244.         for (int i = 0; i < 4; i++)
  245.         {
  246.             if (_uspjeh[i] != nullptr)
  247.             {
  248.                 for (int j = 0; j < _uspjeh[i]->_brojPredmeta; j++)
  249.                 {
  250.                     if (_uspjeh[i]->_predmeti[j].istiPredmet(predmet))
  251.                     {
  252.                         cout << "Ne moze se dodati isti predmet na nivou jednog razreda." << crt;
  253.                         return false;
  254.                     }
  255.                 }
  256.             }
  257.         }
  258.         _uspjeh[pozicijaRazreda]->dodajPredmet(predmet);
  259.         cout << "Uspjesno dodan..." << endl;
  260.         return true;
  261.     }
  262. };
  263.  
  264. void main()
  265. {
  266.     DatumVrijeme datum19062017_1015, datum20062017_1115, datum30062017_1215, datum05072017_1231;
  267.     datum19062017_1015.Unos(19, 6, 2017, 10, 15);
  268.     datum20062017_1115.Unos(20, 6, 2017, 11, 15);
  269.     datum30062017_1215.Unos(30, 6, 2017, 12, 15);
  270.     datum05072017_1231.Unos(5, 7, 2017, 12, 31);
  271.  
  272.     cout << datum19062017_1015.GetDatumKaoNizKaraktera() << endl;//9.6.2017 10:15
  273.  
  274.     Predmet Matematika, Fizika, Hemija, Engleski;
  275.     //2 - ocjena na predmetu; datum - datum evidentiranja uspjeha na predmetu jer postoji krajnji rok za evidentiranje
  276.     Matematika.Unos("Matematika", 2, datum19062017_1015);
  277.     Fizika.Unos("Fizika", 5, datum20062017_1115);
  278.     Hemija.Unos("Hemija", 2, datum20062017_1115);
  279.     Engleski.Unos("Engleski", 5, datum05072017_1231);
  280.  
  281.     int brojKandidata = 2;
  282.  
  283.     Kandidat * prijave2017 = new Kandidat[brojKandidata];
  284.     prijave2017[0].Unos(DL, "Jasmin Azemovic");
  285.     prijave2017[1].Unos(REDOVAN, "Indira Hamulic");
  286.  
  287.     /*
  288.     uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
  289.     prilikom dodavanja onemoguciti:
  290.     - dodavanje predmeta za razrede koji nisu definisani enumeracijom,
  291.     - dodavanje istoimenih predmeta na nivou jednog razreda,
  292.     - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
  293.     razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  294.     */
  295.     if (prijave2017[0].DodajPredmet(DRUGI, Engleski))//ne bi trebao dodati jer je prosao postavljeni rok za dodavanje predmeta
  296.         cout << "Predmet uspjesno dodan!" << crt;
  297.     if (prijave2017[0].DodajPredmet(DRUGI, Matematika))
  298.         cout << "Predmet uspjesno dodan!" << crt;
  299.     if (prijave2017[0].DodajPredmet(PRVI, Fizika))
  300.         cout << "Predmet uspjesno dodan!" << crt;
  301.     if (prijave2017[0].DodajPredmet(PRVI, Hemija))
  302.         cout << "Predmet uspjesno dodan!" << crt;
  303.  
  304.     Matematika._ocjena = 5;
  305.     Hemija._ocjena = 3;
  306.  
  307.     if (prijave2017[1].DodajPredmet(PRVI, Matematika))
  308.         cout << "Predmet uspjesno dodan!" << crt;
  309.     if (prijave2017[1].DodajPredmet(PRVI, Matematika))//ne bi trebalo ponovo dodati Matematiku!
  310.         cout << "Predmet uspjesno dodan!" << crt;
  311.     if (prijave2017[1].DodajPredmet(TRECI, Hemija))
  312.         cout << "Predmet uspjesno dodan!" << crt;
  313.     if (prijave2017[1].DodajPredmet(DRUGI, Engleski))
  314.         cout << "Predmet uspjesno dodan!" << crt;
  315.  
  316.     /*
  317.     koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci prosjek (na nivou razreda, a ne ukupni prosjek).
  318.     ukoliko vise kandidata ima isti prosjek funkcija vraca uspjeh (najboljeg razreda) prvog pronadjenog kandidata
  319.     */
  320.     auto najboljiUspjeh = [&]()
  321.     {
  322.         //kandidat (prijave2017), broj kandidata
  323.         // prosjek= suma ocjena / broj predmeta
  324.         // suma, prosjek, broj predmeta
  325.         //najveci prosjek
  326.  
  327.         shared_ptr <Uspjeh> temp = nullptr;
  328.         float suma = 0;
  329.         float prosjek = 0;
  330.         float maxProsjek = 0;
  331.  
  332.         for (int i = 0; i < brojKandidata; i++)
  333.         {
  334.             for (int j = 0; j < 4; j++)
  335.             {
  336.                 if (prijave2017[i]._uspjeh[j] != nullptr)
  337.                 {
  338.                     for (int k = 0; k < prijave2017[i]._uspjeh[j]->_brojPredmeta; k++)
  339.                     {
  340.                         suma += prijave2017[i]._uspjeh[j]->_predmeti[k]._ocjena;
  341.                     }
  342.                     prosjek = suma / prijave2017[i]._uspjeh[j]->_brojPredmeta;
  343.  
  344.                     if (prosjek > maxProsjek)
  345.                     {
  346.                         maxProsjek = prosjek;
  347.                         temp = prijave2017[i]._uspjeh[j];
  348.                     }
  349.                 }
  350.             }
  351.         }
  352.         return temp;
  353.     };
  354.     cout << "Uspjeh kandidata s najboljim prosjekom. ";
  355.     shared_ptr<Uspjeh> najbolji = najboljiUspjeh();
  356.     najbolji->Ispis();
  357.  
  358.     /*
  359.     napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecom ocjenom na predmetu koji je proslijedjen kao parametar.
  360.     ukoliko je vise kandidata ostvarilo istu ocjenu, funkcija treba da vrati onog kandidata koji je prvi evidentirao tu ocjenu
  361.     (ako je isto vrijeme evidentiranja, onda funkcija vraca kandidata koji je prvi u nizu). u slucaju da niti jedan kandidat nije evidentirao trazeni predmet
  362.     funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale parametre dodajte po potrebi.
  363.     */
  364.     //Kandidat * kandidatSaNajboljomOcjenom = rekNajboljaOcjena(prijave2017, brojKandidata, "Matematika");
  365.  
  366.     for (size_t i = 0; i < brojKandidata; i++)
  367.     {
  368.         prijave2017[i].Ispis();
  369.         prijave2017[i].Dealociraj();
  370.     }
  371.     delete[] prijave2017;
  372.     prijave2017 = nullptr;
  373.  
  374.     system("pause>0");
  375. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement