Advertisement
wiuu23

PR2-Ispit-1.: Seminarski, Parcijalni1, Parcijalni2...

Sep 3rd, 2017
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.11 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.     */
  109.     bool DodajIzvrsenuObavezu(ObavezeNaPredmetu obaveza)
  110.     {
  111.         if (_trenutnoIzvrsenihObaveza > 10)
  112.         {
  113.             cout << "Broj obaveza je ogranicen na 10." << endl;
  114.             return false;
  115.         }
  116.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  117.         {
  118.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == obaveza._vrstaObaveze && obaveza._vrstaObaveze != Prakticni &&
  119.                 _listaIzvrsenihObaveza[i]->_ocjena != 5)
  120.             {
  121.                 cout << "Obaveza ne moze biti dodana." << endl;
  122.                 return false;
  123.             }
  124.         }
  125.         _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza] = new ObavezeNaPredmetu;
  126.         _listaIzvrsenihObaveza[_trenutnoIzvrsenihObaveza]->Unos(obaveza._vrstaObaveze, obaveza._datumIzvrsenja, obaveza._ocjena, obaveza._napomena);
  127.         _trenutnoIzvrsenihObaveza++;
  128.         cout << "Obaveza uspjeno dodana-> ";
  129.         return true;
  130.     }
  131.     /*2. FormirajKonacnuOcjenu - formiranje konacne ocjene se vrsi prema sljedecim pravilima : student mora posjedovati polozen integralni ili
  132.     dva parijcalna ispita; ukoliko je ispit polozen putem parcijalnih ispita, student takodjer mora imati pozitivno(ocjenom vecom od 5)
  133.     ocijenjena najmanje dva seminarska rada u okviru kojih nije evidentirana losa napomena
  134.     (rijeci koje oznacavaju losu napomenu : nije dobro, kopirano, nije ispravljeno); u slucaju da je ispit polozen putem integralnog ispita student
  135.     mora imati polozen i prakticni ispit(polozen najkasnije 15 dana od dana polaganja integralnog ispita).
  136.     */
  137.     float FormirajKonacnuOcjenu()
  138.     {
  139.         //brojac parcijalnih=2, // ocjena > 5, //brojac seminarsih
  140.         //integralni: prakticni datum manji od 15
  141.  
  142.         //integralni
  143.         int prvaParcijala = 0;
  144.         int drugaParcijala = 0;
  145.         int brojSeminarskih = 0;
  146.         float prosjek = 0.00;
  147.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++) {
  148.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Seminarski)
  149.             {
  150.                 if (_listaIzvrsenihObaveza[i]->_ocjena > 5) {
  151.                     if (strstr(_listaIzvrsenihObaveza[i]->_napomena, "nije dobro") || strstr(_listaIzvrsenihObaveza[i]->_napomena, "kopirano") || strstr(_listaIzvrsenihObaveza[i]->_napomena, "nije ispravljeno"))
  152.                         brojSeminarskih++;
  153.                 }
  154.             }
  155.             if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Integralni) {
  156.                 if (_listaIzvrsenihObaveza[i]->_ocjena > 5)
  157.                     if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Prakticni && _listaIzvrsenihObaveza[i]->_datumIzvrsenja->provjeraDatum15Dana(*_listaIzvrsenihObaveza[Prakticni]->_datumIzvrsenja));
  158.                 {
  159.                     _konacnaOcjena = _listaIzvrsenihObaveza[i]->_ocjena;
  160.                     return _konacnaOcjena;
  161.                 }
  162.             }
  163.             else if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni1) {
  164.                 if (_listaIzvrsenihObaveza[i]->_ocjena > 5) {
  165.                     prvaParcijala = _listaIzvrsenihObaveza[i]->_ocjena;
  166.                 }
  167.             }
  168.             else if (_listaIzvrsenihObaveza[i]->_vrstaObaveze == Parcijalni2) {
  169.                 if (_listaIzvrsenihObaveza[i]->_ocjena > 5) {
  170.                     drugaParcijala = _listaIzvrsenihObaveza[i]->_ocjena;
  171.                 }
  172.             }
  173.         }
  174.         for (int j = 0; j < _trenutnoIzvrsenihObaveza; j++) {
  175.             if (prvaParcijala > 5 && drugaParcijala > 5 && brojSeminarskih >= 2) {
  176.                 prosjek = (prvaParcijala + drugaParcijala) / 2.00;
  177.                 return prosjek;
  178.             }
  179.             else
  180.                 return _konacnaOcjena;
  181.         }
  182.     }
  183.  
  184.     void Dealociraj()
  185.     {
  186.         delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
  187.  
  188.         for (int i = 0; i < _trenutnoIzvrsenihObaveza; i++)
  189.         {
  190.             _listaIzvrsenihObaveza[i]->Dealociraj();
  191.             delete[] _listaIzvrsenihObaveza[i]; _listaIzvrsenihObaveza[i] = nullptr;
  192.         }
  193.     }
  194. };
  195.  
  196. struct Student
  197. {
  198.     char * _imePrezime;
  199.     char * _brojIndeksa;
  200.     PolozeniPredmet * _polozeniPredmeti;
  201.     int _brojPolozenih;
  202.  
  203.     void Unos(char * IB, char * imePrezime)
  204.     {
  205.         int size1 = strlen(IB) + 1;
  206.         _brojIndeksa = new char[size1];
  207.         strcpy_s(_brojIndeksa, size1, IB);
  208.  
  209.         int size = strlen(imePrezime) + 1;
  210.         _imePrezime = new char[size];
  211.         strcpy_s(_imePrezime, size, imePrezime);
  212.  
  213.         _brojPolozenih = 0;
  214.     }
  215.  
  216.  
  217.     bool DodajPolozeniPredmet(PolozeniPredmet predmet)
  218.     {
  219.         for (int i = 0; i < _brojPolozenih; i++)
  220.         {
  221.             if (strcmp(_polozeniPredmeti[i]._nazivPredmeta, predmet._nazivPredmeta) == 0)
  222.             {
  223.                 cout << "Nemoguce dodati predmet." << endl;
  224.                 return false;
  225.             }
  226.             if (strcmp(_polozeniPredmeti->_listaIzvrsenihObaveza[i]->_napomena, "prepisivao") == 0 ||
  227.                 strcmp(_polozeniPredmeti->_listaIzvrsenihObaveza[i]->_napomena, "izbacen") == 0)
  228.             {
  229.                 cout << "Nemoguce dodati predmet." << endl;
  230.                 return false;
  231.             }
  232.             if (_polozeniPredmeti[i]._konacnaOcjena == 1 || _polozeniPredmeti[i]._konacnaOcjena == 2 ||
  233.                 _polozeniPredmeti[i]._konacnaOcjena == 3 || _polozeniPredmeti[i]._konacnaOcjena == 4 || _polozeniPredmeti[i]._konacnaOcjena > 10)
  234.             {
  235.                 cout << "Nemoguce dodati predmet." << endl;
  236.                 return false;
  237.             }
  238.  
  239.         }
  240.         _polozeniPredmeti = new PolozeniPredmet;
  241.         _polozeniPredmeti->Unos(predmet._nazivPredmeta);
  242.         _brojPolozenih++;
  243.         cout << "Predmet uspjeno dodan-> ";
  244.         return true;
  245.     }
  246.  
  247.     PolozeniPredmet * PronadjiNajuspjesnijuObavezu(VrstaObaveze obaveza)
  248.     {
  249.         //PronadjiNajuspjesnijuObavezu -
  250.         //vraca pokazivac na predmet u okviru koga je student ostvario najvecu ocjenu tokom realizacije odredjene obaveze
  251.         //(vrsta obaveze je proslijedjena kao parametar).
  252.         //Ukoliko postoje dva identicna predmeta, onda funkcija vraca pokazivac na posljednje pronadjeni predmet.
  253.         //U slucaju da obaveza nije pronadjena, funkcija vraca nullptr.
  254.         PolozeniPredmet * niz = new PolozeniPredmet[_brojPolozenih + 1];
  255.  
  256.         return niz;;
  257.     }
  258.  
  259.     void Ispis()
  260.     {
  261.         cout << "Broj indeksa:" << _brojIndeksa << endl;
  262.         cout << "Ime i prezime: " << _imePrezime << endl;
  263.         for (int i = 0; i < _brojPolozenih; i++)
  264.             _polozeniPredmeti[i].Ispis();
  265.     }
  266.     void Dealociraj()
  267.     {
  268.         delete[] _imePrezime; _imePrezime = nullptr;
  269.         delete[] _brojIndeksa; _brojIndeksa = nullptr;
  270.         for (int i = 0; i < _brojPolozenih; i++)
  271.             _polozeniPredmeti[i].Dealociraj();
  272.         delete[] _polozeniPredmeti;
  273.         _polozeniPredmeti = nullptr;
  274.  
  275.     }
  276. };
  277.  
  278. /*
  279. 1. UpisiUBinarniFajl - objekat koji je primljen kao parametar upisuje u binarni fajl. Naziv fajla treba biti sastavljen od naziva predmeta i
  280. konacne ocjena
  281. npr. "Programiranje II_6"
  282. 2. UcitajIzBinarnogFajla - u objekat koji je primljen kao parametar ucitava sadrzaj binarnog fajla (naziv fajla je takodjer proslijedjen
  283. kao parametar)
  284. */
  285. void UpisiUBinarniFajl(PolozeniPredmet predmet)
  286. {
  287.     char * nazivFajla = predmet._nazivPredmeta;
  288.     ofstream upis(nazivFajla, ios::out | ios::binary);
  289.     if (upis.is_open())
  290.     {
  291.         upis.write((char*)(&predmet), sizeof(predmet));
  292.         cout << "Fajl: " << nazivFajla << " je uspjesno upisan... " << endl;
  293.     }
  294.     else
  295.         cout << "Greska prilikom upisa u fajl: " << nazivFajla << endl;
  296.     upis.close();
  297. }
  298. void UcitajIzBinarnogFajla(PolozeniPredmet & predmet, char * nazivPredemta)
  299. {
  300.     // greska prilikom ucitavanja iz binarnog fajla je zbog naziva predmeta "Programiranje II_6"
  301.     //jer takav naziv predemta nije učitan, učitan je naziv "Programiranje II, ukoliko bi kao naziv predmeta umjesto "Programiranje II_6" proslijedili
  302.     //"Programiranje II" fajl bi bio uspješno učitan
  303.  
  304.     ifstream ispis(nazivPredemta, ios::in | ios::binary);
  305.     if (ispis.is_open())
  306.     {
  307.         ispis.read((char*)(&predmet), sizeof(predmet));
  308.         cout << "Fajl: " << nazivPredemta << " je uspjesno ucitan... " << endl;
  309.     }
  310.     else
  311.         cout << "Greska prilikom citanja u fajl : " << nazivPredemta << endl;
  312.     ispis.close();
  313. }
  314. void main()
  315. {
  316.     /*
  317.     1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE BODOVATI
  318.     2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  319.     3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB130030.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA
  320.     KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  321.     4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  322.     5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO,
  323.     MS WORD (U KOJI ĆETE KOPIRATI VAŠA RJEŠENJA)
  324.     6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAĐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  325.     */
  326.  
  327.  
  328.     Datum datumSeminarski1, datumSeminarski2, datumParcijalni1, datumParcijalni2,
  329.         datumIntegralni;
  330.     datumSeminarski1.Unos(10, 6, 2016);
  331.     datumSeminarski2.Unos(18, 6, 2016);
  332.     datumParcijalni1.Unos(22, 3, 2016);
  333.     datumParcijalni2.Unos(22, 6, 2016);
  334.  
  335.     ObavezeNaPredmetu parcijalni1, parcijalni2, seminarski1, seminarski2;
  336.     parcijalni1.Unos(Parcijalni1, &datumParcijalni1, 6, "uslovno polozen");
  337.  
  338.  
  339.     parcijalni2.Unos(Parcijalni2, &datumParcijalni2, 5, "previse gresaka");
  340.     parcijalni2.DodajNapomenu("sugerisati da se vise paznje obrati na rad sa dinamickim nizovima");
  341.  
  342.  
  343.     seminarski1.Unos(Seminarski, &datumSeminarski1, 8, "implementirani svi algoritmi");
  344.     seminarski1.DodajNapomenu("predloziti ucesce na FITCC 2017");//omogucava dodavanje dodatnih napomena vezano za obeveze na predmetu
  345.  
  346.  
  347.     seminarski2.Unos(Seminarski, &datumSeminarski2, 6, "rad slican kao kod studenta IB150388");
  348.  
  349.  
  350.     //polozeni predmet
  351.     PolozeniPredmet prII, prII_FromFile;
  352.     prII.Unos("Programiranje II");
  353.     if (prII.DodajIzvrsenuObavezu(parcijalni1))
  354.         cout << "Parcijalni 1...dodan" << endl;
  355.     if (prII.DodajIzvrsenuObavezu(parcijalni2))
  356.         cout << "Parcijalni 2...dodan" << endl;
  357.     if (prII.DodajIzvrsenuObavezu(seminarski1))
  358.         cout << "Seminarski1...dodan" << endl;
  359.     if (prII.DodajIzvrsenuObavezu(seminarski2))
  360.         cout << "Seminarski2...dodan" << endl;
  361.     datumParcijalni2.Unos(22, 7, 2016);
  362.     parcijalni2._datumIzvrsenja = &datumParcijalni2;
  363.  
  364.     if (prII.DodajIzvrsenuObavezu(parcijalni2))
  365.         cout << "Parcijalni 2...dodan" << endl;
  366.     cout << "Konacna ocjena iz predmeta PRII je: " << prII.FormirajKonacnuOcjenu() << endl;
  367.  
  368.     //manipulacija fajlovima
  369.     UpisiUBinarniFajl(prII);
  370.     prII.Ispis();
  371.     //greska:
  372.     //UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II_6"); // greska prilikom ucitavanja iz binarnog fajla je zbog naziva predmeta "Programiranje II_6"
  373.     //ispravno:
  374.     UcitajIzBinarnogFajla(prII_FromFile, "Programiranje II"); //jer takav naziv predemta nije učitan, učitan je naziv "Programiranje II, ukoliko bi
  375.                                                                 //kao naziv predmeta umjesto "Programiranje II_6" proslijedili
  376.                                                                 //"Programiranje II" fajl bi bio uspješno učitan, funkcija ispis unutar stukture
  377.                                                                 //polozeni predmet bi radila kako treba, ne bi dolazilo do "pucanja" programa u
  378.                                                                 //dijelu ispisa naziv predmeta
  379.     prII_FromFile.Ispis();
  380.  
  381.     Student jasmin;
  382.     jasmin.Unos("IB130031", "Jasmin Azemovic");
  383.     if (jasmin.DodajPolozeniPredmet(prII))
  384.         cout << "PRII uspjesno dodan!" << endl;
  385.     /*PolozeniPredmet * p = jasmin.PronadjiNajuspjesnijuObavezu(Seminarski);
  386.     cout << "Najuspjesniji seminarski je realizovan u okviru predmeta "; p->Ispis();*/
  387.     jasmin.Ispis();
  388.  
  389.     //izvrsiti potrebne dealokacije
  390.     datumSeminarski1.Dealociraj(); datumSeminarski2.Dealociraj(); datumParcijalni1.Dealociraj(); datumParcijalni2.Dealociraj();
  391.     parcijalni1.Dealociraj(); seminarski1.Dealociraj(); seminarski2.Dealociraj();
  392.     prII.Dealociraj();
  393.     jasmin.Dealociraj();
  394.     system("PAUSE");
  395.  
  396. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement