wiuu23

VrsteObaveze, sharedPtr, lambda, rekurzija

Sep 13th, 2018
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.61 KB | None | 0 0
  1. #include<iostream>
  2. /*
  3. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NECE BODOVATI
  4. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  5. 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
  6. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  7. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI CETE KOPIRATI VAŠA RJEŠENJA)
  8. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAÐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  9. */
  10.  
  11. using namespace std;
  12. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  13. #pragma warning(disable:4996)
  14.  
  15. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  16. const char * vrstaObavezeChar[] = { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni", "Prakticni" };
  17.  
  18. struct Datum {
  19.     int * _dan, *_mjesec, *_godina;
  20.     void Unos(int d, int m, int g) {
  21.         _dan = new int(d);
  22.         _mjesec = new int(m);
  23.         _godina = new int(g);
  24.     }
  25.     void Ispis() {
  26.         cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
  27.     }
  28.     void Dealociraj() { delete _dan; delete _mjesec; delete _godina; }
  29. };
  30. bool veciDatum(Datum d1, Datum d2)
  31. {
  32.     if (*d1._godina < *d2._godina)
  33.         return true;
  34.     else if (*d2._godina < *d1._godina)
  35.         return false;
  36.  
  37.     if (*d1._mjesec < *d2._mjesec)
  38.         return true;
  39.     else if (*d2._mjesec < *d1._mjesec)
  40.         return false;
  41.  
  42.     if (*d1._dan < *d2._dan)
  43.         return true;
  44.     else if (*d2._dan < *d1._dan)
  45.         return false;
  46.  
  47.     return true;
  48. }
  49. struct ObavezeNaPredmetu {
  50.     shared_ptr<VrstaObaveze> _vrstaObaveze;
  51.     Datum _datumIzvrsenja;
  52.     char * _napomena;
  53.     int _ocjena; // 5 - 10
  54.     void Unos(VrstaObaveze vrsta, Datum datum, int ocjena, const char * napomena) {
  55.         _vrstaObaveze = make_shared <VrstaObaveze>(vrsta) /*DOPUNITI*/;
  56.         //_datumIzvrsenja = datum;
  57.         _datumIzvrsenja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
  58.         _ocjena = ocjena;
  59.         _napomena = new char[strlen(napomena) + 1];
  60.         strcpy_s(_napomena, strlen(napomena) + 1, napomena);
  61.     }
  62.     void Ispis() {
  63.         cout << vrstaObavezeChar[*_vrstaObaveze] /*DOPUNITI*/ << " " << _ocjena << " " << _napomena;
  64.         _datumIzvrsenja.Ispis();
  65.         cout << endl;
  66.     }
  67.     void Dealociraj() {
  68.         _datumIzvrsenja.Dealociraj();
  69.         delete[] _napomena; _napomena = nullptr;
  70.     }
  71. };
  72.  
  73. const char * _kljucneRijeci[15] = { NULL }; /*da bi se odredjena obaveza na predmetu smatrala uspjesno izvrsenom,
  74.                                             u napomeni (objekta ObavezeNaPredmetu) ne smije stajati niti jedna od rijeci koja se nalazi u nizu _kljucneRijeci*/
  75.  
  76. struct PolozeniPredmet {
  77.     Datum _datumPolaganja;//datum koji ce se evidentirati kao datum kada je predmet polozen tj. kada je formirana konacna ocjena
  78.     char * _nazivPredmeta;
  79.     ObavezeNaPredmetu * _listaIzvrsenihObaveza;
  80.     int _trenutnoIzvrsenihObaveza;
  81.     int _minimalanBrojDana; //odnosi se na minimalan broj dana koji mora proci od izvrsenja pojedinih obaveza na predmetu (npr. 7 dana)
  82.     int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
  83.  
  84.     void Unos(const char * naziv, int minimalanBrojDana) {
  85.         _nazivPredmeta = new char[strlen(naziv) + 1];
  86.         strcpy_s(_nazivPredmeta, strlen(naziv) + 1, naziv);
  87.         _listaIzvrsenihObaveza = nullptr;
  88.         _trenutnoIzvrsenihObaveza = 0;
  89.         _minimalanBrojDana = minimalanBrojDana;
  90.         _konacnaOcjena = 0;
  91.         _datumPolaganja.Unos(0, 0, 0);
  92.     }
  93.     void Dealociraj()
  94.     {
  95.         //if (_datumPolaganja._dan != nullptr && _datumPolaganja._mjesec != nullptr && _datumPolaganja._godina != nullptr)
  96.         //{
  97.         _datumPolaganja.Dealociraj();
  98.         //}
  99.         delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
  100.         for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  101.         {
  102.             _listaIzvrsenihObaveza[i].Dealociraj();
  103.         }
  104.         delete[]_listaIzvrsenihObaveza;
  105.     }
  106.     /*Na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu.
  107.     Potrebno je onemoguciti dodavanje identicnih obaveza,
  108.     a izmedju izvrsenja pojedinih obaveza mora proci najmanje onoliko dana koliko je definisano vrijednoscu atributa _minimalanBrojDana.
  109.     Identicna vrsta obaveze se moze dodati samo u slucaju da je prethodno dodana obaveza (identicne vrste) imala ocjenu 5
  110.     ili je u napomeni sadrzavala neku od zabranjenih rijeci
  111.     (definisanih nizom _kljucneRijeci).*/
  112.     bool DodajIzvrsenuObavezu(VrstaObaveze obaveza, Datum datum, int ocjena, const char * napomena)
  113.     {
  114.         //provjere
  115.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  116.         {
  117.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == obaveza && _listaIzvrsenihObaveza[i]._ocjena != 5) //uvjet za provjeru kljucnih rijeci
  118.             {
  119.                 return false;
  120.             }
  121.         }
  122.         for (int j = 0; j < 15; j++)
  123.         {
  124.             if (_kljucneRijeci[j] != nullptr)
  125.             {
  126.                 if (strstr(napomena, _kljucneRijeci[j]) != nullptr)
  127.                 {
  128.                     return false;
  129.                 }
  130.             }
  131.         }
  132.  
  133.         ObavezeNaPredmetu * temp = new ObavezeNaPredmetu[_trenutnoIzvrsenihObaveza + 1];
  134.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  135.         {
  136.             temp[i].Unos(*_listaIzvrsenihObaveza[i]._vrstaObaveze, _listaIzvrsenihObaveza[i]._datumIzvrsenja, _listaIzvrsenihObaveza[i]._ocjena,
  137.                 _listaIzvrsenihObaveza[i]._napomena);
  138.         }
  139.         temp[_trenutnoIzvrsenihObaveza].Unos(obaveza, datum, ocjena, napomena);
  140.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  141.         {
  142.             _listaIzvrsenihObaveza[i].Dealociraj();
  143.         }
  144.         delete[] _listaIzvrsenihObaveza;
  145.         _listaIzvrsenihObaveza = temp;
  146.         _trenutnoIzvrsenihObaveza++;
  147.         //cout << "Obaveza: " << _trenutnoIzvrsenihObaveza << " dodana. ";
  148.         return true;
  149.     }
  150.     /*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu (prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta),
  151.     a za njeno formiranje student mora posjedovati
  152.     polozen integralni
  153.     ili dva parijcalna ispita. Ukoliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati pozitivno (ocjenom vecom od 5)
  154.     ocijenjena najmanje dva seminarska i jedan prakticni rad.
  155.     Takodjer, datum polaganja drugog parcijalnog ispita ne smije biti raniji (manji) od datuma polaganja prvog parcijalnog ispita.
  156.     Konacna ocjena ne smije biti formirana u slucaju da napomena bilo koje odbaveze (koja je ucestvovala u formiranju konacne ocjene) sadrzi neku od
  157.     zabranjenih rijeci (niz _kljucneRijeci).
  158.     U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5. Ukoliko su ispunjeni svi uslovi,
  159.     osim formiranja konacne ocjene, datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze sa najvecom ocjenom.
  160.     */
  161.     float FormirajKonacnuOcjenu()
  162.     {
  163.         //provjere
  164.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  165.         {
  166.             for (int j = 0; j < 15; j++)
  167.             {
  168.                 if (_kljucneRijeci[j] != nullptr)
  169.                 {
  170.                     if (strstr(_listaIzvrsenihObaveza[i]._napomena, _kljucneRijeci[j]) != nullptr)
  171.                     {
  172.                         cout << "U napomeni stoji neka od zabranjenih rijeci... " << endl;
  173.                         _konacnaOcjena = 5;
  174.                         return _konacnaOcjena;
  175.                     }
  176.                 }
  177.             }
  178.         }
  179.  
  180.         int brojSeminarskih = 0, brojPrakticnih = 0;
  181.         int ocjenaSeminarski = 0, ocjenaPrakticni = 0, ocjenaParcijala = 0;
  182.         int sumaSvihOcjena = 0;
  183.         float prosjecnaOcjena = 0;
  184.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)//brojanje uslova za parcijale i sabiranje ocjena
  185.         {
  186.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]._ocjena > 5)
  187.             {
  188.                 ocjenaSeminarski += _listaIzvrsenihObaveza[i]._ocjena;
  189.                 brojSeminarskih++;
  190.             }
  191.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Prakticni && _listaIzvrsenihObaveza[i]._ocjena > 5)
  192.             {
  193.                 ocjenaPrakticni += _listaIzvrsenihObaveza[i]._ocjena;
  194.                 brojPrakticnih++;
  195.             }
  196.         }
  197.  
  198.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)//ukoliko se radi o integralnom ispitu
  199.         {
  200.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Integralni && _listaIzvrsenihObaveza[i]._ocjena > 5)
  201.             {
  202.                 _konacnaOcjena = _listaIzvrsenihObaveza[i]._ocjena;
  203.                 return _konacnaOcjena;
  204.             }
  205.         }
  206.  
  207.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)// ukoliko se radi o parcijalnim ispitima, ako nisu izvrsene obaveze pada
  208.         {
  209.             if (brojSeminarskih < 2)
  210.             {
  211.                 _konacnaOcjena = 5;
  212.                 return _konacnaOcjena;
  213.             }
  214.             if (brojPrakticnih < 1)
  215.             {
  216.                 _konacnaOcjena = 5;
  217.                 return _konacnaOcjena;
  218.             }
  219.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]._ocjena > 5) //polozen prvi parcijalni - saberi date ocjene
  220.             {
  221.                 ocjenaParcijala += _listaIzvrsenihObaveza[i]._ocjena;
  222.             }
  223.             else if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]._ocjena == 5) // prvi parcijalni nije polozen, pao si
  224.             {
  225.                 _konacnaOcjena = 5;
  226.                 return _konacnaOcjena;
  227.             }
  228.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]._ocjena > 5) // polozen II parcijalni, saberi ocjene
  229.             {
  230.                 ocjenaParcijala += _listaIzvrsenihObaveza[i]._ocjena;
  231.             }
  232.             else if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]._ocjena == 5)// II parcijalni nije polozen, pao si
  233.             {
  234.                 _konacnaOcjena = 5;
  235.                 return _konacnaOcjena;
  236.             }
  237.         }
  238.         //sabiranje svih ocjena uz obaveze koje zahtjevaju parcijalni ispiti(parcijale, seminarki, partkicni)
  239.         sumaSvihOcjena += ocjenaSeminarski;
  240.         sumaSvihOcjena += ocjenaPrakticni;
  241.         sumaSvihOcjena += ocjenaParcijala;
  242.         prosjecnaOcjena = sumaSvihOcjena / (2, brojPrakticnih + brojSeminarskih); //konacna ocjena parcijala i izvrsenih obaveza
  243.         _konacnaOcjena = prosjecnaOcjena;
  244.  
  245.         int maximalnaOcjena = 0;
  246.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++) //trazenje makismalne ocjene tj. njen indeks
  247.         {
  248.             if (_listaIzvrsenihObaveza[i]._ocjena > _listaIzvrsenihObaveza[maximalnaOcjena]._ocjena)
  249.             {
  250.                 maximalnaOcjena = i;
  251.             }
  252.         }
  253.         //postavljanje datuma na indeks maksimalne ocjene
  254.         _datumPolaganja.Unos(*_listaIzvrsenihObaveza[maximalnaOcjena]._datumIzvrsenja._dan, *_listaIzvrsenihObaveza[maximalnaOcjena]._datumIzvrsenja._mjesec,
  255.             *_listaIzvrsenihObaveza[maximalnaOcjena]._datumIzvrsenja._godina);
  256.         return prosjecnaOcjena;
  257.     }
  258. };
  259. /*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu odredjene vrste u definisanom periodu.
  260. Izbjegavati koristenje globalnih varijabli*/
  261. int i=0;
  262. float PretragaRekurzivno(PolozeniPredmet & predmet, VrstaObaveze obaveza, Datum OD, Datum DO, int brojac, int suma)
  263. {
  264.     float prosjek;
  265.     if (predmet._trenutnoIzvrsenihObaveza == i)
  266.     {
  267.         if (brojac == 0)
  268.             return 0;
  269.         else
  270.         {
  271.             prosjek = float(suma) / brojac;
  272.             return prosjek;
  273.         }
  274.     }
  275.     else
  276.     {
  277.         if (*predmet._listaIzvrsenihObaveza[i]._vrstaObaveze == obaveza)
  278.         {
  279.             if (veciDatum(OD, predmet._listaIzvrsenihObaveza[i]._datumIzvrsenja) && veciDatum(predmet._listaIzvrsenihObaveza[i]._datumIzvrsenja, DO))
  280.             {
  281.                 suma += predmet._listaIzvrsenihObaveza[i]._ocjena;
  282.                 brojac++;
  283.             }
  284.         }
  285.     }
  286.     i++;
  287.     return PretragaRekurzivno(predmet, obaveza, OD, DO, brojac, suma);
  288. }
  289.  
  290. /*Koristeci lambda-u, unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od prosjecne*/
  291. int GetBrojObavezaIznadProsjeka(PolozeniPredmet & predmet, float prosjek)
  292. {
  293.    
  294.     auto lambda = [&]()
  295.     {
  296.         int brojac = 0;
  297.         int sumaOcjena = 0;
  298.         for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
  299.         {
  300.             sumaOcjena += predmet._listaIzvrsenihObaveza[i]._ocjena;
  301.         }
  302.         prosjek = sumaOcjena / predmet._trenutnoIzvrsenihObaveza;
  303.         for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
  304.         {
  305.             if (predmet._listaIzvrsenihObaveza[i]._ocjena >= prosjek)
  306.             {
  307.                 brojac++;
  308.             }
  309.         }
  310.         return brojac;
  311.     };
  312.     return lambda();
  313. }
  314. void main() {
  315.     _kljucneRijeci[0] = "prepisivao";
  316.     _kljucneRijeci[1] = "ometao";
  317.     _kljucneRijeci[2] = "nije dostavio";
  318.  
  319.     Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2, datumIntegralni;
  320.     datumSeminarski1.Unos(10, 6, 2017);
  321.     datumSeminarski2.Unos(18, 6, 2017);
  322.     datumParcijalni1.Unos(22, 6, 2017);
  323.     datumParcijalni2.Unos(30, 6, 2017);
  324.  
  325.     PolozeniPredmet prII;
  326.     //naziv predmeta, minimalan broj dana
  327.     prII.Unos("Programiranje II", 7);
  328.  
  329.     /*Na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu. Potrebno je onemoguciti dodavanje identicnih obaveza, a izmedju izvrsenja pojedinih obaveza mora proci najmanje onoliko dana koliko je definisano vrijednoscu atributa _minimalanBrojDana. Identicna vrsta obaveze se moze dodati samo u slucaju da je prethodno dodana obaveza (identicne vrste) imala ocjenu 5 ili je u napomeni sadrzavala neku od zabranjenih rijeci (definisanih nizom _kljucneRijeci).*/
  330.     if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen ispit"))
  331.         cout << "Parcijalni 1...dodan" << endl;
  332.     if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka, a tokom ispita ometao druge studente"))
  333.         cout << "Parcijalni 2...dodan" << endl;
  334.     if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski1, 8, "implementirani svi algoritmi"))
  335.         cout << "Seminarski1...dodan" << endl;
  336.     if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski2, 6, "rad slican kao kod studenta IB150388"))
  337.         cout << "Seminarski2...dodan" << endl;
  338.  
  339.     /*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu (prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta),
  340.     a za njeno formiranje student mora posjedovati polozen integralni ili dva parijcalna ispita. Ukoliko je ispit polozen putem parcijalnih ispita,
  341.     student takodjer mora imati pozitivno (ocjenom vecom od 5) ocijenjena najmanje dva seminarska i jedan prakticni rad. Takodjer, datum polaganja
  342.     drugog parcijalnog ispita ne smije biti raniji (manji) od datuma polaganja prvog parcijalnog ispita. Konacna ocjena ne smije biti formirana u
  343.     slucaju da napomena bilo koje odbaveze (koja je ucestvovala u formiranju konacne ocjene) sadrzi neku od zabranjenih rijeci (niz _kljucneRijeci).
  344.     U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5. Ukoliko su ispunjeni svi uslovi,
  345.     osim formiranja konacne ocjene, datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze sa najvecom ocjenom.
  346.     */
  347.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  348.  
  349.     datumParcijalni2.Unos(22, 7, 2017);
  350.     if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
  351.         cout << "Parcijalni 2...dodan" << endl;
  352.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  353.     Datum OD, DO; OD.Unos(1, 1, 2017); DO.Unos(1, 7, 2017);
  354.  
  355.     /*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu odredjene vrste u definisanom periodu.
  356.     Izbjegavati koristenje globalnih varijabli*/
  357.     float prosjek = PretragaRekurzivno(prII, Seminarski, OD, DO, 0, 0);
  358.     cout << "Prosjecna ocjena izvrsenih obaveza je: " << prosjek << endl;
  359.  
  360.     /*Koristeci lambda-u, unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od prosjecne*/
  361.     int iznadProsjeka = GetBrojObavezaIznadProsjeka(prII, prosjek);
  362.     cout << "Broj izvrsenih obaveza iznad prosjeka je: " << iznadProsjeka << endl;
  363.  
  364.     datumParcijalni1.Dealociraj();
  365.     datumParcijalni2.Dealociraj();
  366.     datumSeminarski1.Dealociraj();
  367.     datumSeminarski2.Dealociraj();
  368.     //datumIntegralni.Dealociraj(); - zakomentarisan jer nigdje unutar main funckije nije unesen
  369.     datumIntegralni.Unos(23, 03, 1995); // ili je moguce prvo unijeti datum, pa onda pozivati njegovu funkciju za dealokaciju
  370.     datumIntegralni.Dealociraj();
  371.     prII.Dealociraj();
  372.  
  373.     system("PAUSE");
  374. }
Advertisement
Add Comment
Please, Sign In to add comment