Untitled
unknown
plain_text
3 years ago
19 kB
5
Indexable
#include <iostream> #include <vector> #include <mutex> #include <thread> #include <regex> #include <exception> 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 eRazred { PRVI = 1, DRUGI, TRECI, CETVRTI }; 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> class Kolekcija { T1* _elementi1; T2* _elementi2; int _trenutno; bool _omoguciDupliranje; public: Kolekcija(bool omoguciDupliranje = true) { _elementi1 = nullptr; _elementi2 = nullptr; _omoguciDupliranje = omoguciDupliranje; } bool Isti(T1 el1, T2 el2) { for (size_t i = 0; i < _trenutno; i++) { if (_elementi1[i] == el1 && _elementi2[i] == el2 && _omoguciDupliranje == false) return true; } return false; } Kolekcija(const Kolekcija& obj) { _trenutno = obj._trenutno; _omoguciDupliranje = obj._omoguciDupliranje; _elementi1 = new T1[obj._trenutno]; _elementi2 = new T2[obj._trenutno]; for (size_t i = 0; i < _trenutno; i++) { _elementi1[i] = obj._elementi1[i]; _elementi2[i] = obj._elementi2[i]; } } Kolekcija& operator=(const Kolekcija& obj) { if (this == &obj) return *this; _trenutno = obj._trenutno; _omoguciDupliranje = obj._omoguciDupliranje; _elementi1 = new T1[obj._trenutno]; _elementi2 = new T2[obj._trenutno]; for (size_t i = 0; i < _trenutno; i++) { _elementi1[i] = obj._elementi1[i]; _elementi2[i] = obj._elementi2[i]; } return *this; } void AddElement(T1 el1, T2 el2) { if (Isti(el1, el2)) throw exception("Pokusali ste dodati iste elemente! "); T1* temp1 = _elementi1; T2* temp2 = _elementi2; _elementi1 = new T1[_trenutno + 1]; _elementi2 = new T2[_trenutno + 1]; // kopiranje elemenata for (size_t i = 0; i < _trenutno; i++) { _elementi1[i] = temp1[i]; _elementi2[i] = temp2[i]; } _elementi1[_trenutno] = el1; _elementi2[_trenutno] = el2; _trenutno++; delete[] temp1, temp2; temp1 = nullptr; temp2 = nullptr; } Kolekcija<T1, T2> operator() (int start, int end) { if (start<0 || end>_trenutno || _trenutno == 0) throw exception("Prijavljujem izuzetak..."); Kolekcija<T1, T2> nova; for (size_t i = start; i <= end; i++) { nova.AddElement(i, i); } return nova; } ~Kolekcija() { delete[]_elementi1; _elementi1 = nullptr; delete[]_elementi2; _elementi2 = nullptr; } T1& getElement1(int lokacija)const { return _elementi1[lokacija]; } T2& getElement2(int lokacija)const { return _elementi2[lokacija]; } int getTrenutno() { 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) return *this; _dan = new int(*obj._dan); _mjesec = new int(*obj._mjesec); _godina = new int(*obj._godina); return *this; } bool operator==(const Datum& obj) { return(*_dan == *obj._dan && *_mjesec == *obj._mjesec && *obj._godina == *_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 Predmet { char* _naziv; Kolekcija<Datum*, int>* _ocjene; public: Predmet(const char* naziv = "", Datum datum = Datum(), int ocjena = 0) { _naziv = GetNizKaraktera(naziv); _ocjene = new Kolekcija<Datum*, int>(); if (ocjena > 0) AddOcjena(datum, ocjena); } bool operator==(Predmet& obj) { bool vrijednost = strcmp(GetNaziv(), obj.GetNaziv()); return vrijednost; } void AddOcjena(Datum& datum, int ocjena) { _ocjene->AddElement(new Datum(datum), ocjena); } Predmet(const Predmet& obj) { _naziv = GetNizKaraktera(obj._naziv); _ocjene = new Kolekcija<Datum*, int>(*obj._ocjene); } float GetProsjek() { int brojOcjena = _ocjene->getTrenutno(); float prosjek = 0; for (size_t i = 0; i < brojOcjena; i++) { prosjek += _ocjene->getElement2(i); } if (brojOcjena == 0) return 0; return prosjek / brojOcjena; } Predmet& operator=(const Predmet& obj) { if (this == &obj) return *this; delete[] _naziv; _naziv = GetNizKaraktera(obj._naziv); _ocjene = new Kolekcija<Datum*, int>(*obj._ocjene); return *this; } ~Predmet() { delete[] _naziv; _naziv = nullptr; } char* GetNaziv() { return _naziv; } Kolekcija<Datum*, int> GetOcjene() { return _ocjene; } friend ostream& operator<<(ostream& cout, Predmet& predmet) { cout << "Naziv Predmeta je ---> " << predmet.GetNaziv() << endl; cout << "Ispis formata - Datum -- Ocjena - " << endl; for (size_t i = 0; i < predmet._ocjene->getTrenutno(); i++) { cout << "- " << *predmet._ocjene->getElement1(i) << " -- " << predmet._ocjene->getElement2(i) << "- " << endl; } cout << "Prosjek iznosi --> " << predmet.GetProsjek(); return cout; } }; class Uspjeh { eRazred _razred; //char* se odnosi na napomenu o polozenom predmetu Kolekcija<Predmet*, const char*> _polozeniPredmeti; public: Uspjeh(eRazred razred = PRVI) { _razred = razred; } Uspjeh(const Uspjeh& obj) { _razred = obj._razred; _polozeniPredmeti = Kolekcija<Predmet*, const char*>(obj._polozeniPredmeti); } float ProsjekUspjeh() { float prosjek = 0; for (size_t i = 0; i < _polozeniPredmeti.getTrenutno(); i++) { prosjek += _polozeniPredmeti.getElement1(i)->GetProsjek(); } return prosjek / _polozeniPredmeti.getTrenutno(); } bool Provjeri() { if (_polozeniPredmeti.getTrenutno() >= 5) return true; return false; } Uspjeh& operator=(const Uspjeh& obj) { if (this == &obj) return *this; _razred = obj._razred; _polozeniPredmeti = Kolekcija<Predmet*, const char*>(obj._polozeniPredmeti); return *this; } void UspjehAdd(Predmet& predmet, const char* napomena) { _polozeniPredmeti.AddElement(new Predmet(predmet), napomena); } Kolekcija<Predmet*, const char*> GetPredmeti() { return _polozeniPredmeti; } eRazred GetERazred() { return _razred; } friend ostream& operator<< (ostream& COUT, Uspjeh& obj) { COUT << obj._razred << endl; for (size_t i = 0; i < obj._polozeniPredmeti.getTrenutno(); i++) { cout << " - " << *obj._polozeniPredmeti.getElement1(i) << " --- " << obj._polozeniPredmeti.getElement2(i); } cout << crt; return COUT; } }; mutex m; class Kandidat { char* _imePrezime; string _emailAdresa; string _brojTelefona; vector<Uspjeh> _uspjeh; ///*nakon evidentiranja uspjeha na bilo kojem predmetu kandidatu se salje email sa porukom: //FROM:info@fit.ba //TO: emailKorisnika //Postovani ime i prezime, evidentirali ste uspjeh za X razred. Dosadasnji uspjeh (prosjek) //na nivou X razreda iznosi Y, a ukupni uspjeh u toku skolovanja iznosi Z. //Pozdrav. //FIT Team. //ukoliko je prosjek na nivou tog razreda veci od 4.5 kandidatu se salje SMS sa porukom: "Svaka cast za uspjeh 4.X u X razredu". Slanje SMS-a izvrsiti samo u slucaju da je broj telefona validna, u protivnom ispisati poruku „BROJ TELEFONA NIJE VALIDAN“ //slanje poruka i emailova implemenitrati koristeci zasebne thread-ove. //*/ void SaljemMail(eRazred razred, float dosadasnjiU, float ukupniU) { m.lock(); cout << " FROM:info@fit.ba " << endl; cout << "TO: " << GetEmail() << endl; cout << "Postovani ime i prezime, evidentirali ste uspjeh za" << razred << endl; cout << "Dosadasnji uspjeh na nivou " << razred << " ,razreda iznosi " << ",a ukupni uspjeh u toku skolovanja " << ukupniU; cout << "//Pozdrav." << endl; cout << "FIT Team." << endl; m.unlock(); } public: Kandidat(const char* imePrezime, string emailAdresa, string brojTelefona) { _imePrezime = GetNizKaraktera(imePrezime); _emailAdresa = emailAdresa; _brojTelefona = brojTelefona;//izvrsiti validaciju broja telefona } bool ProvjeriJesuLiIsti(eRazred razred, Predmet& predmet) { for (size_t i = 0; i < _uspjeh.size(); i++) { if (_uspjeh[i].GetERazred() == razred) { for (size_t j = 0; j < _uspjeh[i].GetPredmeti().getTrenutno(); j++) { if (!(predmet == *_uspjeh[i].GetPredmeti().getElement1(j))) return true; } } } return false; } bool AddPredmet(eRazred razred, Predmet& predmet, const char* napomena) { float ukupni = 0; for (int i = 0; i < _uspjeh.size(); i++) { ukupni += _uspjeh[i].ProsjekUspjeh(); if (razred == _uspjeh[i].GetERazred()) { if (ProvjeriJesuLiIsti(razred, predmet)) return false; if (predmet.GetProsjek() < 2.5) return false; if (_uspjeh[i].Provjeri() >= 5) return false; } } Uspjeh u1(razred); u1.UspjehAdd(predmet, napomena); _uspjeh.push_back(u1); ukupni += u1.ProsjekUspjeh(); ukupni /= _uspjeh.size(); thread t1(&Kandidat::SaljemMail, this, razred, 0.33, ukupni); t1.join(); return true; } ~Kandidat() { delete[] _imePrezime; _imePrezime = nullptr; } friend ostream& operator<< (ostream& COUT, Kandidat& obj) { COUT << obj._imePrezime << " " << obj._emailAdresa << " " << obj._brojTelefona << endl; for (size_t i = 0; i < obj._uspjeh.size(); i++) COUT << obj._uspjeh[i]; return COUT; } vector<Uspjeh>& GetUspjeh() { return _uspjeh; } string GetEmail() { return _emailAdresa; } string GetBrojTelefona() { return _brojTelefona; } char* GetImePrezime() { return _imePrezime; } }; const char* GetOdgovorNaPrvoPitanje() { cout << "Pitanje -> Pojasnite ulogu i nacin koristenja generickog tipa future<>?\n"; return "Odgovor -> OVDJE UNESITE VAS ODGOVOR"; } const char* GetOdgovorNaDrugoPitanje() { cout << "Pitanje -> Ukratko opisite na koji nacin se moze izbjeci pojavljivanje vise podobjekata bazne klase u slucaju visestrukog nasljedjivanja?\n"; return "Odgovor -> OVDJE UNESITE VAS ODGOVOR"; } void main() { //cout << PORUKA; //cin.get(); //cout << GetOdgovorNaPrvoPitanje() << endl; //cin.get(); //cout << GetOdgovorNaDrugoPitanje() << endl; //cin.get(); Datum datum19062021(19, 6, 2021), datum20062021(20, 6, 2021), datum30062021(30, 6, 2021), datum05072021(5, 7, 2021); int kolekcijaTestSize = 9; Kolekcija<int, int> kolekcija1(false); 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 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; } //parametri: nazivPredmeta, datum, prva ocjena Predmet Matematika("Matematika", datum19062021, 5), Fizika("Fizika", datum20062021, 5), Hemija("Hemija", datum30062021, 2), Engleski("Engleski", datum05072021, 5); Matematika.AddOcjena(datum05072021, 3); Matematika.AddOcjena(datum05072021, 3); //// ispisuje: naziv predmeta, ocjene (zajedno sa datumom polaganja) i prosjecnu ocjenu na predmetu //// ukoliko predmet nema niti jednu ocjenu prosjecna treba biti jednaka 0 cout << Matematika << endl; ///* //broj telefona mora biti u formatu //- znak + //- pozivni broj drzave (2 ili 3 cifre) //- pozivni broj operatera (2 cifre) npr. 063, 061, 065 pri cemu je broj 0 opcionalan //- prvi dio broja (2 ili 3 cifre) //- razmak ili crtica, oboje opcionalno tj. broj telefona ne mora sadrzavati niti jedno niti drugo // - drugi dio broja (2 ili 3 cifre) //ukoliko broj telefona nije u validnom formatu, njegova vrijednost se postavlja na NOT VALID //*/ //if (ValidirajBrojTelefona("+38761222333")) // cout << "Broj telefona validan" << crt; //if (ValidirajBrojTelefona("+38761222-333")) // cout << "Broj telefona validan" << crt; //if (ValidirajBrojTelefona("+38761222 333")) // cout << "Broj telefona validan" << crt; //if (ValidirajBrojTelefona("+387061222 333")) // cout << "Broj telefona validan" << crt; //if (!ValidirajBrojTelefona("+38761 222 333")) // cout << "Broj NIJE telefona validan" << crt; //if (!ValidirajBrojTelefona("+387 61222 333")) // cout << "Broj NIJE telefona validan" << crt; Kandidat jasmin("Jasmin Azemovic", "jasmin@fit.ba", "+38761222333"); Kandidat adel("Adel Handzic", "adel@edu.fit.ba", "+387061222 333"); Kandidat brojTelefonaNotValid("Ime Prezime", "korisnik@klix.ba", "+387 61222 333"); /* uspjeh (tokom srednjoskolskog obrazovanja) se dodaje za svaki predmet na nivou razreda. tom prilikom onemoguciti: - dodavanje istih (moraju biti identicne vrijednosti svih clanova tipa Predmet) predmeta na nivou jednog razreda, - dodavanje predmeta kod kojih je prosjecna ocjena manja od 2.5 - dodavanje vise od 5 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.). Metoda vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja */ if (jasmin.AddPredmet(DRUGI, Fizika, "Napomena 1")) cout << "Predmet uspjesno dodan!" << crt; if (jasmin.AddPredmet(DRUGI, Hemija, "Napomena 2")) cout << "Predmet uspjesno dodan!" << crt; if (jasmin.AddPredmet(PRVI, Engleski, "Napomena 3")) cout << "Predmet uspjesno dodan!" << crt; if (jasmin.AddPredmet(PRVI, Matematika, "Napomena 4")) cout << "Predmet uspjesno dodan!" << crt; //Matematiku je vec dodana u prvom razredu if (jasmin.AddPredmet(PRVI, Matematika, "Napomena 5")) cout << "Predmet uspjesno dodan!" << crt; ///*nakon evidentiranja uspjeha na bilo kojem predmetu kandidatu se salje email sa porukom: //FROM:info@fit.ba //TO: emailKorisnika //Postovani ime i prezime, evidentirali ste uspjeh za X razred. Dosadasnji uspjeh (prosjek) //na nivou X razreda iznosi Y, a ukupni uspjeh u toku skolovanja iznosi Z. //Pozdrav. //FIT Team. //ukoliko je prosjek na nivou tog razreda veci od 4.5 kandidatu se salje SMS sa porukom: "Svaka cast za uspjeh 4.X u X razredu". Slanje SMS-a izvrsiti samo u slucaju da je broj telefona validna, u protivnom ispisati poruku „BROJ TELEFONA NIJE VALIDAN“ //slanje poruka i emailova implemenitrati koristeci zasebne thread-ove. //*/ cout << jasmin << crt; ////vraca kolekciju predmeta koji sadrze najmanje jednu ocjenu evidentiranu u periodu izmedju proslijedjenih datuma ////float se odnosi na prosjecan broj dana izmedju ostvarenih ocjena na predmetu //Kolekcija<Predmet, float> jasminUspjeh = jasmin(new Datum(18, 06, 2021), new Datum(21, 06, 2021)); //cout << jasminUspjeh << crt; cin.get(); system("pause>0"); }
Editor is loading...