Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <memory>
- using namespace std;
- #pragma warning(disable:4996)
- char *crt = "\n-------------------------------------------\n";
- enum eNacinStudiranja { REDOVAN, DL };
- enum eRazred { PRVI = 1, 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;
- }
- bool Prije(DatumVrijeme d)
- {
- if (*_godina < *d._godina)
- return true;
- if (*_godina == *d._godina && *_mjesec < *d._mjesec)
- return true;
- if (*_godina == *d._godina && *_mjesec == *d._mjesec && *_dan < *d._dan)
- return true;
- if (*_godina == *d._godina && *_mjesec == *d._mjesec && *_dan == *d._dan && *_sati < *d._sati)
- return true;
- if (*_godina == *d._godina && *_mjesec == *d._mjesec && *_dan == *d._dan && *_sati == *d._sati && *_minuti < *d._minuti)
- return true;
- return false;
- }
- bool Poslije(DatumVrijeme d)
- {
- return !Prije(d);
- }
- char * GetDatumKaoNizKaraktera()
- {
- char dan[3], mjesec[3], godina[5], sati[3], minuti[3];
- _itoa_s(*_dan, dan, 10);
- _itoa_s(*_mjesec, mjesec, 10);
- _itoa_s(*_godina, godina, 10);
- _itoa_s(*_sati, sati, 10);
- _itoa_s(*_minuti, minuti, 10);
- int vel = strlen(dan) + strlen(mjesec) + strlen(godina) + strlen(sati) + strlen(minuti) + 5;
- char * datum = new char[vel];
- strcpy_s(datum, strlen(dan) + 1, dan);
- strcat_s(datum, vel, ".");
- strcat_s(datum, vel, mjesec);
- strcat_s(datum, vel, ".");
- strcat_s(datum, vel, godina);
- strcat_s(datum, vel, " ");
- strcat_s(datum, vel, sati);
- strcat_s(datum, vel, ":");
- strcat_s(datum, vel, minuti);
- return datum;
- }
- };
- const DatumVrijeme rokZaPrijavu = { new int(5), new int(7), new int(2017), new int(12), new int(30) };
- struct Predmet {
- char * _naziv;
- int _ocjena;
- DatumVrijeme * _datumUnosa;
- void Unos(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() {
- cout << _naziv << " (" << _ocjena << ") " << _datumUnosa->GetDatumKaoNizKaraktera() << endl;
- }
- };
- struct Uspjeh {
- eRazred _razred;
- Predmet * _predmeti;
- int _brojPredmeta;
- 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 -> " << _razred << crt;
- for (size_t i = 0; i < _brojPredmeta; i++)
- _predmeti[i].Ispis();
- }
- float VratiProsjek()
- {
- float suma(0);
- for (size_t i = 0; i < _brojPredmeta; i++) suma += _predmeti[i]._ocjena;
- return suma / _brojPredmeta;
- }
- };
- struct Kandidat {
- eNacinStudiranja _nacinStudiranja;
- char * _imePrezime;
- shared_ptr<Uspjeh> _uspjeh[4];
- void Unos(eNacinStudiranja nacinStudiranja, 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; _uspjeh[i] != nullptr; i++)
- _uspjeh[i]->Dealociraj();
- }
- void Ispis() {
- cout << crt << _imePrezime << " " << _nacinStudiranja;
- for (size_t i = 0; _uspjeh[i] != nullptr; i++)
- _uspjeh[i]->Ispis();
- }
- bool DodajPredmet(eRazred r, Predmet p)
- {
- if (r != PRVI && r != DRUGI && r != TRECI && r != CETVRTI) return false;
- if (p._datumUnosa->Poslije(rokZaPrijavu)) return false;
- int indeks(-1);
- for (size_t i = 0; i < 4 && indeks == -1; i++)
- {
- if (_uspjeh[i] == nullptr) indeks = i;
- else if (_uspjeh[i]->_razred == r)
- {
- for (size_t j = 0; j < _uspjeh[i]->_brojPredmeta; j++)
- if (strcmp(_uspjeh[i]->_predmeti[j]._naziv, p._naziv) == 0)
- return false;
- indeks = i;
- }
- }
- if (_uspjeh[indeks] == nullptr)
- {
- _uspjeh[indeks] = make_shared<Uspjeh>();
- _uspjeh[indeks]->Unos(r);
- }
- Predmet * tempPredmeti = new Predmet[_uspjeh[indeks]->_brojPredmeta + 1];
- for (size_t i = 0; i < _uspjeh[indeks]->_brojPredmeta; i++)
- {
- tempPredmeti[i].Unos(_uspjeh[indeks]->_predmeti[i]._naziv, _uspjeh[indeks]->_predmeti[i]._ocjena, *_uspjeh[indeks]->_predmeti[i]._datumUnosa);
- _uspjeh[indeks]->_predmeti[i].Dealociraj();
- }
- delete[] _uspjeh[indeks]->_predmeti;
- _uspjeh[indeks]->_predmeti = tempPredmeti;
- _uspjeh[indeks]->_predmeti[_uspjeh[indeks]->_brojPredmeta++].Unos(p._naziv, p._ocjena, *p._datumUnosa);
- return true;
- }
- };
- Kandidat * rekNajboljaOcjena(Kandidat * prijave, int brojKandidata, char * nazivPredmeta, int indeksK = -1, int najveca = -1, int brojacK = 0, int brojacU = 0, int brojacP = 0)
- {
- if (brojacK == brojKandidata)
- {
- if (indeksK == -1) return nullptr;
- return &prijave[indeksK];
- }
- if (prijave[brojacK]._uspjeh[brojacU] == nullptr)
- return rekNajboljaOcjena(prijave, brojKandidata, nazivPredmeta, indeksK, najveca, brojacK + 1, brojacU = 0, brojacP = 0);
- if(prijave[brojacK]._uspjeh[brojacU]->_brojPredmeta == brojacP)
- return rekNajboljaOcjena(prijave, brojKandidata, nazivPredmeta, indeksK, najveca, brojacK , brojacU + 1, brojacP = 0);
- if(strcmp(prijave[brojacK]._uspjeh[brojacU]->_predmeti[brojacP]._naziv, nazivPredmeta) == 0 && prijave[brojacK]._uspjeh[brojacU]->_predmeti[brojacP]._ocjena > najveca)
- return rekNajboljaOcjena(prijave, brojKandidata, nazivPredmeta, brojacK, prijave[brojacK]._uspjeh[brojacU]->_predmeti[brojacP]._ocjena, brojacK, brojacU + 1, brojacP = 0);
- return rekNajboljaOcjena(prijave, brojKandidata, nazivPredmeta, indeksK, najveca, brojacK, brojacU, brojacP + 1);
- }
- 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;
- Predmet Matematika, Fizika, Hemija, Engleski;
- 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");
- if (prijave2017[0].DodajPredmet(DRUGI, Engleski))
- 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))
- 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;
- auto najboljiUspjeh = [prijave2017, brojKandidata]() -> shared_ptr<Uspjeh> {
- int najbolji = 0, trenutno = 0, indeksK = 0, indeksU = 0;
- for (size_t i = 0; i < brojKandidata; i++)
- {
- for (size_t j = 0; prijave2017[i]._uspjeh[j] != nullptr; j++)
- {
- trenutno = prijave2017[i]._uspjeh[j]->VratiProsjek();
- if (trenutno > najbolji)
- {
- najbolji = trenutno;
- indeksK = i; indeksU = j;
- }
- }
- }
- return prijave2017[indeksK]._uspjeh[indeksU];
- };
- shared_ptr<Uspjeh> najbolji = najboljiUspjeh();
- najbolji->Ispis();
- Kandidat * kandidatSaNajboljomOcjenom = rekNajboljaOcjena(prijave2017, brojKandidata, "Matematika");
- 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