Advertisement
blavorov_list

Divlji Zadatak

Aug 27th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.84 KB | None | 0 0
  1. #include<iostream>
  2. #include <regex>
  3. #include <string>
  4. #include <vector>
  5. #include <exception>
  6.  
  7. using namespace std;
  8.  
  9. char *crt = "\n-------------------------\n";
  10.  
  11. template<class T1, class T2>
  12. class Kolekcija {
  13.     T1 * _elementi1;
  14.     T2 * _elementi2;
  15.     int _trenutnoElemenata;
  16. public:
  17.  
  18.     Kolekcija(int tr = 0) {
  19.         _trenutnoElemenata = tr;
  20.         _elementi1 = nullptr;
  21.         _elementi2 = nullptr;
  22.     }
  23.     Kolekcija(Kolekcija & k){
  24.         _trenutnoElemenata = k._trenutnoElemenata;
  25.         _elementi1 = new T1[_trenutnoElemenata];
  26.         _elementi2 = new T2[_trenutnoElemenata];
  27.         for (int i = 0; i < _trenutnoElemenata; i++){
  28.             _elementi1[i] = k._elementi1[i];
  29.             _elementi2[i] = k._elementi2[i];
  30.         }
  31.     }
  32.     Kolekcija & operator=(Kolekcija & k){
  33.         if (this != &k){
  34.             delete[]_elementi1;
  35.             delete[]_elementi2;
  36.             _trenutnoElemenata = k._trenutnoElemenata;
  37.             _elementi1 = new T1[_trenutnoElemenata];
  38.             _elementi2 = new T2[_trenutnoElemenata];
  39.             for (int i = 0; i < _trenutnoElemenata; i++){
  40.                 _elementi1[i] = k._elementi1[i];
  41.                 _elementi2[i] = k._elementi2[i];
  42.             }
  43.         }
  44.         return *this;
  45.     }
  46.     ~Kolekcija(){
  47.         delete[] _elementi1;
  48.         delete[] _elementi2;
  49.         _elementi1 = nullptr;
  50.         _elementi2 = nullptr;
  51.     }
  52.     void AddElement(T1 a, T2 b){
  53.         for (int i = 0; i < _trenutnoElemenata; i++){
  54.             if (_elementi1[i] == a || _elementi2[i] == b)
  55.                 return;
  56.         }
  57.         T1 * temp1 = new T1[_trenutnoElemenata + 1];
  58.         T2 * temp2 = new T2[_trenutnoElemenata + 1];
  59.         for (int i = 0; i < _trenutnoElemenata; i++){
  60.             temp1[i] = _elementi1[i];
  61.             temp2[i] = _elementi2[i];
  62.         }
  63.         temp1[_trenutnoElemenata] = a;
  64.         temp2[_trenutnoElemenata] = b;
  65.         delete[]_elementi1;
  66.         delete[]_elementi2;
  67.         _elementi1 = temp1;
  68.         _elementi2 = temp2;
  69.         _trenutnoElemenata++;
  70.     }
  71.     int getTrenutnoElemenata(){
  72.         return _trenutnoElemenata;
  73.     }
  74.     T1& getT1(int index) {
  75.         return _elementi1[index];
  76.     }
  77.     T2& getT2(int index) {
  78.         return _elementi2[index];
  79.     }
  80.     void SetT2(int lokacija, T2 a){
  81.         _elementi2[lokacija] = a;
  82.     }
  83.     void RemoveElement(T1 a){
  84.         for (int i = 0; i < _trenutnoElemenata; i++){
  85.             if (_elementi1[i] == a){
  86.                 for (int j = i; j < _trenutnoElemenata; j++)
  87.                     _elementi1[j] = _elementi1[j + 1];
  88.                 _trenutnoElemenata--;
  89.                 return;
  90.             }
  91.         }
  92.     }
  93.     void RemoveElement(T2 a){
  94.         for (int i = 0; i < _trenutnoElemenata; i++){
  95.             if (_elementi2[i] == a){
  96.                 for (int j = i; j < _trenutnoElemenata; j++)
  97.                     _elementi2[j] = _elementi2[j + 1];
  98.                 _trenutnoElemenata--;
  99.                 return;
  100.             }
  101.         }
  102.     }
  103.     Kolekcija & operator+(Kolekcija & k){
  104.         Kolekcija novi;
  105.         for (int i = 0; i < _trenutnoElemenata; i++){
  106.             if (novi.getT1(i) == *this->getT1(i) || novi.getT2(i) == *this->getT2(i))
  107.                 continue;
  108.             novi.AddElement(*this->getT1(i), *this->getT2());
  109.         }
  110.         for (int i = 0; i < k._trenutnoElemenata; i++){
  111.             if (novi.getT1(i) == k.getT1(i) || novi.getT2(i) == k.getT2(i))
  112.                 continue;
  113.             novi.AddElement(k.getT1(i), k.getT2(i));
  114.         }
  115.         return novi;
  116.     }
  117.     friend ostream & operator<<<> (ostream& cout, const Kolekcija<T1, T2>& obj);
  118.     /*1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko prosiranje kolekcije prilikom dodavanja svakog novog elementa, te onemoguciti ponavljanje elemenata.
  119.     2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije i smanjuje velicinu niza. Ukoliko je potrebno, prilikom uklanjanja elementa izvrsiti dealokaciju. Prilikom uklanjanja elemenata ocuvati redoslijed njihovog dodavanja.
  120.     3. operator+ :: vraca objekat tipa Kolekcija koji u sebi sadrzi sve elemente objekta koji je
  121.     pozvao funkciju i objekta koji je proslijedjen kao parametar (takodjer tipa Kolekcija), pri cemu se elementi unutar kreirane kolekcije ne smiju ponavljati (ne smiju postojati dva ista elementa).*/
  122. };
  123. template<class T1, class T2>
  124. ostream & operator<<<> (ostream& cout, const Kolekcija<T1, T2>& obj)
  125. {
  126.     for (int i = 0; i < obj._trenutnoElemenata; i++)
  127.     {
  128.         cout << obj._elementi1[i] << " : " << obj._elementi2[i] << endl;
  129.     }
  130.     return cout;
  131. }
  132.  
  133. bool Provjera(string sifra){
  134.     regex velika("[A-Z]");
  135.     regex mala("[a-z]");
  136.     regex znakovi("[#@\\^_\\-]");
  137.     regex brojevi("[0-9]");
  138.  
  139.     if (sifra.length() < 6)
  140.         return false;
  141.  
  142.     if (!regex_search(sifra, velika))
  143.         return false;
  144.  
  145.     if (!regex_search(sifra, mala))
  146.         return false;
  147.  
  148.     if (!regex_search(sifra, znakovi))
  149.         return false;
  150.  
  151.     if (!regex_search(sifra, brojevi))
  152.         return false;
  153.  
  154.     return true;
  155.  
  156. }
  157.  
  158. int brojIndexa = 0;
  159. class Student {
  160.  
  161.     /*1. potrebne funkcije
  162.     NAPOMENE:
  163.     2. lozinka mora postovati sljedeca pravila:
  164.     2.a: sadrzi kombinaciju slova, brojeva i nekog od specijalnih znakova
  165.     2.b: ne smije sadrzavati niti ime niti prezime
  166.     2.c: sadrzi minimalno 6 znakova
  167.     postivanje navedenih pravila se mora osigurati prije kreiranje objekta tipa Student*/
  168. public:
  169.  
  170.     const int _brojIndeksa;
  171.     string _ime;
  172.     string _prezime;
  173.     string _korisnickoIme;
  174.     string _lozinka;
  175.     Student(string ime = "", string prezime = "", string username = "", string pw = "") :_brojIndeksa(brojIndexa++){
  176.         _ime = ime;
  177.         _prezime = prezime;
  178.         _korisnickoIme = username;
  179.         _lozinka = pw;
  180.         if (!Provjera(pw))
  181.             _lozinka = "";
  182.     }
  183.     Student(const Student & s) :_brojIndeksa(brojIndexa++){
  184.         _ime = s._ime;
  185.         _prezime = s._prezime;
  186.         _korisnickoIme = s._korisnickoIme;
  187.         _lozinka = s._lozinka;
  188.     }
  189.     Student & operator=(const Student & s){
  190.         if (this != &s){
  191.             _ime = s._ime;
  192.             _prezime = s._prezime;
  193.             _korisnickoIme = s._korisnickoIme;
  194.             _lozinka = s._lozinka;
  195.         }
  196.         return *this;
  197.     }
  198.     bool operator==(Student & drugi){
  199.         return _ime == drugi._ime && _prezime == drugi._prezime && _korisnickoIme == drugi._korisnickoIme && drugi._lozinka == _lozinka;
  200.     }
  201.     friend ostream & operator<<(ostream & cout, Student & s){
  202.         cout << "Broj indeksa: " << s._brojIndeksa << endl;
  203.         cout << "Ime i prezime: " << s._ime << " " << s._prezime << endl;
  204.         cout << "Username: " << s._korisnickoIme << endl;
  205.         cout << "Password: " << s._lozinka << endl;
  206.         return cout;
  207.     }
  208. };
  209. //
  210. class Ispit {
  211. public:
  212.     char * _opis;//npr. PR2::Integralni::30.01.2015
  213.     /*tip string u kolekciji sluzi kao napomena vezana za ponasanje studenta na ispitu gdje ce se evidentirati utisci dezurnog nastavnika npr. kasnio, dosao bez indeksa, izbacen zbog prepisivanja*/
  214.     Kolekcija<Student, string> * _listaStudenata;
  215.     /*1. AddStudent :: dodaje podatke o studentu koji je pristupio ispitu
  216.     uz odgovarajucu napomenu (napomena nije obavezna).
  217.     Studentu nije dozvoljeno da dva puta pristupi istom ispitu,
  218.     a u slucaju da pokusa pristupiti automatski
  219.     se dodaje adekvatna napomena (npr. ponovo pokusao pristupiti). */
  220. public:
  221.     Ispit(char *opis=""){
  222.         _opis = new char[strlen(opis) + 1];
  223.         strcpy_s(_opis, strlen(opis) + 1, opis);
  224.         _listaStudenata = new Kolekcija<Student, string>;
  225.     }
  226.     Ispit(Ispit & s){
  227.         _opis = new char[strlen(s._opis) + 1];
  228.         strcpy_s(_opis, strlen(s._opis) + 1, s._opis);
  229.         _listaStudenata = new Kolekcija<Student, string>;
  230.         for (int i = 0; i < s._listaStudenata->getTrenutnoElemenata(); i++)
  231.             _listaStudenata->AddElement(s._listaStudenata->getT1(i), s._listaStudenata->getT2(i));
  232.     }
  233.     Ispit & operator=(Ispit & drugi){
  234.         if (this != &drugi){
  235.             delete _listaStudenata;
  236.             _opis = new char[strlen(drugi._opis) + 1];
  237.             strcpy_s(_opis, strlen(drugi._opis) + 1, drugi._opis);
  238.             _listaStudenata = new Kolekcija<Student, string>;
  239.             for (int i = 0; i < drugi._listaStudenata->getTrenutnoElemenata(); i++)
  240.                 _listaStudenata->AddElement(drugi._listaStudenata->getT1(i), drugi._listaStudenata->getT2(i));
  241.         }
  242.         return *this;
  243.     }
  244.     void AddStudent(Student & s, string napomena = ""){
  245.         for (int i = 0; i < _listaStudenata->getTrenutnoElemenata(); i++){
  246.             if (_listaStudenata->getT1(i)._korisnickoIme == s._korisnickoIme){
  247.                 _listaStudenata->SetT2(i, "Ponovo pokusao pristupiti ispitu");
  248.                 return;
  249.             }
  250.         }
  251.         _listaStudenata->AddElement(s, napomena);
  252.     }
  253.     bool operator==(Ispit & drugi){
  254.         if (strcmp(_opis, drugi._opis) == 0)
  255.             return true;
  256.         return false;
  257.     }
  258.     int getBrojStudenata(){ return _listaStudenata->getTrenutnoElemenata(); }
  259.     friend ostream & operator<<(ostream & cout, Ispit & s){
  260.         cout << "Opis: " << s._opis << endl;
  261.         cout << "Studenti: " << endl;
  262.         cout << *s._listaStudenata << endl;
  263.         return cout;
  264.     }
  265.     void Info() {
  266.         cout << "Naziv ispita: " << _opis << endl << "Studenti koji pristupaju :" << endl;
  267.         for (int i = 0; i < _listaStudenata->getTrenutnoElemenata(); i++)
  268.         {
  269.             cout << _listaStudenata->getT1(i) << "   " << _listaStudenata->getT2(i) << endl;
  270.         }
  271.     }
  272. };
  273.  
  274. class Predmet {
  275.     char * _nazivPredmeta;
  276.     char * _profesor;
  277.     //1. potrebne funkcije
  278. public:
  279.     Predmet(char * naziv = "", char * profesor = ""){
  280.         _nazivPredmeta = new char[strlen(naziv) + 1];
  281.         _profesor = new char[strlen(profesor) + 1];
  282.         strcpy_s(_nazivPredmeta, strlen(naziv) + 1, naziv);
  283.         strcpy_s(_profesor, strlen(profesor) + 1, profesor);
  284.     }
  285.     Predmet(const Predmet & drugi){
  286.  
  287.         _nazivPredmeta = new char[strlen(drugi._nazivPredmeta) + 1];
  288.         _profesor = new char[strlen(drugi._profesor) + 1];
  289.         strcpy_s(_nazivPredmeta, strlen(drugi._nazivPredmeta) + 1, drugi._nazivPredmeta);
  290.         strcpy_s(_profesor, strlen(drugi._profesor) + 1, drugi._profesor);
  291.     }
  292.     Predmet & operator=(const Predmet & drugi){
  293.         if (this != &drugi){
  294.             delete[]_nazivPredmeta;
  295.             delete[]_profesor;
  296.  
  297.             _nazivPredmeta = new char[strlen(drugi._nazivPredmeta) + 1];
  298.             _profesor = new char[strlen(drugi._profesor) + 1];
  299.             strcpy_s(_nazivPredmeta, strlen(drugi._nazivPredmeta) + 1, drugi._nazivPredmeta);
  300.             strcpy_s(_profesor, strlen(drugi._profesor) + 1, drugi._profesor);
  301.         }
  302.         return *this;
  303.     }
  304.     bool operator==(Predmet & drugi){
  305.         if (strcmp(_nazivPredmeta, drugi._nazivPredmeta) == 0 && strcmp(_profesor, drugi._profesor) == 0)
  306.             return true;
  307.         return false;
  308.     }
  309.     friend ostream & operator<<(ostream & cout, Predmet & p){
  310.         cout << "Naziv predmeta: " << p._nazivPredmeta << endl;
  311.         cout << "Profesor: " << p._profesor << endl;
  312.         return cout;
  313.     }
  314. };
  315. //
  316. class SkolskaGodina {
  317.     char * _skolskaGodina;//npr.2014/2015
  318.     Kolekcija<Predmet, Ispit> * _odrzaniIspiti;
  319. public:
  320.     SkolskaGodina(char * sGodina){
  321.         _skolskaGodina = new char[strlen(sGodina) + 1];
  322.         strcpy_s(_skolskaGodina, strlen(sGodina) + 1, sGodina);
  323.         _odrzaniIspiti = new Kolekcija<Predmet, Ispit>;
  324.     }
  325.     SkolskaGodina(SkolskaGodina & sk){
  326.         _skolskaGodina = new char[strlen(sk._skolskaGodina) + 1];
  327.         strcpy_s(_skolskaGodina, strlen(sk._skolskaGodina) + 1, sk._skolskaGodina);
  328.         _odrzaniIspiti = new Kolekcija<Predmet, Ispit>;
  329.         for (int i = 0; i < sk._odrzaniIspiti->getTrenutnoElemenata(); i++)
  330.             _odrzaniIspiti->AddElement(sk._odrzaniIspiti->getT1(i), sk._odrzaniIspiti->getT2(i));
  331.     }
  332.     SkolskaGodina & operator=(SkolskaGodina & sk){
  333.         if (this != &sk){
  334.             delete[]_skolskaGodina;
  335.             delete _odrzaniIspiti;
  336.             _skolskaGodina = new char[strlen(sk._skolskaGodina) + 1];
  337.             strcpy_s(_skolskaGodina, strlen(sk._skolskaGodina) + 1, sk._skolskaGodina);
  338.             _odrzaniIspiti = new Kolekcija<Predmet, Ispit>;
  339.             for (int i = 0; i < sk._odrzaniIspiti->getTrenutnoElemenata(); i++)
  340.                 _odrzaniIspiti->AddElement(sk._odrzaniIspiti->getT1(i), sk._odrzaniIspiti->getT2(i));
  341.         }
  342.         return *this;
  343.     }
  344.     bool AddIspit(Predmet a, Ispit b){
  345.         for (int i = 0; i < _odrzaniIspiti->getTrenutnoElemenata(); i++){
  346.             if (_odrzaniIspiti->getT1(i) == a && _odrzaniIspiti->getT2(i) == b)
  347.                 return false;
  348.         }
  349.         _odrzaniIspiti->AddElement(a, b);
  350.         return true;
  351.     }
  352.     bool RemoveIspit(Ispit& b){
  353.  
  354.         for (int i = 0; i < _odrzaniIspiti->getTrenutnoElemenata(); i++){
  355.             if (_odrzaniIspiti->getT2(i) == b && _odrzaniIspiti->getT2(i).getBrojStudenata() != 0){
  356.                 _odrzaniIspiti->RemoveElement(b);
  357.                 return true;
  358.             }
  359.         }
  360.         return false;
  361.     }
  362.     int GetBrojIzlazakaByPredmet(Student a, Predmet b){
  363.         int brIzlazaka = 0;
  364.         for (int i = 0; i < _odrzaniIspiti->getTrenutnoElemenata(); i++){
  365.             if (_odrzaniIspiti->getT1(i) == b){
  366.                 for (int j = 0; j < _odrzaniIspiti->getT2(i)._listaStudenata->getTrenutnoElemenata(); j++){
  367.                     if (_odrzaniIspiti->getT2(i)._listaStudenata->getT1(j)==a)
  368.                         brIzlazaka++;
  369.                 }
  370.             }
  371.         }
  372.         return brIzlazaka;
  373.        
  374.     }
  375.     vector<Student> operator()(string napomena){
  376.         cout << "Studenti za napomenu(" << napomena << ")" << endl;
  377.         vector<Student> studenti;
  378.         for (int i = 0; i < _odrzaniIspiti->getTrenutnoElemenata(); i++){
  379.             for (int j = 0; j < _odrzaniIspiti->getT2(i)._listaStudenata->getTrenutnoElemenata(); j++){
  380.                 if (_odrzaniIspiti->getT2(i)._listaStudenata->getT2(j) == napomena)
  381.                     studenti.push_back(_odrzaniIspiti->getT2(i)._listaStudenata->getT1(j));
  382.             }
  383.         }
  384.         return studenti;
  385.     }
  386.     friend ostream & operator<<(ostream & cout, SkolskaGodina & sk){
  387.         cout << "Skolska godina: " << sk._skolskaGodina << endl;
  388.         cout << "Odrzani ispiti: " << endl;
  389.         cout << *sk._odrzaniIspiti << endl;
  390.         return cout;
  391.     }
  392.     /*1. AddIspit::dodate podatke o odrzanom ispitu na odredjenom predmetu
  393.     2. RemoveIspit::uklanja podatke o odrzanom ispitu, ali samo pod uslovom da tom ispitu nije pristupio niti jedan student
  394.     3. GetBrojIzlazakaByPredmet::vraca podatak o tome koliko je puta trazeni student izasao na ispit iz odredjenog predmeta u toku skolske godine
  395.     4. operator()::vraca sve studente koji u napomeni posjeduju sadrzaj koji je proslijedjen kao parametar (npr.listu svih studenata koji u napomeni posjeduju sadrzaj "bez indeksa")
  396.     5. operator<<::ispisuje sve dostupne podatke o odrzanim ispitima i studentima koji su im pristupili*/
  397. };
  398.  
  399. void main() {
  400.     //izbjegavajte koristenje vlastitog imena i prezimena
  401.     //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa SkolskaGodina  
  402.  
  403.     Student corda("Tarik", "Corda", "corbinho", "corba-Grah.");
  404.     Student emina("Emina", "Kapetanovic", "nibaeniba", "nibceahmedovski");
  405.     Student meca("Medim", "Maric", "meca123", "ekran123");
  406.     Student dzemek("Dzemis", "Brkan", "nomek", "nomekdzemek");
  407.  
  408.     Predmet py("Python", "Erhad Husovic");
  409.     Predmet cpp("C++ 11", "Stefan Stanic");
  410.     Predmet wrd("Web Razvoj i Dizajn", "Amar Maslo");
  411.  
  412.     Ispit jucer("Python programiranje");
  413.     Ispit danas("C++ by Stefan Stanic");
  414.     Ispit sutra("WRD by dr. Amar Maslo");
  415.     Ispit prekosutra("Python programiranje Integralni");
  416.  
  417.     jucer.AddStudent(corda, "solidio");
  418.     jucer.AddStudent(emina, "moja mala");
  419.     jucer.AddStudent(dzemek, "katana");
  420.  
  421.     danas.AddStudent(emina, "solidio");
  422.     danas.AddStudent(meca, "nije lose");
  423.  
  424.     sutra.AddStudent(emina, "moze bolje");
  425.     sutra.AddStudent(corda, "rothmans");
  426.  
  427.     prekosutra.AddStudent(emina, "normala");
  428.  
  429.     cout << prekosutra << endl;
  430.  
  431.     cout << crt;
  432.  
  433.     SkolskaGodina k17("2017");
  434.     k17.AddIspit(py, jucer);
  435.     k17.AddIspit(cpp, danas);
  436.     k17.AddIspit(wrd, sutra);
  437.     k17.AddIspit(py, prekosutra);
  438.  
  439.     cout << k17 << endl;
  440.  
  441.     cout << crt;
  442.  
  443.     vector<Student> studentiSaNapomenom = k17("solidio");
  444.     for (int i = 0; i < studentiSaNapomenom.size(); i++)
  445.         cout << studentiSaNapomenom[i] << endl;
  446.  
  447.     cout << crt << crt;
  448.  
  449.     cout << "Student by Predmet: " << endl;
  450.     cout << k17.GetBrojIzlazakaByPredmet(emina, py);
  451.  
  452.  
  453.     system("pause");
  454. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement