Advertisement
Guest User

ZavrsniRad

a guest
Sep 23rd, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <tuple>
  3.  
  4.  
  5. using namespace std;
  6. /*
  7. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA U SUPROTNOM SE RAD NECE BODOVATI.
  8. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI.
  9. 3. KREIRAJTE .DOC FAJL SA VASIM BROJEM INDEKSA (NPR. IB140273.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U
  10. NJEGA KOPIRAJTE RJESENJA VASIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE.
  11. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORISTENJE HELP-A.
  12. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI
  13. CETE KOPIRATI VASA RJESENJA).
  14. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URADJENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD.*/
  15.  
  16.  
  17. const char* not_set = "NEMA_VRIJEDNOSTI";
  18. const char* crt = "\n--------------------\n";
  19. const int min_poglavlja = 3;
  20. const int min_karaktera_po_poglavju = 30;
  21. const int max_zavrsnih = 30;
  22.  
  23. char* AlocirajNizKaraktera(const char* sadrzaj) {
  24.     if (sadrzaj == nullptr)
  25.         return nullptr;
  26.     int vel = strlen(sadrzaj) + 1;
  27.     char* temp = new char[vel];
  28.     strcpy_s(temp, vel, sadrzaj);
  29.     return temp;
  30.  
  31. }
  32.  
  33.  
  34.  
  35.  
  36.  
  37. struct Poglavlje {
  38.     char* _naslov;
  39.     char* _sadrzaj;
  40.     bool _prihvaceno;
  41.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6-10
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.     void Unos(const char* naslov = nullptr, const char* sadrzaj = nullptr) {
  51.         _ocjena = 0; _prihvaceno = false;
  52.         _naslov = AlocirajNizKaraktera(naslov);
  53.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  54.     }
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.     void Dealociraj() {
  64.         delete[] _naslov; _naslov = nullptr;
  65.         delete[] _sadrzaj; _sadrzaj = nullptr;
  66.  
  67.     }
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.     void Ispis() {
  75.         if (_naslov == nullptr || _sadrzaj == nullptr)
  76.             return;
  77.         cout << endl << "Poglavlje ->" << _naslov << endl << _sadrzaj << endl;
  78.         if (_prihvaceno)
  79.             cout << "Ocjena: " << _ocjena << endl;
  80.     }
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.     void OcijeniPoglavlje(int ocjena) {
  88.         _ocjena = ocjena;
  89.         if (_ocjena > 5 && ocjena <= 10)
  90.             _prihvaceno = true;
  91.     }
  92.  
  93.  
  94.  
  95.  
  96. };
  97.  
  98.  
  99.  
  100.  
  101. struct ZavrsniRad {
  102.     char* _brojIndeksa;
  103.     char* _tema;
  104.     Poglavlje* _poglavljaRada;
  105.     int _trenutnoPoglavlja;
  106.     char* _datumOdbrane;
  107.     float _konacnaOcjena; //konacna ocjena zavrsnog rada predstavlja prosjek ocjena svih poglavlja u zavrsnom radu koja se
  108.     //izracunava u momentu zakazivanja odbrane
  109.  
  110.  
  111.  
  112.  
  113.     void Unos(const char* brojIndeksa, const char* nazivTeme = nullptr) {
  114.         _konacnaOcjena = 0;
  115.         _brojIndeksa = AlocirajNizKaraktera(brojIndeksa);
  116.         _tema = AlocirajNizKaraktera(nazivTeme);
  117.         _datumOdbrane = AlocirajNizKaraktera(not_set);
  118.         _trenutnoPoglavlja = 0;
  119.         _poglavljaRada = nullptr;
  120.     }
  121.  
  122.  
  123.     void Dealociraj() {
  124.         delete[] _tema; _tema = nullptr;
  125.         delete[] _datumOdbrane; _datumOdbrane = nullptr;
  126.         delete[] _brojIndeksa; _brojIndeksa = nullptr;
  127.  
  128.  
  129.         for (size_t i = 0; i < _trenutnoPoglavlja; i++)
  130.             _poglavljaRada[i].Dealociraj();
  131.         delete[] _poglavljaRada; _poglavljaRada = nullptr;
  132.     }
  133.  
  134.  
  135.  
  136.     void Ispis() {
  137.         cout << "Tema rada: " << _tema << endl;
  138.         cout << "Sadrzaj: " << endl;
  139.         for (size_t i = 0; i < _trenutnoPoglavlja; i++)
  140.             _poglavljaRada[i].Ispis();
  141.         cout << "Datum odbrane rada: " << _datumOdbrane << endl << "Ocjena: " << _konacnaOcjena << endl;
  142.     }
  143.  
  144.  
  145.  
  146.  
  147.  
  148.     void DodajPoglavlje(const char* nazivPoglavlja, const char* sadrzajPoglavlja) {
  149.  
  150.  
  151.  
  152.         for (int i = 0; i < _trenutnoPoglavlja; i++)
  153.         {
  154.             if (strcmp(_poglavljaRada[i]._naslov, nazivPoglavlja) == 0)
  155.             {
  156.                 int vel = strlen(_poglavljaRada[i]._sadrzaj) + strlen(sadrzajPoglavlja) + 2;
  157.                 char* temp = new char[vel];
  158.                 strcpy_s(temp, strlen(_poglavljaRada[i]._sadrzaj) + 1, _poglavljaRada[i]._sadrzaj);
  159.                 strcat_s(temp, vel, " ");
  160.                 strcat_s(temp, vel, sadrzajPoglavlja);
  161.                 delete[] _poglavljaRada[i]._sadrzaj;
  162.                 _poglavljaRada[i]._sadrzaj = temp;
  163.                 return;
  164.  
  165.  
  166.             }
  167.         }
  168.  
  169.  
  170.         Poglavlje* tempPoglavlja = new Poglavlje[_trenutnoPoglavlja + 1];
  171.         for (int i = 0; i < _trenutnoPoglavlja; i++)
  172.         {
  173.             tempPoglavlja[i] = _poglavljaRada[i];
  174.         }
  175.         tempPoglavlja[_trenutnoPoglavlja].Unos(nazivPoglavlja, sadrzajPoglavlja);
  176.         _trenutnoPoglavlja++;
  177.         delete[] _poglavljaRada;
  178.         _poglavljaRada = tempPoglavlja;
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.     }
  187.  
  188.  
  189.  
  190.  
  191.  
  192.     void OcijeniPoglavlje(const char* nazivPoglavlja, int ocjena) {
  193.  
  194.         for (int i = 0; i < _trenutnoPoglavlja; i++)
  195.         {
  196.             if (strcmp(_poglavljaRada[i]._naslov, nazivPoglavlja) == 0) {
  197.                 _poglavljaRada[i].OcijeniPoglavlje(ocjena);
  198.                 return;
  199.             }
  200.         }
  201.     }
  202.  
  203.  
  204.  
  205.  
  206.  
  207.     void Kopiraj(ZavrsniRad& rad) {
  208.         Unos(rad._brojIndeksa, rad._tema);
  209.         for (int j = 0; j < rad._trenutnoPoglavlja; j++)
  210.         {
  211.             DodajPoglavlje(rad._poglavljaRada[j]._naslov, rad._poglavljaRada[j]._sadrzaj);
  212.             OcijeniPoglavlje(rad._poglavljaRada[j]._naslov, rad._poglavljaRada[j]._ocjena);
  213.         }
  214.     }
  215.  
  216.  
  217.  
  218.  
  219.    
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229. };
  230.  
  231.  
  232. struct Nastavnik {
  233.  
  234.     char* _imePrezime;
  235.     ZavrsniRad* _teme[max_zavrsnih] = { nullptr };
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.     void Unos(const char* imePrezime) {
  243.         _imePrezime = AlocirajNizKaraktera(imePrezime);
  244.     }
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.     void Dealociraj() {
  253.         delete[] _imePrezime; _imePrezime = nullptr;
  254.         for (size_t i = 0; i < max_zavrsnih; i++)
  255.         {
  256.             if (_teme[i] != nullptr) {
  257.                 _teme[i]->Dealociraj();
  258.                 delete _teme[i];
  259.  
  260.             }
  261.         }
  262.     }
  263.  
  264.  
  265.  
  266.  
  267.     void Ispis() {
  268.         cout << crt << _imePrezime << crt;
  269.         for (size_t i = 0; i < max_zavrsnih; i++)
  270.             _teme[i]->Ispis();
  271.     }
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.     bool DodajZavrsniRad(ZavrsniRad rad) {
  279.         for (int i = 0; i < max_zavrsnih; i++)
  280.         {
  281.             if (_teme[i] == nullptr) {
  282.                 _teme[i] = new ZavrsniRad;
  283.                 _teme[i]->Kopiraj(rad);
  284.                 return true;
  285.             }
  286.             else if (strcmp(_teme[i]->_tema, rad._tema) == 0)
  287.                 return false;
  288.         }
  289.         return false;
  290.        
  291.  
  292.  
  293.  
  294.     }
  295.  
  296.  
  297.  
  298.  
  299.  
  300.     ZavrsniRad *ZakaziOdbranuRada(const char* brojIndeksa, const char* datumOdbrane) {
  301.         for (int i = 0; i < max_zavrsnih; i++)
  302.         {
  303.             if (_teme[i] != nullptr && strcmp(brojIndeksa, _teme[i]->_brojIndeksa) == 0) {
  304.                 if (_teme[i]->_trenutnoPoglavlja < min_poglavlja)
  305.                     return nullptr;
  306.                 float prosjek = 0;
  307.                 for (int j = 0; j < _teme[i]->_trenutnoPoglavlja; j++)
  308.                 {
  309.                     if (strlen(_teme[i]->_poglavljaRada[j]._sadrzaj) < min_karaktera_po_poglavju || !_teme[i]->_poglavljaRada[j]._prihvaceno)
  310.                         return nullptr;
  311.                     prosjek += _teme[i]->_poglavljaRada[j]._ocjena;
  312.                 }
  313.                 prosjek /= _teme[i]->_trenutnoPoglavlja;
  314.                 _teme[i]->_konacnaOcjena = int(prosjek * 100) / float(100);
  315.                 _teme[i]->_datumOdbrane = new char[strlen(datumOdbrane) + 1];
  316.                 return _teme[i];
  317.             }
  318.         }
  319.         return nullptr;
  320.  
  321.     }
  322.  
  323.  
  324.  
  325.  
  326.  
  327. };
  328.  
  329.  
  330.  
  331. int main() {
  332.     const int max = 2;
  333.  
  334.  
  335.  
  336.     Nastavnik* nastavnici[max];
  337.     nastavnici[0] = new Nastavnik; nastavnici[0]->Unos("Denis Music");
  338.     nastavnici[1] = new Nastavnik; nastavnici[1]->Unos("Emina Junuz");
  339.  
  340.  
  341.  
  342.     ZavrsniRad multimedijalni; //parametri: brojIndeksa,tema
  343.     multimedijalni.Unos("IB120021", "Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  344.  
  345.  
  346.  
  347.  
  348.     ZavrsniRad podrsa_operaterima;
  349.     podrsa_operaterima.Unos("IB130031", "Sistem za podrsku rada kablovskog operatera");
  350.  
  351.  
  352.  
  353.  
  354.     ZavrsniRad analiza_sigurnosti;
  355.     analiza_sigurnosti.Unos("IB140041", "Prakticna analiza sigurnosti sigurnosti bezicnih racunarskih mreza");
  356.  
  357.  
  358.  
  359.  
  360.     ZavrsniRad kriptografija;
  361.     kriptografija.Unos("IB120021", "Primjena teorije informacija u procesu generisanja kriptografskih kljuceva");
  362.  
  363.  
  364.  
  365.  
  366.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija
  367.     tom poglavlju treba dodati novi sadrzaj i pri tome sadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje
  368.     prazana prostor). u slusacju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzajem.*/
  369.  
  370.  
  371.  
  372.     //parametri: nazivPoglavlja, sadrzajPoglavlja;
  373.  
  374.  
  375.  
  376.  
  377.  
  378.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  379.  
  380.  
  381.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  382.  
  383.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  384.  
  385.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistma, a neke od naznacajnijih su... ");
  386.  
  387.     multimedijalni.DodajPoglavlje("Teorija multimedijalnih sistema", "Sadrzaj koji bi treabo stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130031!");
  388.  
  389.  
  390.  
  391.     //nazivPoglavlja, ocjena
  392.  
  393.     multimedijalni.OcijeniPoglavlje("Uvod", 8);
  394.  
  395.  
  396.  
  397.  
  398.  
  399.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu.
  400.     sprijeciti dodavanje zavrsnih radova sa istom temom kao i mogucnost da jedan student kod istog nastavnika
  401.     posjeduje vise zavrsnih radova*/
  402.  
  403.  
  404.  
  405.     //brojIndeksa, zavrsniRad
  406.  
  407.  
  408.     if (nastavnici[0]->DodajZavrsniRad(multimedijalni))
  409.         cout << "Zavrsni rad uspjesno dodat !" << endl;
  410.  
  411.     if (nastavnici[0]->DodajZavrsniRad(podrsa_operaterima))
  412.         cout << "Zavrsni rad uspjesno dodat !" << endl;
  413.  
  414.     if (!nastavnici[0]->DodajZavrsniRad(podrsa_operaterima))//dupliranje rada, onemoguciti dodavanje
  415.         cout << "Zavrsni rad nije dodat !" << endl;
  416.  
  417.     if (!nastavnici[0]->DodajZavrsniRad(kriptografija))//studentu vec dodijeljen rad, onemoguciti dodavanje
  418.         cout << "Zavrsni rad nije dodat !" << endl;
  419.  
  420.     if (nastavnici[1]->DodajZavrsniRad(analiza_sigurnosti))
  421.         cout << "Zavrsni rad uspjesno dodat !" << endl;
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429. //U PRVOBITNOJ POSTAVCI ZADATKA NIJE BIO OVOLIKI USLOV KOJI VIDIMO ISPOD SAD DOLJE !!!!
  430. // DA LI U MAINU TREBAMO DODATNO NEKAD NESTO ISPISAT, USLOV/POZIV/PROVJERE ????
  431.  
  432.  
  433.  
  434.     /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog
  435.     rada sto podrazumijeva
  436.    
  437.     izracunavanje konacne ocjene i definisanje datuma odbrane.
  438.    
  439.     odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
  440.    
  441.     Za zakazivanje odbrane rada moraju biti zadovoljeni sljedeci uslovi:
  442.    
  443.     1. zavrsni rad mora imati broj poglavlja veci od minimalnog.
  444.     2. svako poglavlje mora imati broj karatkera veci od minimalnog.
  445.     3. svako poglavlje mora biti prihvaceno/odobreno ukoliko su zadovoljeni prethodni kriteriji, izracuvana se
  446.     konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad
  447.     kome je zakazana odbrana.
  448.    
  449.     u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija
  450.     nije zadovoljen, funkcija vraca nullptr.*/
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.     //parametri: brojIndeksa, datumOdbrane
  458.  
  459.     ZavrsniRad* zr1 = nastavnici[0]->ZakaziOdbranuRada("IB120021", "25.09.2018");
  460.     if (zr1 != nullptr)
  461.         zr1->Ispis();
  462.  
  463.     zr1 = nastavnici[0]->ZakaziOdbranuRada("IB180081", "25.09.2018");//student sa brojem indeksa
  464.     //ib180081 jos uvijek nije prijavio rad
  465.     if (zr1 == nullptr)
  466.         cout << "odbrana ne moze biti zakazana !" << endl;
  467.    
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.     //dodano zbog testiranja PronadjiNajStudenta
  475.  
  476.     ZavrsniRad* zr2 = nastavnici[1]->ZakaziOdbranuRada("IB140041", "25.09.2018");
  477.     if (zr2 != nullptr)
  478.         zr2->Ispis();
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.     //float prosjekStudenta = 0, prosjekMentora = 0;
  487.     //char* indeksStudenta;
  488.  
  489.     ////parametri PronadjiNajStudenta: nastavnici, brojNastavnika, minimalnaKonacnaOcjena
  490.  
  491.  
  492.     //tie(indeksStudenta, prosjekMentora, prosjekStudenta) = PronadjiNajStudenta(nastavnici, max, 8.2);
  493.  
  494.     //if (indeksStudenta != nullptr)
  495.     //  cout << crt << indeksStudenta << " " << prosjekMentora << " " << prosjekStudenta << crt;
  496.  
  497.  
  498.     for (int i = 0; i < max; i++) {
  499.         nastavnici[i]->Dealociraj();
  500.         delete nastavnici[i];
  501.         nastavnici[i] = nullptr;
  502.  
  503.     }
  504.  
  505.     system("pause>0");
  506.     return 0;
  507.  
  508.  
  509.  
  510.  
  511. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement