Advertisement
Guest User

Untitled

a guest
Aug 24th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 18.36 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include<vector>
  4. #include<string>
  5. #include<regex>
  6. #include<thread>
  7. using namespace std;
  8.  
  9. /****************************************************************************
  10. 1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
  11. 2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
  12. 3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
  13. 4. 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.
  14. 5. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
  15. ****************************************************************************/
  16.  
  17. const char* nedozvoljena_operacija = "Nedozvoljena operacija";
  18. const char* not_set = "NOT_SET";
  19.  
  20. enum Sortiranje { ASC, DESC };
  21. enum Predmet { MATEMATIKA, FIZIKA, HEMIJA, GEOGRAFIJA, NOT_SET };
  22. enum Razred { I = 1, II, III, IV };
  23.  
  24.  
  25. string GetNazivPredmeta(Predmet p) {
  26.     switch (p)
  27.     {
  28.     case MATEMATIKA:
  29.         return "MATEMATIKA";
  30.     case FIZIKA:
  31.         return "FIZIKA";
  32.  
  33.     case HEMIJA:
  34.         return "HEMIJA";
  35.     case GEOGRAFIJA:
  36.         return "GEOGRAFIJA";
  37.     case NOT_SET:
  38.         return "NOT_SET";
  39.     default:
  40.         return "";
  41.     }
  42. }
  43. char* AlocirajNizKaraktera(const char* sadrzaj) {
  44.     if (sadrzaj == nullptr)
  45.         return nullptr;
  46.     int vel = strlen(sadrzaj) + 1;
  47.     char* temp = new char[vel];
  48.     strcpy_s(temp, vel, sadrzaj);
  49.     return temp;
  50. }
  51. template <class T1, class T2, int max>
  52. class Kolekcija {
  53.     T1* _elementi1[max] = { nullptr };
  54.     T2* _elementi2[max] = { nullptr };
  55.     int _trenutnoElemenata;
  56.     bool _dozvoliDupliranje;
  57.     Sortiranje _sortiranje;
  58. public:
  59.     Kolekcija(Sortiranje sortiranje = ASC, bool dozvoliDupliranje = true) {
  60.         _trenutnoElemenata = 0;
  61.         _sortiranje = sortiranje;
  62.         _dozvoliDupliranje = dozvoliDupliranje;
  63.     }
  64.     Kolekcija(const Kolekcija& obj) {
  65.         _trenutnoElemenata = obj._trenutnoElemenata;
  66.         _dozvoliDupliranje = obj._dozvoliDupliranje;
  67.         _sortiranje = obj._sortiranje;
  68.  
  69.         for (size_t i = 0; i < _trenutnoElemenata; i++)
  70.         {
  71.             _elementi1[i] = new T1(*obj._elementi1[i]);
  72.             _elementi2[i] = new T2(*obj._elementi2[i]);
  73.         }
  74.     }
  75.     Kolekcija& operator=(const Kolekcija& obj) {
  76.         if (this == &obj)
  77.             return *this;
  78.         for (size_t i = 0; i < _trenutnoElemenata; i++)
  79.         {
  80.             delete _elementi1[i];
  81.             delete _elementi2[i];
  82.  
  83.             _elementi1[i] = nullptr;
  84.             _elementi2[i] = nullptr;
  85.         }
  86.  
  87.         _trenutnoElemenata = obj._trenutnoElemenata;
  88.         _dozvoliDupliranje = obj._dozvoliDupliranje;
  89.         _sortiranje = obj._sortiranje;
  90.  
  91.         for (size_t i = 0; i < _trenutnoElemenata; i++)
  92.         {
  93.             _elementi1[i] = new T1(*obj._elementi1[i]);
  94.             _elementi2[i] = new T2(*obj._elementi2[i]);
  95.         }
  96.         return *this;
  97.  
  98.     }
  99.     ~Kolekcija() {
  100.         for (size_t i = 0; i < _trenutnoElemenata; i++) {
  101.             delete _elementi1[i]; _elementi1[i] = nullptr;
  102.             delete _elementi2[i]; _elementi2[i] = nullptr;
  103.         }
  104.     }
  105.  
  106.     bool Sadrzi(T1 e1, T2 e2) {
  107.         for (size_t i = 0; i < _trenutnoElemenata; i++)
  108.         {
  109.             if (*_elementi1[i] == e1 && *_elementi2[i] == e2)
  110.                 return true;
  111.         }
  112.  
  113.         return false;
  114.     }
  115.     void Sortiraj() {
  116.         int i, j, flag = 1;    // set flag to 1 to start first pass
  117.         T1* temp1;
  118.         T2* temp2;
  119.         for (i = 1; (i <= _trenutnoElemenata) && flag; i++)
  120.         {
  121.             flag = 0;
  122.             for (j = 0; j < (_trenutnoElemenata - 1); j++)
  123.             {
  124.                 if (_sortiranje == DESC) {
  125.                     if ((*_elementi1[j + 1]) > (*_elementi1[j])  )      // ascending order simply changes to <
  126.                     {
  127.                        
  128.                         temp1 = _elementi1[j];             // swap elements
  129.                         _elementi1[j] = _elementi1[j + 1];
  130.                         _elementi1[j + 1] = temp1;
  131.  
  132.                         temp2 = _elementi2[j];             // swap elements
  133.                         _elementi2[j] = _elementi2[j + 1];
  134.                         _elementi2[j + 1] = temp2;
  135.  
  136.                         flag = 1;               // indicates that a swap occurred.
  137.                     }
  138.                 }
  139.                 else {
  140.                     if ((*_elementi1[j + 1]) < (*_elementi1[j]))
  141.                     {
  142.                         temp1 = _elementi1[j];             // swap elements
  143.                         _elementi1[j] = _elementi1[j + 1];
  144.                         _elementi1[j + 1] = temp1;
  145.  
  146.                         temp2 = _elementi2[j];             // swap elements
  147.                         _elementi2[j] = _elementi2[j + 1];
  148.                         _elementi2[j + 1] = temp2;
  149.  
  150.                         flag = 1;               // indicates that a swap occurred.
  151.                     }
  152.                 }
  153.  
  154.  
  155.             }
  156.         }
  157.     }
  158.     void AddElement(T1 e1, T2 e2) {
  159.         if (_trenutnoElemenata >= max)
  160.             throw exception("Kolekcija je puna");
  161.  
  162.         if (!_dozvoliDupliranje && Sadrzi(e1, e2))
  163.             throw exception("Kolekcija već sadrži elemente");
  164.  
  165.         _elementi1[_trenutnoElemenata] = new T1(e1);
  166.         _elementi2[_trenutnoElemenata] = new T2(e2);
  167.         _trenutnoElemenata++;
  168.  
  169.         Sortiraj();
  170.     }
  171.     int GetTrenutno() const { return _trenutnoElemenata; }
  172.     int GetMax() const { return max; }
  173.  
  174.     T1& GetElement1(int lokacija) const {
  175.         if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  176.             throw exception(nedozvoljena_operacija);
  177.         return *_elementi1[lokacija];
  178.     }
  179.     T2& GetElement2(int lokacija) const {
  180.         if (lokacija < 0 || lokacija >= _trenutnoElemenata)
  181.             throw exception(nedozvoljena_operacija);
  182.         return *_elementi2[lokacija];
  183.     }
  184.     void SetElement2(int lokacija, T2 ele2) {
  185.         _elementi2[lokacija] = ele2;
  186.     }
  187.     friend ostream& operator<<(ostream& COUT, const Kolekcija& obj) {
  188.         for (size_t i = 0; i < obj.GetTrenutno(); i++)
  189.             COUT << obj.GetElement1(i) << " " << obj.GetElement2(i) << endl;
  190.         return COUT;
  191.     }
  192. };
  193.  
  194. class Aktivnost {
  195.     shared_ptr<Razred> _razred;
  196.     string _opis;
  197.     int _ocjena;//1-5
  198. public:
  199.     Aktivnost(Razred razred = I, int ocjena = 0, string opis = not_set) {
  200.         _ocjena = ocjena;
  201.         _opis = opis;
  202.         _razred = make_shared<Razred>(razred);
  203.     }
  204.     int  GetOcjenu() const { return _ocjena; }
  205.     string GetOpis() const { return _opis; }
  206.     Razred GetRazred() const { return *_razred; }
  207.     bool operator==(Aktivnost& obj) {
  208.         return (*_razred) == *obj._razred && _ocjena == obj._ocjena && _opis == obj._opis;
  209.     }
  210.  
  211.     bool operator>(Aktivnost& obj) {
  212.         return *(obj._razred) > * _razred;
  213.     }
  214.     bool operator<(Aktivnost& obj) {
  215.         return *(obj._razred) < *_razred;
  216.     }
  217.     friend ostream& operator<<(ostream& COUT, const Aktivnost& obj) {
  218.         COUT << "Razred: " << *obj._razred << " Ocjena: " << obj._ocjena << " Opis:" << obj._opis << endl;
  219.         return COUT;
  220.     }
  221.     bool JeIstiRazred(Aktivnost& a) {
  222.         return (*_razred) == a.GetRazred();
  223.     }
  224. };
  225.  
  226. class Polaznik {
  227. protected:
  228.     char* _imePrezime;
  229.     string _brojTelefona;
  230. public:
  231.     Polaznik(string imePrezime, string brojTelefona) :
  232.         _imePrezime(AlocirajNizKaraktera(imePrezime.c_str())) {
  233.         _brojTelefona = brojTelefona;
  234.     }
  235.     Polaznik(const Polaznik& obj) {
  236.         _imePrezime = AlocirajNizKaraktera(obj._imePrezime);
  237.         _brojTelefona = obj._brojTelefona;
  238.     }
  239.     Polaznik& operator=(const Polaznik& obj) {
  240.         if (this == &obj)
  241.             return *this;
  242.  
  243.         delete[]_imePrezime;
  244.  
  245.         _imePrezime = AlocirajNizKaraktera(obj._imePrezime);
  246.         _brojTelefona = obj._brojTelefona;
  247.  
  248.         return *this;
  249.     }
  250.     ~Polaznik() { delete[] _imePrezime; }
  251.     char* GetImePrezime() { return _imePrezime; }
  252.     string GetTelefon() { return _brojTelefona; }
  253.     virtual void PredstaviSe() = 0;
  254. };
  255.  
  256. class Ucenik : public Polaznik {
  257.     Kolekcija<Predmet, Aktivnost, 16> * _aktivnosti;
  258.    
  259.  
  260. public:
  261.     Ucenik(string imePrezime, string brojTelefona) : Polaznik(imePrezime, brojTelefona) {
  262.         _aktivnosti = new Kolekcija<Predmet, Aktivnost, 16>();
  263.     }
  264.     Ucenik(const Ucenik& obj) : Polaznik(obj) {
  265.         _aktivnosti = new Kolekcija<Predmet, Aktivnost, 16>(*obj._aktivnosti);
  266.     }
  267.     Ucenik& operator=(const Ucenik& obj) {
  268.         if (this == &obj)
  269.             return *this;
  270.  
  271.         Polaznik::operator=(obj);
  272.         *_aktivnosti = *obj._aktivnosti;
  273.  
  274.  
  275.  
  276.         Polaznik::operator=(obj);
  277.         return *this;
  278.  
  279.     }
  280.     int BrojAktivnostiURazredu(Razred r) {
  281.         int ukupno = 0;
  282.         for (size_t i = 0; i < _aktivnosti->GetTrenutno(); i++)
  283.         {
  284.             Razred razredAktivnost = _aktivnosti->GetElement2(i).GetRazred();
  285.             if (razredAktivnost == r)
  286.                 ukupno++;
  287.         }
  288.  
  289.         return ukupno;
  290.     }
  291.  
  292.     float GetProsjek() {
  293.         float suma = 0;
  294.         int brojac = 0;
  295.         for (size_t i = 0; i < _aktivnosti->GetTrenutno(); i++)
  296.         {
  297.             suma += _aktivnosti->GetElement2(i).GetOcjenu();
  298.             brojac++;
  299.         }
  300.  
  301.         if (brojac != 0)
  302.             return suma / brojac;
  303.         return suma;
  304.     }
  305.     bool ImaValidanBrojTelefona() {
  306.         return _brojTelefona != not_set;
  307.     }
  308.     bool RazredSadrziAktivnostIzIstogPredmeta(Predmet p, Aktivnost a) {
  309.         for (size_t i = 0; i < _aktivnosti->GetTrenutno(); i++)
  310.         {
  311.             Aktivnost aktivnost = _aktivnosti->GetElement2(i);
  312.             Predmet predmet = _aktivnosti->GetElement1(i);
  313.             if (aktivnost.JeIstiRazred(a) && predmet == p) {
  314.                 return true;
  315.             }
  316.         }
  317.         return false;
  318.     }
  319.     void DodajAktivnost(Predmet p, Aktivnost a) {
  320.         _aktivnosti->AddElement(p, a);
  321.     }
  322.     ~Ucenik() { delete _aktivnosti; _aktivnosti = nullptr; }
  323.  
  324.  
  325.     void PredstaviSe() {
  326.        
  327.         cout << _imePrezime << " - " << _brojTelefona << endl;
  328.     }
  329.     Kolekcija<Predmet, Aktivnost, 16> & GetAktivnosti() { return *_aktivnosti; };
  330.     friend ostream& operator<<(ostream& COUT, Ucenik& n)
  331.     {
  332.         COUT <<  n._imePrezime << " " << n._brojTelefona << endl;
  333.         for (size_t i = 0; i < n._aktivnosti->GetTrenutno(); i++)
  334.         {
  335.             Predmet p = n._aktivnosti->GetElement1(i);
  336.             Aktivnost a = n._aktivnosti->GetElement2(i);
  337.  
  338.             COUT << "Predmet " << GetNazivPredmeta(p) << endl;
  339.             COUT << a << endl;
  340.         }
  341.         return COUT;
  342.     }
  343. };
  344.  
  345. void PosaljiSmsPoruku(string broj, float ocjena, Razred r) {
  346.     cout << "Slanje SMS-a na broj " << broj << ": " << "Uspjesno ste okoncali aktivnosti u okviru " << r << " razreda sa prosjecnom ocjenom " << ocjena << endl;
  347. }
  348. class Skola {
  349.     char* _naziv;
  350.     vector<Ucenik>  _ucenici;
  351. public:
  352.     Skola(const char* naziv = nullptr) {
  353.         _naziv = AlocirajNizKaraktera(naziv);
  354.        
  355.     }
  356.     Skola(const Skola& obj) {
  357.         _naziv = AlocirajNizKaraktera(obj._naziv);
  358.         _ucenici = obj._ucenici;
  359.  
  360.     }
  361.     Skola& operator=(const Skola& obj) {
  362.         if (this == &obj)
  363.             return *this;
  364.  
  365.         delete[] _naziv;
  366.  
  367.         _naziv = AlocirajNizKaraktera(obj._naziv);
  368.         _ucenici = obj._ucenici;
  369.  
  370.         return *this;
  371.     }
  372.     ~Skola() {
  373.         delete[] _naziv; _naziv = nullptr;
  374.     }
  375.     char* GetNaziv()const { return _naziv; }
  376.     vector<Ucenik>& GetUcenici() { return _ucenici; };
  377.  
  378.  
  379.  
  380.     ///*U fajl (npr. Gimnazija.txt) upisati podatke (podatke upisati kao obicni tekst) o skoli i svim ucenicima.
  381.     //Nakon upisa, potrebno je ispisati sadrzaj fajla. Parametar tipa bool oznacava da li ce ranije dodani sadrzaj fajla prethodno biti pobrisan*/
  382.  
  383.     bool SpasiUFajl(string nazivFajla, bool izbrisiPostojece = false) {
  384.         ofstream mojFajl;
  385.         if (izbrisiPostojece)
  386.             mojFajl.open(nazivFajla, ios::out | ios::trunc );
  387.         else
  388.             mojFajl.open(nazivFajla, ios::out | ios::app);
  389.  
  390.         if (!mojFajl.is_open())
  391.             return false;
  392.  
  393.         mojFajl << *this;
  394.         mojFajl.close();
  395.     }
  396.  
  397.  
  398.     pair<Polaznik*, float> GetNajboljegUcenika() {
  399.         float maxProsjek = 0;
  400.         int lokMaxProsjeka = -1;
  401.         for (size_t i = 0; i < _ucenici.size(); i++)
  402.         {
  403.             float tempProsjek = _ucenici[i].GetProsjek();
  404.             if (tempProsjek > maxProsjek)
  405.             {
  406.                 maxProsjek = tempProsjek;
  407.                 lokMaxProsjeka = i;
  408.             }
  409.         }
  410.         if (lokMaxProsjeka == -1)
  411.             throw exception("Lista učenika je prazna");
  412.         Polaznik* p = &_ucenici[lokMaxProsjeka];
  413.  
  414.         return make_pair(p, maxProsjek);
  415.     }
  416.  
  417.     Ucenik* GetUcenikByName(string ucenik) {
  418.         for (size_t i = 0; i < _ucenici.size(); i++)
  419.         {
  420.             if (_ucenici[i].GetImePrezime() == ucenik)
  421.                 return &_ucenici[i];
  422.         }
  423.         return nullptr;
  424.     }
  425.  
  426.     bool RazredVecSadrziAktivnostIzIstogPredmeta(Predmet predmet, Aktivnost aktivnost) {
  427.         for (size_t i = 0; i < _ucenici.size(); i++)
  428.         {
  429.             if (_ucenici[i].RazredSadrziAktivnostIzIstogPredmeta(predmet, aktivnost))
  430.                 return true;
  431.         }
  432.         return false;
  433.     }
  434.     bool RazredImaPopunjeneAktivnosti(Razred r) {
  435.         int ukupno = 0;
  436.         for (size_t i = 0; i < _ucenici.size(); i++)
  437.         {
  438.             ukupno += _ucenici[i].BrojAktivnostiURazredu(r);
  439.             if (ukupno >= 4)
  440.                 return true;
  441.         }
  442.         return false;
  443.     }
  444.     /*na nivou svakog razreda se mogu evidentirati maksimalno 4 aktivnosti, a takodjer,
  445.     na nivou razreda se ne smiju ponavljati aktivnosti iz istog predmeta*/
  446.  
  447.  
  448.     /*u slucaju da je ucenik uspjesno (ocjenom vecom od 1) realizovao aktivnosti na nivou odredjenog razreda, te posjeduje validan broj telefona,
  449.         u okviru zasebnog thread-a se salje SMS sa sadrzajem "Uspjesno ste okoncali aktivnosti u okviru X razreda sa prosjecnom ocjenom X.X"*/
  450.     bool DodajAktivnost(string imeUcenika, Predmet predmet, Aktivnost aktivnost) {
  451.  
  452.         if (RazredVecSadrziAktivnostIzIstogPredmeta(predmet, aktivnost))
  453.             return false;
  454.  
  455.         if (RazredImaPopunjeneAktivnosti(aktivnost.GetRazred())) {
  456.             return false;
  457.         }
  458.  
  459.         Ucenik* ucenik = GetUcenikByName(imeUcenika);
  460.         if (ucenik == nullptr)
  461.             return false;
  462.  
  463.         try {
  464.             ucenik->DodajAktivnost(predmet, aktivnost);
  465.  
  466.             if (aktivnost.GetOcjenu() > 1 && ucenik->ImaValidanBrojTelefona()) {
  467.                
  468.                 thread t(PosaljiSmsPoruku, ucenik->GetTelefon(), aktivnost.GetOcjenu(), aktivnost.GetRazred());
  469.                 t.join();
  470.             }
  471.             return true;
  472.         }
  473.         catch (exception e) {
  474.             return false;
  475.         }
  476.  
  477.     }
  478.  
  479.     bool SadrziUcenika(string brojTelefona, string imePrezime) {
  480.         for (size_t i = 0; i < _ucenici.size(); i++)
  481.         {
  482.             if (_ucenici[i].GetImePrezime() == imePrezime || _ucenici[i].GetTelefon() == brojTelefona)
  483.                 return true;
  484.         }
  485.         return false;
  486.     }
  487.  
  488.     bool BrojTelefonaUIspravnomObliku(string broj) {
  489.  
  490.         //+387(6X)XXX - XXX ili +387 6X XXX - XXX
  491.         regex praviloSaZagradama = regex("(\\+)(\\d{3})(\\()([6]\\d)(\\))(\\d{3})([-])(\\d{3})");
  492.         regex praviloBezZagrada = regex("(\\+)(\\d{3})(\\s)([6]\\d)(\\s)(\\d{3})([-])(\\d{3})");
  493.  
  494.         if (regex_match(broj, praviloSaZagradama)) {
  495.             return true;
  496.         }
  497.         else if (regex_match(broj, praviloBezZagrada)) {
  498.             return true;
  499.         }
  500.         else {
  501.             return false;
  502.         }
  503.     }
  504.  
  505.     //dodaje novog ucenika u skolu
  506.     /*
  507.     koristeci regex, osigurati sljedeci format za broj telefona: +387(6X)XXX-XXX ili +387 6X XXX-XXX
  508.     onemoguciti pojavljivanje samo jedne zagrade, a ukoliko format nije adekvatna koristiti vrijednost not_set
  509.  
  510.     */
  511.     /*onemoguciti dodavanje ucenika sa istim imenom i prezimenom ili brojem telefona*/
  512.  
  513.  
  514.  
  515.     void operator()  (string ucenik, string brojTelefona) {
  516.         if (SadrziUcenika(ucenik, brojTelefona))
  517.         {
  518.             throw exception("Ucenik je vec dodan");
  519.         }
  520.  
  521.         if (!BrojTelefonaUIspravnomObliku(brojTelefona))
  522.             brojTelefona = not_set;
  523.  
  524.         Ucenik noviUcenik = Ucenik(ucenik, brojTelefona);
  525.  
  526.         _ucenici.push_back(noviUcenik);
  527.     }
  528.     friend ostream& operator<<(ostream& COUT, Skola& obj) {
  529.         COUT << "Skola: " << obj._naziv << endl;
  530.         COUT << "Ucenici: " << endl;
  531.         for (size_t i = 0; i < obj._ucenici.size(); i++)
  532.             COUT << obj._ucenici[i] << endl;
  533.         return COUT;
  534.  
  535.  
  536.     }
  537. };
  538.  
  539. int main() {
  540.    
  541.     Kolekcija<int, int, 10> kolekcija1(DESC, false);
  542.     try {
  543.         kolekcija1.AddElement(1, 2);
  544.         //dupliranje elemenata nije dozvoljeno
  545.         kolekcija1.AddElement(1, 2);
  546.     }
  547.     catch (exception& ex) {
  548.         cout << ex.what();
  549.     }
  550.  
  551.     /*nakon svakog dodavanja, elemente sortirati prema T1 i vrijednosti atributa _sortiranje*/
  552.     for (size_t i = 1; i < kolekcija1.GetMax() - 1; i++)
  553.         kolekcija1.AddElement(rand(), rand());
  554.  
  555.     cout << kolekcija1 << endl;
  556.  
  557.     try {
  558.         //prekoracen maksimalan broj elemenata
  559.         kolekcija1.AddElement(rand(), rand());
  560.     }
  561.     catch (exception& ex) {
  562.         cout << ex.what();
  563.     }
  564.     cout << kolekcija1 << endl;
  565.  
  566.     Kolekcija<int, int, 10> kolekcija2(kolekcija1);
  567.     cout << kolekcija2 << endl;
  568.  
  569.     Skola gimnazijaMostar("GIMNAZIJA MOSTAR");
  570.     //dodaje novog ucenika u skolu
  571.     gimnazijaMostar("Jasmin Azemovic", "+387(61)111-222");
  572.     gimnazijaMostar("Adel Handzic", "+387(61)333-444");
  573.  
  574.     /*
  575.     koristeci regex, osigurati sljedeci format za broj telefona: +387(6X)XXX-XXX ili +387 6X XXX-XXX
  576.     onemoguciti pojavljivanje samo jedne zagrade, a ukoliko format nije adekvatna koristiti vrijednost not_set
  577.     */
  578.  
  579.     gimnazijaMostar("Telefon NotValidFormat", "387 61)333-444");
  580.  
  581.     try
  582.     {
  583.         /*onemoguciti dodavanje ucenika sa istim imenom i prezimenom ili brojem telefona*/
  584.         gimnazijaMostar("Adel Handzic", "+387(61)333-444");
  585.     }
  586.     catch (exception& ex)
  587.     {
  588.         cout << ex.what() << endl;
  589.     }
  590.     if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", MATEMATIKA,
  591.         Aktivnost(I, 4, "Priprema za takmicenje iz Matematije koje se odrzava u Konjicu 07.02.2019")))
  592.         cout << "Aktivnost uspjesno dodana" << endl;
  593.     /*na nivou svakog razreda se mogu evidentirati maksimalno 4 aktivnosti,
  594.     a takodjer, na nivou razreda se ne smiju ponavljati aktivnosti iz istog predmeta*/
  595.     if (!gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", MATEMATIKA, Aktivnost(I, 4, "Aktivnosti iz matematike")))
  596.         cout << "Aktivnost nije uspjesno dodana" << endl;
  597.     if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", FIZIKA, Aktivnost(I, 4, "Analiza stepena apsorpcije materijala ")))
  598.         cout << "Aktivnost uspjesno dodana" << endl;
  599.     /*u slucaju da je ucenik uspjesno (ocjenom vecom od 1) realizovao aktivnosti na nivou odredjenog razreda,
  600.     te posjeduje validan broj telefona,
  601.     u okviru zasebnog thread-a se salje SMS sa sadrzajem
  602.     "Uspjesno ste okoncali aktivnosti u okviru X razreda sa prosjecnom ocjenom X.X"*/
  603.     if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", GEOGRAFIJA, Aktivnost(I, 4, "Izrada 5 reljefa Mostara")))
  604.         cout << "Aktivnost uspjesno dodana" << endl;
  605.     if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", HEMIJA, Aktivnost(I, 4, "Izrada 5 reljefa Mostara")))
  606.         cout << "Aktivnost uspjesno dodana" << endl;
  607.  
  608.     if (gimnazijaMostar.DodajAktivnost("Jasmin Azemovic", NOT_SET, Aktivnost(I, 4, "Izrada 5 reljefa Mostara")))
  609.         cout << "Aktivnost uspjesno dodana" << endl;
  610.  
  611.  
  612.     if (gimnazijaMostar.DodajAktivnost("Adel Handzic", MATEMATIKA, Aktivnost(II, 5, "Izrada skripte na temu integralni racun")))
  613.         cout << "Aktivnost uspjesno dodana" << endl;
  614.  
  615.     //ispisuje sve ucenike i njihove aktivnosti
  616.     cout << gimnazijaMostar << endl;
  617.  
  618.  
  619.     pair<Polaznik*, float> par = gimnazijaMostar.GetNajboljegUcenika();
  620.     cout << "Najbolji ucenik je " << par.first->GetImePrezime() << " sa prosjekom " << par.second << endl;
  621.  
  622.     /*U fajl (npr. Gimnazija.txt) upisati podatke (podatke upisati kao obicni tekst) o skoli i svim ucenicima.
  623.     Nakon upisa, potrebno je ispisati sadrzaj fajla. Parametar tipa bool oznacava da li ce ranije dodani
  624.     sadrzaj fajla prethodno biti pobrisan*/
  625.  
  626.     if (gimnazijaMostar.SpasiUFajl("Gimnazija.txt", true))
  627.         cout << "Podaci o ucenicima uspjesno pohranjeni u fajl" << endl;
  628.     if (gimnazijaMostar.SpasiUFajl("Gimnazija.txt", false))
  629.         cout << "Podaci o ucenicima uspjesno pohranjeni u fajl" << endl;
  630.  
  631.     cin.get();
  632.     system("pause>0");
  633.     return 0;
  634. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement