Advertisement
Guest User

Ktobeni Se Obesio

a guest
Feb 6th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.09 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<exception>
  4. #include<vector>
  5. #include<regex>
  6. #include<mutex>
  7. #include<thread>
  8. #include<sstream>
  9. #include<iterator>
  10.  
  11. using namespace std;
  12.  
  13. const char *crt = "\n-------------------------------------------\n";
  14. enum GodinaStudija { PRVA = 1, DRUGA, TRECA };
  15.  
  16. mutex cuvar;
  17.  
  18. char * Alociraj(const char * sadrzaj) {
  19.     if (sadrzaj == nullptr)return nullptr;
  20.     int vel = strlen(sadrzaj) + 1;
  21.     char * temp = new char[vel];
  22.     strcpy_s(temp, vel, sadrzaj);
  23.     return temp;
  24. }
  25.  
  26. template<class T1, class T2>
  27. class Dictionary {
  28.     T1 * _elementi1;
  29.     T2 * _elementi2;
  30.     int * _trenutno;
  31. public:
  32.     Dictionary() {
  33.         _elementi1 = nullptr;
  34.         _elementi2 = nullptr;
  35.         _trenutno = new int(0);
  36.     }
  37.     Dictionary(const Dictionary& d)
  38.     {
  39.         _trenutno = new int(*d._trenutno);
  40.         _elementi1 = new T1[*_trenutno];
  41.         _elementi2 = new T2[*_trenutno];
  42.         for (int i = 0; i < *_trenutno; i++) {
  43.             _elementi1[i] = d.getElement1(i);
  44.             _elementi2[i] = d.getElement2(i);
  45.         }
  46.     }
  47.     ~Dictionary() {
  48.         delete[]_elementi1; _elementi1 = nullptr;
  49.         delete[]_elementi2; _elementi2 = nullptr;
  50.         delete _trenutno; _trenutno = nullptr;
  51.     }
  52.     void AddElement(T1 el1, T2 el2) {
  53.         T1* temp1 = new T1[*_trenutno + 1];
  54.         T2* temp2 = new T2[*_trenutno + 1];
  55.         for (int i = 0; i < *_trenutno; i++) {
  56.             temp1[i] = _elementi1[i];
  57.             temp2[i] = _elementi2[i];
  58.         }
  59.         delete[] _elementi1;
  60.         delete[] _elementi2;
  61.         _elementi1 = temp1;
  62.         _elementi2 = temp2;
  63.         _elementi1[*_trenutno] = el1;
  64.         _elementi2[*_trenutno] = el2;
  65.         *_trenutno += 1;
  66.     }
  67.     void operator=(const Dictionary& d) {
  68.         delete[]_elementi1; _elementi1 = nullptr;
  69.         delete[]_elementi2; _elementi2 = nullptr;
  70.         delete _trenutno; _trenutno = nullptr;
  71.         _trenutno = new int(*d._trenutno);
  72.         _elementi1 = new T1[*_trenutno];
  73.         _elementi2 = new T2[*_trenutno];
  74.         for (int i = 0; i < *_trenutno; i++) {
  75.             _elementi1[i] = d.getElement1(i);
  76.             _elementi2[i] = d.getElement2(i);
  77.         }
  78.     }
  79.  
  80.     Dictionary<T1, T2> getRange(int oD,int dO) {
  81.         if (oD > *_trenutno || dO > *_trenutno)
  82.             throw exception("Greska!");
  83.         Dictionary<T1, T2> novi;
  84.         for (int i = oD; i < dO; i++)
  85.             novi.AddElement(_elementi1[i],_elementi2[i]);
  86.         return novi;
  87.     }
  88.     T1& getElement1(int lokacija)const { return _elementi1[lokacija]; }
  89.     T2& getElement2(int lokacija)const { return _elementi2[lokacija]; }
  90.     int getTrenutno() { return *_trenutno; }
  91.     friend ostream& operator<< (ostream &COUT, const Dictionary &obj) {
  92.         for (size_t i = 0; i < *obj._trenutno; i++)
  93.             COUT << obj.getElement1(i) << " " << obj.getElement2(i) << endl;
  94.         return COUT;
  95.     }
  96. };
  97. class DatumVrijeme {
  98.     int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
  99. public:
  100.     DatumVrijeme(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
  101.         _dan = new int(dan);
  102.         _mjesec = new int(mjesec);
  103.         _godina = new int(godina);
  104.         _sati = new int(sati);
  105.         _minuti = new int(minuti);
  106.     }
  107.     DatumVrijeme(const DatumVrijeme& d)
  108.     {
  109.         _dan = new int(*d._dan);
  110.         _mjesec = new int(*d._mjesec);
  111.         _godina = new int(*d._godina);
  112.         _sati = new int(*d._sati);
  113.         _minuti = new int(*d._minuti);
  114.     }
  115.     ~DatumVrijeme() {
  116.         delete _dan; _dan = nullptr;
  117.         delete _mjesec; _mjesec = nullptr;
  118.         delete _godina; _godina = nullptr;
  119.         delete _sati; _sati = nullptr;
  120.         delete _minuti; _minuti = nullptr;
  121.     }
  122.     void operator=(const DatumVrijeme& d) {
  123.         *_dan = *d._dan;
  124.         *_mjesec = *d._mjesec;
  125.         *_godina = *d._godina;
  126.         *_sati = *d._sati;
  127.         *_minuti = *d._minuti;
  128.     }
  129.     char* ToCharArray() {
  130.         stringstream s;
  131.         if (*_dan < 10)
  132.             s << "0" << *_dan;
  133.         else
  134.             s << *_dan;
  135.         s << ".";
  136.         if (*_mjesec < 10)
  137.             s << "0" << *_mjesec;
  138.         else
  139.             s << *_mjesec;
  140.         s << "." << *_godina << " " << *_sati << ":" << *_minuti << endl;
  141.        
  142.         return Alociraj(s.str().c_str());
  143.     }
  144.     int ToSeconds() {
  145.         return (*_sati) * 60 + *_minuti;
  146.     }
  147.     friend ostream& operator<< (ostream &COUT, const DatumVrijeme &obj) {
  148.         COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti << endl;
  149.         return COUT;
  150.     }
  151. };
  152.  
  153. class Predmet {
  154.     char * _naziv;
  155.     int _ocjena;
  156.     string _napomena;
  157. public:
  158.     Predmet(const char * naziv = "", int ocjena = 0, string napomena = "") {
  159.         _naziv = Alociraj(naziv);
  160.         _ocjena = ocjena;
  161.         _napomena = napomena;
  162.     }
  163.     Predmet(const Predmet& p)
  164.     {
  165.         _naziv = Alociraj(p._naziv);
  166.         _ocjena = p._ocjena;
  167.         _napomena = p._napomena;
  168.     }
  169.     ~Predmet() {
  170.         delete[] _naziv; _naziv = nullptr;
  171.     }
  172.     friend ostream& operator<< (ostream &COUT, Predmet &obj) {
  173.         COUT << obj._naziv << " (" << obj._ocjena << ") " << obj._napomena << endl;
  174.         return COUT;
  175.     }
  176.     void operator=(const Predmet& p) {
  177.         delete[] _naziv;
  178.         _naziv = Alociraj(p._naziv);
  179.         _ocjena = p._ocjena;
  180.         _napomena = p._napomena;
  181.     }
  182.     string GetNapomena() { return _napomena; }
  183.     char * GetNaziv() { return _naziv; }
  184.     int GetOcjena() { return _ocjena; }
  185.  
  186.     void DodajNapomenu(string napomena) {
  187.         _napomena += " " + napomena;
  188.     }
  189. };
  190. class Uspjeh {
  191.     GodinaStudija * _godina;
  192.     //datumvrijeme se odnosi na vrijeme evidentiranja polozenog predmeta
  193.     Dictionary<Predmet, DatumVrijeme> _predmeti;
  194. public:
  195.     Uspjeh(GodinaStudija godina) {
  196.         _godina = new GodinaStudija(godina);
  197.     }
  198.     Uspjeh(const Uspjeh& u)
  199.     {
  200.         _godina = new GodinaStudija(*u._godina);
  201.         _predmeti = u._predmeti;
  202.     }
  203.     ~Uspjeh() { delete _godina; _godina = nullptr; }
  204.  
  205.     bool dodajPredmet(Predmet& p, DatumVrijeme& d) {
  206.         for (int i = 0; i < _predmeti.getTrenutno(); i++)
  207.             if (strcmp(_predmeti.getElement1(i).GetNaziv(), p.GetNaziv()) == 0)
  208.                 return false;
  209.         if(_predmeti.getTrenutno() > 0)
  210.             if (d.ToSeconds() - _predmeti.getElement2(_predmeti.getTrenutno() - 1).ToSeconds() < 60)
  211.                 return false;
  212.         _predmeti.AddElement(Predmet(p),DatumVrijeme(d));
  213.         return true;
  214.     }
  215.     void operator=(const Uspjeh& u) {
  216.         delete _godina;
  217.         _godina = new GodinaStudija(*u._godina);
  218.         _predmeti = u._predmeti;
  219.     }
  220.     Dictionary<Predmet, DatumVrijeme> * GetPredmeti() { return &_predmeti; }
  221.     GodinaStudija * GetGodinaStudija() { return _godina; }
  222.     friend ostream& operator<< (ostream &COUT, const Uspjeh &obj) {
  223.         COUT << *obj._godina << " " << obj._predmeti << endl;
  224.         return COUT;
  225.     }
  226. };
  227.  
  228. class Student {
  229.     char * _imePrezime;
  230.     string _emailAdresa;
  231.     string _brojTelefona;
  232.     vector<Uspjeh> _uspjeh;
  233. public:
  234.     Student(const char * imePrezime, string emailAdresa, string brojTelefona) {
  235.         string praviloMail = "([A-Za-z0-9]){4,}(\\.)([A-Za-z0-9]){4,}([@])(gmail|fit|hotmail|outlook)(\\.)(ba|com|sr|hr)";
  236.         if (regex_match(emailAdresa, regex(praviloMail)))
  237.             _emailAdresa = emailAdresa;
  238.         else
  239.             _emailAdresa = "notSet@fit.ba";
  240.  
  241.         _imePrezime = Alociraj(imePrezime);
  242.        
  243.         _brojTelefona = brojTelefona;
  244.     }
  245.     Student(const Student& s)
  246.     {
  247.         _imePrezime = Alociraj(s._imePrezime);
  248.         _emailAdresa = s._emailAdresa;
  249.         _brojTelefona = s._brojTelefona;
  250.         _uspjeh = s._uspjeh;
  251.     }
  252.     ~Student() {
  253.         delete[] _imePrezime; _imePrezime = nullptr;
  254.     }
  255.     void PosaljiMail(GodinaStudija g, Predmet p) {
  256.         cuvar.lock();
  257.         cout << "FROM: " << "info@fit.ba" << endl;
  258.         cout << "TO: " << _emailAdresa << endl;
  259.         cout << "Postovani " << _imePrezime << ", evidentirali ste uspjeh za " << (int)g << " godinu studija." << endl;
  260.         cout << "Pozdrav." << endl << "FIT Team." << endl;
  261.         cuvar.unlock();
  262.     }
  263.     void PosaljiSMS(Uspjeh u, GodinaStudija g) {
  264.         if (Prosjek(u) > 8) {
  265.             cuvar.lock();
  266.             cout << "Svaka cast za uspjeh " << Prosjek(u) << " ostvaren u " << (int)g << " godini studija." << endl;
  267.             cuvar.unlock();
  268.         }
  269.     }
  270.     float Prosjek(Uspjeh u) {
  271.         int suma = 0;
  272.         int brojac = 0;
  273.         for (int i = 0; i < u.GetPredmeti()->getTrenutno(); i++) {
  274.             suma += u.GetPredmeti()->getElement1(i).GetOcjena();
  275.             brojac++;
  276.         }
  277.         return suma / (float)brojac;
  278.     }
  279.     int BrojPonavljanjaRijeci(string s) {
  280.         regex words_regex(s);
  281.         int brojac = 0;
  282.         for (int i = 0; i < _uspjeh.size(); i++) {
  283.             for (int j = 0; j < _uspjeh[i].GetPredmeti()->getTrenutno(); j++) {
  284.                 string test = _uspjeh[i].GetPredmeti()->getElement1(j).GetNapomena();
  285.                 auto words_begin = sregex_iterator(test.begin(), test.end(), words_regex);
  286.                 auto words_end = sregex_iterator();
  287.                 brojac += distance(words_begin, words_end);
  288.             }              
  289.  
  290.         }
  291.         return brojac;
  292.     }
  293.     bool AddPredmet(Predmet& p,GodinaStudija g,DatumVrijeme& d) {
  294.         for (int i = 0; i < _uspjeh.size(); i++)
  295.             if (*_uspjeh[i].GetGodinaStudija() == g)//godina pronadjena dodati joj predmet
  296.                 if (_uspjeh[i].dodajPredmet(p, d)) {
  297.                     thread m(&Student::PosaljiMail, this, g, p);
  298.                     m.join();
  299.                     thread s(&Student::PosaljiSMS, this, _uspjeh[i], g);
  300.                     s.join();
  301.                     return true;
  302.                 }
  303.                 else return false;
  304.  
  305.         //godina nije pronadjena kreirati godinu i dodati joj predmet godina = uspjeh
  306.         _uspjeh.push_back(Uspjeh(g));
  307.         if (_uspjeh.back().dodajPredmet(p, d)) {
  308.             thread ma(&Student::PosaljiMail, this, g, p);
  309.             ma.join();
  310.             thread sm(&Student::PosaljiSMS, this, _uspjeh.back(), g);
  311.             sm.join();
  312.             return true;
  313.         }
  314.         else return false;
  315.     }
  316.     friend ostream& operator<< (ostream &COUT, Student &obj) {
  317.         COUT << obj._imePrezime << " " << obj._emailAdresa << " " << obj._brojTelefona << endl;
  318.         vector<Uspjeh>::iterator it = obj._uspjeh.begin();
  319.         while (it != obj._uspjeh.end()) {
  320.             cout << *it << endl;
  321.             it++;
  322.         }
  323.         return COUT;
  324.     }
  325.     vector<Uspjeh> * GetUspjeh() { return &_uspjeh; }
  326.     string GetEmail() { return _emailAdresa; }
  327.     string GetBrojTelefona() { return _brojTelefona; }
  328.     char * GetImePrezime() { return _imePrezime; }
  329. };
  330.  
  331. void main() {
  332.     /****************************************************************************
  333.     1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  334.     2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  335.     3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  336.     4. PROGRAMSKI CODE SE TAKOĐER NALAZI U FAJLU CODE.TXT
  337.     5. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUČAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOĆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
  338.     6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  339.     ****************************************************************************/
  340.     //cout << "NA KRAJU ISPITA, RAD PREDAJTE U ODGOVARAJUCI FOLDER NA FTP SERVERU (INTEGRALNI)!" << endl;
  341.     DatumVrijeme temp,
  342.         datum19062019_1015(19, 6, 2019, 10, 15),
  343.         datum20062019_1115(20, 6, 2019, 11, 15),
  344.         datum30062019_1215(30, 6, 2019, 12, 15),
  345.         datum05072019_1231(5, 7, 2019, 12, 31);
  346.     //funkcija ToCharArray vraca datum i vrijeme kao char *. konverziju izvrsiti koristeci stringstream objekat.
  347.     ////voditi racuna o tome da se izmedju datuma i vremena nalazi samo jedan razmak, te da su vrijednosti dana i mjeseca iskazane kao dvije cifre
  348.     cout << datum19062019_1015.ToCharArray() << endl;//treba ispisati: 19/06/2019 10:15
  349.     temp = datum05072019_1231;
  350.     cout << temp.ToCharArray() << endl;//treba ispisati: 05/07/2019 12:31
  351.  
  352.     const int DictionaryTestSize = 9;
  353.     Dictionary<int, int> Dictionary1;
  354.     for (size_t i = 0; i < DictionaryTestSize; i++)
  355.         Dictionary1.AddElement(i + 1, i*i);
  356.  
  357.     try {
  358.         //vraca elemente kolekcije koji se nalaze na lokacijama definisanim vrijednostima parametara (npr. 2 - 7).
  359.         //funkcija baca izuzetak u slucaju da se zahtijeva lokacija koja ne postoji ili je vrijednost posljednje lokacije manja od pocetne
  360.         Dictionary<int, int> opseg = Dictionary1.getRange(2, 7);
  361.         cout << opseg << endl;
  362.         Dictionary1.getRange(7, 11);
  363.     }
  364.     catch (exception& err) {
  365.         cout << err.what() << endl;
  366.     }
  367.     cout << Dictionary1 << endl;
  368.  
  369.     Dictionary<int, int> Dictionary2 = Dictionary1;
  370.     cout << Dictionary2 << crt;
  371.  
  372.     Dictionary<int, int> Dictionary3;
  373.     Dictionary3 = Dictionary1;
  374.     cout << Dictionary3 << crt;
  375.  
  376.     //napomena se moze dodati i prilikom kreiranja objekta
  377.     Predmet MAT("Matematika", 7, "Ucesce na takmicenju"),
  378.         UIT("Uvod u informacijske tehnologije", 9),
  379.         RM("Racunarske mreze", 8),
  380.         EN("Engleski jezik", 6);
  381.     UIT.DodajNapomenu("Pohvala za ostvareni uspjeh");
  382.     cout << MAT << endl;
  383.  
  384.     /*
  385.     email adresa mora biti u formatu: text-text@ nakon cega slijedi neka od sljedecih domena: hotmail.com ili outlook.com ili fit.ba. Pod text se podrazumijeva bilo koje slovo, malo ili veliko.
  386.     u slucaju da email adresa nije validna, postaviti je na defaultnu: notSet@fit.ba
  387.     za provjeru koristiti regex
  388.     */
  389.     Student jasmin("Jasmin Azemovic", "jasmin.azemovic@hotmail.com", "033 281 172");
  390.     Student adel("Adel Handzic", "adel.handzic@fit.ba", "033 281 170");
  391.     Student emailNotValid("Ime Prezime", "korisnik@lazna.ba", "033 281 170");
  392.  
  393.     /*
  394.     uspjeh se dodaje za svaki predmet na nivou godine studija.
  395.     tom prilikom onemoguciti:
  396.     - dodavanje istoimenih predmeta na nivou jedne godine,
  397.     - dodavanje vise predmeta u kratkom vremenskom periodu (na nivou jedne godine, razmak izmedju dodavanja pojedinih predmeta mora biti najmanje 1 sat).
  398.     godine (predmeti ili uspjeh) ne moraju biti dodavani sortiranim redoslijedom (npr. prvo se moze dodati uspjeh za drugu godinu, pa onda za prvu godinu i sl.).
  399.     Funkcija vraca true ili false u zavisnosti od (ne)uspjesnost izvrsenja
  400.     */
  401.     if (jasmin.AddPredmet(UIT, DRUGA, datum20062019_1115))
  402.         cout << "Predmet uspjesno dodan!" << crt;
  403.     if (jasmin.AddPredmet(RM, DRUGA, datum30062019_1215))
  404.         cout << "Predmet uspjesno dodan!" << crt;
  405.     if (jasmin.AddPredmet(EN, PRVA, datum19062019_1015))
  406.         cout << "Predmet uspjesno dodan!" << crt;
  407.     if (jasmin.AddPredmet(MAT, PRVA, datum20062019_1115))
  408.         cout << "Predmet uspjesno dodan!" << crt;
  409.     //ne treba dodati MAT jer je vec dodana u prvoj godini
  410.     if (jasmin.AddPredmet(MAT, PRVA, datum05072019_1231))
  411.         cout << "Predmet uspjesno dodan!" << crt;
  412.     //ne treba dodati UIT jer nije prosao 1 sat od dodavanja posljednjeg predmeta
  413.     if (jasmin.AddPredmet(UIT, PRVA, datum20062019_1115))
  414.         cout << "Predmet uspjesno dodan!" << crt;
  415.     /*nakon evidentiranja uspjeha na bilo kojem predmetu tj. prilikom uspjesno izvrsene funkcije AddPredmet, Studentu se salje email sa sadrzajem:
  416.     //FROM:info@fit.ba
  417.     //TO: emailStudenta
  418.     //Postovani ime i prezime, evidentirali ste uspjeh za X godinu studija.
  419.     //Pozdrav.
  420.     //FIT Team.
  421.     //ukoliko je, nakon dodavanja predmeta, prosjek na nivou te godine veci od 8.0 Studentu se, pored email-a, salje i SMS sa sadrzajem: "Svaka cast za uspjeh X.X ostvaren u X godini studija".
  422.     //slanje poruka i emailova implemenitrati koristeci zasebne thread-ove.
  423.     */
  424.     cout << "USPJEH ISPISATI KORISTEĆI OSTREAM_ITERATOR" << endl;
  425.     cout << jasmin << endl;
  426.     //vraca broj ponavljanja odredjene rijeci u napomenama, koristiti sregex_iterator
  427.     cout << "Rijec takmicenje se pojavljuje " << jasmin.BrojPonavljanjaRijeci("takmicenju") << " puta." << endl;
  428.  
  429.     ////vraca niz predmeta koji su evidentiranih u periodu izmedju vrijednosti proslijedjenih parametara
  430.     //vector<Predmet> jasminUspjeh = jasmin(new DatumVrijeme(18, 06, 2019, 10, 15), new DatumVrijeme(21, 06, 2019, 10, 10));
  431.     //for (Predmet u : jasminUspjeh)
  432.     //  cout << u << endl;
  433.  
  434.     //Uspjeh * uspjeh_I_godina = jasmin["PRVA"];//vraca uspjeh Studenta ostvaren u prvoj godini studija
  435.     //if (uspjeh_I_godina != nullptr)
  436.     //  cout << *uspjeh_I_godina << endl;
  437.  
  438.     //cin.get();
  439.     system("pause>0");
  440. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement