Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include <tuple>
- 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)
- enum VrstaAktivnosti { Tehnike, Kata, Borba };
- const char * vrtaAktivnostiChar[] = { "Tehnike", "Kata", "Borba" };
- enum Pojas { Zuti, Narandzasti, Zeleni, Plavi, Smedji, Crni };
- const char * pojasChar[] = { "Zuti", "Narandzasti", "Zeleni", "Plavi", "Smedji", "Crni" };
- struct Datum {
- int * _dan, *_mjesec, *_godina;
- void Unos(int d, int m, int g) {
- _dan = new int(d);
- _mjesec = new int(m);
- _godina = new int(g);
- }
- void Ispis()
- {
- if (_dan != nullptr && _mjesec != nullptr && _godina != nullptr)
- {
- cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl;
- }
- }
- void Dealociraj() { delete _dan; delete _mjesec; delete _godina; }
- };
- bool istiDatum(Datum d1, Datum d2)
- {
- if (*d1._godina == *d2._godina && *d1._mjesec == *d2._mjesec && *d1._dan == *d2._dan)
- return true;
- return false;
- }
- bool veciZa15Dana(Datum d1, Datum d2)
- {
- int daniD1 = *d1._dan + *d1._mjesec * 30 + *d1._godina * 30 * 12;
- int daniD2 = *d2._dan + *d2._mjesec * 30 + *d2._godina * 30 * 12;
- if (daniD2 - daniD1 >= 15)
- return true;
- return false;
- }
- struct Aktivnost {
- unique_ptr<VrstaAktivnosti> _vrsta;
- Datum _datumIzvrsenja;
- char * _nazivOpis;
- int _ocjena; // 1 - 10
- void Unos(VrstaAktivnosti vrsta, Datum * datum, int ocjena, const char * nazivOpis)
- {
- _vrsta = make_unique <VrstaAktivnosti>(vrsta);
- _datumIzvrsenja.Unos(*datum->_dan, *datum->_mjesec, *datum->_godina);
- _ocjena = ocjena;
- int size = strlen(nazivOpis) + 1;
- _nazivOpis = new char[size];
- strcpy_s(_nazivOpis, size, nazivOpis);
- }
- void Ispis()
- {
- cout << *_vrsta << " " << _ocjena << " " << _nazivOpis;
- _datumIzvrsenja.Ispis();
- cout << endl;
- }
- void Dealociraj()
- {
- _datumIzvrsenja.Dealociraj();
- delete[] _nazivOpis; _nazivOpis = nullptr;
- }
- };
- struct KaratePojas {
- Datum * _datumPolaganja;//datum koji ce se evidentirati kao datum polaganja pojasa tj. kada su ispunjene sve aktivnosti/obaveze
- Pojas _pojas;
- Aktivnost * _listaIzvrsenihAktivnosti;
- int _trenutnoIzvrsenihAktivnosti;
- void kopiraj(KaratePojas pojas)
- {
- if (pojas._datumPolaganja == nullptr) //ova funkcija ce postaviti _datum Polaganja, ako nije prije ova funkcije dje bila pozvana
- {
- DaLiJePolozen();
- }
- if (pojas._datumPolaganja != nullptr)
- {
- _datumPolaganja = new Datum;
- _datumPolaganja->Unos(*pojas._datumPolaganja->_dan, *pojas._datumPolaganja->_mjesec, *pojas._datumPolaganja->_godina);
- }
- _pojas = pojas._pojas;
- _trenutnoIzvrsenihAktivnosti = pojas._trenutnoIzvrsenihAktivnosti;
- _listaIzvrsenihAktivnosti = new Aktivnost[_trenutnoIzvrsenihAktivnosti];
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- {
- _listaIzvrsenihAktivnosti[i].Unos(*pojas._listaIzvrsenihAktivnosti[i]._vrsta, &pojas._listaIzvrsenihAktivnosti[i]._datumIzvrsenja,
- pojas._listaIzvrsenihAktivnosti[i]._ocjena, pojas._listaIzvrsenihAktivnosti[i]._nazivOpis);
- }
- }
- void Unos(Pojas pojas) {
- _listaIzvrsenihAktivnosti = nullptr;
- _trenutnoIzvrsenihAktivnosti = 0;
- _datumPolaganja = nullptr;
- _pojas = pojas;
- }
- void Dealociraj()
- {
- if (_datumPolaganja != nullptr)
- {
- _datumPolaganja->Dealociraj(); _datumPolaganja = nullptr;
- }
- for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- _listaIzvrsenihAktivnosti[i].Dealociraj();
- delete[] _listaIzvrsenihAktivnosti;
- _listaIzvrsenihAktivnosti = nullptr;
- }
- void Ispis()
- {
- if (_datumPolaganja != nullptr)
- {
- _datumPolaganja->Ispis();
- }
- cout << _pojas << endl;
- for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- _listaIzvrsenihAktivnosti[i].Ispis();
- }
- /*Na osnovu vrijednosti primljenog parametra osigurati dodavanje novoizvrsene aktivnosti za potrebe stjecanja odredjenog pojasa.
- Broj aktivnosti nije ogranicen.
- Identicna aktivnost se moze dodati jedino u slucaju kada je prethodna (identivna aktivnost po vrsti i datumu izvrsenja) imala ocjenu manju od 6.
- Uspjesnom aktivnoscu se smatraju one aktivnosti koje imaju ocjenu vecu od 5, a svaka naredna identicna aktivnost, bez obzira da li je uspjesna ili ne,
- moze biti dodana jedino ako je proslo najmanje 15 dana od izvrsenja prethodne.
- Onemoguciti dodavanje aktivnosti uspjesno polozenom pojasu.*/
- bool DodajIzvrsenuAktivnost(Aktivnost * aktivnost)
- {
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- {
- if ((*_listaIzvrsenihAktivnosti[i]._vrsta == *aktivnost->_vrsta) && (istiDatum(_listaIzvrsenihAktivnosti[i]._datumIzvrsenja, aktivnost->_datumIzvrsenja) == true))
- {
- if (!(_listaIzvrsenihAktivnosti[i]._ocjena < 6))
- {
- return false;
- }
- }
- if (*_listaIzvrsenihAktivnosti[i]._vrsta == *aktivnost->_vrsta)
- {
- if (!(veciZa15Dana(_listaIzvrsenihAktivnosti[i]._datumIzvrsenja, aktivnost->_datumIzvrsenja) == true))
- {
- return false;
- }
- }
- }
- Aktivnost * temp = new Aktivnost[_trenutnoIzvrsenihAktivnosti + 1];
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- {
- temp[i].Unos(*_listaIzvrsenihAktivnosti[i]._vrsta, &_listaIzvrsenihAktivnosti[i]._datumIzvrsenja, _listaIzvrsenihAktivnosti[i]._ocjena, _listaIzvrsenihAktivnosti[i]._nazivOpis);
- }
- temp[_trenutnoIzvrsenihAktivnosti].Unos(*aktivnost->_vrsta, &aktivnost->_datumIzvrsenja, aktivnost->_ocjena, aktivnost->_nazivOpis);
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- {
- _listaIzvrsenihAktivnosti[i].Dealociraj();
- }
- delete[] _listaIzvrsenihAktivnosti;
- _listaIzvrsenihAktivnosti = temp;
- _trenutnoIzvrsenihAktivnosti++;
- return true;
- }
- //Koristeci neki od obradjenih algoritama, po ocjeni sortirati aktivnosti u okviru odredjenog pojasa
- void Sortiraj()
- {
- int minI;
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- {
- minI = i;
- for (int j = i + 1; j < _trenutnoIzvrsenihAktivnosti; j++)
- {
- if (_listaIzvrsenihAktivnosti[i]._ocjena < _listaIzvrsenihAktivnosti[j]._ocjena)
- minI = j;
- }
- swap(_listaIzvrsenihAktivnosti[i], _listaIzvrsenihAktivnosti[minI]);
- cout << "SORTIRANE OCJENE: " << _listaIzvrsenihAktivnosti[i]._ocjena << endl;
- }
- }
- /* Karate pojas zahtijeva uspjesnu realizaciju svih planiranih aktivnosti, a one se za jedan povecavaju sa svakim novim pojasom, npr.
- zuti pojas: 1 x tehnika, 1 x kata, 1 x borba; narandzasti pojas: 2 x tehnika, 2 x kata, 2 x borba; i td...
- Funkcija vraca false u slucaju da: su
- -kandidatu u listu aktivnosti evidentirane tri negativno ocijenjene identicne vrste aktivnosti (npr. tri negativne ocjene iz borbi),
- onda se taj pojas ne moze smatrati uspjesno stecenim
- i,
- -te ukoliko nedostaje bilo koja od aktivnosti zahtijevanih u okviru tog pojasa.
- Ukoliko je kandidat uspjesno realizovao sve aktivnost,
- datum polaganja se postavlja na datum posljednje uspjesno realizovane aktivnosti*/
- bool DaLiJePolozen()
- {
- /*
- enum VrstaAktivnosti { Tehnike, Kata, Borba };
- enum Pojas { Zuti, Narandzasti, Zeleni, Plavi, Smedji, Crni };
- */
- Datum datumPosljednjeAktivnosti;
- int brojacTehnike = 0, brojacKata = 0, brojacBorba = 0;
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- {
- if (_listaIzvrsenihAktivnosti[i]._ocjena <= 5)
- {
- if (*_listaIzvrsenihAktivnosti[i]._vrsta == Tehnike)
- brojacTehnike++;
- if (*_listaIzvrsenihAktivnosti[i]._vrsta == Kata)
- brojacKata++;
- if (*_listaIzvrsenihAktivnosti[i]._vrsta == Borba)
- brojacBorba++;
- }
- }
- if (brojacTehnike >= 3)
- return false;
- if (brojacKata >= 3)
- return false;
- if (brojacBorba >= 3)
- return false;
- brojacTehnike = 0, brojacKata = 0, brojacBorba = 0;
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- {
- if (_listaIzvrsenihAktivnosti[i]._ocjena > 5)
- {
- if (*_listaIzvrsenihAktivnosti[i]._vrsta == Tehnike)
- brojacTehnike++;
- if (*_listaIzvrsenihAktivnosti[i]._vrsta == Kata)
- brojacKata++;
- if (*_listaIzvrsenihAktivnosti[i]._vrsta == Borba)
- brojacBorba++;
- datumPosljednjeAktivnosti = _listaIzvrsenihAktivnosti[i]._datumIzvrsenja;
- }
- }
- if (brojacTehnike == 0 || brojacKata == 0 || brojacBorba == 0)
- {
- return false;
- }
- if (!(brojacTehnike >= int(_pojas + 1) || brojacKata >= int(_pojas + 1) || brojacBorba >= int(_pojas + 1)))
- {
- return false;
- }
- _datumPolaganja = new Datum;
- _datumPolaganja->Unos(*datumPosljednjeAktivnosti._dan, *datumPosljednjeAktivnosti._mjesec, *datumPosljednjeAktivnosti._godina);
- return true;
- }
- /*Funkcija vraca prosjecnu ocjenu svih uspjesno realizovanih aktivnosti koja u nazivu ili opisu sadrze vrijednost primljenog parametra.
- Ukoliko smatrate da je
- potrebno, mozete dodati i druge parametre za potrebe implementacije ove funkcije*/
- float PretragaRekrzivno(const char * naziv, int & i, int & brojac, int & suma, float & prosjek)
- {
- if (_trenutnoIzvrsenihAktivnosti == i)
- {
- if (brojac == 0)
- return 0;
- else
- {
- prosjek = float(suma) / brojac;
- return prosjek;
- }
- }
- else
- {
- if (_listaIzvrsenihAktivnosti[i]._ocjena > 5)
- {
- if (strstr(_listaIzvrsenihAktivnosti[i]._nazivOpis, naziv) != nullptr)
- {
- suma += _listaIzvrsenihAktivnosti[i]._ocjena;
- brojac++;
- }
- }
- }
- i++;
- return PretragaRekrzivno(naziv, i, brojac, suma, prosjek);
- }
- };
- struct Kandidat
- {
- char * _imePrezime;
- shared_ptr<KaratePojas> _pojasevi[6];
- void Unos(const char * imePrezime)
- {
- int size = strlen(imePrezime) + 1;
- _imePrezime = new char[size];
- strcpy_s(_imePrezime, size, imePrezime);
- for (size_t i = 0; i < 6; i++)
- _pojasevi[i] = nullptr;
- }
- void Dealociraj()
- {
- if (_imePrezime != nullptr)
- {
- delete[] _imePrezime; _imePrezime = nullptr;
- }
- for (size_t i = 0; i < 6; i++)
- {
- if (_pojasevi[i] != nullptr)
- {
- _pojasevi[i]->Dealociraj();
- _pojasevi[i].reset();
- }
- }
- }
- void Ispis()
- {
- cout << _imePrezime << endl;
- for (size_t i = 0; i < 6; i++)
- {
- if (_pojasevi[i] != nullptr)
- _pojasevi[i]->Ispis();
- }
- }
- /*
- Karate pojasevi se moraju dodavati po redoslijedu tj. ne smije se dozvoliti dodavanje zelenog pojasa ukoliko prethodno
- nije dodan zuti i narandzasti.
- Za provjeru lokacije (unutar funkcije DodajPojas) na koju ce se dodati novi karate pojas, te da li su nizi pojasevi
- prethodno dodani koristiti lambda funkciju.
- */
- bool DodajPojas(KaratePojas pojas)
- {
- //{ Zuti, Narandzasti, Zeleni, Plavi, Smedji, Crni };
- auto lambda = [&]()
- {
- int prethodni = int(pojas._pojas) - 1;
- if (prethodni < 0) //ne smije indeks niza biti manji od 0, ovdje to znaci da nema dodanih pojaseva
- {
- if (_pojasevi[0] == nullptr)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- if (_pojasevi[prethodni] != nullptr && _pojasevi[int(pojas._pojas)]==nullptr)//ovdje provjeravam da li je dodan pojas prethodni i
- //da li je pojas koji zelimo dodati vec dodan ranije, ukoliko nije dodan ranije dodat cemo ga
- {
- return true;
- }
- };
- //shared_ptr<KaratePojas> _pojasevi[6];
- if (lambda() == true)
- {
- for (int i = 0; i < 6; i++)
- {
- if (_pojasevi[i] == nullptr)
- {
- _pojasevi[i] = make_shared<KaratePojas>();
- _pojasevi[i]->kopiraj(pojas);
- return true;
- }
- }
- }
- return false;
- }
- //Funkcija GetNajbolji vraca par koji sadrzi oznaku i prosjecnu ocjenu (uspjesno okoncanih aktivnosti) pojasa sa najvecim prosjekom
- pair <Pojas, float> GetNajbolji()
- {
- float prosjek = 0;
- Pojas pojas;
- float suma = 0;
- int brojacUspjesnih = 0;
- float maxProsjek = 0;
- for (int i = 0; i < 6; i++)
- {
- brojacUspjesnih = 0;
- suma = 0;
- if (_pojasevi[i] != nullptr)
- {
- for (int j = 0; j < _pojasevi[i]->_trenutnoIzvrsenihAktivnosti; j++)
- {
- if (_pojasevi[i]->_listaIzvrsenihAktivnosti[j]._ocjena > 5)
- {
- suma += _pojasevi[i]->_listaIzvrsenihAktivnosti[j]._ocjena;
- brojacUspjesnih++;
- }
- }
- prosjek = suma / brojacUspjesnih;
- if (maxProsjek < prosjek)
- {
- maxProsjek = prosjek;
- pojas = _pojasevi[i]->_pojas;
- //pojas = Pojas(i);
- }
- }
- }
- pair <Pojas, float> rezultat = make_pair(pojas, maxProsjek);
- return rezultat;
- }
- };
- void main() {
- //BROJ I VRSTA PARAMETARA MORAJU BITI IDENTICNI KAO U PRIMJERIMA
- //STAVITE KOMENTAR NA DIJELOVE CODE-A KOJE NE BUDETE IMPLEMENTIRALI
- Datum datumPolaganja1, datumPolaganja2, datumPolaganja3, datumPolaganja4;
- datumPolaganja1.Unos(10, 6, 2018);
- datumPolaganja2.Unos(18, 6, 2018);
- datumPolaganja3.Unos(22, 3, 2018);
- datumPolaganja4.Unos(22, 7, 2018);
- Aktivnost aktivnost1, aktivnost2, aktivnost3, aktivnost4, aktivnost5;
- aktivnost1.Unos(Tehnike, &datumPolaganja1, 6, "Tehnike za zuti pojas");
- aktivnost2.Unos(Kata, &datumPolaganja1, 8, "Taiki joko shodan - zuti pojas");
- aktivnost3.Unos(Borba, &datumPolaganja1, 2, "Jednostavne borbene tehnike sa partnerom");
- aktivnost4.Unos(Borba, &datumPolaganja1, 6, "Jednostavne borbene tehnike sa partnerom");
- aktivnost5.Unos(Borba, &datumPolaganja4, 6, "Jednostavne borbene tehnike sa partnerom");
- KaratePojas pojasZuti, pojasNarandzasti, pojasZeleni;
- pojasZuti.Unos(Zuti);
- pojasZeleni.Unos(Zeleni);
- pojasNarandzasti.Unos(Narandzasti);
- /*Na osnovu vrijednosti primljenog parametra osigurati dodavanje novoizvrsene aktivnosti za potrebe stjecanja odredjenog pojasa. Broj aktivnosti nije ogranicen.
- Identicna aktivnost se moze dodati jedino u slucaju kada je prethodna (identivna aktivnost po vrsti i datumu izvrsenja) imala ocjenu manju od 6.
- Uspjesnom aktivnoscu se smatraju one aktivnosti koje imaju ocjenu vecu od 5, a svaka naredna identicna aktivnost, bez obzira da li je uspjesna ili ne,
- moze biti dodana jedino ako je proslo najmanje 15 dana od izvrsenja prethodne. Onemoguciti dodavanje aktivnosti uspjesno polozenom pojasu.*/
- if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost1))
- cout << "Aktivnost uspjesno dodana!" << endl;
- if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost2))
- cout << "Aktivnost uspjesno dodana!" << endl;
- if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost3))
- cout << "Aktivnost uspjesno dodana!" << endl;
- if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost4))//15 dana...
- cout << "Aktivnost uspjesno dodana!" << endl;
- if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost5))
- cout << "Aktivnost uspjesno dodana!" << endl;
- //Koristeci neki od obradjenih algoritama, po ocjeni sortirati aktivnosti u okviru odredjenog pojasa
- pojasZuti.Sortiraj();
- /* Karate pojas zahtijeva uspjesnu realizaciju svih planiranih aktivnosti, a one se za jedan povecavaju sa svakim novim pojasom, npr.
- zuti pojas: 1 x tehnika, 1 x kata, 1 x borba; narandzasti pojas: 2 x tehnika, 2 x kata, 2 x borba; i td...
- Funkcija vraca false u slucaju da: su kandidatu u listu aktivnosti evidentirane tri negativno ocijenjene identicne vrste aktivnosti (npr. tri negativne ocjene iz borbi),
- onda se taj pojas ne moze smatrati uspjesno stecenim
- i, te ukoliko nedostaje bilo koja od aktivnosti zahtijevanih u okviru tog pojasa. Ukoliko je kandidat uspjesno realizovao sve aktivnost, datum polaganja se postavlja na
- datum posljednje uspjesno realizovane aktivnosti*/
- if (pojasZuti.DaLiJePolozen())
- pojasZuti.Ispis();
- /*Funkcija vraca prosjecnu ocjenu svih uspjesno realizovanih aktivnosti koja u nazivu ili opisu sadrze vrijednost primljenog parametra. Ukoliko smatrate da je
- potrebno, mozete dodati i druge parametre za potrebe implementacije ove funkcije*/
- int i = 0, brojac = 0, suma = 0;
- float prosjek1 = 0;
- cout << "Prosjecna ocjena za zuti pojas -> " << pojasZuti.PretragaRekrzivno("pojas", i, brojac, suma, prosjek1) << endl;
- //ispisuje sve dostupne podatke o pojasu
- pojasZuti.Ispis();
- Kandidat jasmin;
- jasmin.Unos("Jasmin Azemovic");
- /*
- Karate pojasevi se moraju dodavati po redoslijedu tj. ne smije se dozvoliti dodavanje zelenog pojasa ukoliko prethodno nije dodan zuti i narandzasti.
- Za provjeru lokacije (unutar funkcije DodajPojas) na koju ce se dodati novi karate pojas, te da li su nizi pojasevi prethodno dodani koristiti lambda funkciju.
- */
- if (jasmin.DodajPojas(pojasZuti))
- cout << "Pojas uspjesno dodan!" << endl;
- if (jasmin.DodajPojas(pojasZeleni))//prethodno je trebao biti dodan narandzasti pojas
- cout << "Pojas uspjesno dodan!" << endl;
- if (jasmin.DodajPojas(pojasNarandzasti))
- cout << "Pojas uspjesno dodan!" << endl;
- float prosjek = 0;
- Pojas pojas;
- //Funkcija GetNajbolji vraca par koji sadrzi oznaku i prosjecnu ocjenu (uspjesno okoncanih aktivnosti) pojasa sa najvecim prosjekom
- tie(pojas, prosjek) = jasmin.GetNajbolji();
- cout << "Najbolji rezultat od " << prosjek << " je ostvaren tokom stjecanja pojasa " << pojas << endl;
- datumPolaganja1.Dealociraj(), datumPolaganja2.Dealociraj(), datumPolaganja3.Dealociraj(), datumPolaganja4.Dealociraj();
- aktivnost1.Dealociraj(), aktivnost2.Dealociraj(), aktivnost3.Dealociraj(), aktivnost4.Dealociraj(), aktivnost5.Dealociraj();
- pojasZuti.Dealociraj(), pojasNarandzasti.Dealociraj(), pojasZeleni.Dealociraj();
- jasmin.Dealociraj();
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement