Advertisement
limun11

Obaveze na predmetu - KONACNA

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