Advertisement
wiuu23

PR2-Ispit-Upis/citajIZBinarnogFajla (seminarski,parcijalni1)

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