Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- /*
- 1. BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA. U SUPROTNOM SE RAD NEĆE 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 ĆETE 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
- */
- //narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala smetnje u radu
- #pragma warning(disable:4996)
- const char *crt = "\n-------------------------------------------\n";
- enum eNacinStudiranja { REDOVAN, DL };
- const char * eNacinStudiranjaChar[] = { "REDOVAN", "DL" };
- enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
- const char * eRazredChar[] = { "PRVI", "DRUGI", "TRECI", "CETVRTI" };
- struct DatumVrijeme {
- int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
- void Unos(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
- _dan = new int(dan);
- _mjesec = new int(mjesec);
- _godina = new int(godina);
- _sati = new int(sati);
- _minuti = new int(minuti);
- }
- void Dealociraj() {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- delete _sati; _sati = nullptr;
- delete _minuti; _minuti = nullptr;
- }
- void Ispis() {
- cout << *_dan << "." << *_mjesec << "." << *_godina << " " << *_sati << ":" << *_minuti << endl;
- }
- //kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera
- /*char * GetDatumKaoNizKaraktera()
- {
- char * sara = nullptr;
- return sara;
- }*/
- };
- const DatumVrijeme rokZaPrijavu = { new int(5), new int(7), new int(2017), new int(12), new int(30) };
- bool veciDatum(DatumVrijeme d1, DatumVrijeme d2)
- {
- if (*d1._godina > *d2._godina)
- return true;
- else if (*d2._godina > *d1._godina)
- return false;
- if (*d1._mjesec > *d2._mjesec)
- return true;
- else if (*d2._mjesec > *d1._mjesec)
- return false;
- if (*d1._dan > *d2._dan)
- return true;
- else if (*d2._dan > *d1._dan)
- return false;
- if (*d1._sati > *d2._sati)
- return true;
- else if (*d2._sati > *d1._sati)
- return false;
- if (*d1._minuti > *d2._minuti)
- return true;
- else if (*d2._minuti > *d1._minuti)
- return false;
- return true;
- }
- bool istiDatum(DatumVrijeme d1, DatumVrijeme d2)
- {
- return (*d1._godina == *d2._godina && *d1._mjesec == *d2._mjesec && *d1._dan == *d2._dan && *d1._sati && *d2._sati && *d1._minuti == *d2._minuti);
- }
- struct Predmet {
- char * _naziv;
- int _ocjena;
- DatumVrijeme * _datumUnosa;
- void Unos(const char * naziv, int ocjena, DatumVrijeme datumUnosa)
- {
- int vel = strlen(naziv) + 1;
- _naziv = new char[vel];
- strcpy_s(_naziv, vel, naziv);
- _ocjena = ocjena;
- _datumUnosa = new DatumVrijeme;
- _datumUnosa->Unos(*datumUnosa._dan, *datumUnosa._mjesec, *datumUnosa._godina, *datumUnosa._sati, *datumUnosa._minuti);
- }
- void Dealociraj() {
- delete[] _naziv; _naziv = nullptr;
- _datumUnosa->Dealociraj(); delete _datumUnosa;
- }
- void Ispis() {
- //kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera
- cout << "Naziv predmeta: " << _naziv << " (" << "Ocjena: " << _ocjena << ") ";//<< "Datum unosa: " << _datumUnosa->GetDatumKaoNizKaraktera() << endl;
- }
- };
- struct Uspjeh {
- eRazred _razred;
- Predmet * _predmeti;
- int _brojPredmeta;
- bool dodavanjePredmeta(Predmet predmet)
- {
- Predmet * temp = new Predmet[_brojPredmeta + 1];
- for (int i = 0; i < _brojPredmeta; i++)
- {
- temp[i].Unos(_predmeti[i]._naziv, _predmeti[i]._ocjena, *_predmeti[i]._datumUnosa);
- _predmeti[i].Dealociraj();
- }
- delete[] _predmeti;
- temp[_brojPredmeta].Unos(predmet._naziv, predmet._ocjena, *predmet._datumUnosa);
- _predmeti = temp;
- _brojPredmeta++;
- return true;
- }
- void Unos(eRazred razred)
- {
- _razred = razred;
- _predmeti = nullptr;
- _brojPredmeta = 0;
- }
- void Dealociraj() {
- for (size_t i = 0; i < _brojPredmeta; i++)
- _predmeti[i].Dealociraj();
- delete[] _predmeti; _predmeti = nullptr;
- }
- void Ispis() {
- cout << crt << "Razred -> " << eRazredChar[_razred] << crt;
- cout << "Predmeti: " << endl;
- for (size_t i = 0; i < _brojPredmeta; i++)
- _predmeti[i].Ispis();
- }
- };
- struct Kandidat {
- eNacinStudiranja _nacinStudiranja;
- char * _imePrezime;
- shared_ptr<Uspjeh> _uspjeh[4];
- void Unos(eNacinStudiranja nacinStudiranja, const char * imePrezime) {
- int vel = strlen(imePrezime) + 1;
- _imePrezime = new char[vel];
- strcpy_s(_imePrezime, vel, imePrezime);
- _nacinStudiranja = nacinStudiranja;
- for (size_t i = 0; i < 4; i++)
- _uspjeh[i] = nullptr;
- }
- void Dealociraj() {
- delete[] _imePrezime; _imePrezime = nullptr;
- for (size_t i = 0; i < 4; i++)
- {
- if (_uspjeh[i] != nullptr)
- _uspjeh[i]->Dealociraj();
- }
- }
- void Ispis() {
- cout << crt << "Ime i prezime: " << _imePrezime << " " << "Nacin studiranja: " << eNacinStudiranjaChar[_nacinStudiranja] << endl;
- cout << "Uspjeh: " << endl;
- for (size_t i = 0; i < 4; i++)
- {
- if (_uspjeh[i] != nullptr)
- _uspjeh[i]->Ispis();
- }
- }
- /*
- uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
- prilikom dodavanja onemoguciti:
- - dodavanje predmeta za razrede koji nisu definisani enumeracijom,
- - dodavanje istoimenih predmeta na nivou jednog razreda,
- - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
- razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.).
- Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
- */
- bool DodajPredmet(eRazred razred, Predmet predmet)
- {
- //provjere
- if (razred != PRVI && razred != DRUGI && razred != TRECI && razred != CETVRTI)
- {
- cout << "Razred nije definisan enumeracijom... " << endl;
- return false;
- }
- for (int i = 0; i < 4; i++)
- {
- if (_uspjeh[i] != nullptr)
- {
- for (int j = 0; j < _uspjeh[i]->_brojPredmeta; j++)
- {
- if (strcmp(_uspjeh[i]->_predmeti[j]._naziv, predmet._naziv) == 0 && _uspjeh[i]->_razred == razred)
- {
- cout << "Ne moze se dodati... " << crt;;
- return false;
- }
- }
- }
- }
- if (veciDatum(*predmet._datumUnosa, rokZaPrijavu))
- {
- cout << "Ne moze se dodati... " << crt;;
- return false;
- }
- int index = razred - 1;
- if (_uspjeh[index] == nullptr)
- {
- _uspjeh[index] = make_shared<Uspjeh>();
- _uspjeh[index]->Unos(razred);
- }
- _uspjeh[index]->dodavanjePredmeta(predmet);
- cout << "Predmet dodan... ";
- return true;
- }
- };
- /*
- napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecom ocjenom na predmetu koji je proslijedjen kao parametar.
- ukoliko je vise kandidata ostvarilo istu ocjenu, funkcija treba da vrati onog kandidata koji je prvi evidentirao tu ocjenu
- (ako je isto vrijeme evidentiranja, onda funkcija vraca kandidata koji je prvi u nizu). u slucaju da niti jedan kandidat nije evidentirao trazeni predmet
- funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale parametre dodajte po potrebi.
- */
- Kandidat * rekNajboljaOcjena(Kandidat * kandidat, int brojKandidata, const char * predmet, int & i, int & maxOcjena, int & indeksKandidata, DatumVrijeme & datum)
- {
- //baza
- Kandidat * rezultat;
- if (i == brojKandidata)
- {
- if (maxOcjena == 0)
- return nullptr;
- else
- {
- rezultat= &kandidat[indeksKandidata];
- return rezultat;
- }
- }
- else
- {
- for (int j = 0; j < 4; j++)
- {
- if(kandidat[i]._uspjeh[j]!=nullptr)
- {
- for (int k = 0; k < kandidat[i]._uspjeh[j]->_brojPredmeta; k++)
- {
- if (strcmp(predmet, kandidat[i]._uspjeh[j]->_predmeti[k]._naziv) == 0)
- {
- if (kandidat[i]._uspjeh[j]->_predmeti[k]._ocjena > maxOcjena)
- {
- maxOcjena = kandidat[i]._uspjeh[j]->_predmeti[k]._ocjena;
- indeksKandidata = i;
- *datum._dan = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_dan;
- *datum._mjesec = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_mjesec;
- *datum._godina = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_godina;
- *datum._sati = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_sati;
- *datum._minuti = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_minuti;
- }
- if (kandidat[i]._uspjeh[j]->_predmeti[k]._ocjena == maxOcjena)
- {
- if (!(veciDatum(datum, *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa)))//ovdje f-ja veciDatum radi kontra od moje funkcije
- {
- indeksKandidata = i;
- *datum._dan = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_dan;
- *datum._mjesec = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_mjesec;
- *datum._godina = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_godina;
- *datum._sati = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_sati;
- *datum._minuti = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_minuti;
- }
- if (istiDatum(datum, *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa))
- {
- if (i < indeksKandidata)//indeks hoce da bude najmanji
- {
- indeksKandidata = i;
- *datum._dan = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_dan;
- *datum._mjesec = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_mjesec;
- *datum._godina = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_godina;
- *datum._sati = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_sati;
- *datum._minuti = *kandidat[i]._uspjeh[j]->_predmeti[k]._datumUnosa->_minuti;
- }
- }
- }
- }
- }
- }
- }
- }
- i++;
- return rekNajboljaOcjena(kandidat, brojKandidata, predmet, i, maxOcjena, indeksKandidata, datum);
- }
- void main()
- {
- DatumVrijeme datum19062017_1015, datum20062017_1115, datum30062017_1215, datum05072017_1231;
- datum19062017_1015.Unos(19, 6, 2017, 10, 15);
- datum20062017_1115.Unos(20, 6, 2017, 11, 15);
- datum30062017_1215.Unos(30, 6, 2017, 12, 15);
- datum05072017_1231.Unos(5, 7, 2017, 12, 31);
- //cout << datum19062017_1015.GetDatumKaoNizKaraktera() << endl;//9.6.2017 10:15
- Predmet Matematika, Fizika, Hemija, Engleski;
- //2 - ocjena na predmetu; datum - datum evidentiranja uspjeha na predmetu jer postoji krajnji rok za evidentiranje
- Matematika.Unos("Matematika", 2, datum19062017_1015);
- Fizika.Unos("Fizika", 5, datum20062017_1115);
- Hemija.Unos("Hemija", 2, datum20062017_1115);
- Engleski.Unos("Engleski", 5, datum05072017_1231);
- int brojKandidata = 2;
- Kandidat * prijave2017 = new Kandidat[brojKandidata];
- prijave2017[0].Unos(DL, "Jasmin Azemovic");
- prijave2017[1].Unos(REDOVAN, "Indira Hamulic");
- /*
- uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
- prilikom dodavanja onemoguciti:
- - dodavanje predmeta za razrede koji nisu definisani enumeracijom,
- - dodavanje istoimenih predmeta na nivou jednog razreda,
- - dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu).
- razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred, pa onda za I razred i sl.). Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
- */
- if (prijave2017[0].DodajPredmet(DRUGI, Engleski))//ne bi trebao dodati jer je prosao postavljeni rok za dodavanje predmeta
- cout << "Predmet uspjesno dodan!" << crt;
- if (prijave2017[0].DodajPredmet(DRUGI, Matematika))
- cout << "Predmet uspjesno dodan!" << crt;
- if (prijave2017[0].DodajPredmet(PRVI, Fizika))
- cout << "Predmet uspjesno dodan!" << crt;
- if (prijave2017[0].DodajPredmet(PRVI, Hemija))
- cout << "Predmet uspjesno dodan!" << crt;
- Matematika._ocjena = 5;
- Hemija._ocjena = 3;
- if (prijave2017[1].DodajPredmet(PRVI, Matematika))
- cout << "Predmet uspjesno dodan!" << crt;
- if (prijave2017[1].DodajPredmet(PRVI, Matematika))//ne bi trebalo ponovo dodati Matematiku!
- cout << "Predmet uspjesno dodan!" << crt;
- if (prijave2017[1].DodajPredmet(TRECI, Hemija))
- cout << "Predmet uspjesno dodan!" << crt;
- if (prijave2017[1].DodajPredmet(DRUGI, Engleski))
- cout << "Predmet uspjesno dodan!" << crt;
- /*
- koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci prosjek (na nivou razreda, a ne ukupni prosjek).
- ukoliko vise kandidata ima isti prosjek funkcija vraca uspjeh (najboljeg razreda) prvog pronadjenog kandidata
- */
- auto najboljiUspjeh = [&]()
- {
- shared_ptr<Uspjeh> najboljiU = nullptr;
- float prosjek = 0;
- float suma = 0;
- float max = 0;
- int indeksKandidata = 0, indeksUspjeha = 0;
- for (int i = 0; i < brojKandidata; i++)
- {
- for (int j = 0; j < 4; j++)
- {
- if (prijave2017[i]._uspjeh[j] != nullptr)
- {
- for (int k = 0; k < prijave2017[i]._uspjeh[j]->_brojPredmeta; k++)
- {
- suma += prijave2017[i]._uspjeh[j]->_predmeti[k]._ocjena;
- }
- prosjek = suma / prijave2017[i]._uspjeh[j]->_brojPredmeta;
- if (max < prosjek)
- {
- max = prosjek;
- indeksKandidata = i;
- indeksUspjeha = j;
- }
- }
- }
- }
- najboljiU = prijave2017[indeksKandidata]._uspjeh[indeksUspjeha];
- return najboljiU;
- };
- shared_ptr<Uspjeh> najbolji = najboljiUspjeh();
- if (najbolji != nullptr)
- najbolji->Ispis();
- /*
- napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecom ocjenom na predmetu koji je proslijedjen kao parametar.
- ukoliko je vise kandidata ostvarilo istu ocjenu, funkcija treba da vrati onog kandidata koji je prvi evidentirao tu ocjenu
- (ako je isto vrijeme evidentiranja, onda funkcija vraca kandidata koji je prvi u nizu). u slucaju da niti jedan kandidat nije evidentirao trazeni predmet
- funkcija vraca nullptr. u nastavku je prikazan primjer poziva rekurzivne funkcije, a ostale parametre dodajte po potrebi.
- */
- int i = 0, maxOcjena = 0, indeksKandidata = 0;
- DatumVrijeme datum; datum.Unos(23, 03, 1995, 00, 45);
- Kandidat * kandidatSaNajboljomOcjenom = rekNajboljaOcjena(prijave2017, brojKandidata, "Matematika", i, maxOcjena, indeksKandidata,datum);
- cout << "rek start" << endl;
- kandidatSaNajboljomOcjenom->Ispis();
- cout << "rek kraj" << endl;
- for (size_t i = 0; i < brojKandidata; i++)
- {
- prijave2017[i].Ispis();
- prijave2017[i].Dealociraj();
- }
- delete[] prijave2017;
- prijave2017 = nullptr;
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement