Advertisement
neogz

pr2 int1k v1

Feb 9th, 2015
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 15.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <regex>
  4. using namespace std;
  5.  
  6. char crt[] = { "-----------------------------\n" };
  7. ////////////////////////////////////////////////////////////////
  8. template<class T1, class T2>
  9. class Kolekcija{
  10.     T1 * _elementi1;
  11.     T2 * _elementi2;
  12.     int _trenutnoElemenata;
  13. public:
  14.     Kolekcija(){
  15.         _elementi1 = nullptr;
  16.         _elementi2 = nullptr;
  17.         _trenutnoElemenata = 0;
  18.     }
  19.     ~Kolekcija(){
  20.         delete[]_elementi1;
  21.         delete[]_elementi2;
  22.         _elementi1 = nullptr;
  23.         _elementi2 = nullptr;
  24.     }
  25.     Kolekcija(const Kolekcija & obj){
  26.         _trenutnoElemenata = obj._trenutnoElemenata;
  27.         _elementi1 = new T1[_trenutnoElemenata];
  28.         _elementi2 = new T2[_trenutnoElemenata];
  29.  
  30.         for (int i = 0; i < _trenutnoElemenata; i++){
  31.             _elementi1[i] = obj._elementi1[i];
  32.             _elementi2[i] = obj._elementi2[i];
  33.         }
  34.     }
  35.     ///////////////////////////////////////////////////////////////
  36.     void addElement(T1 e1, T2 e2){
  37.         // AddElement::omogucava dodavanje novog elementa u kolekciju.Osigurati automatsko
  38.         //  prosiranje kolekcije prilikom dodavanja svakog novog elementa, te onemoguciti ponavljanje elemenata.
  39.  
  40.         // provjeriti ima li elemenata u kolekciji
  41.         for (int i = 0; i < _trenutnoElemenata; i++){
  42.             if (_elementi1[i] == e1 ){
  43.                 // nasao je isti element, baciti izuzetak
  44.                 throw exception("1 - Element je vec dodan u kolekciju!");
  45.             }
  46.         }
  47.         // nema elemenata u kolekciji dodati
  48.         // napraviti novi niz veci
  49.         T1 * temp1 = new T1[_trenutnoElemenata + 1];
  50.         T2 * temp2 = new T2[_trenutnoElemenata + 1];
  51.         // kopirati elemente u nove nizove
  52.         for (int i = 0; i < _trenutnoElemenata; i++){
  53.             temp1[i] = _elementi1[i];
  54.             temp2[i] = _elementi2[i];
  55.         }
  56.         // obrisati stare nizove
  57.         delete[]_elementi1;
  58.         delete[]_elementi2;
  59.         // neka stari nizovi pokazuju na nove temp
  60.         _elementi1 = temp1;
  61.         _elementi2 = temp2;
  62.  
  63.         // dodati novi element
  64.         _elementi1[_trenutnoElemenata] = e1;
  65.         _elementi2[_trenutnoElemenata] = e2;
  66.  
  67.         // uvecati brojac
  68.         _trenutnoElemenata++;
  69.     }
  70.     void removeElement(T1 element){
  71.         // RemoveElement::na osnovu parametra tipa T1 uklanja elemente iz kolekcije i smanjuje velicinu niza.
  72.         //  Ukoliko je potrebno, prilikom uklanjanja elementa izvrsiti dealokaciju.Prilikom uklanjanja elemenata ocuvati redoslijed njihovog dodavanja.
  73.  
  74.         // vidjeti ima li element u kolekciji
  75.         for (int i = 0; i < _trenutnoElemenata; i++){
  76.             if (_elementi1[i] == element){
  77.                 T1 * temp1 = new T1[(_trenutnoElemenata - 1)];
  78.                 T2 * temp2 = new T2[(_trenutnoElemenata - 1)];
  79.                 // kopirati u novi do elementa
  80.                 for (int j = 0; j < i; j++){
  81.                     temp1[j] = _elementi1[j];
  82.                     temp2[j] = _elementi2[j];
  83.                 }
  84.                 // kopiralo je do i sada i+1
  85.                 for (int j = i; j < (_trenutnoElemenata - 1); j++){
  86.                     temp1[j] = _elementi1[j+1];
  87.                     temp2[j] = _elementi2[j+1];
  88.                 }
  89.                
  90.                 // obrisati stare nizove
  91.                 delete[]_elementi1;
  92.                 delete[]_elementi2;
  93.                 _elementi1 = temp1;
  94.                 _elementi2 = temp2;
  95.                 _trenutnoElemenata--;
  96.                 return;
  97.             }
  98.         }
  99.         // nije pronasao element baciti exc
  100.         throw exception("2 - Element nije pronadjen u kolekciji!");
  101.     }
  102.     void info(){
  103.         cout << crt << "\tKOLEKCIJA\n" << crt;
  104.         for (int i = 0; i < _trenutnoElemenata; i++){
  105.             cout << _elementi1[i] << " - " << _elementi2[i] << endl;
  106.         }
  107.     }
  108.     Kolekcija & operator =(const Kolekcija & obj){
  109.         _trenutnoElemenata = 0;
  110.         delete[]_elementi1;
  111.         delete[]_elementi2;
  112.  
  113.         for (int i = 0; i < obj._trenutnoElemenata; i++){
  114.             _elementi1[i] = obj._elementi1[i];
  115.             _elementi2[i] = obj._elementi2[i];
  116.         }
  117.         return *this;
  118.     }
  119.     Kolekcija operator + (const Kolekcija<T1,T2> & obj){
  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
  122.         //  elementi unutar kreirane kolekcije ne smiju ponavljati(ne smiju postojati dva ista elementa).
  123.  
  124.         Kolekcija temp;
  125.         int tempMax = _trenutnoElemenata + obj._trenutnoElemenata;
  126.        
  127.         // kolekcija koja poziva
  128.         for (int i = 0; i < _trenutnoElemenata; i++)
  129.             temp.addElement(_elementi1[i], _elementi2[i]);
  130.        
  131.         int j = 0;
  132.         for (int i = _trenutnoElemenata; i < tempMax; i++){
  133.             temp.addElement(obj._elementi1[j], obj._elementi2[j]);
  134.             j++;
  135.            
  136.         }
  137.  
  138.         return temp;
  139.     }
  140.     int getTrenutno()const{
  141.         // potrebno da vidimo ima li elemenata u kolekciji, npr je li 1 student pristupio ispitu
  142.         return _trenutnoElemenata;
  143.     }
  144.     T1 getElement1(int id){
  145.         return _elementi1[id];
  146.     }
  147.     T2 getElement2(int id){
  148.         return _elementi2[id];
  149.     }
  150. };
  151. class Student{
  152.     static int _brojStudenata;
  153.     const int _brojIndeksa;
  154.     string _ime;
  155.     string _prezime;
  156.     string _korisnickomIme;
  157.     string _lozinka;
  158.  
  159. public:
  160.     Student() :_brojIndeksa(++_brojStudenata){}
  161.     Student(char * ime, char *prezime) :_brojIndeksa(++_brojStudenata){
  162.         _ime = ime;
  163.         _prezime = prezime;
  164.  
  165.         _korisnickomIme = ime;
  166.         _korisnickomIme += ".";
  167.         _korisnickomIme += prezime;
  168.  
  169.         bool tacno = false;
  170.         string pravilo = "(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[$*@_,])(?=.{7,})";
  171.  
  172.         do{
  173.             cout << "Unesi lozinku koja ne sadrzi ime i prezime: ";
  174.             getline(cin, _lozinka);
  175.  
  176.             if (regex_search(_lozinka, regex(pravilo))){
  177.                 pravilo = "(?:(" +_ime + "|" + _prezime + "))";
  178.                 if (!regex_search(_lozinka, regex(pravilo))){
  179.                     // dobra je lozinka, ne zaboravi uzvicnik u search
  180.                     tacno = true;
  181.                 }
  182.            
  183.             }
  184.         } while (tacno == false);
  185.     }
  186.     Student(const Student & obj):_brojIndeksa(++_brojStudenata){
  187.         _ime = obj._ime;
  188.         _prezime = obj._prezime;
  189.         _korisnickomIme = obj._korisnickomIme;
  190.         _lozinka = obj._lozinka;
  191.     }
  192.     void info(){
  193.         cout << crt << "\tSTUDENT\n" << crt;
  194.         cout << "IME PREZIME: " << _ime << " " << _prezime << endl;
  195.         cout << "USERNAME:    " << _korisnickomIme << endl;
  196.         cout << "PASSWORD:    ";
  197.         for (int i = 0; i < _lozinka.size(); i++) cout << "*";
  198.         cout << endl << crt;
  199.     }
  200.     // trebaju operatori []== =
  201.     Student &operator =(const Student & obj){
  202.         _ime = obj._ime;
  203.         _prezime = obj._prezime;
  204.         _korisnickomIme = obj._korisnickomIme;
  205.         _lozinka = obj._lozinka;
  206.         return *this;
  207.     }
  208.     bool operator == (const Student & obj){
  209.         if (_ime == obj._ime && _prezime == obj._prezime) return true;
  210.         return false;
  211.     }
  212.     friend ostream & operator <<(ostream & cout, const Student & student);
  213. };
  214. class Ispit{
  215.     // tip string u kolekciji sluzi kao
  216. protected:
  217.     char * _opis; //npr. PR2::Integralni::30.01.2015
  218.     Kolekcija<Student, string> * _listaStudenata;
  219.  
  220. public:
  221.     Ispit(){
  222.         _opis = nullptr;
  223.         _listaStudenata = new Kolekcija < Student, string >;
  224.     }
  225.     Ispit(char * opis){
  226.         int vel = strlen(opis) + 1;
  227.         _opis = new char[vel];
  228.         strcpy_s(_opis, vel, opis);
  229.  
  230.         _listaStudenata = new Kolekcija < Student, string > ;
  231.  
  232.     }
  233.     Ispit(const Ispit& obj){
  234.         int vel = strlen(obj._opis) + 1;
  235.         _opis = new char[vel];
  236.         strcpy_s(_opis, vel, obj._opis);
  237.         // kkopije od kolekcije
  238.         _listaStudenata = new Kolekcija<Student, string>(*obj._listaStudenata);
  239.     }
  240.     ~Ispit(){
  241.         dealociraj();
  242.     }
  243.     void dealociraj(){
  244.         delete[]_opis;
  245.         delete _listaStudenata;
  246.         _opis = nullptr;
  247.         _listaStudenata = nullptr;
  248.     }
  249.     //////////////////////////////////////////////////////////////////////////////
  250.     void info(){
  251.         cout << crt << "\tISPIT\n" << crt;
  252.         cout << _opis << endl;
  253.         _listaStudenata->info();
  254.     }
  255.     void addStudent(const Student & student, string poruka = "------"){
  256.         // 1. AddStudent :: dodaje podatke o studentu koji je pristupio ispitu uz odgovarajucu napomenu
  257.         //    (napomena nije obavezna) napomena vezana za ponasanje studenta na ispitu gdje ce se evidentirati
  258.         //       utisci dezurnog nastavnika npr.kasnio, dosao bez indeksa, izbacen zbog prepisivanja
  259.        
  260.         //    Studentu nije dozvoljeno da dva puta pristupi istom ispitu, a u slucaju da pokusa
  261.         //    pristupiti automatski se dodaje adekvatna napomena (npr. ponovo pokusao pristupiti).
  262.  
  263.         _listaStudenata->addElement(student, poruka);
  264.     }
  265.     bool operator == (const Ispit & ispit){
  266.         if (strcmp(_opis, ispit._opis) == 0) return true;
  267.         return false;
  268.     }
  269.     int getTrenutno()const{
  270.         return _listaStudenata->getTrenutno();
  271.     }
  272.     Student & getElement1(int id){
  273.         return _listaStudenata->getElement1(id);
  274.     }
  275.     string getElement2(int id){
  276.         return _listaStudenata->getElement2(id);
  277.     }
  278.     Ispit & operator = (const Ispit & obj){
  279.         delete[] _opis;
  280.         int vel = strlen(obj._opis) + 1;
  281.         _opis = new char[vel];
  282.         strcpy_s(_opis, vel, obj._opis);
  283.        
  284.         delete _listaStudenata;
  285.         _listaStudenata = obj._listaStudenata;
  286.         return *this;
  287.     }
  288.     friend ostream &  operator << (ostream & cout, const Ispit & ispit);
  289. };
  290. class Predmet{
  291.     char * _nazivPredmeta;
  292.     char * _profesor;
  293. public:
  294.     Predmet(char * nazivPredmeta = "-------", char * profesor = "-------"){
  295.         int vel = strlen(nazivPredmeta) + 1;
  296.         _nazivPredmeta = new char[vel];
  297.         strcpy_s(_nazivPredmeta, vel, nazivPredmeta);
  298.  
  299.         vel = strlen(profesor) + 1;
  300.         _profesor = new char[vel];
  301.         strcpy_s(_profesor, vel, profesor);
  302.     }
  303.     Predmet(const Predmet & obj){
  304.         int vel = strlen(obj._nazivPredmeta) + 1;
  305.         _nazivPredmeta = new char[vel];
  306.         strcpy_s(_nazivPredmeta, vel, obj._nazivPredmeta);
  307.  
  308.         vel = strlen(obj._profesor) + 1;
  309.         _profesor = new char[vel];
  310.         strcpy_s(_profesor, vel, obj._profesor);
  311.     }
  312.     ~Predmet(){
  313.         delete[] _nazivPredmeta;
  314.         delete[]_profesor;
  315.         _nazivPredmeta = nullptr;
  316.         _profesor = nullptr;
  317.     }
  318.     void info(){
  319.         cout << crt << "\tPREDMET\n" << crt;
  320.         cout << "PREDMET:  " << _nazivPredmeta << endl;
  321.         cout << "PROFESOR: " << _profesor << endl;
  322.     }
  323.     bool operator == (const Predmet & obj){
  324.         if (strcmp(_nazivPredmeta, obj._nazivPredmeta) == 0) return true;
  325.         return false;
  326.     }
  327.     Predmet & operator = (const Predmet & obj){
  328.         delete[] obj._nazivPredmeta;
  329.         delete[] obj._profesor;
  330.  
  331.         int vel = strlen(obj._nazivPredmeta) + 1;
  332.         _nazivPredmeta = new char[vel];
  333.         strcpy_s(_nazivPredmeta, vel, obj._nazivPredmeta);
  334.  
  335.         vel = strlen(obj._profesor) + 1;
  336.         _profesor = new char[vel];
  337.         strcpy_s(_profesor, vel, obj._profesor);
  338.         return *this;
  339.     }
  340.     friend ostream & operator <<(ostream & cout, const Predmet & predmet);
  341. };
  342. class SkolskaGodina{
  343.     char * _skolskaGodina; //npr.2014/2015
  344.     Kolekcija<Predmet, Ispit> * _odrzaniIspiti;
  345. public:
  346.     SkolskaGodina(char * skolskaGodina = "----/----"){
  347.         int vel = strlen(skolskaGodina) + 1;
  348.         _skolskaGodina = new char[vel];
  349.         strcpy_s(_skolskaGodina, vel, skolskaGodina);
  350.  
  351.         _odrzaniIspiti = new Kolekcija < Predmet, Ispit >;
  352.     }
  353.     ~SkolskaGodina(){
  354.         delete[] _skolskaGodina;
  355.         delete _odrzaniIspiti;
  356.  
  357.         _skolskaGodina = nullptr;
  358.         _odrzaniIspiti = nullptr;
  359.     }
  360.     void addIspit(const Predmet & predmet, const Ispit & ispit){
  361.         // addIspit::dodate podatke o odrzanom ispitu na odredjenom predmetu
  362.         _odrzaniIspiti->addElement(predmet, ispit);
  363.     }
  364.     ///////////////////////////////////////////
  365.     void removeIspit(const Ispit & ispit){
  366.         // RemoveIspit: : uklanja podatke o odrzanom ispitu, ali samo pod uslovom da tom ispitu nije pristupio niti jedan student
  367.         // for petlja da prodjemo kroz kolekciju
  368.         for (int i = 0; i < _odrzaniIspiti->getTrenutno(); i++){
  369.             // trazimo ispite koji odgovaraju ispitu arugmentu
  370.             if (_odrzaniIspiti->getElement2(i) == ispit){
  371.                 // provjera ima li na ispitu 0 studenata
  372.                 if (_odrzaniIspiti->getElement2(i).getTrenutno() == 0){
  373.                     // bilo je nula moze se brisati
  374.                     _odrzaniIspiti->removeElement(_odrzaniIspiti->getElement1(i));
  375.                     return;
  376.                 }
  377.                 else throw exception("3 - Na ispit su prijavljeni studenti!\nNe moze se obrisati ispit!");
  378.             }
  379.         }
  380.         throw exception("4 - Nije pronadjen zadati ispit!\n");
  381.     }
  382.     int getBrojIzlazakaByPredmet(const Predmet & predmet, const Student & student){
  383.         //GetBrojIzlazakaByPredmet::vraca podatak o tome koliko je puta trazeni student
  384.         // izasao na ispit iz odredjenog predmeta u toku skolske godine
  385.  
  386.         int brojac = 0;
  387.         for (int i = 0; i < _odrzaniIspiti->getTrenutno(); i++){
  388.             // sada za svaki predmet for petlju i
  389.             if (_odrzaniIspiti->getElement1(i) == predmet){
  390.                 // nasli smo trazeni predmet, sada treba prebrojati koliko se puta na ispitima iz tog predmeta nalazi prijavljen studnet
  391.                 for (int j = 0; i < _odrzaniIspiti->getElement2(i).getTrenutno(); j++){
  392.                     if (_odrzaniIspiti->getElement2(i).getElement1(j) == student){
  393.                         // odrzani_ispiti(predmet,ispit) ispit je element2 i iz njega imamo (studente i opise)
  394.                         // pronasao studenta povecaj brojac
  395.                         brojac++;
  396.                     }
  397.                 }
  398.             }
  399.         }
  400.         return 0;
  401.     }
  402.     vector<Student> operator ()(string parametar){
  403.         // operator() ::vraca sve studente koji u napomeni posjeduju sadrzaj koji je proslijedjen kao parametar
  404.         // (npr.listu svih studenata koji u napomeni posjeduju sadrzaj "bez indeksa")
  405.         vector<Student> nazadStudenti;
  406.         for (int i = 0; i < _odrzaniIspiti->getTrenutno(); i++){
  407.             for (int j = 0; j < _odrzaniIspiti->getElement2(i).getTrenutno(); j++){
  408.                 // sada se nalazimo u _listaStudenata<Student,opis>
  409.                 if (_odrzaniIspiti->getElement2(i).getElement2(j) == parametar){
  410.                     // parametri odnosno opisi su jednaki, dodaj studenta u vektor
  411.                     nazadStudenti.push_back(_odrzaniIspiti->getElement2(i).getElement1(j));
  412.                 }
  413.             }
  414.         }
  415.         return nazadStudenti;
  416.     }
  417.     friend ostream & operator <<(ostream & cout, const SkolskaGodina & godina);
  418.  
  419. };
  420. ////////////////////////////////////////////////////////////////
  421. int Student::_brojStudenata = 0;
  422. ostream & operator <<(ostream & cout, const Student & student){
  423.     cout << crt << "\tSTUDENT\n" << crt;
  424.     cout << "IME PREZIME: " << student._ime << " " << student._prezime << endl;
  425.     cout << "USERNAME:    " << student._korisnickomIme << endl;
  426.     cout << "PASSWORD:    ";
  427.     for (int i = 0; i < student._lozinka.size(); i++) cout << "*";
  428.     cout << endl << crt;
  429.     return cout;
  430. }
  431. ostream &  operator << (ostream & cout, const Ispit & ispit){
  432.     cout << crt << "\tPREDMET\n" << crt;
  433.     cout << "NAZIV PREDMETA: " << ispit._opis << endl;
  434.     for (int i = 0; i < ispit._listaStudenata->getTrenutno(); i++){
  435.         cout << ispit._listaStudenata->getElement1(i);
  436.     }
  437.     return cout;
  438. }
  439. ostream & operator <<(ostream & cout, const Predmet & predmet){
  440.     cout << crt << "\tPREDMET\n" << crt;
  441.     cout << "PREDMET:  " << predmet._nazivPredmeta << endl;
  442.     cout << "PROFESOR: " << predmet._profesor << endl;
  443.     return cout;
  444. }
  445. ostream & operator <<(ostream & cout, const SkolskaGodina & godina){
  446.     // operator<<:: ispisuje sve dostupne podatke o odrzanim ispitima i studentima koji su im pristupili
  447.     for (int i = 0; i < godina._odrzaniIspiti->getTrenutno(); i++){
  448.         // ispisuje predmete u kolekciji
  449.         cout << godina._odrzaniIspiti->getElement1(i);
  450.         for (int j = 0; j < godina._odrzaniIspiti->getElement2(i).getTrenutno(); j++){
  451.             //ispisuje ispite u kolekciji
  452.             cout << godina._odrzaniIspiti->getElement2(j);
  453.             for (int z = 0; z < godina._odrzaniIspiti->getElement2(j).getTrenutno(); z++){
  454.                 // ispisuje studente
  455.                 cout << godina._odrzaniIspiti->getElement2(j).getElement1(z);
  456.             }
  457.         }
  458.     }
  459.     return cout;
  460. }
  461. ////////////////////////////////////////////////////////////////
  462.  
  463. int main(){
  464.     try{
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.         Student s1("Nedim", "Fejzic");
  475.         Student s2("Saldina", "Nurak");
  476.         Student s3("Mirnes", "Turkovic");
  477.  
  478.         Ispit ispit("PR2::Integralni::30.01.2015");
  479.         ispit.addStudent(s1, "obecava mali");
  480.         ispit.addStudent(s2, "pitati ce za pomoc");
  481.         ispit.addStudent(s3, "ne smije pristupiti");
  482.         // ispit.addStudent(s3, "ne smije pristupiti");
  483.  
  484.         Predmet pr1("Programiranje 1", "Denis Music");
  485.         Predmet pr2("Programiranje 2", "Denis Music");
  486.  
  487.         SkolskaGodina ova("2014/2015");
  488.         ova.addIspit(pr2, ispit);
  489.  
  490.        
  491.     }
  492.     catch (exception & err){
  493.         cout << "GRESKA! - " << err.what() << endl;
  494.     }
  495.  
  496.     system("pause > null");
  497.     return 0;
  498. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement