Advertisement
limun11

Vrste obaveza(prosireni) - Konacna

Jun 14th, 2017
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.01 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
  5. #pragma warning(disable:4996)
  6.  
  7. enum VrstaObaveze { Seminarski, Parcijalni1, Parcijalni2, Integralni, Prakticni };
  8. char * vrstaobavezeChar[] = { "Seminarski", "Parcijalni1", "Parcijalni2", "Integralni", "Prakticni" };
  9.  
  10. struct Datum
  11. {
  12.     int *_dan, *_mjesec, *_godina;
  13.     void Unos(int d, int m, int g)
  14.     {
  15.         //_dan = &d; _mjesec = &m; _godina = &g;
  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.  
  25.     bool provjeraDatum15Dana(Datum datum)
  26.     {
  27.         if (*datum._godina > *_godina)
  28.             return true;
  29.         else if (*datum._godina == *_godina && *datum._mjesec > *_mjesec)
  30.             return true;
  31.         else if (*datum._mjesec == *_mjesec && *datum._dan - *_dan > 15)
  32.             return true;
  33.         else return false;
  34.     }
  35.  
  36.     void Dealociraj()
  37.     {
  38.         delete[] _dan; _dan = nullptr;
  39.         delete[] _mjesec; _mjesec = nullptr;
  40.         delete[] _godina; _godina = nullptr;
  41.     }
  42. };
  43. struct ObavezeNaPredmetu
  44. {
  45.     VrstaObaveze _vrstaObaveze;
  46.     Datum * _datumIzvrsenja;
  47.     char * _napomena;
  48.     int _ocjena; // 5 - 10
  49.  
  50.     void Unos(VrstaObaveze vrsta, Datum * datum, int ocjena, char * napomena)
  51.     {
  52.         _vrstaObaveze = vrsta;
  53.         _datumIzvrsenja = new Datum;
  54.         _datumIzvrsenja->Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
  55.         _ocjena = ocjena;
  56.         int size = strlen(napomena) + 1;
  57.         _napomena = new char[size];
  58.         strcpy_s(_napomena, size, napomena);
  59.     }
  60.     void Ispis()
  61.     {
  62.         cout << "Vrsta obaveze: " << vrstaobavezeChar[_vrstaObaveze] << endl;
  63.         cout << "Ocjena: " << _ocjena << endl;
  64.         cout << "Napomena:" << _napomena << endl;
  65.         cout << "Datun izvrsenja:";
  66.         _datumIzvrsenja->Ispis();
  67.         cout << endl;
  68.     }
  69.     void DodajNapomenu(char * napomena)
  70.     {
  71.         int size = strlen(napomena) + 1;
  72.         _napomena = new char[size];
  73.         strcpy_s(_napomena, size, napomena);
  74.     }
  75.     void Dealociraj()
  76.     {
  77.         _datumIzvrsenja->Dealociraj();
  78.         delete[] _datumIzvrsenja; _datumIzvrsenja = nullptr;
  79.         delete[] _napomena; _napomena = nullptr;
  80.     }
  81. };
  82. struct PolozeniPredmet
  83. {
  84.     char * _nazivPredmeta;
  85.     ObavezeNaPredmetu * _listaIzvrsenihObaveza[10];//ogranicen je broj izvrsenih obavezan na predmetu
  86.     int _trenutnoIzvrsenihObaveza;
  87.     int _konacnaOcjena; //formira se na osnovu ocjena izvrsenih obaveza
  88.  
  89.     void Unos(char * nazivPredmeta)
  90.     {
  91.         int size = strlen(nazivPredmeta) + 1;
  92.         _nazivPredmeta = new char[size];
  93.         strcpy_s(_nazivPredmeta, size, nazivPredmeta);
  94.  
  95.         _trenutnoIzvrsenihObaveza = 0;
  96.         _konacnaOcjena = 5;
  97.     }
  98.  
  99.     void Ispis()
  100.     {
  101.         //cout << "Naziv predmeta:" << _nazivPredmeta << endl;
  102.         cout << "Konacna ocjena: " << _konacnaOcjena << endl;
  103.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  104.             _listaIzvrsenihObaveza[i]->Ispis();
  105.     }
  106.     /*
  107.     1. DodajIzvrsenuObavezu – na osnovu vrijednosti primljenog parametra osigurati dodavanje novoizvrsene obaveze na predmetu. Potrebno je onemoguciti dodavanje identicnih obaveza. Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Prakticno radu ili je prethodno dodana obaveza (identicne vrste) imala ocjenu 5.
  108.     2. FormirajKonacnuOcjenu - formiranje konacne ocjene se vrsi prema sljedecim pravilima: student mora posjedovati polozen integralni ili
  109.     dva parijcalna ispita; ukoliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati pozitivno (ocjenom vecom od 5)
  110.     ocijenjena najmanje dva seminarska rada u okviru kojih nije evidentirana losa napomena
  111.     (rijeci koje oznacavaju losu napomenu: nije dobro, kopirano, nije ispravljeno); u slucaju da je ispit polozen putem integralnog ispita student
  112.     mora imati polozen i prakticni ispit (polozen najkasnije 15 dana od dana polaganja integralnog ispita).
  113.     */
  114.     bool DodajIzvrsenuObavezu(ObavezeNaPredmetu obaveza)
  115.     {
  116.         //1. DodajIzvrsenuObavezu – na osnovu vrijednosti primljenog parametra osigurati dodavanje novoizvrsene obaveze na predmetu.
  117.         //Potrebno je onemoguciti dodavanje identicnih obaveza.
  118.         //Identicna vrsta obaveze se moze dodati samo u slucaju da se radi o Prakticno radu ili je prethodno dodana obaveza
  119.         //(identicne vrste) imala ocjenu 5.
  120.         if (_trenutnoIzvrsenihObaveza > 10)
  121.             return false;
  122.         if (_trenutnoIzvrsenihObaveza > 0)
  123.         {
  124.             for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  125.             {
  126.                 if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == obaveza._vrstaObaveze && obaveza._vrstaObaveze != Prakticni &&
  127.                     _listaIzvrsenihObaveza[i]->_ocjena != 5)
  128.                     return false;
  129.             }
  130.         }
  131.  
  132.         _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
  133.         _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza._vrstaObaveze, obaveza._datumIzvrsenja,
  134.             obaveza._ocjena, obaveza._napomena);
  135.         _trenutnoIzvrsenihObaveza++;
  136.         return true;
  137.     }
  138.     int FormirajKonacnuOcjenu()
  139.     {
  140.         /*. FormirajKonacnuOcjenu formiranje konacne ocjene se vrsi prema sljedecim pravilima :
  141.         student mora posjedovati polozen integralni ili dva parijcalna ispita; ukoliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati
  142.         pozitivno(ocjenom vecom od 5) ocijenjena najmanje dva seminarska rada u okviru kojih nije evidentirana losa napomena (rijeci koje oznacavaju losu napomenu :
  143.         nije dobro, kopirano, nije ispravljeno); u slucaju da je ispit polozen putem integralnog ispita student mora imati polozen i prakticni ispit
  144.         (polozen najkasnije 15 dana od dana polaganja integralnog ispita).*/
  145.         int brojParcijalnih1 = 0;
  146.         int brojParcijalnih2 = 0;
  147.         int brojSeminarskih = 0;
  148.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  149.         {
  150.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  151.             {
  152.                 if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Prakticni &&
  153.                     _listaIzvrsenihObaveza[i]->_datumIzvrsenja->provjeraDatum15Dana(*_listaIzvrsenihObaveza[i]->_datumIzvrsenja) == false)
  154.                 {
  155.                     _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
  156.                     return _konacnaOcjena;
  157.                 }
  158.             }
  159.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  160.                 brojParcijalnih1++;
  161.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  162.                 brojParcijalnih2++;
  163.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]->_ocjena > 5 &&
  164.                 strstr(_listaIzvrsenihObaveza[i]->_napomena, "nije dobro")==NULL || strstr(_listaIzvrsenihObaveza[i]->_napomena, "kopirano") == NULL ||
  165.                 strstr(_listaIzvrsenihObaveza[i]->_napomena, "nije ispravljeno") == NULL)
  166.                 brojSeminarskih++;
  167.         }
  168.         if (brojParcijalnih1 >= 1 && brojParcijalnih2 >= 1 && brojSeminarskih >= 2)
  169.         {
  170.             for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  171.             {
  172.                 if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  173.                     _konacnaOcjena += _listaIzvrsenihObaveza[i]->_ocjena;
  174.                 if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  175.                     _konacnaOcjena += _listaIzvrsenihObaveza[i]->_ocjena;
  176.                 if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2 && _listaIzvrsenihObaveza[i]->_ocjena > 5)
  177.                     _konacnaOcjena += _listaIzvrsenihObaveza[i]->_ocjena;
  178.             }
  179.             return _konacnaOcjena / (brojParcijalnih1 + brojParcijalnih2 + brojSeminarskih);
  180.         }
  181.         else
  182.         {
  183.             cout << "Nisu ispunjene sve obaveza prema predmetu! " << endl;
  184.             _konacnaOcjena = 5;
  185.             return _konacnaOcjena;
  186.         }
  187.     }
  188.            
  189.     void Dealociraj()
  190.     {
  191.         delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
  192.  
  193.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  194.         {
  195.             _listaIzvrsenihObaveza[i]->Dealociraj();
  196.             delete[] _listaIzvrsenihObaveza[i]; _listaIzvrsenihObaveza[i] = nullptr;
  197.         }
  198.     }
  199. };
  200.  
  201. struct Student
  202. {
  203.     char * _imePrezime;
  204.     char * _brojIndeksa;
  205.     PolozeniPredmet * _polozeniPredmeti;
  206.     int _brojPolozenih;
  207.  
  208.     void Unos(char * IB, char * imePrezime)
  209.     {
  210.         int size1 = strlen(IB) + 1;
  211.         _brojIndeksa = new char[size1];
  212.         strcpy_s(_brojIndeksa, size1, IB);
  213.  
  214.         int size = strlen(imePrezime) + 1;
  215.         _imePrezime = new char[size];
  216.         strcpy_s(_imePrezime, size, imePrezime);
  217.        
  218.         _brojPolozenih = 0;
  219.     }
  220.  
  221.     bool DodajPolozeniPredmet(PolozeniPredmet predmet)
  222.     {
  223.         //DodajPolozeniPredmet - na osnovu vrijednosti primljenog parametra osigurati dodavanje novopolozenog predmeta.
  224.         //Potrebno je onemoguciti dodavanje identicnih predmeta, predmeta koja ne posjeduju formiranu konacnu ocjenu, te predmeta kod kojih je u napomeni neke od
  225.         //izvrsenih obaveza navedena rijec 'prepisivao' ili 'izbacen'.
  226.             for (int i = 0; i < _brojPolozenih; i++)
  227.             {
  228.                 if (strstr(_polozeniPredmeti->_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") != NULL ||
  229.                     strstr(_polozeniPredmeti->_listaIzvrsenihObaveza[i]->_napomena, "izbacen") != NULL)
  230.                     return false;
  231.                 if (strcmp(_polozeniPredmeti[i]._nazivPredmeta, predmet._nazivPredmeta) == 0)
  232.                     return false;
  233.                 if (_polozeniPredmeti[i]._konacnaOcjena == 1 || _polozeniPredmeti[i]._konacnaOcjena == 2 || _polozeniPredmeti[i]._konacnaOcjena == 3
  234.                     || _polozeniPredmeti[i]._konacnaOcjena == 4)
  235.                     return false;
  236.             }
  237.             _polozeniPredmeti = new PolozeniPredmet;
  238.             _polozeniPredmeti->Unos(predmet._nazivPredmeta);
  239.             _brojPolozenih++;
  240.             return true;
  241.     }
  242.     PolozeniPredmet * PronadjiNajuspjesnijuObavezu (VrstaObaveze obaveza)
  243.     {
  244.         //PronadjiNajuspjesnijuObavezu -
  245.         //vraca pokazivac na predmet u okviru koga je student ostvario najvecu ocjenu tokom realizacije odredjene obaveze
  246.         //(vrsta obaveze je proslijedjena kao parametar).
  247.         //Ukoliko postoje dva identicna predmeta, onda funkcija vraca pokazivac na posljednje pronadjeni predmet.
  248.         //U slucaju da obaveza nije pronadjena, funkcija vraca nullptr.
  249.         PolozeniPredmet * niz = new PolozeniPredmet[_brojPolozenih + 1];
  250.        
  251.         return niz;;
  252.     }
  253.  
  254.     void Ispis()
  255.     {
  256.         cout << "Broj indeksa:" << _brojIndeksa << endl;
  257.         cout<<"Ime i prezime: "<< _imePrezime << endl;
  258.         for (int i = 0; i < _brojPolozenih; i++)
  259.             _polozeniPredmeti[i].Ispis();
  260.     }
  261.     void Dealociraj()
  262.     {
  263.         delete[] _imePrezime; _imePrezime = nullptr;
  264.         delete[] _brojIndeksa; _brojIndeksa = nullptr;
  265.         for (int i = 0; i < _brojPolozenih; i++)
  266.             _polozeniPredmeti[i].Dealociraj();
  267.         delete[] _polozeniPredmeti;
  268.         _polozeniPredmeti = nullptr;
  269.  
  270.     }
  271. };
  272.  
  273. /*
  274. 1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl. Naziv fajla treba biti sastavljen od naziva predmeta i konacne ocjena
  275. npr. "Programiranje II_6"
  276. 2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen kao parametar)
  277. */
  278. void UpisiUBinarniFajl(PolozeniPredmet predmet)
  279. {
  280.     char * nazivFajla = predmet._nazivPredmeta;
  281.     ofstream upis(nazivFajla, ios::out | ios::binary);
  282.     if (upis.is_open())
  283.     {
  284.         upis.write((char*)(&predmet), sizeof(predmet));
  285.         cout << "Fajl: " << nazivFajla << " je uspjesno upisan... " << endl;
  286.     }
  287.     else
  288.         cout << "Greska prilikom upisa u fajl: " << nazivFajla << endl;
  289.     upis.close();
  290. }
  291. void UcitajIzBinarnogFajla(PolozeniPredmet & predmet, char * nazivPredemta)
  292. {
  293.     // greska prilikom ucitavanja iz binarnog fajla je zbog naziva predmeta "Programiranje II_6"
  294.     //jer takav naziv predemta nije učitan, učitan je naziv "Programiranje II, ukoliko bi kao naziv predmeta umjesto "Programiranje II_6" proslijedili
  295.     //"Programiranje II" fajl bi bio uspješno učitan
  296.  
  297.     ifstream ispis(nazivPredemta, ios::in | ios::binary);
  298.     if (ispis.is_open())
  299.     {
  300.         ispis.read((char*)(&predmet), sizeof(predmet));
  301.         cout << "Fajl: " << nazivPredemta << " je uspjesno ucitan... " << endl;
  302.     }
  303.     else
  304.         cout<<"Greska prilikom citanja u fajl : " << nazivPredemta << endl;
  305.     ispis.close();
  306. }
  307. void main()
  308. {
  309.     /*
  310.     1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  311.     2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  312.     3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB130030.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA
  313.     KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  314.     4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  315.     5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO,
  316.     MS WORD (U KOJI ĆETE KOPIRATI VAŠA RJEŠENJA)
  317.     6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  318.     */
  319.  
  320.  
  321.     Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2,
  322.         datumIntegralni;
  323.     datumSeminarski1.Unos(10, 6, 2016);
  324.     datumSeminarski2.Unos(18, 6, 2016);
  325.     datumParcijalni1.Unos(22, 3, 2016);
  326.     datumParcijalni2.Unos(22, 6, 2016);
  327.  
  328.     ObavezeNaPredmetu parcijalni1, parcijalni2, seminarski1, seminarski2;
  329.     parcijalni1.Unos(Parcijalni1, &datumParcijalni1, 6, "uslovno polozen");
  330.    
  331.  
  332.     parcijalni2.Unos(Parcijalni2, &datumParcijalni2, 5, "previse gresaka");
  333.     parcijalni2.DodajNapomenu("sugerisati da se vise paznje obrati na rad sa dinamickim nizovima");
  334.    
  335.  
  336.     seminarski1.Unos(Seminarski, &datumSeminarski1, 8, "implementirani svi algoritmi");
  337.     seminarski1.DodajNapomenu("predloziti ucesce na FITCC 2017");//omogucava dodavanje dodatnih napomena vezano za obeveze na predmetu
  338.    
  339.  
  340.     seminarski2.Unos(Seminarski, &datumSeminarski2, 6, "rad slican kao kod studenta IB150388");
  341.    
  342.  
  343.     //polozeni predmet
  344.     PolozeniPredmet prII, prII_FromFile;
  345.     prII.Unos("Programiranje II");
  346.     if (prII.DodajIzvrsenuObavezu(parcijalni1))
  347.         cout << "Parcijalni 1...dodan" << endl;
  348.     if (prII.DodajIzvrsenuObavezu(parcijalni2))
  349.         cout << "Parcijalni 2...dodan" << endl;
  350.     if (prII.DodajIzvrsenuObavezu(seminarski1))
  351.         cout << "Seminarski1...dodan" << endl;
  352.     if (prII.DodajIzvrsenuObavezu(seminarski2))
  353.         cout << "Seminarski2...dodan" << endl;
  354.     datumParcijalni2.Unos(22, 7, 2016);
  355.     parcijalni2._datumIzvrsenja = &datumParcijalni2;
  356.  
  357.     if (prII.DodajIzvrsenuObavezu(parcijalni2))
  358.         cout << "Parcijalni 2...dodan" << endl;
  359.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  360.  
  361.     //manipulacija fajlovima
  362.     UpisiUBinarniFajl(prII);
  363.     prII.Ispis();
  364.     UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II_6"); // greska prilikom ucitavanja iz binarnog fajla je zbog naziva predmeta "Programiranje II_6"
  365.     //jer takav naziv predemta nije učitan, učitan je naziv "Programiranje II, ukoliko bi kao naziv predmeta umjesto "Programiranje II_6" proslijedili
  366.     //"Programiranje II" fajl bi bio uspješno učitan
  367.     prII_FromFile.Ispis();
  368.  
  369.     Student jasmin;
  370.     jasmin.Unos("IB130031", "Jasmin Azemovic");
  371.     if (jasmin.DodajPolozeniPredmet(prII))
  372.         cout << "PRII uspjesno dodan!" << endl;
  373.     /*PolozeniPredmet * p = jasmin.PronadjiNajuspjesnijuObavezu(Seminarski);
  374.     cout << "Najuspjesniji seminarski je realizovan u okviru predmeta "; p->Ispis();*/
  375.     jasmin.Ispis();
  376.  
  377.     //izvrsiti potrebne dealokacije
  378.     datumSeminarski1.Dealociraj(); datumSeminarski2.Dealociraj(); datumParcijalni1.Dealociraj(); datumParcijalni2.Dealociraj();
  379.     parcijalni1.Dealociraj(); seminarski1.Dealociraj(); seminarski2.Dealociraj();
  380.     prII.Dealociraj();
  381.     jasmin.Dealociraj();
  382.     system("PAUSE");
  383.  
  384. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement