Untitled
#include <iostream> #include <string> #include <vector> #include <thread> #include <mutex> #include <regex> #include <fstream> #include <memory> using namespace std; const char* PORUKA = "\n-------------------------------------------------------------------------------\n" "0. PROVJERITE DA LI PREUZETI ZADACI PRIPADAJU VASOJ GRUPI (G1/G2)\n" "1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR\n" "2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA CE BITI OZNACENO KAO TM\n" "3. SPASAVAJTE PROJEKAT KAKO BI SE SPRIJECILO GUBLJENJE URADJENOG ZADATKA\n" "4. ATRIBUTI, NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTICNI ONIMA KOJI SU KORISTENI U TESTNOM CODE-U, " "OSIM U SLUCAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE " "POMOCNE FUNKCIJE MOZETE IMENOVATI I DODAVATI PO ZELJI.\n" "5. IZUZETAK BACITE SAMO U FUNKCIJAMA U KOJIMA JE TO NAZNACENO.\n" "6. FUNKCIJE KOJE NE IMPLEMENTIRATE TREBAJU BITI OBRISANE (KAKO POZIV TAKO I DEFINICIJA)!\n" "7. NA KRAJU ISPITA SVOJE RJESENJE KOPIRATE U .DOCX FAJL (IMENOVAN BROJEM INDEKSA)!\n" "8. RJESENJA ZADATKA POSTAVITE NA FTP SERVER U ODGOVARAJUCI FOLDER!\n" "9. NEMOJTE POSTAVLJATI VISUAL STUDIO PROJEKTE, VEC SAMO .DOCX FAJL SA VASIM RJESENJEM!\n" "-------------------------------------------------------------------------------\n"; const char* crt = "\n-------------------------------------------\n"; enum Pojas { BIJELI, ZUTI, NARANDZASTI, ZELENI, PLAVI, SMEDJI, CRNI }; enum Dupliranje { BEZ_DUPLIKATA, SA_DUPLIKATIMA }; char* GetNizKaraktera(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, int max = 15> class Kolekcija { T1 _elementi1[max]; T2 _elementi2[max]; int* _trenutno; Dupliranje _dupliranje; public: Kolekcija(Dupliranje dupliranje = SA_DUPLIKATIMA) { _trenutno = new int(0); _dupliranje = dupliranje; } Kolekcija(const Kolekcija& obj) { _trenutno = new int(*obj._trenutno); _dupliranje = obj._dupliranje; for (int i = 0; i < *_trenutno; i++) { _elementi1[i] = obj._elementi1[i]; _elementi2[i] = obj._elementi2[i]; } } Kolekcija& operator=(const Kolekcija& obj) { if (this != &obj) { delete _trenutno; _trenutno = new int(*obj._trenutno); _dupliranje = obj._dupliranje; for (int i = 0; i < *_trenutno; i++) { _elementi1[i] = obj._elementi1[i]; _elementi2[i] = obj._elementi2[i]; } } return *this; } void AddElement(T1 el1, T2 el2) { if (max == *_trenutno) throw exception("Prekoracen opseg niza"); if (_dupliranje == BEZ_DUPLIKATA) { for (int i = 0; i < *_trenutno; i++) { if (el1 == _elementi1[i] || _elementi2[i] == el2) throw exception("Zabranjeno dupliranje elemenata."); } } _elementi1[*_trenutno] = el1; _elementi2[*_trenutno] = el2; (*_trenutno)++; } Kolekcija<int, int> operator() (int pocetak,int kraj) { if (pocetak < 0 || kraj > *_trenutno)//zasto ovdje nije vece ili jednako _trenutno throw exception("Pozicija nije validna."); Kolekcija<int, int> noviR; for (int i = pocetak; i <= kraj; i++) { noviR.AddElement(_elementi1[i], _elementi2[i]); } return noviR; } ~Kolekcija() { delete _trenutno; _trenutno = nullptr; } T1 getElement1(int lokacija)const { return _elementi1[lokacija]; } T2 getElement2(int lokacija)const { return _elementi2[lokacija]; } int getTrenutno()const { return *_trenutno; } friend ostream& operator<< (ostream& COUT, const Kolekcija& obj) { for (size_t i = 0; i < *obj._trenutno; i++) COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl; return COUT; } }; class Datum { int* _dan, * _mjesec, * _godina; public: Datum(int dan = 1, int mjesec = 1, int godina = 2000) { _dan = new int(dan); _mjesec = new int(mjesec); _godina = new int(godina); } Datum(const Datum& obj) { _dan = new int(*obj._dan); _mjesec = new int(*obj._mjesec); _godina = new int(*obj._godina); } Datum& operator=(const Datum& obj) { if (this != &obj) { *_dan = *obj._dan; *_mjesec = *obj._mjesec; *_godina = *obj._godina; } return *this; } bool operator==(const Datum& drugi) { return *_dan == *drugi._dan && *_mjesec == *drugi._mjesec && *_godina == *drugi._godina; } ~Datum() { delete _dan; _dan = nullptr; delete _mjesec; _mjesec = nullptr; delete _godina; _godina = nullptr; } friend ostream& operator<< (ostream& COUT, const Datum& obj) { COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina; return COUT; } }; class Tehnika { char* _naziv; //int se odnosi na ocjenu u opsegu od 1 – 5, a datum na momenat postizanja ocjene Kolekcija<Datum, int>* _ocjene; public: Tehnika(const char* naziv = "", Datum datum = Datum(), int ocjena = 0) { _naziv = GetNizKaraktera(naziv); _ocjene = new Kolekcija<Datum, int>(); if (ocjena > 0) AddOcjena(&datum, ocjena); } Tehnika(const Tehnika& obj) { _naziv = GetNizKaraktera(obj._naziv); _ocjene = new Kolekcija<Datum, int>(*obj._ocjene); } Tehnika& operator=(const Tehnika& obj) { if (this != &obj) { delete[] _naziv; delete _ocjene; _naziv = GetNizKaraktera(obj._naziv); _ocjene = new Kolekcija<Datum, int>(*obj._ocjene); } return *this; } float prosjekOcjena()const { float brojac = 0; float suma = 0; for (int i = 0; i < _ocjene->getTrenutno(); i++) { suma += _ocjene->getElement2(i); brojac++; } if (brojac == 0) return 0; return suma / brojac; } void AddOcjena(Datum* datum, int ocjena) { _ocjene->AddElement(*datum, ocjena); } bool operator==(Tehnika tehnika) { return strcmp(_naziv, tehnika._naziv) == 0; } ~Tehnika() { delete[] _naziv; _naziv = nullptr; delete _ocjene; _ocjene = nullptr; } char* GetNaziv()const { return _naziv; } Kolekcija<Datum, int> GetOcjene() const { return *_ocjene; } // ispisuje: naziv tehnike, ocjene (zajedno sa datumom polaganja) i prosjecnu ocjenu za tu tehniku // ukoliko tehnika nema niti jednu ocjenu prosjecna treba biti 0 friend ostream& operator<<(ostream& COUT, const Tehnika& obj) { COUT << obj._naziv << endl; for (int i = 0; i < obj._ocjene->getTrenutno(); i++) { COUT <<"\t" << obj._ocjene->getElement1(i) << " - " << obj._ocjene->getElement2(i) << endl; } COUT <<"Prosjecna ocjena--> " << obj.prosjekOcjena(); return COUT; } }; //class Polaganje { // Pojas _pojas; // //string se odnosi na napomenu o polozenoj tehnici // Kolekcija<Tehnika*, string> _polozeneTehnike; //public: // Polaganje(Pojas pojas = BIJELI) { // _pojas = pojas; // } // Kolekcija<Tehnika*, string>& GetTehnike() { return _polozeneTehnike; } // Pojas GetPojas() { return _pojas; } // friend ostream& operator<< (ostream& COUT, const Polaganje& obj) { // COUT << obj._pojas << " " << obj._polozeneTehnike << endl; // return COUT; // } //}; //class KaratePolaznik { // char* _imePrezime; // string _emailAdresa; // string _brojTelefona; // vector<Polaganje> _polozeniPojasevi; //public: // KaratePolaznik(const char* imePrezime, string emailAdresa, string brojTelefona) { // _imePrezime = GetNizKaraktera(imePrezime); // _emailAdresa = emailAdresa; // _brojTelefona = brojTelefona; // } // ~KaratePolaznik() { // delete[] _imePrezime; _imePrezime = nullptr; // } // friend ostream& operator<< (ostream& COUT, KaratePolaznik& obj) { // COUT << obj._imePrezime << " " << obj._emailAdresa << " " << obj._brojTelefona << endl; // for (size_t i = 0; i < obj._polozeniPojasevi.size(); i++) // COUT << obj._polozeniPojasevi[i]; // return COUT; // } // vector<Polaganje>& GetPolozeniPojasevi() { return _polozeniPojasevi; } // string GetEmail() { return _emailAdresa; } // string GetBrojTelefona() { return _brojTelefona; } // char* GetImePrezime() { return _imePrezime; } //}; //const char* GetOdgovorNaPrvoPitanje() { // cout << "Pitanje -> Za sta se koriste modovi ios::ate i ios::trunc ?\n"; // return "Odgovor -> OVDJE UNESITE VAS ODGOVOR"; //} //const char* GetOdgovorNaDrugoPitanje() { // cout << "Pitanje -> Pojasniti ulogu i način koristenja iteratora?\n"; // return "Odgovor -> OVDJE UNESITE VAS ODGOVOR"; //} void main() { // cout << PORUKA; // cin.get(); // // cout << GetOdgovorNaPrvoPitanje() << endl; // cin.get(); // cout << GetOdgovorNaDrugoPitanje() << endl; // cin.get(); Datum temp, datum19062021(19, 6, 2021), datum20062021(20, 6, 2021), datum30062021(30, 6, 2021), datum05072021(5, 7, 2021); int kolekcijaTestSize = 9; Kolekcija<int, int> kolekcija1(BEZ_DUPLIKATA); for (int i = 0; i <= kolekcijaTestSize; i++) kolekcija1.AddElement(i, i); try { //ukoliko nije dozvoljeno dupliranje elemenata (provjeravaju se T1 i T2), metoda AddElement baca izuzetak //takodjer, izuzetak se baca i u slucaju da se prekoraci maksimalan broj elemenata kolekcija1.AddElement(3, 3); } catch (exception& err) { cout << err.what() << crt; } cout << kolekcija1 << crt; /*objekat kolekcija2 ce biti inicijalizovan elementima koji se u objektu kolekcija1 nalaze na lokacijama 1 - 4 ukljucujuci i te lokacije. u konkretnom primjeru to ce biti parovi sa vrijednostima: 1 1 2 2 3 3 4 4*/ Kolekcija<int, int> kolekcija2 = kolekcija1(1, 4); cout << kolekcija2 << crt; try { //primjeri u kojima opseg nije validan, te bi funkcija trebala baciti izuzetak Kolekcija<int, int> temp1 = kolekcija1(1, 14);//imamo 10 elemenata Kolekcija<int, int> temp2 = kolekcija1(-1, 8);//lokacija -1 ne postoji } catch (exception& err) { cout << err.what() << crt; } //svaka tehnika moze imati vise ocjena i polaze se u vise navrata (istog ili drugog dana) //parametri: nazivTehnike, prva ocjena, datum polaganja Tehnika choku_zuki("choku_zuki", datum19062021, 5), gyaku_zuki("gyaku_zuki", datum20062021, 5), kizami_zuki("kizami_zuki", datum30062021, 2), oi_zuki("oi_zuki", datum05072021, 5); choku_zuki.AddOcjena(&datum05072021, 3); choku_zuki.AddOcjena(&datum05072021, 5); // ispisuje: naziv tehnike, ocjene (zajedno sa datumom polaganja) i prosjecnu ocjenu za tu tehniku // ukoliko tehnika nema niti jednu ocjenu prosjecna treba biti 0 cout << choku_zuki << endl; // // /* // email adresa treba biti u sljedecem formatu 3_ime.prezime@karate.ba tj. zadovoljavati sljedeća pravila: // - poceti sa jednim brojem nakon cega slijedi donja crtica // - u imenu posjedovati najmanje 3 karaktera // - izmedju imena i prezimena moze biti tacka ili donja crtica ili nista od navedenog // - u prezimenu posjedovati najmanje 3 karaktera // - znak @ // - domenu karate.ba ili edu.karate.ba. Pored drzavne(.ba), dozvoljene su oznake .com i .org. // // za provjeru validnosti email adrese koristiti globalnu funkciju ValidirajEmail, a unutar nje regex metode. // validacija email adrese ce se vrsiti unutar konstruktora klase KaratePolaznik, a u slucaju da nije validna // postaviti je na defaultnu adresu: notSet@edu.karate.ba // */ // // if (ValidirajEmail("2_ime.prezime@edu.karate.ba")) // cout << "Email validan" << crt; // if (ValidirajEmail("3_ime_prezime@karate.ba")) // cout << "Email validan" << crt; // if (ValidirajEmail("4_imeprezime@karate.com")) // cout << "Email validan" << crt; // if (ValidirajEmail("8_imeprezime@karate.org")) // cout << "Email validan" << crt; // if (!ValidirajEmail("2ime.prezime@edu.karate.org")) // cout << "Email NIJE validan" << crt; // if (!ValidirajEmail("5_ime prezime@edu.karate.org")) // cout << "Email NIJE validan" << crt; // // // KaratePolaznik* jasmin = new KaratePolaznik("Jasmin Azemovic", "1_jasmin.azemovic@karate.ba", "033 281 172"); // KaratePolaznik* adel = new KaratePolaznik("Adel Handzic", "2_adel_handzic@edu.karate.ba", "033 281 170"); // KaratePolaznik* emailNotValid = new KaratePolaznik("Ime Prezime", "korisnik@karate.ru", "033 281 170"); // // /* // svi kandidati podrazumijevano imaju BIJELI pojas (za njega se ne dodaju tehnike) // uspjeh se dodaje za svaku tehniku na nivou pojasa (ZUTI, ZELENI ... ). // tom prilikom onemoguciti: // - dodavanje istih (moraju biti identicne vrijednosti svih atributa) tehnika na nivou jednog pojasa, // - dodavanje tehnika za vise pojaseve ako ne postoji najmanje jedna tehnika za nizi pojas (ne mozemo dodati tehniku za NARANDZASTI ako ne postoji niti jedna tehnika za ZUTI pojas) // - dodavanje tehnika kod kojih je prosjecna ocjena manja od 3.5 // funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja // */ // // //ne treba dodati kizami_zuki jer ne postoji niti jedna tehnika za ZUTI pojas // if (jasmin->AddTehniku(NARANDZASTI, kizami_zuki, "Napomena 0")) // cout << "Tehnika uspjesno dodan!" << crt; // if (jasmin->AddTehniku(ZUTI, gyaku_zuki, "Napomena 1")) // cout << "Tehnika uspjesno dodan!" << crt; // if (jasmin->AddTehniku(ZUTI, kizami_zuki, "Napomena 2")) // cout << "Tehnika uspjesno dodan!" << crt; // if (jasmin->AddTehniku(ZUTI, oi_zuki, "Napomena 3")) // cout << "Tehnika uspjesno dodan!" << crt; // if (jasmin->AddTehniku(ZUTI, choku_zuki, "Napomena 4")) // cout << "Tehnika uspjesno dodan!" << crt; // //ne treba dodati choku_zuki jer je vec dodana za zuti pojas // if (!jasmin->AddTehniku(ZUTI, choku_zuki, "Napomena 5")) // cout << "Tehnika NIJE uspjesno dodana!" << crt; // // /*nakon evidentiranja tehnike na bilo kojem pojasu kandidatu se salje email sa porukom: // FROM:info@karate.ba // TO: emailKorisnika // Postovani ime i prezime, evidentirana vam je thenika X za Y pojas. Dosadasnji uspjeh (prosjek ocjena) // na pojasu Y iznosi F, a ukupni uspjeh (prosjek ocjena) na svim pojasevima iznosi Z. // Pozdrav. // KARATE Team. // ukoliko je prosjek na nivou tog pojasa veci od 4.5 kandidatu se salje SMS sa porukom: "Svaka cast za uspjeh 4.D na X pojasu". // slanje poruka i emailova implemenitrati koristeci zasebne thread-ove. // */ // cout << *jasmin << crt; // // //vraca kolekciju tehnika koji sadrze najmanje jednu ocjenu evidentiranu u periodu izmedju proslijedjenih datuma // //float se odnosi na prosjecan broj dana izmedju ostvarenih ocjena na tehnici // Kolekcija<Tehnika*, float> jasminUspjeh = (*jasmin)(Datum(18, 06, 2021), Datum(21, 06, 2021)); // for (size_t i = 0; i < jasminUspjeh.getTrenutno(); i++) // cout << *jasminUspjeh.getElement1(i) << " " << jasminUspjeh.getElement2(i) << crt; // // delete jasmin; // delete adel; // delete emailNotValid; // cin.get(); system("pause>0"); }
Leave a Comment