You are on page 1of 7

#include <iostream>

#include <memory>
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
*/
//narednu liniju code-a ignorisite, osim u slucaju da vam bude predstavljala
smetnje u radu
#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;
}
char* GetDatumKaoNizKaraktera() { return "sami skontajte :P"; }
};

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) {

_mjesec == *d2. if (*d1._sati < *d2. i++) _predmeti[i]._sati) return true.Dealociraj(). _naziv = new char[vel]. void Unos(eRazred razred) { _razred = razred. if (*d1. } void Ispis() { //kreirati funkciju GetDatumKaoNizKaraktera() koja vraca vrijednosti atributa strukture datum kao niz karaktera cout << _naziv << " (" << _ocjena << ") " << _datumUnosa- >GetDatumKaoNizKaraktera() << endl._minuti)._mjesec) return true._godina && *d1. _naziv = nullptr._dan) return true._dan == *d2. *datumUnosa. } }._mjesec && *d1._mjesec._sati._dan < *d2. vel._sati && *d1. int vel = strlen(naziv) + 1. delete _datumUnosa. for (size_t i = 0._dan && *d1. _predmeti = nullptr._mjesec && *d1._godina) return true. _ocjena = ocjena. *datumUnosa._mjesec == *d2. } struct Uspjeh { eRazred _razred._sati == *d2. *datumUnosa._godina == *d2._godina && *d1._godina == *d2. if (*d1. int _brojPredmeta._dan && *d1. } void Ispis() { cout << crt << "Razred -> " << _razred << crt._mjesec < *d2._godina. naziv). *datumUnosa. return false. _brojPredmeta = 0. i++) . _datumUnosa = new DatumVrijeme()._mjesec && *d1. if (*d1. i < _brojPredmeta. } void Dealociraj() { for (size_t i = 0._godina && *d1._minuti < *d2._godina && *d1. _predmeti = nullptr. _datumUnosa->Unos(*datumUnosa. Predmet * _predmeti. _datumUnosa->Dealociraj()._godina == *d2. strcpy_s(_naziv. delete[] _predmeti._godina == *d2. DatumVrijeme d2) { if (*d1. bool ProvjeraDatuma(DatumVrijeme d1._mjesec == *d2. } void Dealociraj() { delete[] _naziv._dan == *d2. i < _brojPredmeta._godina < *d2._minuti) return true._dan.

for (size_t i = 0. i++) _uspjeh[i]->Ispis(). temp[_brojPredmeta] = p. i++) _uspjeh[i] = nullptr._naziv._datumUnosa. char * _imePrezime. char * imePrezime) { int vel = strlen(imePrezime) + 1. return true. . strcpy_s(_imePrezime. i < 4.). for (size_t i = 0. _predmeti[i]. _predmeti = temp. struct Kandidat { eNacinStudiranja _nacinStudiranja. void Unos(eNacinStudiranja nacinStudiranja. _imePrezime = new char[vel]. for (size_t i = 0. i++) _uspjeh[i]->Dealociraj(). . i < 4. i++) temp[i] = _predmeti[i]. i < _brojPredmeta. for (size_t i = 0. delete[] _predmeti. razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr.Ispis(). } ._naziv) == 0) return false. } Predmet *temp = new Predmet[_brojPredmeta + 1]. i < 4. } void Dealociraj() { delete[] _imePrezime. Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja */ bool AddPredmet(Predmet p) { if (!ProvjeraDatuma(*p. pa onda za I razred i sl. vel. i++) { if (strcmp(p. rokZaPrijavu)) return false.dodavanje istoimenih predmeta na nivou jednog razreda. shared_ptr<Uspjeh> _uspjeh[4].dodavanje predmeta za razrede koji nisu definisani enumeracijom.dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu). _imePrezime = nullptr. } /*prilikom dodavanja onemoguciti: . _nacinStudiranja = nacinStudiranja. } void Ispis() { cout << crt << _imePrezime << " " << _nacinStudiranja. i < _brojPredmeta. for (size_t i = 0. _predmeti[i]. _brojPredmeta++. imePrezime). prvo se moze dodati uspjeh za II razred. } }.

} for (size_t i = 0._uspjeh[j]->_brojPredmeta. float prosjek = 0. } } } . j < 4. return _uspjeh[i]->AddPredmet(p). for (size_t i = 0. i < 4. } prosjek = (float)suma / niz[i]. Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja */ bool DodajPredmet(eRazred r. razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za II razred.). i++) { for (size_t j = 0. i++) { if(_uspjeh[i] != nullptr) if (_uspjeh[i]->_razred == r) return _uspjeh[i]->AddPredmet(p). Predmet p) { for (size_t i = 0._ocjena. j++) { if (niz[i]. ukoliko vise kandidata ima isti prosjek funkcija vraca uspjeh (najboljeg razreda) prvog pronadjenog kandidata */ shared_ptr<Uspjeh> Getnajbolji(Kandidat *niz. . shared_ptr<Uspjeh> u. if (prosjek > min) u = niz[i]. i < 4._uspjeh[j]->_brojPredmeta. i++) { if (_uspjeh[i] == nullptr) { _uspjeh[i] = make_shared<Uspjeh>(). k+ +) { suma += niz[i]._uspjeh[j]. ._uspjeh[j] != nullptr) { for (size_t k = 0. /* koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci prosjek (na nivou razreda.dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu). int min = INT_MIN. /*prilikom dodavanja onemoguciti: . i < trenutnoKandidata. int trenutnoKandidata) { int suma = 0. } } } }. k < niz[i].dodavanje istoimenih predmeta na nivou jednog razreda. pa onda za I razred i sl. a ne ukupni prosjek). _uspjeh[i]->Unos(r).dodavanje predmeta za razrede koji nisu definisani enumeracijom._uspjeh[j]->_predmeti[k].

Hemija)) cout << "Predmet uspjesno dodan!" << crt. datum20062017_1115.dodavanje istoimenih predmeta na nivou jednog razreda. 5. 2017.DodajPredmet(PRVI. datum05072017_1231). prijave2017[1]. Matematika)) cout << "Predmet uspjesno dodan!" << crt.DodajPredmet(DRUGI. 15). 2017. } void main() { DatumVrijeme datum19062017_1015. pa onda za I razred i sl.DodajPredmet(PRVI. 10. 11.dodavanje predmeta za razrede koji nisu definisani enumeracijom. 6.ocjena na predmetu. Hemija. datum05072017_1231.Unos("Engleski".Unos(20. return u.). datum20062017_1115).Unos(DL. Kandidat * prijave2017 = new Kandidat[brojKandidata]. Matematika. datum20062017_1115). datum19062017_1015. "Jasmin Azemovic"). 7. //2 .Unos(30. datum30062017_1215. 2017.Unos("Matematika". if (prijave2017[0].DodajPredmet(PRVI.GetDatumKaoNizKaraktera() << endl. prvo se moze dodati uspjeh za II razred. if (prijave2017[1].DodajPredmet(TRECI. Engleski. . datum30062017_1215. Hemija)) .Unos(REDOVAN.Unos("Fizika". Engleski))//ne bi trebao dodati jer je prosao postavljeni rok za dodavanje predmeta cout << "Predmet uspjesno dodan!" << crt. Fizika._ocjena = 3. prilikom dodavanja onemoguciti: . Engleski. if (prijave2017[0]. datum05072017_1231. 31). prijave2017[0]._ocjena = 5. 2. "Indira Hamulic").Unos("Hemija". if (prijave2017[0]. if (prijave2017[1].Unos(19.DodajPredmet(PRVI. /* uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.datum evidentiranja uspjeha na predmetu jer postoji krajnji rok za evidentiranje Matematika. razredi (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. datum19062017_1015). Fizika)) cout << "Predmet uspjesno dodan!" << crt. Fizika. datum20062017_1115. 6. Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja */ if (prijave2017[0]. 15). . 12. datum . 5.6. 2017.DodajPredmet(DRUGI.2017 10:15 Predmet Matematika. 6.//9. 2. Hemija. 12. cout << datum19062017_1015. Matematika))//ne bi trebalo ponovo dodati Matematiku! cout << "Predmet uspjesno dodan!" << crt. 15).Unos(5.dodavanje predmeta nakon dozvoljenog roka za prijavu (rokZaPrijavu). int brojKandidata = 2. Matematika)) cout << "Predmet uspjesno dodan!" << crt. if (prijave2017[1]. Hemija.

shared_ptr<Uspjeh> u. onda funkcija vraca kandidata koji je prvi u nizu). k++) suma += prijave2017[i]. i < brojKandidata. int kandidat = 0. /* koristeci Lambda izraz kreirati funkciju koja ce vratiti uspjeh kandidata koji je ostvario najveci prosjek (na nivou razreda. j < 4. a ostale parametre dodajte po potrebi.Ispis(). float prosjek = 0. ukoliko je vise kandidata ostvarilo istu ocjenu._uspjeh[j]- >_predmeti[k]. i < brojKandidata. brojKandidata. u nastavku je prikazan primjer poziva rekurzivne funkcije. brojKandidata]() { int suma = 0. ukoliko vise kandidata ima isti prosjek funkcija vraca uspjeh (najboljeg razreda) prvog pronadjenog kandidata */ auto najboljiUspjeh = [prijave2017. Engleski)) cout << "Predmet uspjesno dodan!" << crt. if (prijave2017[1]. k < prijave2017[i]. "Matematika"). // prijave2017[i]. } } } } cout << "Kandidat: " << prijave2017[kandidat]. //*/ //Kandidat * kandidatSaNajboljomOcjenom = rekNajboljaOcjena(prijave2017. i++) { for (size_t j = 0._imePrezime << endl._uspjeh[j]- >_brojPredmeta. int min = INT_MIN. cout << "Predmet uspjesno dodan!" << crt. for (size_t i = 0. }. u slucaju da niti jedan kandidat nije evidentirao trazeni predmet funkcija vraca nullptr. prosjek = (float)suma / prijave2017[i]. funkcija treba da vrati onog kandidata koji je prvi evidentirao tu ocjenu (ako je isto vrijeme evidentiranja. shared_ptr<Uspjeh> najbolji = najboljiUspjeh(). a ne ukupni prosjek). u = prijave2017[i]. //} . j++) { if (prijave2017[i]._ocjena.Dealociraj(). return u.DodajPredmet(DRUGI._uspjeh[j] != nullptr) { for (size_t k = 0. i++) //{ // prijave2017[i]._uspjeh[j]- >_brojPredmeta. //for (size_t i = 0. ///* //napisati rekurzivnu funkciju koja ce vratiti pokazivac na kandidata sa najvecom ocjenom na predmetu koji je proslijedjen kao parametar._uspjeh[j]. if (prosjek > min) { kandidat = i. najbolji->Ispis().

//delete[] prijave2017. } . //prijave2017 = nullptr. system("pause>0").