Advertisement
limun11

obaveze shared_ptr

Jun 13th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.37 KB | None | 0 0
  1. // ConsoleApplication3.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6.  
  7.  
  8. #include<iostream>
  9. #include <memory>
  10. /*
  11. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  12. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  13. 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
  14. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  15. 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)
  16. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  17. */
  18.  
  19. using namespace std;
  20. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  21. #pragma warning(disable:4996)
  22.  
  23. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  24. const char * VrstaObavezeChar[] = { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni", "Prakticni" };
  25. struct Datum {
  26.     int * _dan, *_mjesec, *_godina;
  27.     void Unos(int d, int m, int g) {
  28.         _dan = new int(d);
  29.         _mjesec = new int(m);
  30.         _godina = new int(g);
  31.     }
  32.     void Ispis() {
  33.         cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
  34.     }
  35.     void Dealociraj()
  36.     {
  37.         //if (_dan != nullptr && _mjesec != nullptr && _godina != nullptr)
  38.         //{
  39.             delete _dan; delete _mjesec; delete _godina;
  40.         //}
  41.     }
  42. };
  43. //bool provjeraDatuma(Datum d1, Datum d2)
  44. //{
  45. //  if (d1._godina < d2._godina)
  46. //      return true;
  47. //  else if (d2._godina < d1._godina)
  48. //      return false;
  49. //  if (d1._mjesec < d2._mjesec)
  50. //      return true;
  51. //  else if (d2._mjesec < d1._mjesec)
  52. //      return false;
  53. //  if (d1._dan < d2._dan)
  54. //      return true;
  55. //  else
  56. //      return false;
  57. //}
  58.  
  59. struct ObavezeNaPredmetu {
  60.     shared_ptr<VrstaObaveze> _vrstaObaveze;
  61.     Datum _datumIzvrsenja;
  62.     char * _napomena;
  63.     int _ocjena; // 5 - 10
  64.     void Unos(VrstaObaveze vrsta, Datum & datum, int ocjena, const char * napomena) {
  65.         _vrstaObaveze = make_shared<VrstaObaveze>(vrsta) /*DOPUNITI*/;
  66.         _datumIzvrsenja.Unos(*datum._dan, *datum._mjesec, *datum._godina);
  67.         _ocjena = ocjena;
  68.         _napomena = new char[strlen(napomena) + 1];
  69.         strcpy_s(_napomena, strlen(napomena) + 1, napomena);
  70.     }
  71.     void Ispis() {
  72.         cout << VrstaObavezeChar[*_vrstaObaveze] /*DOPUNITI*/ << " " << _ocjena << " " << _napomena;
  73.         _datumIzvrsenja.Ispis();
  74.         cout << endl;
  75.     }
  76.     void Dealociraj() {
  77.         //if (_datumIzvrsenja._dan != nullptr && _datumIzvrsenja._mjesec != nullptr && _datumIzvrsenja._godina != nullptr)
  78.         //{
  79.             _datumIzvrsenja.Dealociraj();
  80.         //}
  81.         delete[] _napomena; _napomena = nullptr;
  82.     }
  83. };
  84.  
  85. const char * _kljucneRijeci[15] = { NULL }; /*da bi se odredjena obaveza na predmetu smatrala uspjesno izvrsenom, u napomeni (objekta ObavezeNaPredmetu)
  86.                                             //ne smije stajati niti jedna od rijeci koja se nalazi u nizu _kljucneRijeci*/
  87.  
  88. struct PolozeniPredmet {
  89.     Datum _datumPolaganja;//datum koji ce se evidentirati kao datum kada je predmet polozen tj. kada je formirana konacna ocjena
  90.     char * _nazivPredmeta;
  91.     ObavezeNaPredmetu * _listaIzvrsenihObaveza;
  92.     int _trenutnoIzvrsenihObaveza;
  93.     int _minimalanBrojDana; //odnosi se na minimalan broj dana koji mora proci od izvrsenja pojedinih obaveza na predmetu (npr. 7 dana)
  94.     int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
  95.  
  96.  
  97.     void Unos(const char * naziv, int minimalanBrojDana) {
  98.         _nazivPredmeta = new char[strlen(naziv) + 1];
  99.         strcpy_s(_nazivPredmeta, strlen(naziv) + 1, naziv);
  100.         _listaIzvrsenihObaveza = nullptr;
  101.         _trenutnoIzvrsenihObaveza = 0;
  102.         _minimalanBrojDana = minimalanBrojDana;
  103.         _konacnaOcjena = 0;
  104.         _datumPolaganja.Unos(23, 03, 2018);
  105.     }
  106.     void Dealociraj()
  107.     {
  108.         //if (_datumPolaganja._dan != nullptr && _datumPolaganja._mjesec != nullptr && _datumPolaganja._godina != nullptr)
  109.         //{
  110.             _datumPolaganja.Dealociraj();
  111.         //}
  112.         delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
  113.         for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  114.             _listaIzvrsenihObaveza[i].Dealociraj();
  115.         delete[]_listaIzvrsenihObaveza;
  116.     }
  117.     /*Na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu. Potrebno je onemoguciti dodavanje identicnih obaveza,
  118.     a izmedju izvrsenja pojedinih obaveza mora proci najmanje onoliko dana koliko je definisano vrijednoscu atributa _minimalanBrojDana. Identicna vrsta obaveze
  119.     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
  120.     (definisanih nizom _kljucneRijeci).*/
  121.     bool DodajIzvrsenuObavezu(VrstaObaveze obaveza, Datum & datum, int ocjena, const char * napomena)
  122.     {
  123.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  124.         {
  125.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == obaveza && _listaIzvrsenihObaveza[i]._ocjena != 5)//identicne obaveze
  126.             {
  127.                 cout << "Identicna obaveza vec postoji... " << endl;
  128.                 return false;
  129.             }
  130.         }
  131.         for (int j = 0; j < 15; j++)
  132.         {
  133.             if (_kljucneRijeci[j] != nullptr)
  134.                 if (strstr(napomena, _kljucneRijeci[j]) != nullptr)
  135.                 {
  136.                     cout << "Postoji nepotrebna rijec.." << napomena << "-" << _kljucneRijeci[j] << endl;
  137.                     return false;
  138.                 }
  139.         }
  140.  
  141.         ObavezeNaPredmetu * temp = new ObavezeNaPredmetu[_trenutnoIzvrsenihObaveza + 1];
  142.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  143.         {
  144.             temp[i].Unos(*_listaIzvrsenihObaveza[i]._vrstaObaveze, _listaIzvrsenihObaveza[i]._datumIzvrsenja, _listaIzvrsenihObaveza[i]._ocjena,
  145.                 _listaIzvrsenihObaveza[i]._napomena);
  146.         }
  147.         temp[_trenutnoIzvrsenihObaveza].Unos(obaveza, datum, ocjena, napomena);
  148.         _listaIzvrsenihObaveza = temp;
  149.         _trenutnoIzvrsenihObaveza++;
  150.         return true;
  151.     }
  152.     /*Konacna ocjene predstavlja prosjecnu ocjenu na predmetu (prosjecnu ocjenu izvrsenih obaveza koje ispunjavaju uslove za uspjesno polaganje predmeta),
  153.     a za njeno formiranje student mora posjedovati polozen integralni ili dva parijcalna ispita.
  154.     Ukoliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati pozitivno (ocjenom vecom od 5) ocijenjena najmanje dva seminarska i
  155.     jedan prakticni rad. 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). U slucaju da neki od navedenih uslova nije zadovoljen konacna ocjena treba biti postavljena na vrijednost 5.
  158.     Ukoliko su ispunjeni svi uslovi, osim formiranja konacne ocjene, datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze
  159.     sa najvecom ocjenom.
  160.     */
  161.     int FormirajKonacnuOcjenu()
  162.     {
  163.         this->_konacnaOcjena = 5;
  164.         int ocjena = 0;
  165.         int ocjenaSeminarski = 0, ocjenaPrekticni = 0;
  166.         int brojacSeminarskih = 0, brojacPrakticnih = 0;
  167.         int konacnaOcjena = 0;
  168.         bool daLiJeBioIIParcijalni = false;
  169.         //provjere
  170.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  171.         {
  172.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]._ocjena>5)
  173.             {
  174.                 brojacSeminarskih++;
  175.                 ocjenaSeminarski += _listaIzvrsenihObaveza[i]._ocjena;
  176.             }
  177.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Prakticni && _listaIzvrsenihObaveza[i]._ocjena > 5)
  178.             {
  179.                 brojacPrakticnih++;
  180.                 ocjenaPrekticni += _listaIzvrsenihObaveza[i]._ocjena;
  181.             }
  182.             for (int j = 0; j < 15; j++)
  183.             {
  184.                 if (_kljucneRijeci[j] != nullptr)
  185.                     if (strstr(_listaIzvrsenihObaveza[i]._napomena, _kljucneRijeci[j]) != nullptr)
  186.                     {
  187.                         cout << "Postoji nepozeljna rijec. Ispit nije polozen... " << endl;
  188.                         _konacnaOcjena = 5;
  189.                         return _konacnaOcjena;
  190.                     }
  191.             }
  192.         }
  193.  
  194.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  195.         {
  196.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Integralni && _listaIzvrsenihObaveza[i]._ocjena>5)
  197.             {
  198.                 _konacnaOcjena = _listaIzvrsenihObaveza[i]._ocjena;
  199.                 cout << "Vratio sam integali i ocjena je: " << _konacnaOcjena << endl;
  200.                 return _konacnaOcjena;
  201.             }
  202.         }
  203.  
  204.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  205.         {
  206.             if (brojacSeminarskih < 2)
  207.                 return _konacnaOcjena;
  208.             if (brojacPrakticnih < 1)
  209.                 return _konacnaOcjena;
  210.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]._ocjena > 5)
  211.             {
  212.                 ocjena += _listaIzvrsenihObaveza[i]._ocjena;
  213.             }
  214.             else if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]._ocjena == 5) {
  215.                 return _konacnaOcjena;
  216.             }
  217.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]._ocjena > 5)
  218.             {
  219.                 ocjena += _listaIzvrsenihObaveza[i]._ocjena;
  220.             }
  221.             if (*_listaIzvrsenihObaveza[i]._vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]._ocjena == 5 && i == _trenutnoIzvrsenihObaveza - 1)
  222.             {
  223.                 return _konacnaOcjena;
  224.             }
  225.         }
  226.         if (ocjena <= 10)
  227.             return _konacnaOcjena;
  228.         konacnaOcjena = (ocjena + ocjenaSeminarski + ocjenaPrekticni) / (2 + brojacPrakticnih + brojacSeminarskih);
  229.         _konacnaOcjena = konacnaOcjena;
  230.         int max = 0;
  231.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  232.         {
  233.             //trazimo indeks obaveze u kojoj je student dobio najvecu ocjenu
  234.             if (_listaIzvrsenihObaveza[i]._ocjena > _listaIzvrsenihObaveza[max]._ocjena)
  235.                 max = i;
  236.         }
  237.         //_datumPolaganja.Unos(*_listaIzvrsenihObaveza[max]._datumIzvrsenja._dan, *_listaIzvrsenihObaveza[max]._datumIzvrsenja._mjesec, *_listaIzvrsenihObaveza[max]._datumIzvrsenja._godina);
  238.         return _konacnaOcjena;
  239.     }
  240. };
  241. float PretragaRekurzivno(PolozeniPredmet & predmet, VrstaObaveze obaveza, Datum& OD, Datum & DO, int broj1, int broj2)
  242. {
  243.     float rez = 0;
  244.     return rez;
  245. }
  246. int GetBrojObavezaIznadProsjeka(PolozeniPredmet & predmet, float prosjek)
  247. {
  248.     auto lambdaProsjek = [predmet, prosjek]()
  249.     {
  250.         int brojac = 0;
  251.         for (int i = 0; i < predmet._trenutnoIzvrsenihObaveza; i++)
  252.         {
  253.             if (predmet._listaIzvrsenihObaveza[i]._ocjena >= prosjek)
  254.                 brojac++;
  255.         }
  256.         return brojac;
  257.     };
  258.     return lambdaProsjek();
  259. }
  260. void main() {
  261.     _kljucneRijeci[0] = "prepisivao";
  262.     _kljucneRijeci[1] = "ometao";
  263.     _kljucneRijeci[2] = "nije dostavio";
  264.  
  265.     Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2; // datumIntegralni;
  266.     datumSeminarski1.Unos(10, 6, 2017);
  267.     datumSeminarski2.Unos(18, 6, 2017);
  268.     datumParcijalni1.Unos(22, 6, 2017);
  269.     datumParcijalni2.Unos(30, 6, 2017);
  270.  
  271.     PolozeniPredmet prII;
  272.     //naziv predmeta, minimalan broj dana
  273.     prII.Unos("Programiranje II", 7);
  274.  
  275.  
  276.     if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen ispit"))
  277.         cout << "Parcijalni 1...dodan" << endl;
  278.     if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka, a tokom ispita ometao druge studente"))
  279.         cout << "Parcijalni 2...dodan" << endl;
  280.     if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski1, 8, "implementirani svi algoritmi"))
  281.         cout << "Seminarski1...dodan" << endl;
  282.     if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski2, 6, "rad slican kao kod studenta IB150388"))
  283.         cout << "Seminarski2...dodan" << endl;
  284.  
  285.  
  286.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  287.  
  288.     datumParcijalni2.Unos(22, 7, 2017);
  289.     if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
  290.         cout << "Parcijalni 2...dodan" << endl;
  291.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  292.     Datum OD, DO; OD.Unos(1, 1, 2017); DO.Unos(1, 7, 2017);
  293.  
  294.     /*Rekurzivna funkcija treba vratiti prosjecnu ocjenu uspjesno izvrsenih obaveze na predmetu odredjene vrste u definisanom periodu. Izbjegavati koristenje globalnih varijabli*/
  295.     float prosjek = PretragaRekurzivno(prII, Seminarski, OD, DO, 0, 0);
  296.     cout << "Prosjecna ocjena izvrsenih obaveza je: " << prosjek << endl;
  297.  
  298.     /*Koristeci lambda-u, unutar funkcije GetBrojObavezaIznadProsjeka pronaci broj izvrsenih obaveza koje imaju istu ili vecu ocjenu od prosjecne*/
  299.     int iznadProsjeka = GetBrojObavezaIznadProsjeka(prII, prosjek);
  300.     cout << "Broj izvrsenih obaveza iznad prosjeka je: " << iznadProsjeka << endl;
  301.  
  302.     datumParcijalni1.Dealociraj();
  303.     datumParcijalni2.Dealociraj();
  304.     datumSeminarski1.Dealociraj();
  305.     datumSeminarski2.Dealociraj();
  306.     //datumIntegralni.Dealociraj();
  307.     prII.Dealociraj();
  308.     system("PAUSE");
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement