Advertisement
Guest User

Untitled

a guest
Jan 17th, 2016
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.90 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<regex>
  6.  
  7.  
  8. using namespace std;
  9.  
  10.  
  11.  
  12. template<class T1, class T2>
  13. class Kolekcija {
  14.     T1 * _elementi1;
  15.     T2 * _elementi2;
  16.     int _trenutnoElemenata;
  17. public:
  18.     int getTrenutno() { return _trenutnoElemenata; }
  19.     Kolekcija()
  20.     {
  21.         _elementi1 = nullptr;
  22.         _elementi2 = nullptr;
  23.         _trenutnoElemenata = 0;
  24.     }
  25.     Kolekcija(Kolekcija & o)
  26.     {
  27.         _trenutnoElemenata = o._trenutnoElemenata;
  28.         _elementi1 = new T1[_trenutnoElemenata];
  29.         _elementi2 = new T2[_trenutnoElemenata];
  30.         for (int i = 0; i < _trenutnoElemenata; i++)
  31.         {
  32.             _elementi1[i] = o._elementi1[i];
  33.             _elementi2[i] = o._elementi2[i];
  34.         }
  35.     }
  36.     ~Kolekcija() {
  37.         delete[] _elementi1; _elementi1 = nullptr;
  38.         delete[] _elementi2; _elementi2 = nullptr;
  39.     }
  40.  
  41.     bool AddElement(T1 e1, T2 e2)
  42.     {
  43.         for (int i = 0; i < _trenutnoElemenata; i++)
  44.         {
  45.             if(_elementi1[i] == e1 && _elementi2[i] == e2)
  46.                 return false;
  47.         }
  48.  
  49.         T1* temp1 = new T1[_trenutnoElemenata + 1];
  50.         T2* temp2 = new T2[_trenutnoElemenata + 1];
  51.  
  52.         for (int i = 0; i < _trenutnoElemenata; i++)
  53.         {
  54.             temp1[i] = _elementi1[i];
  55.             temp2[i] = _elementi2[i];
  56.         }
  57.  
  58.         delete[] _elementi1;
  59.         delete[] _elementi2;
  60.         _elementi1 = temp1;
  61.         _elementi2 = temp2;
  62.  
  63.         _elementi1[_trenutnoElemenata] = e1;
  64.         _elementi2[_trenutnoElemenata++] = e2;
  65.         return true;
  66.  
  67.     }
  68.     bool RemoveElement(T1 e1)
  69.     {
  70.         for (int i = 0; i < _trenutnoElemenata; i++)
  71.         {
  72.             if (_elementi1[i] == e1)
  73.             {
  74.  
  75.                 for (int   j= i; j < _trenutnoElemenata-1; j++)
  76.                 {
  77.                     _elementi1[j] = _elementi1[j + 1];
  78.                     _elementi2[j] = _elementi2[j + 1];
  79.                 }
  80.                 _trenutnoElemenata--;
  81.  
  82.                 T1* temp1 = new T1[_trenutnoElemenata];
  83.                 T2* temp2 = new T2[_trenutnoElemenata];
  84.  
  85.                 for (int i = 0; i < _trenutnoElemenata; i++)
  86.                 {
  87.                     temp1[i] = _elementi1[i];
  88.                     temp2[i] = _elementi2[i];
  89.                 }
  90.  
  91.                 delete[] _elementi1;
  92.                 delete[] _elementi2;
  93.                 _elementi1 = temp1;
  94.                 _elementi2 = temp2;
  95.  
  96.                 return true;
  97.             }
  98.         }
  99.  
  100.         return false;
  101.     }
  102.     Kolekcija operator + (Kolekcija & k)
  103.     {
  104.  
  105.  
  106.     }
  107.     /*1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko prosiranje kolekcije prilikom dodavanja svakog novog elementa, te onemoguciti ponavljanje elemenata.
  108.     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.
  109.     3. operator+ :: vraca objekat tipa Kolekcija koji u sebi sadrzi sve elemente objekta koji je
  110.     pozvao funkciju i objekta koji je proslijedjen kao parametar (takodjer tipa Kolekcija), pri cemu se elementi unutar kreirane kolekcije ne smiju
  111.     ponavljati (ne smiju postojati dva ista elementa).*/
  112.  
  113.     T1 & operator [] (int i)
  114.     {
  115.         return _elementi1[i];
  116.     }
  117.     T1 & getElement1(int i)
  118.     {
  119.         return _elementi1[i];
  120.     }
  121.     T2 & getElement2(int i)
  122.     {
  123.         return _elementi2[i];
  124.     }
  125.  
  126.     friend ostream & operator <<(ostream & c, const Kolekcija & k) {
  127.         c << "Trenutno: " << k._trenutnoElemenata << endl;
  128.         for (int i = 0; i < k._trenutnoElemenata; i++)
  129.         {
  130.             c<< k._elementi1[i] << " " << k._elementi2[i] << endl;
  131.         }
  132.         return c;
  133.     }
  134. };
  135. int brojac = 0;
  136. class Student {
  137.     const int _brojIndeksa;
  138.     string _ime;
  139.     string _prezime;
  140.     string _korisnickomIme;
  141.     string _lozinka;
  142.     /*1. potrebne funkcije
  143.     NAPOMENE:
  144.     2. lozinka mora postovati sljedeca pravila:
  145.     2.a: sadrzi kombinaciju slova, brojeva i nekog od specijalnih znakova
  146.     2.b: ne smije sadrzavati niti ime niti prezime
  147.     2.c: sadrzi minimalno 6 znakova
  148.     postivanje navedenih pravila se mora osigurati prije kreiranje objekta tipa Student*/
  149. public:
  150.     Student(string ime="---", string prezime="---", string username="---", string password="---"):_brojIndeksa(++brojac)
  151.     {
  152.         _ime = ime;
  153.         _prezime = prezime;
  154.         _korisnickomIme = username;
  155.         _lozinka = password;
  156.     }
  157.     bool operator == (Student & o)
  158.     {
  159.         return _ime == o._ime && _prezime == o._prezime;
  160.     }
  161.     Student & operator = (Student & o)
  162.     {
  163.         if (this != &o)
  164.         {
  165.             int(_brojIndeksa) = o._brojIndeksa;
  166.             _ime = o._ime;
  167.             _prezime = o._prezime;
  168.             _korisnickomIme = o._korisnickomIme;
  169.             _lozinka = o._lozinka;
  170.         }
  171.         return *this;
  172.     }
  173.  
  174.     friend ostream & operator <<(ostream & c, const Student & s)
  175.     {
  176.         c << "Ime i prezime: " << s._ime << " " << s._prezime << endl;
  177.         return c;
  178.     }
  179.  
  180. };
  181. class Ispit {
  182. protected:
  183.     char * _opis;//npr. PR2::Integralni::30.01.2015
  184.                  /*tip string u kolekciji sluzi kao napomena vezana za ponasanje studenta na ispitu gdje ce se evidentirati utisci dezurnog nastavnika
  185.                  npr. kasnio, dosao bez indeksa, izbacen zbog prepisivanja*/
  186.     Kolekcija<Student, string> * _listaStudenata;
  187.     /*1. AddStudent :: dodaje podatke o studentu koji je pristupio ispitu uz odgovarajucu napomenu (napomena nije obavezna).Studentu nije dozvoljeno da
  188.     dva puta pristupi istom ispitu, a u slucaju da pokusa pristupiti automatski se dodaje adekvatna napomena (npr. ponovo pokusao pristupiti). */
  189.  
  190. public:
  191.     Kolekcija<Student, string>* getListuStudenata() { return _listaStudenata; }
  192.     Ispit(string opis = "---")
  193.     {
  194.         _opis = new char[strlen(opis.c_str()) + 1];
  195.         strcpy_s(_opis, strlen(opis.c_str()) + 1, opis.c_str());
  196.  
  197.         _listaStudenata = new Kolekcija<Student, string>;
  198.     }
  199.     Ispit(Ispit & o)
  200.     {
  201.         _opis = new char[strlen(o._opis) + 1];
  202.         strcpy_s(_opis, strlen(o._opis) + 1, o._opis);
  203.         _listaStudenata = new Kolekcija<Student, string>(*o._listaStudenata);
  204.     }
  205.     ~Ispit()
  206.     {
  207.         delete[] _opis; _opis = nullptr;
  208.         delete _listaStudenata; _listaStudenata = nullptr;
  209.     }
  210.     Ispit & operator = (Ispit & o)
  211.     {
  212.         if (this != &o)
  213.         {
  214.             delete[] _opis;
  215.             delete _listaStudenata;
  216.  
  217.             _opis = new char[strlen(o._opis) + 1];
  218.             strcpy_s(_opis, strlen(o._opis) + 1, o._opis);
  219.             _listaStudenata = new Kolekcija<Student, string>(*o._listaStudenata);
  220.         }
  221.         return *this;
  222.     }
  223.  
  224.     bool AddStudent(Student & s, string napomena="---")
  225.     {
  226.         if (_listaStudenata->AddElement(s, napomena))
  227.             return true;
  228.         else
  229.         {
  230.             cout<<  "Ponovo pokusao pristupiti" << endl;
  231.             return false;
  232.         }
  233.  
  234.     }
  235.  
  236.     friend ostream & operator <<(ostream &c, const Ispit & i)
  237.     {
  238.         c << "Opis: " << i._opis << endl;
  239.         c << "Lista studenata: ";
  240.         c << *i._listaStudenata << endl;
  241.         return c;
  242.     }
  243.  
  244.     bool operator == (Ispit & o)
  245.     {
  246.         return strcmp(_opis, o._opis) == 0;
  247.     }
  248. };
  249. class Predmet {
  250.     char * _nazivPredmeta;
  251.     char * _profesor;
  252.     //1. potrebne funkcije
  253. public:
  254.     Predmet(string nazivPredmeta = "---", string profesor="---")
  255.     {
  256.         _nazivPredmeta = new char[strlen(nazivPredmeta.c_str()) + 1];
  257.         strcpy_s(_nazivPredmeta, strlen(nazivPredmeta.c_str()) + 1, nazivPredmeta.c_str());
  258.  
  259.         _profesor = new char[strlen(profesor.c_str()) + 1];
  260.         strcpy_s(_profesor, strlen(profesor.c_str()) + 1, profesor.c_str());
  261.     }
  262.     Predmet(Predmet & o)
  263.     {
  264.         _nazivPredmeta = new char[strlen(o._nazivPredmeta) + 1];
  265.         strcpy_s(_nazivPredmeta, strlen(o._nazivPredmeta)+ 1, o._nazivPredmeta);
  266.  
  267.         _profesor = new char[strlen(o._profesor) + 1];
  268.         strcpy_s(_profesor, strlen(o._profesor) + 1, o._profesor);
  269.     }
  270.     ~Predmet()
  271.     {
  272.         delete[] _nazivPredmeta; _nazivPredmeta = nullptr;
  273.         delete[] _profesor; _profesor = nullptr;
  274.     }
  275.     Predmet & operator = (Predmet & o)
  276.     {
  277.         if (this != &o)
  278.         {
  279.             delete[] _nazivPredmeta;
  280.             delete[] _profesor;
  281.  
  282.             _nazivPredmeta = new char[strlen(o._nazivPredmeta) + 1];
  283.             strcpy_s(_nazivPredmeta, strlen(o._nazivPredmeta) + 1, o._nazivPredmeta);
  284.  
  285.             _profesor = new char[strlen(o._profesor) + 1];
  286.             strcpy_s(_profesor, strlen(o._profesor) + 1, o._profesor);
  287.         }
  288.         return *this;
  289.     }
  290.     bool operator == (Predmet & o)
  291.     {
  292.         return strcmp(_nazivPredmeta, o._nazivPredmeta) == 0 && strcmp(_profesor, o._profesor) == 0;
  293.     }
  294.     friend ostream & operator <<(ostream &c, const Predmet & p)
  295.     {
  296.         c << "Predmet: " << p._nazivPredmeta << ", Profesor: " << p._profesor << endl;
  297.         return c;
  298.  
  299.     }
  300. };
  301. class SkolskaGodina {
  302.     char * _skolskaGodina;//npr.2014/2015
  303.     Kolekcija<Predmet, Ispit> * _odrzaniIspiti;
  304. public:
  305.     SkolskaGodina(string skolskaGodina)
  306.     {
  307.         _skolskaGodina = new char[strlen(skolskaGodina.c_str()) + 1];
  308.         strcpy_s(_skolskaGodina, strlen(skolskaGodina.c_str()) + 1, skolskaGodina.c_str());
  309.         _odrzaniIspiti = new Kolekcija<Predmet, Ispit>;
  310.     }
  311.     SkolskaGodina(SkolskaGodina & o)
  312.     {
  313.         _skolskaGodina = new char[strlen(o._skolskaGodina) + 1];
  314.         strcpy_s(_skolskaGodina, strlen(o._skolskaGodina) + 1, o._skolskaGodina);
  315.         _odrzaniIspiti = new Kolekcija<Predmet, Ispit>(*o._odrzaniIspiti);
  316.     }
  317.     ~SkolskaGodina()
  318.     {
  319.         delete[] _skolskaGodina; _skolskaGodina = nullptr;
  320.         delete _odrzaniIspiti;
  321.     }
  322.  
  323.     bool AddIspit(Predmet & p, Ispit & i)
  324.     {
  325.         return _odrzaniIspiti->AddElement(p,i);
  326.     }
  327.  
  328.     bool RemoveIspit(Ispit & obj)
  329.     {
  330.         for (int i = 0; i < _odrzaniIspiti->getTrenutno(); i++)
  331.         {
  332.             if(_odrzaniIspiti->getElement2(i) == obj)
  333.             {
  334.                 if (_odrzaniIspiti->getElement2(i).getListuStudenata()->getTrenutno() == 0)
  335.                 {
  336.                     return _odrzaniIspiti->RemoveElement((*_odrzaniIspiti)[i]);
  337.                 }
  338.             }
  339.  
  340.         }
  341.         return false;
  342.     }
  343.  
  344.     int GetBrojIzlazakaByPredmet(Student & s, Predmet & p)
  345.     {
  346.         int brIzlazaka = 0;
  347.  
  348.         for (int i = 0; i < _odrzaniIspiti->getTrenutno(); i++)
  349.         {
  350.             if (_odrzaniIspiti->getElement1(i) == p)
  351.             {
  352.                 for (int j = 0; j < _odrzaniIspiti->getElement2(i).getListuStudenata()->getTrenutno(); j++)
  353.                 {
  354.                     if (_odrzaniIspiti->getElement2(i).getListuStudenata()->getElement1(j) == s)
  355.                         brIzlazaka++;
  356.                 }
  357.             }
  358.         }
  359.         return brIzlazaka;
  360.     }
  361.  
  362.     /*1. AddIspit::dodate podatke o odrzanom ispitu na odredjenom predmetu
  363.     2. RemoveIspit::uklanja podatke o odrzanom ispitu, ali samo pod uslovom da tom ispitu nije pristupio niti jedan student
  364.     3. GetBrojIzlazakaByPredmet::vraca podatak o tome koliko je puta trazeni student izasao na ispit iz odredjenog predmeta u toku skolske godine
  365.     4. operator()::vraca sve studente koji u napomeni posjeduju sadrzaj koji je proslijedjen kao parametar (npr.listu svih studenata koji u napomeni
  366.     posjeduju sadrzaj "bez indeksa")
  367.     5. operator<<::ispisuje sve dostupne podatke o odrzanim ispitima i studentima koji su im pristupili*/
  368.  
  369.  
  370.     vector<Student> & operator() (string tekst)
  371.     {
  372.         vector<Student> vec;
  373.         for (int i = 0; i < _odrzaniIspiti->getTrenutno(); i++)
  374.         {
  375.             for (int j = 0; j < _odrzaniIspiti->getElement2(i).getListuStudenata()->getTrenutno(); j++)
  376.             {
  377.                 if (_odrzaniIspiti->getElement2(i).getListuStudenata()->getElement2(j) == tekst) {
  378.                     vec.push_back(_odrzaniIspiti->getElement2(i).getListuStudenata()->getElement1(j));
  379.                     cout << "Dodan student " << _odrzaniIspiti->getElement2(i).getListuStudenata()->getElement1(j) << endl;
  380.                 }
  381.             }
  382.         }
  383.         return vec;
  384.     }
  385.  
  386.     friend ostream & operator <<(ostream & c, const SkolskaGodina & sk)
  387.     {
  388.         c << "Skolska godina: " << sk._skolskaGodina << endl;
  389.         c << "Odrzani ispiti: " << endl;
  390.         c << *sk._odrzaniIspiti << endl;
  391.         return c;
  392.     }
  393. };
  394. void main() {
  395.     //izbjegavajte koristenje vlastitog imena i prezimena
  396.     //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa SkolskaGodina  
  397.     Predmet p("Programiranje", "Denis Music");
  398.     Ispit ispitIzPR("Ispit iz programiranja");
  399.     Student haris("Haris", "Hercegovac", "HH", "hdusad");
  400.     Student nihad("Nihad", "Tahunic", "NT", "fudsfds");
  401.     Student almin("Almin", "Latovic", "AL", "djksafjsd");
  402.  
  403.     ispitIzPR.AddStudent(haris,"kupus");
  404.     ispitIzPR.AddStudent(nihad);
  405.     ispitIzPR.AddStudent(almin, "kupus");
  406.     Ispit ispitIzDM("Diskretna");
  407.     ispitIzDM.AddStudent(nihad);
  408.  
  409.  
  410.     SkolskaGodina sg("2014/2015");
  411.     sg.AddIspit(p, ispitIzDM);
  412.     sg.AddIspit(p, ispitIzPR);
  413.     sg.RemoveIspit(ispitIzPR);
  414.  
  415.     cout << sg.GetBrojIzlazakaByPredmet(nihad, p) << endl;
  416.     cout << sg << endl;
  417.  
  418.     cout << "--------------------------------------------" << endl;
  419.    
  420.     vector<Student> vektorStudent = sg("kupus");
  421.  
  422.     cout << "SIZE: " << vektorStudent.size() << endl;
  423.     for (int i = 0; i < vektorStudent.size(); i++)
  424.     {
  425.         cout << vektorStudent[i] << endl;
  426.     }
  427.  
  428.  
  429.  
  430.  
  431.  
  432. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement