Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string.h>
- #include <cstring>
- #include <vector>
- using namespace std;
- /*
- 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NECE BODOVATI
- 2. STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
- 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
- 4. TOKOM IZRADE ISPITA NIJE DOZVOLJENO KORIŠTENJE HELP-A
- 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)
- 6. BEZ OBZIRA NA TO DA LI SU ISPITNI ZADACI URAÐENI, SVI STUDENTI KOJI SU PRISTUPILI ISPITU MORAJU PREDATI SVOJ RAD
- */
- // Nasa implementacija strcpy jer nas originalna zeza
- char * strcpy_custom(char *dest, const char *src) {
- int counter = 0;
- char *pocetak = dest;
- while (*src != '\0') {
- *dest = *src;
- src++;
- dest++;
- counter++;
- }
- *dest = '\0';
- return pocetak;
- }
- // Spaja dva stringa
- char * strcat_custom(char *dest, const char *src) {
- char *krajDest = dest + strlen(dest);
- while (*src != '\0') *krajDest++ = *src++;
- *krajDest = '\0';
- return dest;
- }
- const char * not_set = "NEMA_VRIJEDNOST"; // bilo sta pod dvostrukim navodnicima je tipa "const char[]" - "const char* "
- const char * crt = "\n-------------------------------------------\n";
- const int min_polgavlja = 3;
- const int min_karaktera_po_poglavlju = 30;
- const int max_zavrsnih = 30;
- const char razmak[2] = " ";
- char * AlocirajNizKaraktera(const char * sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- const int vel = strlen(sadrzaj) + 1; // zbog /0
- char * temp = new char[vel];
- strcpy_custom(temp, sadrzaj);
- return temp;
- }
- struct Poglavlje {
- char * _naslov;
- char * _sadrzaj;
- bool _prihvaceno;
- int _ocjena;//da bi se poglavlje smatralo prihvacenim ocjena mora biti u opsegu od 6 - 10
- void Unos(const char * naslov = nullptr, const char * sadrzaj = nullptr) {
- _ocjena = 0;
- _prihvaceno = false;
- _naslov = AlocirajNizKaraktera(naslov);
- _sadrzaj = AlocirajNizKaraktera(sadrzaj);
- }
- void Dealociraj() {
- delete[] _naslov; _naslov = nullptr;
- delete[] _sadrzaj; _sadrzaj = nullptr;
- }
- void Ispis() {
- if (_naslov == nullptr || _sadrzaj == nullptr)
- return;
- cout << endl << "Poglavlje -> " << _naslov << endl << _sadrzaj << endl;
- if (_prihvaceno)
- cout << "Ocjena: " << _ocjena << endl;;
- }
- void OcijeniPoglavlje(int ocjena) {
- _ocjena = ocjena;
- if (_ocjena > 5 && ocjena <= 10)
- _prihvaceno = true;
- }
- Poglavlje DajDubokuKopiju() {
- // Todo Ajla
- }
- };
- struct ZavrsniRad {
- char * _brojIndeksa;
- char * _tema;
- Poglavlje * _poglavljaRada = nullptr; // ovo nam je falilo
- int _trenutnoPoglavlja = 0; // ovo nam je falilo
- char * _datumOdbrane;
- float _konacnaOcjena; //konacna ocjena zavrsnog rada predstavlja prosjek ocjena svih poglavlja u zavrsnom radu koja se izracunava u momentu zakazivanja odbrane
- int _pocetniKapacitet = 10;
- void Unos(const char * brojIndeksa, const char * nazivTeme = nullptr) {
- _konacnaOcjena = 0;
- _brojIndeksa = AlocirajNizKaraktera(brojIndeksa);
- _tema = AlocirajNizKaraktera(nazivTeme);
- _datumOdbrane = AlocirajNizKaraktera(not_set);
- }
- void Dealociraj() {
- delete[] _tema; _tema = nullptr;
- delete[] _datumOdbrane; _datumOdbrane = nullptr;
- delete[] _brojIndeksa; _brojIndeksa = nullptr;
- for (size_t i = 0; i < _trenutnoPoglavlja; i++)
- _poglavljaRada[i].Dealociraj();
- delete[] _poglavljaRada; _poglavljaRada = nullptr;
- }
- void Ispis() {
- cout << "Tema rada: " << _tema << endl;
- cout << "Sadrzaj: " << endl;
- for (size_t i = 0; i < _trenutnoPoglavlja; i++)
- _poglavljaRada[i].Ispis();
- cout << "Datum odbrane rada: " << _datumOdbrane << endl << " Ocjena: " << _konacnaOcjena << endl;
- }
- void DodajPoglavlje(const char *nazivPoglavlja, const char *sadrzajPoglavlja) {
- // Ako nije alociran, onda alociraj
- if (_poglavljaRada == nullptr) {
- _poglavljaRada = new Poglavlje[_pocetniKapacitet];
- }
- // Ako se napunio, prosiri ga
- if (_trenutnoPoglavlja == _pocetniKapacitet) {
- // Realokacija
- // Trebamo alocirati novi veci niz
- // Zatim u njega kopirati sva postojeca poglavlja
- // I tek onda dodati novo poglavlje
- }
- bool pronadjenIsti = false;
- // Pretragu trebamo raditi samo ako niz nije prazan
- if (_trenutnoPoglavlja > 0) {
- for (int i = 0; i < _trenutnoPoglavlja; i++) {
- if (strcmp(nazivPoglavlja, _poglavljaRada[i]._naslov) == 0) {
- // Dodati novi sadrzaj na stari
- strcat_custom(_poglavljaRada[i]._sadrzaj, razmak);
- strcat_custom(_poglavljaRada[i]._sadrzaj, sadrzajPoglavlja);
- pronadjenIsti = true;
- break;
- }
- }
- }
- if (pronadjenIsti == false) {
- _poglavljaRada[_trenutnoPoglavlja].Unos(nazivPoglavlja, sadrzajPoglavlja);
- _trenutnoPoglavlja++; // ovo nam je falilo
- }
- }
- void OcijeniPoglavlje(const char *nazivPoglavlja, const int ocjena)
- {
- if (ocjena < 6 || ocjena > 10) return;
- for (int i = 0; i < _trenutnoPoglavlja; i++)
- {
- if (strcmp(_poglavljaRada[i]._naslov, nazivPoglavlja) == 0)
- {
- _poglavljaRada[i]._ocjena = ocjena;
- }
- }
- }
- void PostaviKonacnuOcjenuPoglavlju()
- {
- for(int i=0; i<_trenutnoPoglavlja; i++)
- {
- // Cjelobrojno dijeljenje (int / int ) = int
- _konacnaOcjena+=(float)_poglavljaRada[i]._ocjena/_trenutnoPoglavlja;
- }
- }
- ZavrsniRad DajDubokuKopiju() {
- ZavrsniRad kopija;
- // Prvo kopirajmo staticke resurse
- kopija._konacnaOcjena = _konacnaOcjena;
- kopija._trenutnoPoglavlja = _trenutnoPoglavlja;
- // Sad napravimo duboku kopiju dinamickih resursa
- int velicinaTeme = strlen(_tema);
- kopija._tema = new char[velicinaTeme + 1]; // +1 zbog '\0' koji se ne racuna u strlen
- strcpy_custom(kopija._tema, _tema);
- int velicinaIndexa = strlen(_brojIndeksa);
- kopija._brojIndeksa = new char[velicinaIndexa + 1]; // +1 zbog '\0' koji se ne racuna u strlen
- strcpy_custom(kopija._brojIndeksa, _brojIndeksa);
- int velicinaDatuma = strlen(_datumOdbrane);
- kopija._datumOdbrane = new char[velicinaDatuma + 1]; // +1 zbog '\0' koji se ne racuna u strlen
- strcpy_custom(kopija._datumOdbrane, _datumOdbrane);
- // Treba jos kopija citavog niza poglavlja _poglavljaRada
- if (_poglavljaRada != nullptr) {
- kopija._poglavljaRada = new Poglavlje[_pocetniKapacitet];
- for (int i = 0; i < _trenutnoPoglavlja; i++) {
- // Ovo treba dodati u strukturu Poglavlje da bi radilo
- // kopija._poglavljaRada[i] = _poglavljaRada[i].DajDubokuKopiju();
- // Ovo probaj uraditi
- }
- }
- return kopija;
- }
- };
- struct Nastavnik {
- char * _imePrezime;
- ZavrsniRad * _radovi[max_zavrsnih] = { nullptr }; // Na ovaj nacin jednom naredbom postavljamo citav niz pokazivaca na nullptr-ove
- float prosjek_ocjene=0;
- void Unos(const char * imePrezime) {
- _imePrezime = AlocirajNizKaraktera(imePrezime);
- }
- void Dealociraj() {
- delete[] _imePrezime; _imePrezime = nullptr;
- for (size_t i = 0; i < max_zavrsnih; i++)
- {
- if (_radovi[i] != nullptr) {
- _radovi[i]->Dealociraj();
- delete _radovi[i];
- }
- }
- }
- void Ispis() {
- cout << crt << _imePrezime << crt;
- for (size_t i = 0; i < max_zavrsnih; i++)
- _radovi[i]->Ispis();
- }
- /*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*/
- bool DodajZavrsniRad(ZavrsniRad rad) {
- int i = 0;
- while (_radovi[i] != nullptr && i < max_zavrsnih) {
- // Trebamo provjeriti da li vec postoji rad sa istom temom
- if (strcmp(rad._tema, _radovi[i]->_tema)==0 || strcmp(rad._brojIndeksa, _radovi[i]->_brojIndeksa)) {
- return false;
- }
- i++;
- }
- // Ako se nalazimo u ovoj liniji znaci da nismo nasli duplikate
- // Tj trebamo dodati ovaj rad u niz svih radova ovog nastavnika
- if (i == max_zavrsnih) {
- cout << "Popunjen je kapacitet niza radova za nastvnika: " << _imePrezime;
- return false;
- }
- // Koja je prva slobodna lokacija u nizu? Odgovor: i
- _radovi[i] = new ZavrsniRad;
- *(_radovi[i]) = rad; // NAPOMENA!!!!!!!! OVO JE PLITKA KOPIJA SVIH RESURSA IZ LIJEVE STRUKTURE !!!!!!!!!!!!!!!!!!!!!!
- // Kada imamo struktura = struktura onda se sva polja desne strukture KOPIRAJU u polja lijeve strukture
- // Idealno bi bilo:
- // *(_radovi[i]) = rad.DajDubokuKopiju();
- return true;
- }
- ZavrsniRad * ZakaziOdbranuRada(const char* brojIndeksa, const char *datumOdbrane)
- {
- // 1. Nadjimo rad koji odgovara ovom indeksu
- for(int i=0; i<max_zavrsnih; i++)
- {
- if (strcmp(_radovi[i]->_brojIndeksa, brojIndeksa) == 0
- && _radovi[i]->_trenutnoPoglavlja>min_polgavlja) {
- bool validnoPoglavlje = true;
- for (int j = 0; j < _radovi[i]->_trenutnoPoglavlja; j++) {
- Poglavlje & trenutnoPoglavlje = _radovi[i]->_poglavljaRada[j];
- if (strlen(trenutnoPoglavlje._sadrzaj) < min_karaktera_po_poglavlju
- || trenutnoPoglavlje._ocjena < 6 || trenutnoPoglavlje._ocjena > 10 ) {
- validnoPoglavlje = false;
- return nullptr;
- }
- }
- if (validnoPoglavlje) {
- // _radovi[i]._datumOdbrane = datumOdbrane; // plitka kopija
- strcpy(_radovi[i]->_datumOdbrane, datumOdbrane);
- _radovi[i]->PostaviKonacnuOcjenuPoglavlju();
- return _radovi[i];
- }
- }
- }
- return nullptr;
- }
- };
- int main() {
- char niz[100];
- cout << strcpy_custom(niz, "Danas je") << endl; // Test za strcpy_custom
- cout << strcat_custom(niz, " petak") << endl; // Test za strcat_custom
- const int maks = 2;
- Nastavnik * nastavnici[maks];
- nastavnici[0] = new Nastavnik; nastavnici[0]->Unos("Denis Music");
- nastavnici[1] = new Nastavnik; nastavnici[1]->Unos("Emina Junuz");
- ZavrsniRad multimedijalni;
- //parametri: brojIndeksa, tema
- multimedijalni.Unos("IB120021", "Multimedijalni informacijski sistem za visoko - obrazovnu ustanovu");
- ZavrsniRad podrsa_operaterima;
- podrsa_operaterima.Unos("IB130031", "Sistem za podršku rada kablovskog operatera");
- ZavrsniRad analiza_sigurnosti;
- analiza_sigurnosti.Unos("IB140041", "Prakticna analiza sigurnosti bežiènih raèunarskih mreža");
- ZavrsniRad kriptografija;
- kriptografija.Unos("IB120021", "Primjena teorije informacija u procesu generisanja kriptografskih kljuèeva");
- /*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*/
- //parametri: nazivPoglavlja, sadrzajPoglavlja
- multimedijalni.DodajPoglavlje("Uvod", "U ovom poglavlju ce biti rijeci");
- multimedijalni.DodajPoglavlje("Uvod", "o multimedijalnim sistemima koji se danas koriste");
- multimedijalni.DodajPoglavlje("Uvod", "u savremenom poslovanju");
- multimedijalni.DodajPoglavlje("Vrste multimedijalnih sistema", "Danas se moze govoriti o nekoliko vrsta multimedijalnih sistema, a neke od najznacajnijih su ...");
- multimedijalni.DodajPoglavlje("Teorija multimedije", "Sadrzaj koji bi trebao stajati na pocetku treceg poglavlja zavrsnog rada o multimediji studenta IB130011");
- //nazivPoglavlja, ocjena
- multimedijalni.OcijeniPoglavlje("Uvod", 8);
- multimedijalni.OcijeniPoglavlje("Vrste multimedijalnih sistema", 8);
- multimedijalni.OcijeniPoglavlje("Teorija multimedije", 7);
- multimedijalni.Ispis();
- /*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*/
- //brojIndeksa, zavrsniRad
- // bool DodajZavrsniRad(ZavrsniRad rad)
- if (nastavnici[0]->DodajZavrsniRad(multimedijalni))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (nastavnici[0]->DodajZavrsniRad(podrsa_operaterima))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- if (!nastavnici[0]->DodajZavrsniRad(podrsa_operaterima))//dupliranje rada, onemoguciti dodavanje
- cout << "Zavrsni rad nije dodat!" << endl;
- if (!nastavnici[0]->DodajZavrsniRad(kriptografija)) //studentu vec dodijeljen rad, onemoguciti dodavanje
- cout << "Zavrsni rad nije dodat!" << endl;
- if (nastavnici[1]->DodajZavrsniRad(analiza_sigurnosti))
- cout << "Zavrsni rad uspjesno dodat!" << endl;
- /*funkcija ZakaziOdbranuRada ima zadatak da studentu sa proslijedjenim brojem indeksa zakaze odbranu zavrsnog rada sto podrazumijeva
- izracunavanje konacne ocjene i definisanje datuma odbrane. odbrana rada se moze zakazati samo studentu koji je rad prethodno prijavio.
- Za zakazivanje odbrane rada moraju biti zadovoljeni sljedeci uslovi:
- 1. zavrsni rad mora imati broj poglavlja veci od minimalnog
- 2. svako poglavlje mora imati broj karaktera veci od minimalnog
- 3. svako poglavlje mora biti prihvaceno/odobreno
- 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.
- u slucaju da student sa primljenim brojem indeksa nije prijavio zavrsni rad ili neki od postavljenih kriterija nije zadovoljen, funkcija vraca nullptr.
- */
- //paramteri: brojIndeksa, datumOdbrane
- ZavrsniRad * zr1 = nastavnici[0]->ZakaziOdbranuRada("IB120021", "25.09.2018");
- if (zr1 != nullptr)
- zr1->Ispis();
- zr1 = nastavnici[0]->ZakaziOdbranuRada("IB180081", "25.09.2018");//student sa brojem indeksa IB180081 jos uvijek nije prijavio rad
- if (zr1 == nullptr)
- cout << "Odbrana ne moze biti zakazana!" << endl;
- //ispisuje sve podatke o nastavniku i njegovim mentorstvima
- nastavnici[0]->Ispis();
- nastavnici[1]->Ispis();
- /*funkcija PronadjiNajStudenta ima zadatak da pronadje prvog studenta koji je zavrsni rad odbranio kod
- nastavnika/mentora koji ima najnizu prosjecnu ocjenu radova (sumaSvihOcjenaZavrsnihRadova/brojZavrsnihRadova), te
- tom prilikom ostvario (odnosi se na studenta) ocjenu vecu od proslijedjene (npr. 8.2)*/
- float prosjekStudenta = 0, prosjekMentora = 0;
- char * indeksStudenta;
- //parametri PronadjiNajStudenta: nastavnici, brojNastavnika, minimalnaKonacnaOcjena
- //tie(indeksStudenta, prosjekMentora, prosjekStudenta) = PronadjiNajStudenta(nastavnici, max, 8.2);
- //if (indeksStudenta != nullptr)
- // cout << crt << indeksStudenta << " " << prosjekMentora << " " << prosjekStudenta << crt;
- /*for (int i = 0; i < max; i++) {
- nastavnici[i]->Dealociraj();
- delete nastavnici[i];
- nastavnici[i] = nullptr;
- }*/
- system("pause>0");
- return 0;
- // Poglavlje *poglavlje = new Poglavlje; // ALOCIRALI SMO JEDNO POGLAVLJE I NJEGOVU ADRESU SMJESTILI U VARIJABLU
- // Poglavlje *poglavlja = new Poglavlje[20]; // ALOCIRALI SMO NIZ POGLAVLJA I ADRESU PRVOG ELEMENTA SMO SMJESTILI U VARIJABLU
- // delete poglavlje;
- // delete[] poglavlja;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement