Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- #pragma warning(disable:4996)
- const char *crt = "\n-------------------------------------------\n";
- enum eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI };
- const char* razred[] = { "Prvi", "Drugi", "Treci", "Cetvrti" };
- const float minimalan_prosjek = 4.5;
- char * AlocirajNizKaraktera(const char * sadrzaj) {
- if (sadrzaj == nullptr)
- return nullptr;
- int vel = strlen(sadrzaj) + 1;
- char * temp = new char[vel];
- strcpy_s(temp, vel, sadrzaj);
- return temp;
- }
- template<class T1, class T2>
- class Kolekcija {
- T1 * _elementi1;
- T2 * _elementi2;
- int _trenutno;
- public:
- Kolekcija() {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = 0;
- }
- Kolekcija(const Kolekcija & k) {
- _trenutno = k._trenutno;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (size_t i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = k._elementi1[i];
- _elementi2[i] = k._elementi2[i];
- }
- }
- ~Kolekcija() {
- delete[] _elementi1;
- delete[] _elementi2;
- }
- void AddElement(T1 el1, T2 el2) {
- T1 *temp1 = new T1[_trenutno + 1];
- T2 *temp2 = new T2[_trenutno + 1];
- for (size_t i = 0; i < _trenutno; i++)
- {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- temp1[_trenutno] = el1;
- temp2[_trenutno] = el2;
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _trenutno++;
- }
- Kolekcija & operator = (const Kolekcija & k) {
- delete[]_elementi1;
- delete[]_elementi2;
- _trenutno = k._trenutno;
- _elementi1 = new T1[_trenutno];
- _elementi2 = new T2[_trenutno];
- for (size_t i = 0; i < _trenutno; i++)
- {
- _elementi1[i] = k._elementi1[i];
- _elementi2[i] = k._elementi2[i];
- }
- return *this;
- }
- void SortOpadajuciByT2() {
- bool prolaz = true;
- while (prolaz) {
- prolaz = false;
- for (size_t i = 0; i < _trenutno-1; i++)
- {
- if (_elementi1[i] < _elementi1[i + 1]) {
- T1 temp = _elementi1[i];
- _elementi1[i] = _elementi1[i + 1];
- _elementi1[i + 1] = temp;
- prolaz = true;
- }
- else if (_elementi2[i] < _elementi2[i + 1]) {
- T2 temp = _elementi2[i];
- _elementi2[i] = _elementi2[i + 1];
- _elementi2[i + 1] = temp;
- prolaz = true;
- }
- }
- }
- }
- T1& getElement1(int lokacija) { return _elementi1[lokacija]; }
- T2& getElement2(int lokacija) { return _elementi2[lokacija]; }
- int getTrenutno() { return _trenutno; }
- friend ostream& operator<< (ostream &COUT, Kolekcija &obj) {
- for (int i = 0; i < obj._trenutno; i++)
- COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
- return COUT;
- }
- };
- class DatumVrijeme {
- int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
- public:
- DatumVrijeme(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);
- }
- DatumVrijeme(const DatumVrijeme & d) {
- _dan = new int(*d._dan);
- _mjesec = new int(*d._mjesec);
- _godina = new int(*d._godina);
- _sati = new int(*d._sati);
- _minuti = new int(*d._minuti);
- }
- DatumVrijeme & operator=(const DatumVrijeme & d) {
- delete _dan, _mjesec, _godina, _sati, _minuti;
- _dan = nullptr, _mjesec = nullptr, _godina = nullptr, _sati = nullptr, _minuti = nullptr;
- return *this;
- }
- ~DatumVrijeme() {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- delete _sati; _sati = nullptr;
- delete _minuti; _minuti = nullptr;
- }
- friend ostream& operator<< (ostream &COUT, DatumVrijeme &obj) {
- COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti << endl;
- return COUT;
- }
- };
- class Predmet {
- char * _naziv;
- int _ocjena;
- char* _napomena;
- public:
- Predmet(const char * naziv, int ocjena, const char* napomena = "") :_ocjena(ocjena) {
- _naziv = AlocirajNizKaraktera(naziv);
- _napomena = AlocirajNizKaraktera(napomena);
- }
- Predmet(const Predmet & p) {
- _naziv = AlocirajNizKaraktera(p._naziv);
- _ocjena = p._ocjena;
- _napomena = AlocirajNizKaraktera(p._napomena);
- }
- ~Predmet() {
- delete[] _naziv; _naziv = nullptr;
- if (_napomena != nullptr) delete[] _napomena;
- }
- void DodajNapomenu(const char * napomena) {
- if (strlen(_napomena) < 1) {
- _napomena = AlocirajNizKaraktera(napomena);
- }
- else {
- char tmp[250];
- strcpy_s(tmp, 250, _napomena);
- delete[]_napomena;
- _napomena = new char[strlen(tmp) + strlen(napomena) + 1];
- strcpy_s(_napomena, strlen(tmp) + strlen(napomena) + 1, tmp);
- strcat_s(_napomena, strlen(tmp) + strlen(napomena) + 1, napomena);
- }
- }
- Predmet & operator=(Predmet & p) {
- delete[]_naziv;
- _ocjena = p._ocjena;
- _naziv = AlocirajNizKaraktera(p._naziv);
- delete[]_napomena;
- _napomena = AlocirajNizKaraktera(p._napomena);
- return *this;
- }
- friend ostream& operator<< (ostream &COUT, Predmet &obj) {
- COUT << obj._naziv << " (" << obj._ocjena << ") " << obj._napomena << endl;
- return COUT;
- }
- int GetOcjenu() { return _ocjena; }
- char * GetNaziv() { return _naziv; }
- char* GetNapomena() { return _napomena; }
- };
- //Uspjeh je ustvari razred. Jedan uspjeh(razred) sadrzi vise predmeta koje student slusa.
- class Uspjeh {
- eRazred _razred;
- Kolekcija<Predmet*, DatumVrijeme> * _predmeti; //datumvrijeme se odnosi na vrijeme evidentiranja polozenog predmeta
- public:
- Uspjeh() {
- _predmeti = nullptr;
- }
- Uspjeh(eRazred razred) :_razred(razred), _predmeti(new Kolekcija<Predmet*, DatumVrijeme>()) {}
- ~Uspjeh() {
- delete _predmeti; _predmeti = nullptr;
- }
- eRazred GetRazred() { return _razred; }
- Kolekcija<Predmet*, DatumVrijeme> * GetPredmeti() { return _predmeti; }
- Uspjeh & operator=(Uspjeh & u) {
- _razred = u._razred;
- delete _predmeti;
- _predmeti = new Kolekcija<Predmet *, DatumVrijeme>(*u._predmeti);
- return *this;
- }
- friend ostream& operator<< (ostream &COUT, const Uspjeh &obj) {
- COUT << razred[obj._razred - 1] << *obj._predmeti << endl;
- return COUT;
- }
- };
- class Kandidat {
- char * _imePrezime;
- char* _brojTelefona;
- int _trenutno;
- Uspjeh * _uspjeh;
- public:
- Kandidat(const char * imePrezime, const char* brojTelefona) :_trenutno(0), _uspjeh(nullptr) {
- _imePrezime = AlocirajNizKaraktera(imePrezime);
- _brojTelefona = AlocirajNizKaraktera(brojTelefona);
- }
- ~Kandidat() {
- delete[] _imePrezime; _imePrezime = nullptr;
- delete[] _uspjeh;
- }
- /*
- uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
- tom prilikom onemoguciti:
- - dodavanje vise od 6 predmeta za jedan razred
- - dodavanje istoimenih predmeta na nivou jednog razreda,
- 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 DodajPredmetKandidatu(eRazred razred, Predmet & predmet, DatumVrijeme & d) {
- for (size_t i = 0; i < _trenutno; i++)
- {
- if (_uspjeh[i].GetRazred() == razred) {
- Kolekcija<Predmet *, DatumVrijeme>*temp = _uspjeh[i].GetPredmeti();
- if (temp->getTrenutno() > 6) {
- return false;
- }
- for (size_t i = 0; i < temp->getTrenutno(); i++)
- {
- if (strcmp(temp->getElement1(i)->GetNaziv(), predmet.GetNaziv()) == 0) {
- return false;
- }
- }
- temp->AddElement(&predmet, d);
- return true;
- }
- }
- Uspjeh t(razred);
- t.GetPredmeti()->AddElement(&predmet, d);
- Uspjeh *temp = new Uspjeh[_trenutno + 1];
- for (size_t i = 0; i < _trenutno; i++)
- {
- temp[i] = _uspjeh[i];
- }
- temp[_trenutno] = t;
- delete[]_uspjeh;
- _uspjeh = temp;
- _trenutno++;
- return true;
- }
- int operator ()(eRazred razred) {
- float suma = 0;
- float PROSJECNA = 0;
- float brojac = 0;
- int trenutno;
- for (size_t i = 0; i < _trenutno; i++)
- {
- if (_uspjeh[i].GetRazred() == razred) {
- trenutno = _uspjeh[i].GetPredmeti()->getTrenutno();
- for(size_t j = 0; j <trenutno; j++)
- {
- suma += _uspjeh[i].GetPredmeti()->getElement1(j)->GetOcjenu();
- brojac++;
- }
- PROSJECNA = suma / brojac;
- return PROSJECNA;
- }
- }
- }
- friend ostream& operator<< (ostream &COUT, Kandidat &obj) {
- COUT << obj._imePrezime << " " << obj._brojTelefona << endl;
- for (int i = 0; i < obj._trenutno; i++)
- COUT << obj._uspjeh[i] << endl;
- return COUT;
- }
- Uspjeh * GetUspjeh() { return _uspjeh; }
- };
- void main() {
- /****************************************************************************
- 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR CE BITI OZNACENO KAO "RE"
- 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URAÐENOG ZADATKA
- 4. PROGRAMSKI CODE SE TAKOÐER NALAZI U FAJLU CODE.TXT
- 5. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTICNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUCAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOCNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
- 6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNACENO.
- ****************************************************************************/
- DatumVrijeme temp,
- datum19062018_1015(19, 6, 2018, 10, 15),
- datum20062018_1115(20, 6, 2018, 11, 15),
- datum30062018_1215(30, 6, 2018, 12, 15),
- datum05072018_1231(5, 7, 2018, 12, 31),
- datum20062018_1115_Copy(datum20062018_1115);
- cout << datum20062018_1115;
- const int kolekcijaTestSize = 10;
- Kolekcija<int, int> kolekcija1;
- for (int i = 0; i < kolekcijaTestSize; i++)
- kolekcija1.AddElement(i + 1, i * i);
- cout << kolekcija1 << endl;
- Kolekcija<int, int> kolekcija2 = kolekcija1;
- cout << kolekcija2 << crt;
- Kolekcija<int, int> kolekcija3;
- kolekcija3 = kolekcija1;
- kolekcija3.SortOpadajuciByT2(); //od najvece prema najmanjoj vrijednosti
- cout << kolekcija3 << crt;
- //napomena se moze dodati i prilikom kreiranja objekta
- Predmet Matematika("Matematika", 5, "Ucesce na takmicenju"), Fizika("Fizika", 5), Hemija("Hemija", 2), Engleski("Engleski", 5);
- Fizika.DodajNapomenu("Pohvala za ostvareni uspjeh!"); // dodaje novu napomenu
- Fizika.DodajNapomenu("Pohvala za uspjeh na takmicenju!");
- //krajnji rezulat nakona dodavanja napomena: Pohvala za ostvareni uspjeh!; Pohvala za uspjeh na takmicenju!;
- cout << Fizika << endl;
- cout << Matematika << endl;
- Kandidat jasmin("Jasmin Azemovic", "033 281 172");
- Kandidat adel("Adel Handzic", "033 281 170");
- /*
- uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda.
- tom prilikom onemoguciti:
- - dodavanje vise od 6 predmeta za jedan razred
- - dodavanje istoimenih predmeta na nivou jednog razreda,
- 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 (jasmin.DodajPredmetKandidatu(DRUGI, Fizika, datum20062018_1115))
- cout << "Fizika za DRUGI uspjesno dodana!" << crt;
- else
- cout << "Fizika za DRUGI nije dodana!" << crt;
- if (jasmin.DodajPredmetKandidatu(DRUGI, Hemija, datum30062018_1215))
- cout << "Hemija za DRUGI uspjesno dodana!" << crt;
- else
- cout << "Hemija za DRUGI nije dodana" << crt;
- if (jasmin.DodajPredmetKandidatu(PRVI, Engleski, datum19062018_1015)) //ocjena 5
- cout << "Engleski za PRVI uspjesno dodan!" << crt;
- else
- cout << "Engleski za PRVI nije dodan" << crt;
- if (jasmin.DodajPredmetKandidatu(PRVI, Matematika, datum20062018_1115)) //ocjena 5
- cout << "Matematika za PRVI uspjesno dodana!" << crt;
- else
- cout << "Matematika za PRVI nije dodana!" << crt;
- //ne treba dodati Matematiku jer je vec dodana u prvom razredu
- if (jasmin.DodajPredmetKandidatu(PRVI, Matematika, datum05072018_1231))
- cout << "Matematika za PRVI uspjesno dodana!" << crt;
- else
- cout << "Matematika za PRVI nije dodana!" << crt;
- if (jasmin.DodajPredmetKandidatu(PRVI, Fizika, datum20062018_1115_Copy)) //ocjena 5
- cout << "Fizika za PRVI uspjesno dodana!" << crt;
- else
- cout << "Fizika za PRVI nije dodana" << crt;
- cout << "Prosjecna ocjena Jasmina za PRVU godinu: " << jasmin(PRVI) << endl;//vraca uspjeh kandidata ostvaren u prvom razredu
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement