Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.20 KB | None | 0 0
  1. #include <iostream>
  2. #include <string.h>
  3. #include <cstring>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. /*
  9. 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NECE BODOVATI
  10. 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
  11. 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
  12. 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
  13. 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)
  14. 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAÐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
  15. */
  16.  
  17. // Nasa implementacija strcpy jer nas originalna zeza
  18. char * strcpy_custom(char *dest, const char *src) {
  19.     int counter = 0;
  20.     char *pocetak = dest;
  21.     while (*src != '\0') {
  22.         *dest = *src;
  23.         src++;
  24.         dest++;
  25.         counter++;
  26.     }
  27.     *dest = '\0';
  28.     return pocetak;
  29. }
  30.  
  31. // Spaja dva stringa
  32. char * strcat_custom(char *dest, const char *src) {
  33.     char *krajDest = dest + strlen(dest);
  34.     while (*src != '\0') *krajDest++ = *src++;
  35.     *krajDest = '\0';
  36.     return dest;
  37. }
  38.  
  39.  
  40. const char * not_set = "NEMA_VRIJEDNOST"; // bilo sta pod dvostrukim navodnicima je tipa "const char[]" - "const char* "
  41. const char * crt = "\n-------------------------------------------\n";
  42. const int min_polgavlja = 3;
  43. const int min_karaktera_po_poglavlju = 30;
  44. const int max_zavrsnih = 30;
  45. const char razmak[2] = " ";
  46.  
  47. char * AlocirajNizKaraktera(const char * sadrzaj) {
  48.     if (sadrzaj == nullptr)
  49.         return nullptr;
  50.     const int vel = strlen(sadrzaj) + 1; // zbog /0
  51.     char * temp = new char[vel];
  52.     strcpy_custom(temp, sadrzaj);
  53.     return temp;
  54. }
  55.  
  56. struct Poglavlje {
  57.     char * _naslov;
  58.     char * _sadrzaj;
  59.     bool _prihvaceno;
  60.     int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
  61.     void Unos(const char * naslov = nullptr, const char * sadrzaj = nullptr) {
  62.         _ocjena = 0;
  63.         _prihvaceno = false;
  64.         _naslov = AlocirajNizKaraktera(naslov);
  65.         _sadrzaj = AlocirajNizKaraktera(sadrzaj);
  66.     }
  67.     void Dealociraj() {
  68.         delete[] _naslov; _naslov = nullptr;
  69.         delete[] _sadrzaj; _sadrzaj = nullptr;
  70.     }
  71.     void Ispis() {
  72.         if (_naslov == nullptr || _sadrzaj == nullptr)
  73.             return;
  74.         cout << endl << "Poglavlje -> " << _naslov << endl << _sadrzaj << endl;
  75.         if (_prihvaceno)
  76.             cout << "Ocjena: " << _ocjena << endl;;
  77.     }
  78.     void OcijeniPoglavlje(int ocjena) {
  79.         _ocjena = ocjena;
  80.         if (_ocjena > 5 && ocjena <= 10)
  81.             _prihvaceno = true;
  82.     }
  83.  
  84.     Poglavlje DajDubokuKopiju() {
  85.         // Todo Ajla
  86.     }
  87. };
  88.  
  89. struct ZavrsniRad {
  90.     char * _brojIndeksa;
  91.     char * _tema;
  92.     Poglavlje * _poglavljaRada = nullptr; // ovo nam je falilo
  93.     int _trenutnoPoglavlja = 0; // ovo nam je falilo
  94.     char * _datumOdbrane;
  95.     float _konacnaOcjena; //konacna ocjena zavrsnog rada predstavlja prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
  96.     int _pocetniKapacitet = 10;
  97.  
  98.  
  99.     void Unos(const char * brojIndeksa, const char * nazivTeme = nullptr) {
  100.         _konacnaOcjena = 0;
  101.         _brojIndeksa = AlocirajNizKaraktera(brojIndeksa);
  102.         _tema = AlocirajNizKaraktera(nazivTeme);
  103.         _datumOdbrane = AlocirajNizKaraktera(not_set);
  104.     }
  105.     void Dealociraj() {
  106.         delete[] _tema; _tema = nullptr;
  107.         delete[] _datumOdbrane; _datumOdbrane = nullptr;
  108.         delete[] _brojIndeksa; _brojIndeksa = nullptr;
  109.         for (size_t i = 0; i < _trenutnoPoglavlja; i++)
  110.             _poglavljaRada[i].Dealociraj();
  111.         delete[] _poglavljaRada; _poglavljaRada = nullptr;
  112.     }
  113.     void Ispis() {
  114.         cout << "Tema rada: " << _tema << endl;
  115.         cout << "Sadrzaj: " << endl;
  116.         for (size_t i = 0; i < _trenutnoPoglavlja; i++)
  117.             _poglavljaRada[i].Ispis();
  118.         cout << "Datum odbrane rada: " << _datumOdbrane << endl << " Ocjena: " << _konacnaOcjena << endl;
  119.     }
  120.  
  121.     void DodajPoglavlje(const char *nazivPoglavlja, const char *sadrzajPoglavlja) {
  122.         // Ako nije alociran, onda alociraj
  123.         if (_poglavljaRada == nullptr) {
  124.             _poglavljaRada = new Poglavlje[_pocetniKapacitet];
  125.         }
  126.         // Ako se napunio, prosiri ga
  127.         if (_trenutnoPoglavlja == _pocetniKapacitet) {
  128.             // Realokacija
  129.             // Trebamo alocirati novi veci niz
  130.             // Zatim u njega kopirati sva postojeca poglavlja
  131.             // I tek onda dodati novo poglavlje
  132.         }
  133.  
  134.         bool pronadjenIsti = false;
  135.         // Pretragu trebamo raditi samo ako niz nije prazan
  136.         if (_trenutnoPoglavlja > 0) {
  137.             for (int i = 0; i < _trenutnoPoglavlja; i++) {
  138.                 if (strcmp(nazivPoglavlja, _poglavljaRada[i]._naslov) == 0) {
  139.                     // Dodati novi sadrzaj na stari
  140.                     strcat_custom(_poglavljaRada[i]._sadrzaj, razmak);
  141.                     strcat_custom(_poglavljaRada[i]._sadrzaj, sadrzajPoglavlja);
  142.                     pronadjenIsti = true;
  143.                     break;
  144.                 }
  145.             }
  146.         }
  147.  
  148.         if (pronadjenIsti == false) {
  149.             _poglavljaRada[_trenutnoPoglavlja].Unos(nazivPoglavlja, sadrzajPoglavlja);
  150.             _trenutnoPoglavlja++; // ovo nam je falilo
  151.         }
  152.     }
  153.  
  154.     void OcijeniPoglavlje(const char *nazivPoglavlja, const int ocjena)
  155.     {
  156.         if (ocjena < 6 || ocjena > 10) return;
  157.         for (int i = 0; i < _trenutnoPoglavlja; i++)
  158.         {
  159.             if (strcmp(_poglavljaRada[i]._naslov, nazivPoglavlja) == 0)
  160.             {
  161.                _poglavljaRada[i]._ocjena = ocjena;
  162.             }
  163.         }
  164.     }
  165.  
  166.     void PostaviKonacnuOcjenuPoglavlju()
  167.     {
  168.         for(int i=0; i<_trenutnoPoglavlja; i++)
  169.         {
  170.             // Cjelobrojno dijeljenje (int / int ) = int
  171.             _konacnaOcjena+=(float)_poglavljaRada[i]._ocjena/_trenutnoPoglavlja;
  172.         }
  173.     }
  174.  
  175.     ZavrsniRad DajDubokuKopiju() {
  176.         ZavrsniRad kopija;
  177.         // Prvo kopirajmo staticke resurse
  178.         kopija._konacnaOcjena = _konacnaOcjena;
  179.         kopija._trenutnoPoglavlja = _trenutnoPoglavlja;
  180.  
  181.         // Sad napravimo duboku kopiju dinamickih resursa
  182.         int velicinaTeme = strlen(_tema);
  183.         kopija._tema = new char[velicinaTeme + 1]; // +1 zbog '\0' koji se ne racuna u strlen
  184.         strcpy_custom(kopija._tema, _tema);
  185.  
  186.         int velicinaIndexa = strlen(_brojIndeksa);
  187.         kopija._brojIndeksa = new char[velicinaIndexa + 1]; // +1 zbog '\0' koji se ne racuna u strlen
  188.         strcpy_custom(kopija._brojIndeksa, _brojIndeksa);
  189.  
  190.         int velicinaDatuma = strlen(_datumOdbrane);
  191.         kopija._datumOdbrane = new char[velicinaDatuma + 1]; // +1 zbog '\0' koji se ne racuna u strlen
  192.         strcpy_custom(kopija._datumOdbrane, _datumOdbrane);
  193.  
  194.         // Treba jos kopija citavog niza poglavlja _poglavljaRada
  195.         if (_poglavljaRada != nullptr) {
  196.             kopija._poglavljaRada = new Poglavlje[_pocetniKapacitet];
  197.             for (int i = 0; i < _trenutnoPoglavlja; i++) {
  198.                 // Ovo treba dodati u strukturu Poglavlje da bi radilo
  199.                 // kopija._poglavljaRada[i] = _poglavljaRada[i].DajDubokuKopiju();
  200.                 // Ovo probaj uraditi
  201.             }
  202.         }
  203.  
  204.         return kopija;
  205.     }
  206.  
  207. };
  208.  
  209. struct Nastavnik {
  210.     char * _imePrezime;
  211.     ZavrsniRad * _radovi[max_zavrsnih] = { nullptr }; // Na ovaj nacin jednom naredbom postavljamo citav niz pokazivaca na nullptr-ove
  212.     float prosjek_ocjene=0;
  213.  
  214.     void Unos(const char * imePrezime) {
  215.         _imePrezime = AlocirajNizKaraktera(imePrezime);
  216.     }
  217.     void Dealociraj() {
  218.         delete[] _imePrezime; _imePrezime = nullptr;
  219.         for (size_t i = 0; i < max_zavrsnih; i++)
  220.         {
  221.             if (_radovi[i] != nullptr) {
  222.                 _radovi[i]->Dealociraj();
  223.                 delete _radovi[i];
  224.             }
  225.         }
  226.     }
  227.     void Ispis() {
  228.         cout << crt << _imePrezime << crt;
  229.         for (size_t i = 0; i < max_zavrsnih; i++)
  230.             _radovi[i]->Ispis();
  231.     }
  232.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu.
  233.     sprijeciti dodavanje zavrsnih radova sa istom temom
  234.     kao i mogucnost da jedan student kod istog nastavnika posjeduje vise zavrsnih radova*/
  235.     bool DodajZavrsniRad(ZavrsniRad rad) {
  236.         int i = 0;
  237.         while (_radovi[i] != nullptr && i < max_zavrsnih) {
  238.             // Trebamo provjeriti da li vec postoji rad sa istom temom
  239.             if (strcmp(rad._tema, _radovi[i]->_tema)==0 || strcmp(rad._brojIndeksa, _radovi[i]->_brojIndeksa)) {
  240.                 return false;
  241.             }
  242.             i++;
  243.         }
  244.         // Ako se nalazimo u ovoj liniji znaci da nismo nasli duplikate
  245.         // Tj trebamo dodati ovaj rad u niz svih radova ovog nastavnika
  246.         if (i == max_zavrsnih) {
  247.             cout << "Popunjen je kapacitet niza radova za nastvnika: " << _imePrezime;
  248.             return false;
  249.         }
  250.  
  251.         // Koja je prva slobodna lokacija u nizu? Odgovor: i
  252.         _radovi[i] = new ZavrsniRad;
  253.         *(_radovi[i]) = rad; // NAPOMENA!!!!!!!! OVO JE PLITKA KOPIJA SVIH RESURSA IZ LIJEVE STRUKTURE !!!!!!!!!!!!!!!!!!!!!!
  254.         // Kada imamo struktura = struktura onda se sva polja desne strukture KOPIRAJU u polja lijeve strukture
  255.         // Idealno bi bilo:
  256.         // *(_radovi[i]) = rad.DajDubokuKopiju();
  257.         return true;
  258.     }
  259.  
  260.     ZavrsniRad * ZakaziOdbranuRada(const char* brojIndeksa, const char *datumOdbrane)
  261.     {
  262.         // 1. Nadjimo rad koji odgovara ovom indeksu
  263.         for(int i=0; i<max_zavrsnih; i++)
  264.         {
  265.             if (strcmp(_radovi[i]->_brojIndeksa, brojIndeksa) == 0
  266.                 && _radovi[i]->_trenutnoPoglavlja>min_polgavlja) {
  267.  
  268.                 bool validnoPoglavlje = true;
  269.                 for (int j = 0; j < _radovi[i]->_trenutnoPoglavlja; j++) {
  270.                     Poglavlje & trenutnoPoglavlje = _radovi[i]->_poglavljaRada[j];
  271.  
  272.                     if (strlen(trenutnoPoglavlje._sadrzaj) < min_karaktera_po_poglavlju
  273.                         || trenutnoPoglavlje._ocjena < 6 || trenutnoPoglavlje._ocjena > 10 ) {
  274.                         validnoPoglavlje = false;
  275.                         return nullptr;
  276.                     }
  277.                 }
  278.  
  279.                 if (validnoPoglavlje) {
  280.                     // _radovi[i]._datumOdbrane = datumOdbrane; // plitka kopija
  281.                     strcpy(_radovi[i]->_datumOdbrane, datumOdbrane);
  282.                     _radovi[i]->PostaviKonacnuOcjenuPoglavlju();
  283.                     return _radovi[i];
  284.                 }
  285.  
  286.             }
  287.  
  288.         }
  289.  
  290.         return nullptr;
  291.  
  292.     }
  293. };
  294.  
  295.  
  296. int main() {
  297.     char niz[100];
  298.     cout << strcpy_custom(niz, "Danas je") << endl; // Test za strcpy_custom
  299.     cout << strcat_custom(niz, " petak") << endl; // Test za strcat_custom
  300.  
  301.     const int maks = 2;
  302.     Nastavnik * nastavnici[maks];
  303.  
  304.     nastavnici[0] = new Nastavnik;     nastavnici[0]->Unos("Denis Music");
  305.     nastavnici[1] = new Nastavnik;     nastavnici[1]->Unos("Emina Junuz");
  306.  
  307.     ZavrsniRad multimedijalni;
  308.  
  309.     //parametri: brojIndeksa, tema
  310.     multimedijalni.Unos("IB120021", "Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
  311.     ZavrsniRad podrsa_operaterima;
  312.     podrsa_operaterima.Unos("IB130031", "Sistem za podršku rada kablovskog operatera");
  313.     ZavrsniRad analiza_sigurnosti;
  314.     analiza_sigurnosti.Unos("IB140041", "Prakticna analiza sigurnosti bežiènih raèunarskih mreža");
  315.     ZavrsniRad kriptografija;
  316.     kriptografija.Unos("IB120021", "Primjena teorije informacija u procesu generisanja kriptografskih kljuèeva");
  317.  
  318.     /*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*/
  319.     //parametri: nazivPoglavlja, sadrzajPoglavlja
  320.     multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
  321.     multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
  322.     multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
  323.     multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
  324.     multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
  325.  
  326.     //nazivPoglavlja, ocjena
  327.     multimedijalni.OcijeniPoglavlje("Uvod", 8);
  328.     multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
  329.     multimedijalni.OcijeniPoglavlje("Teorija multimedije", 7);
  330.  
  331.     multimedijalni.Ispis();
  332.  
  333.     /*funkcija DodajZavrsniRad ima zadatak da odredjenom nastavniku dodijeli mentorstvo na zavrsnom radu. sprijeciti dodavanje zavrsnih radova sa istom temom kao i mogucnost da jedan student kod istog nastavnika posjeduje vise zavrsnih radova*/
  334.     //brojIndeksa, zavrsniRad
  335.  
  336.     // bool DodajZavrsniRad(ZavrsniRad rad)
  337.     if (nastavnici[0]->DodajZavrsniRad(multimedijalni))
  338.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  339.     if (nastavnici[0]->DodajZavrsniRad(podrsa_operaterima))
  340.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  341.     if (!nastavnici[0]->DodajZavrsniRad(podrsa_operaterima))//dupliranje rada, onemoguciti dodavanje
  342.         cout << "Zavrsni rad nije dodat!" << endl;
  343.     if (!nastavnici[0]->DodajZavrsniRad(kriptografija)) //studentu vec dodijeljen rad, onemoguciti dodavanje
  344.         cout << "Zavrsni rad nije dodat!" << endl;
  345.     if (nastavnici[1]->DodajZavrsniRad(analiza_sigurnosti))
  346.         cout << "Zavrsni rad uspjesno dodat!" << endl;
  347.  
  348.  
  349.     /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva
  350.     izracunavanje konacne ocjene i definisanje datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
  351.     Za zakazivanje odbrane rada moraju biti zadovoljeni sljedeci uslovi:
  352.         1. zavrsni rad mora imati broj poglavlja veci od minimalnog
  353.         2. svako poglavlje mora imati broj karaktera veci od minimalnog
  354.         3. svako poglavlje mora biti prihvaceno/odobreno
  355.     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.
  356.     u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
  357. */
  358.  
  359. //paramteri: brojIndeksa, datumOdbrane
  360.  
  361.  
  362.     ZavrsniRad * zr1 = nastavnici[0]->ZakaziOdbranuRada("IB120021", "25.09.2018");
  363.     if (zr1 != nullptr)
  364.         zr1->Ispis();
  365.  
  366.     zr1 = nastavnici[0]->ZakaziOdbranuRada("IB180081", "25.09.2018");//student sa brojem indeksa IB180081 jos uvijek nije prijavio rad
  367.     if (zr1 == nullptr)
  368.         cout << "Odbrana ne moze biti zakazana!" << endl;
  369.  
  370.  
  371.  
  372.     //ispisuje sve podatke o nastavniku i njegovim mentorstvima
  373.     nastavnici[0]->Ispis();
  374.     nastavnici[1]->Ispis();
  375.  
  376.     /*funkcija PronadjiNajStudenta ima zadatak da pronadje prvog studenta koji je zavrsni rad odbranio kod
  377.     nastavnika/mentora koji ima najnizu prosjecnu ocjenu radova (sumaSvihOcjenaZavrsnihRadova/brojZavrsnihRadova), te
  378.     tom prilikom ostvario (odnosi se na studenta) ocjenu vecu od proslijedjene (npr. 8.2)*/
  379.     float prosjekStudenta = 0, prosjekMentora = 0;
  380.     char * indeksStudenta;
  381.     //parametri PronadjiNajStudenta: nastavnici, brojNastavnika, minimalnaKonacnaOcjena
  382.     //tie(indeksStudenta, prosjekMentora, prosjekStudenta) = PronadjiNajStudenta(nastavnici, max, 8.2);
  383.     //if (indeksStudenta != nullptr)
  384.     //  cout << crt << indeksStudenta << " " << prosjekMentora << " " << prosjekStudenta << crt;
  385.  
  386.     /*for (int i = 0; i < max; i++) {
  387.         nastavnici[i]->Dealociraj();
  388.         delete nastavnici[i];
  389.         nastavnici[i] = nullptr;
  390.     }*/
  391.     system("pause>0");
  392.     return 0;
  393.  
  394.     // Poglavlje *poglavlje = new Poglavlje; // ALOCIRALI SMO JEDNO POGLAVLJE I NJEGOVU ADRESU SMJESTILI U VARIJABLU
  395.     // Poglavlje *poglavlja = new Poglavlje[20]; // ALOCIRALI SMO NIZ POGLAVLJA I ADRESU PRVOG ELEMENTA SMO SMJESTILI U VARIJABLU
  396.  
  397.     // delete poglavlje;
  398.     // delete[] poglavlja;
  399.  
  400. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement