limun11

GOTOVO::Vrste Obaveza

Feb 4th, 2017
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.02 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  5. char * vrstaObaveze[] = { "Seminarski","Parcijalni1","Parcijalni2","Integralni","Prakticni" };
  6. struct Datum {
  7.     int * _dan, *_mjesec, *_godina;
  8.     void Unos(int d, int m, int g) {
  9.         _dan = new int(d);
  10.         _mjesec = new int(m);
  11.         _godina = new int(g);
  12.     }
  13.     void Ispis() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
  14.     void Dealociraj() { delete _dan; delete _mjesec; delete _godina; }
  15.    
  16.     void Prijestupna(int brojdana[], int &godina)
  17.     {
  18.         if (godina % 4 == 0 && godina % 100 != 0 && godina % 400 == 0)
  19.             brojdana[1] = 29;
  20.         else
  21.             brojdana[1] = 28;
  22.     }
  23.  
  24.     bool StarijiOd7Dana(Datum * datum)
  25.     {
  26.         int brojdana[] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  27.         int brojac = 0;
  28.        
  29.         int dan = *datum->_dan, mjesec = *datum->_mjesec, godina = *datum->_godina;
  30.  
  31.         while (brojac < 7)
  32.         {
  33.             if (godina == *_godina && mjesec == *_mjesec && dan == *_dan)
  34.                 return false;
  35.             else
  36.             {
  37.                 if (dan == 0)
  38.                 {
  39.                     mjesec--;
  40.                     dan = brojdana[mjesec - 1];
  41.                 }
  42.                 if (mjesec == 0)
  43.                 {
  44.                     godina--;
  45.                     Prijestupna(brojdana, godina);
  46.                     mjesec = 12;
  47.                     dan = brojdana[mjesec - 1];
  48.                 }
  49.                 brojac++;
  50.                 dan--;
  51.             }
  52.         }
  53.        
  54.     }
  55.    
  56. };
  57. struct ObavezeNaPredmetu {
  58.     VrstaObaveze * _vrstaObaveze;
  59.     Datum * _datumIzvrsenja;
  60.     char * _napomena;
  61.     int _ocjena; // 5 - 10
  62.     void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena, char * napomena) {
  63.         _vrstaObaveze = new VrstaObaveze(vrsta);
  64.         _datumIzvrsenja = new Datum;
  65.         _datumIzvrsenja->Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
  66.         _ocjena = ocjena;
  67.         int size = strlen(napomena) + 1;
  68.         _napomena = new char[size];
  69.         strcpy_s(_napomena, size, napomena);
  70.     }
  71.     void Ispis() {
  72.         cout << vrstaObaveze[*_vrstaObaveze] << " " << _ocjena << " " << _napomena << "  ";
  73.         _datumIzvrsenja->Ispis();
  74.         cout << endl;
  75.     }
  76.     void Dealociraj() {
  77.         _datumIzvrsenja->Dealociraj();
  78.         delete _vrstaObaveze; _vrstaObaveze = nullptr;
  79.         delete _datumIzvrsenja; _datumIzvrsenja = nullptr;
  80.         delete[] _napomena; _napomena = nullptr;
  81.     }
  82. };
  83. struct PolozeniPredmet {
  84.     Datum _datumPolaganja;//datum koji ce se evidentirati kao datum kada je predmet polozen tj. kada je formirana konacna ocjena
  85.     char * _nazivPredmeta;
  86.     ObavezeNaPredmetu * _listaIzvrsenihObaveza[10];
  87.     int _trenutnoIzvrsenihObaveza;
  88.     int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
  89.  
  90.                         /*
  91.                         1. Unos - na osnovu vrijednosti primljenog parametra izvrsiti inicijalizaciju odgovarajucih atributa
  92.                         2. DodajIzvrsenuObavezu – na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu.
  93.                         Potrebno je onemoguciti dodavanje identicnih obaveza, a izmedju izvrsenja pojedinih obaveza mora proci najmanje 7 dana.
  94.                         Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Seminarskom ili je prethodno dodana obaveza
  95.                         (identicne vrste)
  96.                         imala ocjenu 5. Ukoliko je moguce, osigurati prosirenje niza na nacin da prihvati vise od 10 obaveza.
  97.                         3. FormirajKonacnuOcjenu - konacna ocjene predstavlja prosjecnu ocjenu na predmetu, a za njeno
  98.                         formiranje student mora posjedovati polozen integralni ili dva parijcalna ispita. U
  99.                         koliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati pozitivno (ocjenom vecom od 5)
  100.                         ocijenjena najmanje dva seminarska rada. U slucaju da bilo koji od navedenih uslova nije zadovoljenkonacna ocjena
  101.                         treba biti postavljena na vrijednost 5. Konacna ocjena, takodjer, ne smije biti formirana u slucaju da u napomeni
  102.                         od dvije obaveze stoji rijec 'prepisivao' ili 'izbacen'. Ukoliko su ispunjeni svi uslovi, osim formiranja konacne ocjene,
  103.                         kao datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze koja je usla u formiranje ocjene.
  104.                         4. Ispis – ispsuje vrijednosti svih atributa strukture
  105.                         */
  106.     void Unos(char * ime) {
  107.         int vel = strlen(ime) + 1;
  108.         _nazivPredmeta = new char[vel];
  109.         strcpy_s(_nazivPredmeta, vel, ime);
  110.         _trenutnoIzvrsenihObaveza = 0;
  111.         _konacnaOcjena = 5;
  112.     }
  113.     /*DodajIzvrsenuObavezu – na osnovu vrijednosti primljenih parametara osigurati dodavanje novoizvrsene obaveze na predmetu.
  114.     Potrebno je onemoguciti dodavanje identicnih obaveza, a izmedju izvrsenja pojedinih obaveza mora proci najmanje 7 dana.
  115.     Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Seminarskom ili je prethodno dodana obaveza
  116.     (identicne vrste)*/
  117.  
  118.     bool DodajIzvrsenuObavezu(VrstaObaveze obaveza, Datum &datum, int ocjena, char *napomena)
  119.     {
  120.         if (_trenutnoIzvrsenihObaveza > 0)
  121.         {
  122.             for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  123.             {
  124.                 if (obaveza == *_listaIzvrsenihObaveza[i]->_vrstaObaveze && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  125.                 {
  126.                     if (obaveza != Seminarski)
  127.                         return false;
  128.                 }
  129.             }
  130.             for (int j = 0; j < _trenutnoIzvrsenihObaveza; j++)
  131.             {
  132.                 if (!_listaIzvrsenihObaveza[j]->_datumIzvrsenja->StarijiOd7Dana(&datum))
  133.                     return false;
  134.             }
  135.         }
  136.         if (_trenutnoIzvrsenihObaveza >= 10) {
  137.             return false;
  138.         }
  139.        
  140.             _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
  141.             _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza, &datum, ocjena, napomena);
  142.             _trenutnoIzvrsenihObaveza++;
  143.             return true;
  144.        
  145.     }
  146.     /*FormirajKonacnuOcjenu - konacna ocjene predstavlja prosjecnu ocjenu na predmetu, a za njeno
  147.     formiranje student mora posjedovati polozen integralni ili dva parijcalna ispita. U
  148.     koliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati pozitivno (ocjenom vecom od 5)
  149.     ocijenjena najmanje dva seminarska rada. U slucaju da bilo koji od navedenih uslova nije zadovoljenkonacna ocjena
  150.     treba biti postavljena na vrijednost 5. Konacna ocjena, takodjer, ne smije biti formirana u slucaju da u napomeni
  151.     od dvije obaveze stoji rijec 'prepisivao' ili 'izbacen'. Ukoliko su ispunjeni svi uslovi, osim formiranja konacne ocjene,
  152.     kao datum polaganja je potrebno postaviti na vrijednost datuma posljednje izvrsene obaveze koja je usla u formiranje ocjene.*/
  153.  
  154.     int FormirajKonacnuOcjenu()
  155.     {
  156.         int brParcijalnih = 0, brSeminarskih = 0;
  157.         int suma = 0;
  158.         Datum temp;
  159.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  160.         {
  161.             if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") == 0)
  162.                 return _konacnaOcjena;
  163.             if (strcmp(_listaIzvrsenihObaveza[i]->_napomena, "izbacen") == 0)
  164.                 return _konacnaOcjena;
  165.         }
  166.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  167.         {
  168.             if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  169.             {
  170.                 _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
  171.                 _datumPolaganja = *_listaIzvrsenihObaveza[i]->_datumIzvrsenja;
  172.                 return _konacnaOcjena;
  173.             }
  174.             if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1  && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  175.             {
  176.                 brParcijalnih++;
  177.                 suma += _listaIzvrsenihObaveza[i]->_ocjena;
  178.             }
  179.             if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2  && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  180.             {
  181.                 brParcijalnih++;
  182.                 suma += _listaIzvrsenihObaveza[i]->_ocjena;
  183.                 temp = *_listaIzvrsenihObaveza[i]->_datumIzvrsenja;
  184.             }
  185.             if (*_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  186.                 brSeminarskih++;
  187.         }
  188.  
  189.         if (brParcijalnih == 2 && brSeminarskih == 2)
  190.         {
  191.             if (suma % 2 != 0)
  192.                 _konacnaOcjena = (suma / 2) + 1;
  193.             else
  194.                 _konacnaOcjena = suma / 2;
  195.         }
  196.         if (_konacnaOcjena>5)
  197.             _datumPolaganja = temp;
  198.         return _konacnaOcjena;
  199.     }
  200.     void Ispis()
  201.     {
  202.         cout << "Naziv predmeta: " << _nazivPredmeta << endl;
  203.         cout << "Datum polaganja: ";
  204.         _datumPolaganja.Ispis();
  205.         cout << endl;
  206.         for (size_t i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  207.         {
  208.             _listaIzvrsenihObaveza[i]->Ispis();
  209.         }
  210.     }
  211. };
  212.  
  213. /*
  214. 1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl. Naziv fajla treba biti sastavljen od
  215. //naziva predmeta i konacne ocjena npr. "Programiranje II_6"
  216. 2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen kao parametar)
  217. 3. PretragaRekurzivno - rekurzivna funkcija koja treba da vrati broj obaveza kod koji je student ostvario negativnu ocjenu*/
  218.  
  219. void UpisiUBinarniFajl(PolozeniPredmet predmet)
  220. {
  221.     ofstream upis("Programiranje II_6", ios::out, ios::binary);
  222.     if (upis.is_open())
  223.         upis.write((char*)(&predmet), sizeof(predmet));
  224.     else
  225.         cout << "Greska!" << endl;
  226. }
  227. void UcitajIzBinarnogFajla(PolozeniPredmet & predmet, char *NazivFajla)
  228. {
  229.     ifstream ispis(NazivFajla, ios::in, ios::binary);
  230.     if (ispis.is_open())
  231.         ispis.read((char*)(&predmet), sizeof(predmet));
  232.     else
  233.         cout << "Greska!" << endl;
  234. }
  235.  
  236. void main() {
  237.     /*
  238.     1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  239.     2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  240.     3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB130030.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  241.     4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  242.     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)
  243.     6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  244.     */
  245.  
  246.     Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2,
  247.         datumIntegralni;
  248.     datumSeminarski1.Unos(10, 6, 2016);
  249.     datumSeminarski2.Unos(18, 6, 2016);
  250.     datumParcijalni1.Unos(22, 3, 2016);
  251.     datumParcijalni2.Unos(22, 6, 2016);
  252.  
  253.     //polozeni predmet
  254.     PolozeniPredmet prII, prII_FromFile;
  255.     prII.Unos("Programiranje II");
  256.     if (prII.DodajIzvrsenuObavezu(Parcijalni1, datumParcijalni1, 6, "uslovno polozen"))
  257.         cout << "Parcijalni 1...dodan" << endl;
  258.     if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 5, "previse gresaka"))
  259.         cout << "Parcijalni 2...dodan" << endl;
  260.     if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski1, 8, "implementirani svi algoritmi"))
  261.         cout << "Seminarski1...dodan" << endl;
  262.     if (prII.DodajIzvrsenuObavezu(Seminarski, datumSeminarski2, 6, "rad slican kao kod studenta IB150388"))
  263.         cout << "Seminarski2...dodan" << endl;
  264.  
  265.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  266.     datumParcijalni2.Unos(22, 7, 2016);
  267.     if (prII.DodajIzvrsenuObavezu(Parcijalni2, datumParcijalni2, 6, ""))
  268.         cout << "Parcijalni 2...dodan" << endl;
  269.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  270.     //rekurzija
  271.     //cout << "Broj negativnih ocjena je: " << PretragaRekurzivno(&prII, prII._trenutnoIzvrsenihObaveza - 1, 0) << endl;
  272.     //manipulacija fajlovima
  273.     UpisiUBinarniFajl(prII);
  274.     prII.Ispis();
  275.     UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II_6");
  276.     prII_FromFile.Ispis();
  277.     system("pause");
  278.  
  279. }
Advertisement
Add Comment
Please, Sign In to add comment