Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include <regex>
- #include <string>
- #include <vector>
- #include <exception>
- using namespace std;
- char *crt = "\n-------------------------\n";
- template<class T1, class T2>
- class Kolekcija {
- T1 * _elementi1;
- T2 * _elementi2;
- int _trenutnoElemenata;
- public:
- Kolekcija(int tr = 0) {
- _trenutnoElemenata = tr;
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- }
- Kolekcija(Kolekcija & k){
- _trenutnoElemenata = k._trenutnoElemenata;
- _elementi1 = new T1[_trenutnoElemenata];
- _elementi2 = new T2[_trenutnoElemenata];
- for (int i = 0; i < _trenutnoElemenata; i++){
- _elementi1[i] = k._elementi1[i];
- _elementi2[i] = k._elementi2[i];
- }
- }
- Kolekcija & operator=(Kolekcija & k){
- if (this != &k){
- delete[]_elementi1;
- delete[]_elementi2;
- _trenutnoElemenata = k._trenutnoElemenata;
- _elementi1 = new T1[_trenutnoElemenata];
- _elementi2 = new T2[_trenutnoElemenata];
- for (int i = 0; i < _trenutnoElemenata; i++){
- _elementi1[i] = k._elementi1[i];
- _elementi2[i] = k._elementi2[i];
- }
- }
- return *this;
- }
- ~Kolekcija(){
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- }
- void AddElement(T1 a, T2 b){
- for (int i = 0; i < _trenutnoElemenata; i++){
- if (_elementi1[i] == a || _elementi2[i] == b)
- return;
- }
- T1 * temp1 = new T1[_trenutnoElemenata + 1];
- T2 * temp2 = new T2[_trenutnoElemenata + 1];
- for (int i = 0; i < _trenutnoElemenata; i++){
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- temp1[_trenutnoElemenata] = a;
- temp2[_trenutnoElemenata] = b;
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = temp1;
- _elementi2 = temp2;
- _trenutnoElemenata++;
- }
- int getTrenutnoElemenata(){
- return _trenutnoElemenata;
- }
- T1& getT1(int index) {
- return _elementi1[index];
- }
- T2& getT2(int index) {
- return _elementi2[index];
- }
- void SetT2(int lokacija, T2 a){
- _elementi2[lokacija] = a;
- }
- void RemoveElement(T1 a){
- for (int i = 0; i < _trenutnoElemenata; i++){
- if (_elementi1[i] == a){
- for (int j = i; j < _trenutnoElemenata; j++)
- _elementi1[j] = _elementi1[j + 1];
- _trenutnoElemenata--;
- return;
- }
- }
- }
- void RemoveElement(T2 a){
- for (int i = 0; i < _trenutnoElemenata; i++){
- if (_elementi2[i] == a){
- for (int j = i; j < _trenutnoElemenata; j++)
- _elementi2[j] = _elementi2[j + 1];
- _trenutnoElemenata--;
- return;
- }
- }
- }
- Kolekcija & operator+(Kolekcija & k){
- Kolekcija novi;
- for (int i = 0; i < _trenutnoElemenata; i++){
- if (novi.getT1(i) == *this->getT1(i) || novi.getT2(i) == *this->getT2(i))
- continue;
- novi.AddElement(*this->getT1(i), *this->getT2());
- }
- for (int i = 0; i < k._trenutnoElemenata; i++){
- if (novi.getT1(i) == k.getT1(i) || novi.getT2(i) == k.getT2(i))
- continue;
- novi.AddElement(k.getT1(i), k.getT2(i));
- }
- return novi;
- }
- friend ostream & operator<<<> (ostream& cout, const Kolekcija<T1, T2>& obj);
- /*1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko prosiranje kolekcije prilikom dodavanja svakog novog elementa, te onemoguciti ponavljanje elemenata.
- 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.
- 3. operator+ :: vraca objekat tipa Kolekcija koji u sebi sadrzi sve elemente objekta koji je
- 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).*/
- };
- template<class T1, class T2>
- ostream & operator<<<> (ostream& cout, const Kolekcija<T1, T2>& obj)
- {
- for (int i = 0; i < obj._trenutnoElemenata; i++)
- {
- cout << obj._elementi1[i] << " : " << obj._elementi2[i] << endl;
- }
- return cout;
- }
- bool Provjera(string sifra){
- regex velika("[A-Z]");
- regex mala("[a-z]");
- regex znakovi("[#@\\^_\\-]");
- regex brojevi("[0-9]");
- if (sifra.length() < 6)
- return false;
- if (!regex_search(sifra, velika))
- return false;
- if (!regex_search(sifra, mala))
- return false;
- if (!regex_search(sifra, znakovi))
- return false;
- if (!regex_search(sifra, brojevi))
- return false;
- return true;
- }
- int brojIndexa = 0;
- class Student {
- /*1. potrebne funkcije
- NAPOMENE:
- 2. lozinka mora postovati sljedeca pravila:
- 2.a: sadrzi kombinaciju slova, brojeva i nekog od specijalnih znakova
- 2.b: ne smije sadrzavati niti ime niti prezime
- 2.c: sadrzi minimalno 6 znakova
- postivanje navedenih pravila se mora osigurati prije kreiranje objekta tipa Student*/
- public:
- const int _brojIndeksa;
- string _ime;
- string _prezime;
- string _korisnickoIme;
- string _lozinka;
- Student(string ime = "", string prezime = "", string username = "", string pw = "") :_brojIndeksa(brojIndexa++){
- _ime = ime;
- _prezime = prezime;
- _korisnickoIme = username;
- _lozinka = pw;
- if (!Provjera(pw))
- _lozinka = "";
- }
- Student(const Student & s) :_brojIndeksa(brojIndexa++){
- _ime = s._ime;
- _prezime = s._prezime;
- _korisnickoIme = s._korisnickoIme;
- _lozinka = s._lozinka;
- }
- Student & operator=(const Student & s){
- if (this != &s){
- _ime = s._ime;
- _prezime = s._prezime;
- _korisnickoIme = s._korisnickoIme;
- _lozinka = s._lozinka;
- }
- return *this;
- }
- bool operator==(Student & drugi){
- return _ime == drugi._ime && _prezime == drugi._prezime && _korisnickoIme == drugi._korisnickoIme && drugi._lozinka == _lozinka;
- }
- friend ostream & operator<<(ostream & cout, Student & s){
- cout << "Broj indeksa: " << s._brojIndeksa << endl;
- cout << "Ime i prezime: " << s._ime << " " << s._prezime << endl;
- cout << "Username: " << s._korisnickoIme << endl;
- cout << "Password: " << s._lozinka << endl;
- return cout;
- }
- };
- //
- class Ispit {
- public:
- char * _opis;//npr. PR2::Integralni::30.01.2015
- /*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*/
- Kolekcija<Student, string> * _listaStudenata;
- /*1. AddStudent :: dodaje podatke o studentu koji je pristupio ispitu
- uz odgovarajucu napomenu (napomena nije obavezna).
- Studentu nije dozvoljeno da dva puta pristupi istom ispitu,
- a u slucaju da pokusa pristupiti automatski
- se dodaje adekvatna napomena (npr. ponovo pokusao pristupiti). */
- public:
- Ispit(char *opis=""){
- _opis = new char[strlen(opis) + 1];
- strcpy_s(_opis, strlen(opis) + 1, opis);
- _listaStudenata = new Kolekcija<Student, string>;
- }
- Ispit(Ispit & s){
- _opis = new char[strlen(s._opis) + 1];
- strcpy_s(_opis, strlen(s._opis) + 1, s._opis);
- _listaStudenata = new Kolekcija<Student, string>;
- for (int i = 0; i < s._listaStudenata->getTrenutnoElemenata(); i++)
- _listaStudenata->AddElement(s._listaStudenata->getT1(i), s._listaStudenata->getT2(i));
- }
- Ispit & operator=(Ispit & drugi){
- if (this != &drugi){
- delete _listaStudenata;
- _opis = new char[strlen(drugi._opis) + 1];
- strcpy_s(_opis, strlen(drugi._opis) + 1, drugi._opis);
- _listaStudenata = new Kolekcija<Student, string>;
- for (int i = 0; i < drugi._listaStudenata->getTrenutnoElemenata(); i++)
- _listaStudenata->AddElement(drugi._listaStudenata->getT1(i), drugi._listaStudenata->getT2(i));
- }
- return *this;
- }
- void AddStudent(Student & s, string napomena = ""){
- for (int i = 0; i < _listaStudenata->getTrenutnoElemenata(); i++){
- if (_listaStudenata->getT1(i)._korisnickoIme == s._korisnickoIme){
- _listaStudenata->SetT2(i, "Ponovo pokusao pristupiti ispitu");
- return;
- }
- }
- _listaStudenata->AddElement(s, napomena);
- }
- bool operator==(Ispit & drugi){
- if (strcmp(_opis, drugi._opis) == 0)
- return true;
- return false;
- }
- int getBrojStudenata(){ return _listaStudenata->getTrenutnoElemenata(); }
- friend ostream & operator<<(ostream & cout, Ispit & s){
- cout << "Opis: " << s._opis << endl;
- cout << "Studenti: " << endl;
- cout << *s._listaStudenata << endl;
- return cout;
- }
- void Info() {
- cout << "Naziv ispita: " << _opis << endl << "Studenti koji pristupaju :" << endl;
- for (int i = 0; i < _listaStudenata->getTrenutnoElemenata(); i++)
- {
- cout << _listaStudenata->getT1(i) << " " << _listaStudenata->getT2(i) << endl;
- }
- }
- };
- class Predmet {
- char * _nazivPredmeta;
- char * _profesor;
- //1. potrebne funkcije
- public:
- Predmet(char * naziv = "", char * profesor = ""){
- _nazivPredmeta = new char[strlen(naziv) + 1];
- _profesor = new char[strlen(profesor) + 1];
- strcpy_s(_nazivPredmeta, strlen(naziv) + 1, naziv);
- strcpy_s(_profesor, strlen(profesor) + 1, profesor);
- }
- Predmet(const Predmet & drugi){
- _nazivPredmeta = new char[strlen(drugi._nazivPredmeta) + 1];
- _profesor = new char[strlen(drugi._profesor) + 1];
- strcpy_s(_nazivPredmeta, strlen(drugi._nazivPredmeta) + 1, drugi._nazivPredmeta);
- strcpy_s(_profesor, strlen(drugi._profesor) + 1, drugi._profesor);
- }
- Predmet & operator=(const Predmet & drugi){
- if (this != &drugi){
- delete[]_nazivPredmeta;
- delete[]_profesor;
- _nazivPredmeta = new char[strlen(drugi._nazivPredmeta) + 1];
- _profesor = new char[strlen(drugi._profesor) + 1];
- strcpy_s(_nazivPredmeta, strlen(drugi._nazivPredmeta) + 1, drugi._nazivPredmeta);
- strcpy_s(_profesor, strlen(drugi._profesor) + 1, drugi._profesor);
- }
- return *this;
- }
- bool operator==(Predmet & drugi){
- if (strcmp(_nazivPredmeta, drugi._nazivPredmeta) == 0 && strcmp(_profesor, drugi._profesor) == 0)
- return true;
- return false;
- }
- friend ostream & operator<<(ostream & cout, Predmet & p){
- cout << "Naziv predmeta: " << p._nazivPredmeta << endl;
- cout << "Profesor: " << p._profesor << endl;
- return cout;
- }
- };
- //
- class SkolskaGodina {
- char * _skolskaGodina;//npr.2014/2015
- Kolekcija<Predmet, Ispit> * _odrzaniIspiti;
- public:
- SkolskaGodina(char * sGodina){
- _skolskaGodina = new char[strlen(sGodina) + 1];
- strcpy_s(_skolskaGodina, strlen(sGodina) + 1, sGodina);
- _odrzaniIspiti = new Kolekcija<Predmet, Ispit>;
- }
- SkolskaGodina(SkolskaGodina & sk){
- _skolskaGodina = new char[strlen(sk._skolskaGodina) + 1];
- strcpy_s(_skolskaGodina, strlen(sk._skolskaGodina) + 1, sk._skolskaGodina);
- _odrzaniIspiti = new Kolekcija<Predmet, Ispit>;
- for (int i = 0; i < sk._odrzaniIspiti->getTrenutnoElemenata(); i++)
- _odrzaniIspiti->AddElement(sk._odrzaniIspiti->getT1(i), sk._odrzaniIspiti->getT2(i));
- }
- SkolskaGodina & operator=(SkolskaGodina & sk){
- if (this != &sk){
- delete[]_skolskaGodina;
- delete _odrzaniIspiti;
- _skolskaGodina = new char[strlen(sk._skolskaGodina) + 1];
- strcpy_s(_skolskaGodina, strlen(sk._skolskaGodina) + 1, sk._skolskaGodina);
- _odrzaniIspiti = new Kolekcija<Predmet, Ispit>;
- for (int i = 0; i < sk._odrzaniIspiti->getTrenutnoElemenata(); i++)
- _odrzaniIspiti->AddElement(sk._odrzaniIspiti->getT1(i), sk._odrzaniIspiti->getT2(i));
- }
- return *this;
- }
- bool AddIspit(Predmet a, Ispit b){
- for (int i = 0; i < _odrzaniIspiti->getTrenutnoElemenata(); i++){
- if (_odrzaniIspiti->getT1(i) == a && _odrzaniIspiti->getT2(i) == b)
- return false;
- }
- _odrzaniIspiti->AddElement(a, b);
- return true;
- }
- bool RemoveIspit(Ispit& b){
- for (int i = 0; i < _odrzaniIspiti->getTrenutnoElemenata(); i++){
- if (_odrzaniIspiti->getT2(i) == b && _odrzaniIspiti->getT2(i).getBrojStudenata() != 0){
- _odrzaniIspiti->RemoveElement(b);
- return true;
- }
- }
- return false;
- }
- int GetBrojIzlazakaByPredmet(Student a, Predmet b){
- int brIzlazaka = 0;
- for (int i = 0; i < _odrzaniIspiti->getTrenutnoElemenata(); i++){
- if (_odrzaniIspiti->getT1(i) == b){
- for (int j = 0; j < _odrzaniIspiti->getT2(i)._listaStudenata->getTrenutnoElemenata(); j++){
- if (_odrzaniIspiti->getT2(i)._listaStudenata->getT1(j)==a)
- brIzlazaka++;
- }
- }
- }
- return brIzlazaka;
- }
- vector<Student> operator()(string napomena){
- cout << "Studenti za napomenu(" << napomena << ")" << endl;
- vector<Student> studenti;
- for (int i = 0; i < _odrzaniIspiti->getTrenutnoElemenata(); i++){
- for (int j = 0; j < _odrzaniIspiti->getT2(i)._listaStudenata->getTrenutnoElemenata(); j++){
- if (_odrzaniIspiti->getT2(i)._listaStudenata->getT2(j) == napomena)
- studenti.push_back(_odrzaniIspiti->getT2(i)._listaStudenata->getT1(j));
- }
- }
- return studenti;
- }
- friend ostream & operator<<(ostream & cout, SkolskaGodina & sk){
- cout << "Skolska godina: " << sk._skolskaGodina << endl;
- cout << "Odrzani ispiti: " << endl;
- cout << *sk._odrzaniIspiti << endl;
- return cout;
- }
- /*1. AddIspit::dodate podatke o odrzanom ispitu na odredjenom predmetu
- 2. RemoveIspit::uklanja podatke o odrzanom ispitu, ali samo pod uslovom da tom ispitu nije pristupio niti jedan student
- 3. GetBrojIzlazakaByPredmet::vraca podatak o tome koliko je puta trazeni student izasao na ispit iz odredjenog predmeta u toku skolske godine
- 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")
- 5. operator<<::ispisuje sve dostupne podatke o odrzanim ispitima i studentima koji su im pristupili*/
- };
- void main() {
- //izbjegavajte koristenje vlastitog imena i prezimena
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa SkolskaGodina
- Student corda("Tarik", "Corda", "corbinho", "corba-Grah.");
- Student emina("Emina", "Kapetanovic", "nibaeniba", "nibceahmedovski");
- Student meca("Medim", "Maric", "meca123", "ekran123");
- Student dzemek("Dzemis", "Brkan", "nomek", "nomekdzemek");
- Predmet py("Python", "Erhad Husovic");
- Predmet cpp("C++ 11", "Stefan Stanic");
- Predmet wrd("Web Razvoj i Dizajn", "Amar Maslo");
- Ispit jucer("Python programiranje");
- Ispit danas("C++ by Stefan Stanic");
- Ispit sutra("WRD by dr. Amar Maslo");
- Ispit prekosutra("Python programiranje Integralni");
- jucer.AddStudent(corda, "solidio");
- jucer.AddStudent(emina, "moja mala");
- jucer.AddStudent(dzemek, "katana");
- danas.AddStudent(emina, "solidio");
- danas.AddStudent(meca, "nije lose");
- sutra.AddStudent(emina, "moze bolje");
- sutra.AddStudent(corda, "rothmans");
- prekosutra.AddStudent(emina, "normala");
- cout << prekosutra << endl;
- cout << crt;
- SkolskaGodina k17("2017");
- k17.AddIspit(py, jucer);
- k17.AddIspit(cpp, danas);
- k17.AddIspit(wrd, sutra);
- k17.AddIspit(py, prekosutra);
- cout << k17 << endl;
- cout << crt;
- vector<Student> studentiSaNapomenom = k17("solidio");
- for (int i = 0; i < studentiSaNapomenom.size(); i++)
- cout << studentiSaNapomenom[i] << endl;
- cout << crt << crt;
- cout << "Student by Predmet: " << endl;
- cout << k17.GetBrojIzlazakaByPredmet(emina, py);
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement