Advertisement
limun11

PRII - ZavrsniRad/Nastavnici (shared_ptr)

Oct 3rd, 2018
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.87 KB | None | 0 0
  1. #include<iostream>
  2. #include <tuple>
  3. using namespace std;
  4.  
  5. /*
  6. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NECE BODOVATI
  7. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  8. 3. KREIRAJTE .DOC FAJL SA VAŠIM BROJEM INDEKSA ( NPR. IB160061.DOC BEZ IMENA I PREZIMENA), TE NA KRAJU ISPITA U NJEGA KOPIRAJTE RJEŠENJA VAŠIH ZADATAKA. NE PREDAVATI .TXT ILI .CPP FAJLOVE
  9. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  10. 5. TOKOM IZRADE ISPITA MOGU BITI POKRENUTA SAMO TRI PROGRAMA: PDF READER (ISPITNI ZADACI), MS VISUAL STUDIO, MS WORD (U KOJI CETE KOPIRATI VAŠA RJEŠENJA)
  11. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAÐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  12. */
  13.  
  14. const char * not_set = "NEMA_VRIJEDNOST";
  15. const char * crt = "\n-------------------------------------------\n";
  16. const int min_polgavlja = 3;
  17. const int max_zavrsnih = 30;
  18. const char * zabranjeneRijeci[] = { "ubiti","mrziti", "NC", "RE" };
  19.  
  20. char * AlocirajNizKaraktera(const char * sadrzaj) {
  21.     if (sadrzaj == nullptr)
  22.         return nullptr;
  23.     int vel = strlen(sadrzaj) + 1;
  24.     char * temp = new char[vel];
  25.     strcpy_s(temp, vel, sadrzaj);
  26.     return temp;
  27. }
  28.  
  29. struct Poglavlje {
  30.     char * _naslov;
  31.     char * _sadrzaj;
  32.     bool _prihvaceno;
  33.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  34.     void Unos(const char * naslov = nullptr, const char * sadrzaj = nullptr) {
  35.         _ocjena = 0; _prihvaceno = false;
  36.         _naslov = AlocirajNizKaraktera(naslov);
  37.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  38.     }
  39.     void Dealociraj() {
  40.         delete[] _naslov; _naslov = nullptr;
  41.         delete[] _sadrzaj; _sadrzaj = nullptr;
  42.     }
  43.     void Ispis() {
  44.         if (_naslov == nullptr || _sadrzaj == nullptr)
  45.             return;
  46.         cout << endl << "Poglavlje -> " << _naslov << endl << _sadrzaj << endl;
  47.         if (_prihvaceno)
  48.             cout << "Ocjena: " << _ocjena << endl;;
  49.     }
  50.     void OcijeniPoglavlje(int ocjena) {
  51.         _ocjena = ocjena;
  52.         if (_ocjena > 5 && ocjena <= 10)
  53.             _prihvaceno = true;
  54.     }
  55. };
  56.  
  57. struct ZavrsniRad {
  58.     char _brojIndeksa[15];
  59.     char * _tema;
  60.     shared_ptr<Poglavlje> * _poglavljaRada;
  61.     int _trenutnoPoglavlja;
  62.     char * _datumOdbrane;
  63.     float _konacnaOcjena; //konacna ocjena zavrsnog rada predstavlja prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  64.  
  65.     void kopirajZavrsniRad(ZavrsniRad & zavrsni)
  66.     {
  67.         Unos(zavrsni._brojIndeksa, zavrsni._tema);
  68.         for (int i = 0; i < zavrsni._trenutnoPoglavlja; i++)
  69.         {
  70.             DodajPoglavlje(zavrsni._poglavljaRada[i]->_naslov, zavrsni._poglavljaRada[i]->_sadrzaj);
  71.             OcijeniPoglavlje(zavrsni._poglavljaRada[i]->_naslov, zavrsni._poglavljaRada[i]->_ocjena);
  72.         }
  73.         _datumOdbrane = AlocirajNizKaraktera(zavrsni._datumOdbrane);
  74.         _konacnaOcjena = zavrsni._konacnaOcjena;
  75.     }
  76.  
  77.     void Unos(const char * brojIndeksa, const char * nazivTeme = nullptr) {
  78.         _konacnaOcjena = 0;
  79.         strcpy_s(_brojIndeksa, 15, brojIndeksa);
  80.         _tema = AlocirajNizKaraktera(nazivTeme);
  81.         _trenutnoPoglavlja = 0;
  82.         _datumOdbrane = AlocirajNizKaraktera(not_set);
  83.         _poglavljaRada = nullptr;
  84.     }
  85.     void Dealociraj() {
  86.         delete[] _tema; _tema = nullptr;
  87.         delete[] _datumOdbrane; _datumOdbrane = nullptr;
  88.         for (size_t i = 0; i < _trenutnoPoglavlja; i++)
  89.             _poglavljaRada[i]->Dealociraj();
  90.         delete[] _poglavljaRada; _poglavljaRada = nullptr;
  91.     }
  92.     void Ispis() {
  93.         cout << "Tema rada: " << _tema << endl;
  94.         cout << "Sadrzaj: " << endl;
  95.         for (size_t i = 0; i < _trenutnoPoglavlja; i++)
  96.             _poglavljaRada[i]->Ispis();
  97.         cout << "Datum odbrane rada: " << _datumOdbrane << endl << " Ocjena: " << _konacnaOcjena << endl;
  98.     }
  99.  
  100.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu,
  101.     funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog
  102.     sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzajem*/
  103.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  104.     void DodajPoglavlje(const char * nazivPoglavlja, const char * sadrzajPoglavlja)
  105.     {
  106.         for (int i = 0; i < _trenutnoPoglavlja; i++)
  107.         {
  108.             if (strcmp(_poglavljaRada[i]->_naslov, nazivPoglavlja) == 0)
  109.             {
  110.                 char *temp;
  111.                 int size = strlen(sadrzajPoglavlja) + 1 + strlen(_poglavljaRada[i]->_sadrzaj) + 1;
  112.                 temp = new char[size];
  113.                 strcpy_s(temp, size, _poglavljaRada[i]->_sadrzaj);
  114.                 strcat_s(temp, size, " ");
  115.                 strcat_s(temp, size, sadrzajPoglavlja);
  116.  
  117.                 delete[] _poglavljaRada[i]->_sadrzaj;
  118.                 _poglavljaRada[i]->_sadrzaj = temp;
  119.                 return;
  120.             }
  121.         }
  122.         shared_ptr<Poglavlje> * temp = new shared_ptr <Poglavlje>[_trenutnoPoglavlja + 1];
  123.         for (int i = 0; i < _trenutnoPoglavlja; i++)
  124.         {
  125.             temp[i] = make_shared <Poglavlje>();
  126.             temp[i]->Unos(_poglavljaRada[i]->_naslov, _poglavljaRada[i]->_sadrzaj);
  127.         }
  128.         temp[_trenutnoPoglavlja] = make_shared<Poglavlje>();
  129.         temp[_trenutnoPoglavlja]->Unos(nazivPoglavlja, sadrzajPoglavlja);
  130.         for (int i = 0; i < _trenutnoPoglavlja; i++)
  131.         {
  132.             _poglavljaRada[i]->Dealociraj();
  133.         }
  134.         delete[] _poglavljaRada;
  135.         _poglavljaRada = temp;
  136.         _trenutnoPoglavlja++;
  137.         return;
  138.     }
  139.     //parametri: nazivPoglavlja, ocjena
  140.     void OcijeniPoglavlje(const char * nazivPoglavlja, int ocjena)
  141.     {
  142.         for (int i = 0; i < _trenutnoPoglavlja; i++)
  143.         {
  144.             if (strcmp(_poglavljaRada[i]->_naslov, nazivPoglavlja) == 0)
  145.             {
  146.                 _poglavljaRada[i]->OcijeniPoglavlje(ocjena);
  147.             }
  148.         }
  149.     }
  150. };
  151. struct Nastavnik {
  152.     char * _imePrezime;
  153.     shared_ptr<ZavrsniRad> _teme[max_zavrsnih] = { nullptr };
  154.  
  155.     void Unos(const char * imePrezime) {
  156.         _imePrezime = AlocirajNizKaraktera(imePrezime);
  157.     }
  158.     void Dealociraj() {
  159.         delete[] _imePrezime; _imePrezime = nullptr;
  160.         for (size_t i = 0; i < max_zavrsnih; i++)
  161.             if (_teme[i] != nullptr)
  162.                 _teme[i]->Dealociraj();
  163.     }
  164.     void Ispis() {
  165.         cout << crt << _imePrezime << crt;
  166.         for (size_t i = 0; i < max_zavrsnih; i++)
  167.             if (_teme[i] != nullptr)
  168.                 _teme[i]->Ispis();
  169.     }
  170.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu. sprijeciti dodavanje
  171.     zavrsnih radova sa istom temom kao i mogucnost da jedan student kod istog nastavnika posjeduje vise zavrsnih radova*/
  172.     bool DodajZavrsniRad(ZavrsniRad zavrsni)
  173.     {
  174.         for (int i = 0; i < max_zavrsnih; i++)
  175.         {
  176.             if (_teme[i] == nullptr)
  177.             {
  178.                 _teme[i] = make_shared <ZavrsniRad>();
  179.                 _teme[i]->kopirajZavrsniRad(zavrsni);
  180.                 return true;
  181.             }
  182.             else if ((strcmp(_teme[i]->_tema, zavrsni._tema) == 0) || (strcmp(_teme[i]->_brojIndeksa, zavrsni._brojIndeksa) == 0))
  183.                 return false;
  184.         }
  185.         return false;
  186.     }
  187.     /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva
  188.     izracunavanje konacne ocjene i definisanje datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
  189.     Za zakazivanje odbrane rada moraju biti zadovoljeni sljedeci uslovi:
  190.     1. zavrsni rad mora imati broj poglavlja veci od minimalnog
  191.     2. sadrzaj bilo kojeg poglavlja u zavrsnom radu ne smije sadrzavati neku od zabranjenih rijeci (definisanih u nizu zabranjeneRijeci)
  192.     3. svako poglavlje mora biti prihvaceno/odobreno
  193.     ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i
  194.     vraca pokazivac na rad kome je zakazana odbrana.
  195.     u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  196.     */
  197.  
  198.     //paramteri: brojIndeksa, datumOdbrane
  199.     ZavrsniRad * ZakaziOdbranuRada(const char * brojIndeksa, const char * datumOdbrane)
  200.     {
  201.         ZavrsniRad * rezultat = nullptr;
  202.         for (int i = 0; i < max_zavrsnih; i++)
  203.         {
  204.             if (_teme[i] != nullptr)
  205.             {
  206.                 if (strcmp(_teme[i]->_brojIndeksa, brojIndeksa) == 0)
  207.                 {
  208.                     if (_teme[i]->_trenutnoPoglavlja < min_polgavlja)
  209.                         return nullptr;
  210.                 }
  211.                 for (int j = 0; j < _teme[i]->_trenutnoPoglavlja; j++)
  212.                 {
  213.                     if (_teme[i]->_poglavljaRada[j]->_prihvaceno == false)
  214.                         return nullptr;
  215.                     for (int k = 0; k < 4; k++)
  216.                     {
  217.                         if (strstr(_teme[i]->_poglavljaRada[j]->_sadrzaj, zabranjeneRijeci[k]) != nullptr)
  218.                             return nullptr;
  219.                     }
  220.                 }
  221.             }
  222.         }
  223.         float suma = 0, prosjek = 0;
  224.         for (int i = 0; i < max_zavrsnih; i++)
  225.         {
  226.             if (_teme[i] != nullptr)
  227.             {
  228.                 for (int j = 0; j < _teme[i]->_trenutnoPoglavlja; j++)
  229.                 {
  230.                     suma += _teme[i]->_poglavljaRada[j]->_ocjena;
  231.                 }
  232.                 prosjek = suma / _teme[i]->_trenutnoPoglavlja;
  233.                 _teme[i]->_datumOdbrane = AlocirajNizKaraktera(datumOdbrane);
  234.                 rezultat = &(*_teme[i]);
  235.             }
  236.         }
  237.         return rezultat;
  238.     }
  239. };
  240.  
  241. /*funkcija PronadjiNajStudenta ima zadatak da pronadje studenta koji kod nastavnika/mentora sa najvecom prosjecnom ocjenom radova
  242. (sumaSvihOcjenaZavrsnihRadova/brojZavrsnihRadova) ima najvise neodobrenih (negativno ocijenjenih) poglavlja*/
  243.  
  244. //parametri PronadjiStudenta: nastavnici, brojNastavnika
  245. //indeksStudenta, brojPoglavlja, prosjekMentora
  246. tuple <char *, int, float> PronadjiStudenta(Nastavnik *n, int v)
  247. {
  248.     Nastavnik *najboljiNastavnik = nullptr;
  249.     char *brojIndexa = nullptr;
  250.     float prosjek = 0;
  251.     int brojPoglavlja = 0;
  252.     for (size_t i = 0; i < v; i++) //prolazimo kroz broj nastavnika
  253.     {
  254.         float suma = 0;
  255.         int brojac = 0;
  256.         for (size_t j = 0; j < max_zavrsnih; j++) //prolazimo kroz sve zavrsne radove u nastavnicima
  257.         {
  258.             if (n[i]._teme[j] != nullptr && n[i]._teme[j]->_konacnaOcjena > 0)  // gledamo sve konacne ocjene unutar zavrsnih radova koje imaju ocjenu vecu od 0
  259.             {
  260.                 suma += n[i]._teme[j]->_konacnaOcjena; // sabirami sve te ocjene
  261.                 brojac++; // brojimo koliko je konacnihOcjena koje su vece od 0 u svim zavrsnim radovima
  262.             }
  263.         }
  264.         suma /= brojac; // trazimo prosjecnu ocjenu svih zavrsnih radova unutar svih nastavnika koje smo izracunali gore
  265.         if (suma > prosjek) // ako je ta prosjecna ocjena veca od dosadasnje prosjecne ocjene nastavnika
  266.         {
  267.             prosjek = suma; // nova prosjecna ocjena nastavnika ce biti prosjecna ocjenua koju smo izracnulai
  268.             najboljiNastavnik = n + i; //spasavamo indeks nastavnika koji ima tu najvecu prosjecnu ocjenu
  269.         }
  270.     }
  271.     if (najboljiNastavnik != nullptr) {
  272.         for (size_t i = 0; i < max_zavrsnih; i++) //prolazimo kroz sve zavrsne radove
  273.         {
  274.             if (najboljiNastavnik->_teme[i] != nullptr) {
  275.                 int brojNeprihvacenih = 0;
  276.                 for (size_t j = 0; j < najboljiNastavnik->_teme[i]->_trenutnoPoglavlja; j++) // prolazimo kroz sva poglavlja rada
  277.                 {
  278.                     if (!najboljiNastavnik->_teme[i]->_poglavljaRada[j]->_prihvaceno)//gledamo provjeravamo koja poglavlja rada unutar zavrnim radovima nisu prihvacena
  279.                         brojNeprihvacenih++;//sabirami sve neprihvacene poglavlje radova u zavrsnim radovima
  280.                 }
  281.                 if (brojPoglavlja < brojNeprihvacenih) //ako  ima manje broja poglavlja od broja neprihvacenih poglavlja
  282.                 {
  283.                     brojPoglavlja = brojNeprihvacenih; // broj pogavlja postaje neprihvaceni broj poglavlja
  284.                     brojIndexa = najboljiNastavnik->_teme[i]->_brojIndeksa;//i inekdsu studenta dodjeljujemo koji ima najvise neprihvaacenih poglavlja
  285.                 }
  286.             }
  287.         }
  288.     }
  289.     return make_tuple(brojIndexa, brojPoglavlja, prosjek);
  290. }
  291. int main() {
  292.     const int max = 2;
  293.     Nastavnik * nastavnici = new Nastavnik[max];
  294.  
  295.     nastavnici[0].Unos("Denis Music");
  296.     nastavnici[1].Unos("Emina Junuz");
  297.  
  298.     ZavrsniRad multimedijalni;
  299.     //parametri: brojIndeksa, tema
  300.     multimedijalni.Unos("IB120021", "Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  301.     ZavrsniRad podrsa_operaterima;
  302.     podrsa_operaterima.Unos("IB130031", "Sistem za podršku rada kablovskog operatera");
  303.     ZavrsniRad analiza_sigurnosti;
  304.     analiza_sigurnosti.Unos("IB140041", "Prakticna analiza sigurnosti bežiènih raèunarskih mreža");
  305.     ZavrsniRad kriptografija;
  306.     kriptografija.Unos("IB120021", "Primjena teorije informacija u procesu generisanja kriptografskih kljuèeva");
  307.  
  308.     /*u zavrsni rad dodaje novo poglavlje i njegov sadrzaj. ukoliko poglavlje vec postoji u zavrsnom radu, funkcija tom poglavlju treba dodati novi sadrzaj i pri tome zadrzi postojeci (izmedju postojeceg i novog sadrzaja se dodaje prazan prostor). u slucaju da poglavlje ne postoji, ono se dodaje zajedno sa sadrzajem*/
  309.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  310.  
  311.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  312.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  313.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  314.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  315.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  316.  
  317.     //parametri: nazivPoglavlja, ocjena
  318.     multimedijalni.OcijeniPoglavlje("Uvod", 8);
  319.     multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  320.     multimedijalni.OcijeniPoglavlje("Teorija multimedije", 9);
  321.  
  322.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu. sprijeciti dodavanje
  323.     zavrsnih radova sa istom temom kao i mogucnost da jedan student kod istog nastavnika posjeduje vise zavrsnih radova*/
  324.     if (nastavnici[0].DodajZavrsniRad(multimedijalni))
  325.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  326.     if (nastavnici[0].DodajZavrsniRad(podrsa_operaterima))
  327.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  328.     if (!nastavnici[0].DodajZavrsniRad(podrsa_operaterima))//dupliranje rada, onemoguciti dodavanje
  329.         cout << "Zavrsni rad nije dodat!" << endl;
  330.     if (!nastavnici[0].DodajZavrsniRad(kriptografija)) //studentu vec dodijeljen rad, onemoguciti dodavanje
  331.         cout << "Zavrsni rad nije dodat!" << endl;
  332.     if (nastavnici[1].DodajZavrsniRad(analiza_sigurnosti))
  333.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  334.  
  335.  
  336.     /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva
  337.     izracunavanje konacne ocjene i definisanje datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
  338.     Za zakazivanje odbrane rada moraju biti zadovoljeni sljedeci uslovi:
  339.     1. zavrsni rad mora imati broj poglavlja veci od minimalnog
  340.     2. sadrzaj bilo kojeg poglavlja u zavrsnom radu ne smije sadrzavati neku od zabranjenih rijeci (definisanih u nizu zabranjeneRijeci)
  341.     3. svako poglavlje mora biti prihvaceno/odobreno
  342.     ukoliko su zadovoljeni prethodni kriteriji, izracunava se konacna ocjena rada (prosjek ocjena svih poglavlja), postavlja datum odbrane rada i vraca pokazivac na rad kome je zakazana odbrana.
  343.     u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  344.     */
  345.  
  346.     //paramteri: brojIndeksa, datumOdbrane
  347.     ZavrsniRad * zr1 = nastavnici[0].ZakaziOdbranuRada("IB120021", "25.09.2018");
  348.     if (zr1 != nullptr)
  349.         zr1->Ispis();
  350.  
  351.     zr1 = nastavnici[0].ZakaziOdbranuRada("IB180081", "25.09.2018");//student sa brojem indeksa IB180081 jos uvijek nije prijavio rad
  352.     if (zr1 == nullptr)
  353.         cout << "Odbrana ne moze biti zakazana!" << endl;
  354.  
  355.     //ispisuje sve podatke o nastavniku i njegovim mentorstvima
  356.     nastavnici[0].Ispis();
  357.     nastavnici[1].Ispis();
  358.  
  359.     /*funkcija PronadjiNajStudenta ima zadatak da pronadje studenta koji kod nastavnika/mentora sa najvecom prosjecnom ocjenom radova
  360.     (sumaSvihOcjenaZavrsnihRadova/brojZavrsnihRadova) ima najvise neodobrenih (negativno ocijenjenih) poglavlja*/
  361.     int brojPoglavlja = -1;
  362.     float prosjekMentora = 0;
  363.     char * indeksStudenta;
  364.     //parametri PronadjiStudenta: nastavnici, brojNastavnika
  365.     tie(indeksStudenta, brojPoglavlja, prosjekMentora) = PronadjiStudenta(nastavnici, max);
  366.     if (indeksStudenta != nullptr)
  367.         cout << crt << indeksStudenta << " " << prosjekMentora << " " << brojPoglavlja << crt;
  368.  
  369.     for (int i = 0; i < max; i++)
  370.         nastavnici[i].Dealociraj();
  371.     delete[]nastavnici;
  372.     nastavnici = nullptr;
  373.  
  374.     system("pause>0");
  375.     return 0;
  376.  
  377. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement