Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- #include <memory>
- #include <cstring>
- #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 };
- // dodano kako bi se enum podatak ispisivao tekstualnom vrijednoscu, a ne brojcanom
- const char *vrstaAktivnosti[] = { "Tehnike", "Kata", "Borba" };
- std::ostream& operator<<(std::ostream& os, enum VrstaAktivnosti va)
- {
- return os << vrstaAktivnosti[va];
- }
- enum Pojas { Zuti, Narandzasti, Zeleni, Plavi, Smedji, Crni };
- // dodano kako bi se enum podatak ispisivao tekstualnom vrijednoscu, a ne brojcanom
- const char *pojas[] = { "Zuti", "Narandzasti", "Zeleni", "Plavi", "Smedji", "Crni" };
- std::ostream& operator<<(std::ostream& os, enum Pojas p)
- {
- return os << pojas[p];
- }
- 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() { cout << *_dan << "/" << *_mjesec << "/" << *_godina << endl; }
- void Dealociraj() { delete _dan; delete _mjesec; delete _godina; }
- // dodana funkcija za racunanje broja dana izmedju dva datuma, radi jednostavnosti je uzeto da svaki mjesec ima 30 dana i da nema prijestupnih godina
- // ako je to potrebno uzeti u obzir, detaljan algoritam imas na https://www.geeksforgeeks.org/find-number-of-days-between-two-given-dates/
- int ProsloDana(Datum *datum)
- {
- int d1 = *_godina * 365 + *_mjesec * 30 + *_dan;
- int d2 = *datum->_godina * 365 + *datum->_mjesec * 30 + *datum->_dan;
- return d1 - d2;
- }
- int Dan() { return *_dan; }
- int Mjesec() { return *_mjesec; }
- int Godina() { return *_godina; }
- };
- 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) {
- // dodana inicijalizacija clana _vrsta, nije bila u zadatku
- _vrsta = unique_ptr<VrstaAktivnosti>(new 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;
- typedef string value_type;
- void Unos(Pojas pojas)
- {
- _listaIzvrsenihAktivnosti = nullptr;
- _trenutnoIzvrsenihAktivnosti = 0;
- _datumPolaganja = nullptr;
- _pojas = pojas;
- }
- void Dealociraj()
- {
- _datumPolaganja->Dealociraj(); _datumPolaganja = nullptr;
- for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- _listaIzvrsenihAktivnosti[i].Dealociraj();
- delete[] _listaIzvrsenihAktivnosti;
- _listaIzvrsenihAktivnosti = nullptr;
- }
- void Ispis()
- {
- _datumPolaganja->Ispis();
- cout << _pojas << endl;
- for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- _listaIzvrsenihAktivnosti[i].Ispis();
- }
- // dodana funkcija DodajIzvrsenuAktivnost() u skladu sa zahtjevima zadatka
- bool DodajIzvrsenuAktivnost(Aktivnost *aktivnost)
- {
- if (!this->DaLiJePolozen())
- {
- // Identicna aktivnost se moze dodati jedino u slucaju kada je prethodna (identicna aktivnost po vrsti i datumu izvrsenja) imala ocjenu manju od 6.
- for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- if ((*_listaIzvrsenihAktivnosti[i]._vrsta == *aktivnost->_vrsta) && (&_listaIzvrsenihAktivnosti[i]._datumIzvrsenja == &aktivnost->_datumIzvrsenja))
- if (_listaIzvrsenihAktivnosti[i]._ocjena >= 6)
- return false;
- // 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.
- for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- if (*_listaIzvrsenihAktivnosti[i]._vrsta == *aktivnost->_vrsta)
- if ((_listaIzvrsenihAktivnosti[i]._ocjena >= 6) && (aktivnost->_datumIzvrsenja.ProsloDana(&_listaIzvrsenihAktivnosti[i]._datumIzvrsenja) < 15))
- return false;
- Aktivnost * _pomocnaListaIzvrsenihAktivnosti = new Aktivnost[_trenutnoIzvrsenihAktivnosti + 1];
- for (size_t i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- _pomocnaListaIzvrsenihAktivnosti[i].Unos(*_listaIzvrsenihAktivnosti[i]._vrsta, &_listaIzvrsenihAktivnosti[i]._datumIzvrsenja, _listaIzvrsenihAktivnosti[i]._ocjena, _listaIzvrsenihAktivnosti[i]._nazivOpis);
- _pomocnaListaIzvrsenihAktivnosti[_trenutnoIzvrsenihAktivnosti++].Unos(*aktivnost->_vrsta, &aktivnost->_datumIzvrsenja, aktivnost->_ocjena, aktivnost->_nazivOpis);
- _listaIzvrsenihAktivnosti = _pomocnaListaIzvrsenihAktivnosti;
- return true;
- }
- else
- return false;
- }
- // dodana funkcija Sortiraj() u skladu sa zahtjevima zadatka
- void Sortiraj()
- {
- for(int i = 0; i < _trenutnoIzvrsenihAktivnosti - 1; i++)
- for(int j = i + 1; j < _trenutnoIzvrsenihAktivnosti; j++)
- if (_listaIzvrsenihAktivnosti[i]._ocjena < _listaIzvrsenihAktivnosti[j]._ocjena)
- {
- Aktivnost tmpAktivnost;
- tmpAktivnost.Unos(*_listaIzvrsenihAktivnosti[i]._vrsta, &_listaIzvrsenihAktivnosti[i]._datumIzvrsenja, _listaIzvrsenihAktivnosti[i]._ocjena, _listaIzvrsenihAktivnosti[i]._nazivOpis);
- _listaIzvrsenihAktivnosti[i].Unos(*_listaIzvrsenihAktivnosti[j]._vrsta, &_listaIzvrsenihAktivnosti[j]._datumIzvrsenja, _listaIzvrsenihAktivnosti[j]._ocjena, _listaIzvrsenihAktivnosti[j]._nazivOpis);
- _listaIzvrsenihAktivnosti[j].Unos(*tmpAktivnost._vrsta, &tmpAktivnost._datumIzvrsenja, tmpAktivnost._ocjena, tmpAktivnost._nazivOpis);
- }
- }
- // dodana funkcija DaLiJePolozen() u skladu sa zahtjevima zadatka
- bool DaLiJePolozen()
- {
- int pozTehnike = 0, negTehnike = 0, pozKata = 0, negKata = 0, pozBorba = 0, negBorba = 0;
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- switch (*_listaIzvrsenihAktivnosti[i]._vrsta)
- {
- case Tehnike:
- {
- if (_listaIzvrsenihAktivnosti[i]._ocjena > 5)
- pozTehnike++;
- else
- negTehnike++;
- break;
- }
- case Kata:
- {
- if (_listaIzvrsenihAktivnosti[i]._ocjena > 5)
- pozKata++;
- else
- negKata++;
- break;
- }
- case Borba:
- {
- if (_listaIzvrsenihAktivnosti[i]._ocjena > 5)
- pozBorba++;
- else
- negBorba++;
- break;
- }
- }
- //cout << "T+" << pozTehnike << "K+" << pozKata << "B+" << pozBorba << endl;
- //cout << "T-" << negTehnike << "K-" << negKata << "B-" << negBorba << endl;
- if ((negTehnike >= 3) || (negKata >= 3) || (negBorba >= 3))
- return false;
- // kako se podaci enum tipa predstavljaju cijelim brojevima pocevsi od 0, provjera polozenosti moze ici ovako ili kao u komentiranom dijelu ispod
- if ((pozTehnike >= _pojas + 1) && (pozKata >= _pojas + 1) && (pozBorba >= _pojas + 1))
- {
- Datum datumPolaganja;
- // postavljam neki izmisljeni datum 1. 1. 1. koji je manji od datuma bilo koje aktivnosti i trazim zadnji datum pozitivne aktivnosti
- datumPolaganja.Unos(1, 1, 1);
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- if ((_listaIzvrsenihAktivnosti[i]._ocjena > 5) && (datumPolaganja.ProsloDana(&_listaIzvrsenihAktivnosti[i]._datumIzvrsenja) < 0))
- datumPolaganja.Unos(_listaIzvrsenihAktivnosti[i]._datumIzvrsenja.Dan(), _listaIzvrsenihAktivnosti[i]._datumIzvrsenja.Mjesec(), _listaIzvrsenihAktivnosti[i]._datumIzvrsenja.Godina());
- if (_datumPolaganja == nullptr)
- _datumPolaganja = new Datum;
- _datumPolaganja->Unos(datumPolaganja.Dan(), datumPolaganja.Mjesec(), datumPolaganja.Godina());
- return true;
- }
- else
- return false;
- /* drugi nacin provjere polozenosti - trebalo bi u svaki case dodati odredjivanje datuma polaganja
- switch (_pojas)
- {
- case Zuti:
- {
- if ((pozTehnike >= 1) && (pozKata >= 1) && (pozBorba >= 1))
- return true;
- else
- return false;
- break;
- }
- case Narandzasti:
- {
- if ((pozTehnike >= 2) && (pozKata >= 2) && (pozBorba >= 2))
- return true;
- else
- return false;
- break;
- }
- case Zeleni:
- {
- if ((pozTehnike >= 3) && (pozKata >= 3) && (pozBorba >= 3))
- return true;
- else
- return false;
- break;
- }
- case Plavi:
- {
- if ((pozTehnike >= 4) && (pozKata >= 4) && (pozBorba >= 4))
- return true;
- else
- return false;
- break;
- }
- case Smedji:
- {
- if ((pozTehnike >= 5) && (pozKata >= 5) && (pozBorba >= 5))
- return true;
- else
- return false;
- break;
- }
- case Crni:
- {
- if ((pozTehnike >= 6) && (pozKata >= 6) && (pozBorba >= 6))
- return true;
- else
- return false;
- break;
- }
- } */
- }
- double PretragaRekurzivno(const char * searchString)
- {
- int brojac = 0, sumaPozitivnih = 0;
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- if (_listaIzvrsenihAktivnosti[i]._ocjena > 5)
- {
- if (strstr(_listaIzvrsenihAktivnosti[i]._nazivOpis, searchString) != NULL)
- {
- brojac++;
- sumaPozitivnih += _listaIzvrsenihAktivnosti[i]._ocjena;
- }
- }
- double prosjek = static_cast<double>(sumaPozitivnih) / brojac;
- return prosjek;
- }
- float ProsjecnaOcjena()
- {
- int brojac = 0, sumaPozitivnih = 0;
- for (int i = 0; i < _trenutnoIzvrsenihAktivnosti; i++)
- if (_listaIzvrsenihAktivnosti[i]._ocjena > 5)
- {
- brojac++;
- sumaPozitivnih += _listaIzvrsenihAktivnosti[i]._ocjena;
- }
- float prosjek = static_cast<float>(sumaPozitivnih) / brojac;
- return 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()
- {
- 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();
- }
- bool DodajPojas(KaratePojas pojas)
- {
- // u ovoj funkciji nisam koristio lambda funkciju za provjere, kako se trazi u zadatku,
- // nisam to do sada nikad koristio, niti sam na internetu nasao slican primjer, ako imas primjer s vjezbi posalji mi pa cu ga prilagoditi za ovaj zadatak
- // ako nisu polozeni svi raniji pojasevi ne moze se dodati novi
- for (int i = 0; i < pojas._pojas; i++)
- if (_pojasevi[i] == nullptr)
- return false;
- if (_pojasevi[pojas._pojas] != nullptr)
- // ako je pojas vec polozen ne moze se ponovno dodati
- return false;
- else
- {
- _pojasevi[pojas._pojas] = make_shared<KaratePojas>(pojas);
- return true;
- }
- }
- pair<Pojas, float> GetNajbolji()
- {
- Pojas p;
- float maxProsjek = 0;
- for (int i = 0; i < 6; i++)
- if (_pojasevi[i] != nullptr)
- {
- KaratePojas kp = *_pojasevi[i];
- float prosjek = kp.ProsjecnaOcjena();
- if (prosjek > maxProsjek)
- {
- p = kp._pojas;
- maxProsjek = prosjek;
- }
- }
- return make_pair(p, maxProsjek);
- }
- };
- 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);
- // dodano radi kasnije upotrebe varijabli pojasNarandzasti i pojasZeleni
- pojasNarandzasti.Unos(Narandzasti);
- pojasZeleni.Unos(Zeleni);
- /* 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 (identicna 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 ... // moze se dodati jer je aktivnost3 neuspjesna (ocjena 2)
- cout << "Aktivnost uspjesno dodana!" << endl;
- if (pojasZuti.DodajIzvrsenuAktivnost(&aktivnost5)) // ne moze se dodati jer je pojas vec polozen
- 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 */
- cout << "Prosjecna ocjena za zuti pojas -> " << pojasZuti.PretragaRekurzivno("pojas") << 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)) // pojas nije polozen
- 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