Advertisement
Guest User

Untitled

a guest
Dec 30th, 2016
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.53 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <conio.h>
  4. #include <string>
  5. #include <vector>
  6. #include <regex>
  7. using namespace std;
  8.  
  9. const string crt = "\n----------------------------------------------------------------------\n";
  10.  
  11. bool ValidirajPodatak(string podatak, string pravilo, string funkcija = "match")
  12. {
  13.     if (funkcija == "search")
  14.         return regex_search(podatak, regex(pravilo));
  15.     else
  16.         return regex_match(podatak, regex(pravilo));
  17. }
  18.  
  19. class Term //Pojam
  20. {
  21.     char* _key;
  22.     char* _value;
  23.  
  24.     void SetDefaultValues()
  25.     {
  26.         int size = strlen("N/A") + 1;
  27.         _key = new char[size];
  28.         strcpy_s(_key, size, "N/A");
  29.  
  30.         _value = new char[size];
  31.         strcpy_s(_value, size, "N/A");
  32.     }
  33. public:
  34.     //Konstruktor
  35.     //Atributi _key i _value ne smiju sadržavati brojeve, prazne prostore niti specijalne znakove: @, #, $.
  36.     //Dodatno atribut _value ne smije sadržavati karaktere: č, ć, š, đ i ž.
  37.     //U slučaju da vrijednosti proslijeđenih parametara ne zadovolje postavljene uslove,
  38.     //postaviti default-ne vrijednosti atributima klase i baciti izuzetak.
  39.     Term(const string & key, const string & value )
  40.     {
  41.         if (ValidirajPodatak(key, "([0-9]|\\s|[$#@])", "search") || ValidirajPodatak(value, "([čćžđš])", "search"))
  42.         {
  43.             SetDefaultValues();
  44.             throw exception("Niste ispostovali pravila za unos rijeci u rjecnik");
  45.         }
  46.         else
  47.         {
  48.             int size = strlen(key.c_str()) + 1;
  49.             _key = new char[size];
  50.             strcpy_s(_key, size, key.c_str());
  51.  
  52.             size = strlen(value.c_str()) + 1;
  53.             _value = new char[size];
  54.             strcpy_s(_value, size, value.c_str());
  55.         }
  56.     }
  57.     Term(const Term & obj)
  58.     {
  59.         int size = strlen(obj._key) + 1;
  60.         _key = new char[size];
  61.         strcpy_s(_key, size, obj._key);
  62.  
  63.         size = strlen(obj._value) + 1;
  64.         _value = new char[size];
  65.         strcpy_s(_value, size, obj._value);
  66.     }
  67.     //Destruktor
  68.     ~Term()
  69.     {
  70.         delete[] _key;
  71.         delete[] _value;
  72.  
  73.         _key = nullptr;
  74.         _value = nullptr;
  75.     }
  76.     Term & operator = (const Term & right)
  77.     {
  78.         if (this != &right)
  79.         {
  80.             delete[] _key;
  81.             delete[] _value;
  82.  
  83.             int size = strlen(right._key) + 1;
  84.             _key = new char[size];
  85.             strcpy_s(_key, size, right._key);
  86.  
  87.             size = strlen(right._value) + 1;
  88.             _value = new char[size];
  89.             strcpy_s(_value, size, right._value);
  90.         }
  91.         return *this;
  92.     }
  93.     const char * GetKey()const
  94.     {
  95.         return _key;
  96.     }
  97.     const char * GetValue()const
  98.     {
  99.         return _value;
  100.     }
  101.     //Operatori poređenja == i != (koristiti samo vrijednost atributa _key)
  102.     friend bool operator ==(const Term &, const Term &);
  103.     friend bool operator !=(const Term &, const Term &);
  104.     friend bool operator <(const Term &, const Term &);
  105.    
  106.     //Operator za ispis
  107.     friend ostream & operator <<(ostream &, const Term &);
  108. };
  109.  
  110. bool operator ==(const Term & left, const Term & right)
  111. {
  112.     return strcmp(left._key, right._key) == 0;
  113. }
  114. bool operator !=(const Term & left, const Term & right)
  115. {
  116.     return !(left == right);
  117. }
  118. bool operator <(const Term & left, const Term & right)
  119. {
  120.     return strcmp(left._key, right._key) < 0;
  121. }
  122. ostream & operator <<(ostream & cout, const Term & obj)
  123. {
  124.     cout << obj._key << " - " << obj._value << endl;
  125.  
  126.     return cout;
  127. }
  128.  
  129.  
  130. class Dictionary //Riječnik pojmova
  131. {
  132.     string _title;
  133.     int _publicationYear;
  134.     //Ključne riječi bosanskog jezika u atribut _key
  135.     //Odgovarajući prevod na engleskom jeziku u atribut _value
  136.     vector<Term> _terms;
  137. public:
  138.     //Konstruktor
  139.     //Naslov riječnika treba da počinje velikim slovom. U suprotnom baciti izuzetak i
  140.     //postaviti default-ne vrijednosti atributa klase.
  141.     Dictionary(const string & title, int publicationYear)
  142.     {
  143.         if (ValidirajPodatak(title, "[A-Z].+"))
  144.         {
  145.             _title = title;
  146.             _publicationYear = publicationYear;
  147.         }
  148.         else
  149.         {
  150.             _title = "N/A";
  151.             _publicationYear = -1;
  152.             throw exception("Procitajte pravila prije kreiranja rjecnika");
  153.         }
  154.     }
  155.     //Operator () za dodavanje novih pojmova u riječnik (u paru key-value).
  156.     //Spriječiti dodavanje istih vrijednosti u kolekciju (baciti izuzetak).
  157.     //Pojmovi u svakom momentu treba da budu sortirani abecedno (koristiti funkciju sort iz biblioteke algorithm).
  158.     Dictionary & operator()(const Term & term)
  159.     {
  160.         for (size_t i = 0; i < _terms.size(); i++)
  161.         {
  162.             if ((string)_terms[i].GetKey() == (string)term.GetKey() && (string)_terms[i].GetValue() == (string)term.GetValue())
  163.                 throw exception("Pojam koji zelite dodati vec postoji u rjecniku");
  164.         }
  165.  
  166.         _terms.push_back(term);
  167.         sort(_terms.begin(), _terms.end());
  168.         return *this;
  169.  
  170.     }
  171.     //Operator -= za uklanjanje pojma iz riječnika na osnovu atributa _key.
  172.     Dictionary & operator -=(const string & key)
  173.     {
  174.         vector<Term>::iterator it = _terms.begin();
  175.  
  176.         while (it != _terms.end())
  177.         {
  178.             if (it->GetKey() == key)
  179.             {
  180.                 _terms.erase(it);
  181.                 return *this;
  182.             }          
  183.             it++;
  184.         }
  185.         throw exception("Ne postoji pojam koji sadrzi zadani kljuc");
  186.     }
  187.     //Funkciju koja vraća trenutni broj pojmova u riječniku.
  188.     int GetTrenutniBrojPojmova()const
  189.     {
  190.         return _terms.size();
  191.     }
  192.     //operator[] koji vraća vrijednost na osnovu ključne riječi (povratna vrijednost je engleska riječ-value,
  193.     //na osnovu bosanske-key)
  194.     const char * operator[](const string & key)const
  195.     {
  196.         for (size_t i = 0; i < _terms.size(); i++)
  197.         {
  198.             if (_terms[i].GetKey() == key)
  199.                 return _terms[i].GetValue();
  200.         }
  201.         throw exception("Ne postoji pojam koji sadrzi zadani kljuc");
  202.     }
  203.     //Funkciju koja vraća kolekciju ključeva (bosanskih riječi)
  204.     //koji počinju sa određenim slovom. Ukoliko je broj takvih riječi paran,
  205.     //vratiti sve one na parnim pozicijama, u suprotnom odabrati riječi na neparnim pozicijama.
  206.     vector <string> GetKolekcijaKljuceva(char slovo)
  207.     {
  208.         vector<string> tempKolekcija;
  209.         vector<string> kolekcijaKljuceva;
  210.  
  211.         string rijec;
  212.         for (size_t i = 0; i < _terms.size(); i++)
  213.         {
  214.             rijec = _terms[i].GetKey();
  215.             if (rijec[0] == slovo)
  216.                 tempKolekcija.push_back(_terms[i].GetKey());
  217.         }
  218.  
  219.         if (tempKolekcija.size() % 2 == 0)
  220.         {
  221.             for (size_t i = 0; i < tempKolekcija.size(); i++)
  222.             {
  223.                 if (i % 2 == 0)
  224.                     kolekcijaKljuceva.push_back(tempKolekcija[i]);
  225.             }
  226.         }
  227.         else
  228.         {
  229.             for (size_t i = 0; i < tempKolekcija.size(); i++)
  230.             {
  231.                 if (i % 2 != 0)
  232.                     kolekcijaKljuceva.push_back(tempKolekcija[i]);
  233.             }
  234.         }
  235.  
  236.         return kolekcijaKljuceva;
  237.     }
  238.  
  239.     friend ostream & operator <<(ostream &, const Dictionary &);
  240. };
  241.  
  242. ostream & operator <<(ostream & cout, const Dictionary & obj)
  243. {
  244.     cout << crt <<  obj._title << "\t\t\tPublication year: " << obj._publicationYear << crt;
  245.     if (obj._terms.size() > 0)
  246.     {  
  247.         cout << "\t\t\t:::Lista pojmova:::\n";
  248.         for (size_t i = 0; i < obj._terms.size(); i++)
  249.             cout << i + 1 << ". " << obj._terms[i].GetKey() << " - " << obj._terms[i].GetValue() << endl;
  250.     }
  251.     return cout;
  252. }
  253.  
  254. //Osmisliti i implementirati klasu Competitor (Takmičar) na način da se upotrebom objekta klase Dictionary.
  255. //svakom takmičaru dodijele određena pitanja (riječi bosanskog jezika) - koristiti implementiranu funkciju klase Dictionary.
  256. //Svakom pitanju je potrebno pridružiti odgovor takmičara (kolekcija _odgovori).
  257. //Obavezno implementirati funkciju koja vrši kalkulaciju osvojenih bodova (1 tačan odgovor = 1 bod).
  258. //Po potrebi dopuniti klasu dodatnim atributima.
  259. class Competitor //Takmičar
  260. {
  261.     string _ime;
  262.     string _prezime;
  263.     string _username; //ime.prezime
  264.     string _password; //minimalno 6 karaktera, kombinacija velikih i malih slova,
  265.                       //te najmanje jednog specijalnog karaktera iz liste: #%$@?!
  266.     vector<string> _pitanja;
  267.     vector<string> _odgovori;
  268.  
  269.     string GenerisiUsername(string ime, string prezime)
  270.     {
  271.         string username;
  272.  
  273.         for (size_t i = 0; i < ime.size(); i++)
  274.         {
  275.             ime[i] = tolower(ime[i]);
  276.             for (size_t j = 0; j < prezime.size(); j++)
  277.             {
  278.                 prezime[j] = tolower(prezime[j]);
  279.             }
  280.         }
  281.  
  282.         username = ime;
  283.         username.append("." + prezime);
  284.  
  285.         return username;
  286.     }
  287. public:
  288.     Competitor(const string & ime, const string & prezime, const string & password)
  289.     {
  290.         if (ValidirajPodatak(password, "(?=.{6,})(?=.*[A-Za-z])(?=.*[#%$@?!]{1,})", "search"))
  291.         {
  292.             _ime = ime;
  293.             _prezime = prezime;
  294.             _username = GenerisiUsername(_ime, _prezime);
  295.             _password = password;
  296.         }
  297.         else
  298.         {
  299.             _ime = _prezime = _username = _password = "N/A";
  300.             throw exception("Procitajte pravila prije registracije takmicara");
  301.         }
  302.     }
  303.  
  304.     friend ostream & operator << (ostream &, const Competitor &);
  305. };
  306.  
  307. ostream & operator << (ostream & cout, const Competitor & obj)
  308. {
  309.     cout << "Ime i prezime: " << obj._ime << " " << obj._prezime << endl;
  310.     cout << "Username: " << obj._username << endl;
  311.     cout << "Password: " << obj._password<< endl;
  312.     return cout;
  313. }
  314.  
  315. void main()
  316. {
  317.     //Kreirati rijecnik pojmova.
  318.     //Kreirati niz objekata tipa Competitor i simulirati takmičenje u poznavanju riječi engleskog jezika.
  319.     //Pronaći najboljeg među takmičarima (najveći broj bodova).
  320.  
  321. #pragma region DodavanjePojmova
  322.     Term kuca("Kuca", "House");
  323.     Term krov("Krov", "Roof");
  324.     Term kisa("Kisa", "Rain");
  325.     Term krava("Krava", "Cow");
  326.     Term voda("Voda", "Water");
  327.     Term zid("Zid", "Wall");
  328.     Term hrana("Hrana", "Food");
  329.     Term racunar("Racunar", "Computer");
  330.     Term igra("Igrica", "Game");
  331.     Term telefon("Telefon", "Phone");
  332. #pragma endregion
  333.  
  334. #pragma region DodavanjaPojmovaURjecnik
  335.     Dictionary rjecnik("Bosansko - engleski rjecnik", 2016);
  336.     rjecnik(kuca);
  337.     rjecnik(voda);
  338.     rjecnik(zid);
  339.     rjecnik(hrana);
  340.     rjecnik(racunar);
  341.     rjecnik(igra);
  342.     rjecnik(telefon);
  343.     rjecnik(kisa);
  344.     rjecnik(krava);
  345.     rjecnik(krov);
  346. #pragma endregion
  347.  
  348.     cout << rjecnik << endl;
  349.  
  350.     Competitor nisvet("Nisvet", "Mujkic", "!N1sv€t#");
  351.  
  352.     cout << nisvet << endl;
  353.  
  354.     _getch();
  355. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement