Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <regex>
- #include <exception>
- using namespace std;
- //int brojindeks = 1;
- class Indexator{
- int brojindex;
- int * removaniindexi;
- int brojremovanih;
- public:
- Indexator() {
- removaniindexi = new int[1];
- //removaniindexi[0] = 0;
- brojindex = 1;
- brojremovanih = 0;
- }
- void putremovani (int broj) {
- if (brojremovanih == 0) {
- removaniindexi[0] = broj;
- brojremovanih++;
- }
- else {
- brojremovanih++;
- int * temp = new int[brojremovanih];
- for (int i = 0; i < brojremovanih-1; i++) {
- temp[i] = removaniindexi[i];
- }
- temp[brojremovanih - 1] = broj;
- delete[] removaniindexi;
- removaniindexi = temp;
- }
- }
- int operator++ () {
- int temp = brojindex;
- for (int i = 0; i < brojremovanih; i++) {
- /*if (i >= brojindex) {
- for (int j = 0; j < temp; j++) {
- if (brojindex == removaniindexi[i])
- brojindex++;
- }
- }*/
- if (removaniindexi[i] == temp)
- return ++brojindex;
- }
- return brojindex++;
- }
- int operator-- () {
- return brojindex--;
- }
- void settozero() {
- brojindex = 1;
- }
- } indexator;
- class Greska: public exception{
- int linijakoda;
- char * funkcija;
- public:
- Greska(int brln, char* funkc, char * desc) : exception(desc) {
- linijakoda = brln;
- int size = strlen(funkc) + 1;
- funkcija = new char[size];
- strcpy_s(funkcija, size, funkc);
- }
- void Info() {
- cout << "Linija koda: " << linijakoda << endl;
- cout << funkcija;
- what();
- }
- };
- template<class T1, class T2>
- class Kolekcija{
- T1 * _elementi1;
- T2 * _elementi2;
- int _trenutnoElemenata;
- public:
- Kolekcija() {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- //_elementi1 = new T1[1];
- //_elementi2 = new T2[1];
- _trenutnoElemenata = 0;
- }
- Kolekcija(T1 obj, T2 obj2) {
- _elementi1 = new T1[1];
- _elementi2 = new T2[1];
- _elementi1[0] = obj;
- _elementi2[0] = obj2;
- _trenutnoElemenata = 1;
- }
- Kolekcija(Kolekcija & kol) {
- _elementi1 = new T1[kol._trenutnoElemenata];
- _elementi2 = new T2[kol._trenutnoElemenata];
- for (int i = 0; i < kol._trenutnoElemenata; i++) {
- _elementi1[i] = kol._elementi1[i];
- _elementi2[i] = kol._elementi2[i];
- }
- _trenutnoElemenata = kol._trenutnoElemenata;
- }
- ~Kolekcija() { delete[] _elementi1; _elementi1 = nullptr; delete[] _elementi2; _elementi2 = nullptr; }
- bool AddElement(T1 obj, T2 obj2) {
- for (int i = 0; i < _trenutnoElemenata; i++) {
- if (obj == _elementi1[i] || obj2 == _elementi2[i])
- return false;
- }
- if (typeid(T1) == typeid(Student))
- indexator.settozero();
- T1 * temp = new T1[_trenutnoElemenata+1];
- T2 * temp2 = new T2[_trenutnoElemenata+1];
- for (int i = 0; i < _trenutnoElemenata; i++) {
- temp[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- delete[] _elementi1;
- delete[] _elementi2;
- _elementi1 = temp;
- _elementi1[_trenutnoElemenata] = obj;
- _elementi2 = temp2;
- //temp = nullptr;
- _elementi2[_trenutnoElemenata] = obj2;
- //temp2 = nullptr;
- _trenutnoElemenata++;
- return true;
- }
- bool RemoveElement(T1 obj) {
- if (_trenutnoElemenata == 0) {
- return false;
- }
- int lokacijska = -1;
- for (int i = 0; i < _trenutnoElemenata; i++) {
- if (_elementi1[i] == obj) {
- /*for (int j = i; j < _trenutnoElemenata-1; j++) {
- _elementi1[j] = _elementi1[j+1];
- _elementi2[j] = _elementi2[j+1];
- }*/
- lokacijska = i+1;
- }
- }
- if (lokacijska == -1)
- return false;
- if (typeid(T1) == typeid(Student)) {
- indexator.settozero();
- indexator.putremovani(lokacijska+1);
- }
- T1 * temp = new T1[_trenutnoElemenata];
- T2 * temp2 = new T2[_trenutnoElemenata];
- _trenutnoElemenata--;
- for (int i = 0; i < lokacijska; i++) {
- temp[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- for (int i = lokacijska; i < _trenutnoElemenata+1; i++) {
- temp[i-1] = _elementi1[i];
- temp2[i-1] = _elementi2[i];
- }
- delete[] _elementi1;
- _elementi1 = nullptr;
- delete[] _elementi2;
- _elementi2 = nullptr;
- _elementi1 = temp;
- temp = nullptr;
- _elementi2 = temp2;
- temp2 = nullptr;
- return true;
- }
- Kolekcija operator+ (Kolekcija<T1,T2> obj) {
- Kolekcija returnani(*this);
- for (int i = 0; i < obj._trenutnoElemenata; i++) {
- returnani.AddElement(obj._elementi1[i], obj._elementi2[i]);
- }
- return returnani;
- }
- void operator= (Kolekcija<T1, T2> & obj) {
- //delete[]_elementi1;
- //delete[]_elementi2;
- _elementi1 = new T1[obj._trenutnoElemenata];
- _elementi2 = new T2[obj._trenutnoElemenata];
- for (int i = 0; i < obj._trenutnoElemenata; i++) {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- void Info() {
- for (int i = 0; i < _trenutnoElemenata; i++) {
- cout << "Element1 " << i << " je ";
- cout << _elementi1[i];
- cout << endl;
- }
- for (int i = 0; i < _trenutnoElemenata; i++) {
- cout << "Element2 " << i << " je ";
- cout << _elementi2[i];
- cout << endl;
- }
- }
- friend ostream & operator << (ostream & COUT, Kolekcija & obj);
- //void operator= (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 < _trenutnoElemenata; i++) {
- COUT << "Element1 " << i << " je ";
- COUT << _elementi1[i];
- COUT << endl;
- }
- for (int i = 0; i < _trenutnoElemenata; i++) {
- COUT << "Element2 " << i << " je ";
- COUT << _elementi2[i];
- COUT << endl;
- }
- }
- class Student{
- int _brojIndeksa;
- string _ime;
- string _prezime;
- string _korisnickomIme;
- string _lozinka;
- public:
- Student(string ime = " ", string prezime = " ", string lozinka = "defaultimpossibleunbreakablecase1337letspraythisdoesnthappen") : _brojIndeksa(indexator++), _ime(ime), _prezime(prezime) {
- if (! (lozinka == "defaultimpossibleunbreakablecase1337letspraythisdoesnthappen")) {
- string rule = "(?=.*[[:digit:]])(?=.*[[:alpha:]])(?=.*[@*,])(?=.{6,})";
- regex pravilo(rule);
- if (!regex_search(lozinka, pravilo)) {
- indexator--;
- throw Greska(__LINE__, __FUNCTION__, "Lozinka error.\n");
- }
- }
- _korisnickomIme = ime + "." + prezime;
- _lozinka = lozinka;
- }
- Student(const Student & obj) : _brojIndeksa(obj._brojIndeksa){
- _ime = obj._ime;
- _prezime = obj._prezime;
- _korisnickomIme = obj._korisnickomIme;
- _lozinka = obj._lozinka;
- }
- Student & operator= (const Student & obj){
- _ime = obj._ime;
- _prezime = obj._prezime;
- _korisnickomIme = obj._korisnickomIme;
- _lozinka = obj._lozinka;
- //(int)_brojIndeksa = obj._brojIndeksa; //sta se dogodi kad ovog nema
- return *this;
- }
- bool operator==(const Student & obj) {
- if (_ime == obj._ime && _prezime == obj._prezime)
- return true;
- else
- return false;
- }
- friend ostream & operator << (ostream & COUT, const Student & obj);
- void Info() {
- cout << "Broj indeksa: " << _brojIndeksa << "\nIme i prezime: " << _ime << " " << _prezime << endl;
- cout << "Korisnicko ime: " << _korisnickomIme << "\nLozinka: " << _lozinka << endl;
- }
- /*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*/
- };
- ostream & operator << (ostream & COUT, const Student & obj) {
- COUT << "Broj indeksa: " << obj._brojIndeksa << "\nIme i prezime: " << obj._ime << " " << obj._prezime << endl;
- COUT << "Korisnicko ime: " << obj._korisnickomIme << "\nLozinka: " << obj._lozinka << endl;
- return COUT;
- }
- class Ispit{
- protected:
- 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;
- public:
- Ispit() :_opis("test") {
- _listaStudenata = new Kolekcija<Student, string>();
- }
- Ispit(char * description,Student & studen, string napomena) {
- int size = strlen(description) + 1;
- _opis = new char[size];
- strcpy_s(_opis, size, description);
- _listaStudenata = new Kolekcija < Student, string >(studen,napomena) ;
- //_listaStudenata->AddElement(studen, napomena);
- }
- Ispit(Ispit & org) {
- int size = strlen(org._opis) + 1;
- _opis = new char[size];
- strcpy_s(_opis, size, org._opis);
- _listaStudenata = new Kolekcija < Student, string >(*org._listaStudenata);
- }
- ~Ispit() { delete[]_opis; _opis = nullptr; delete _listaStudenata; _listaStudenata = nullptr; }
- void AddStudent(Student & st, string napomena = " ") {
- if (!_listaStudenata->AddElement(st, napomena)) {
- _listaStudenata->RemoveElement(st);
- _listaStudenata->AddElement(st, "Pokusao ponovo pristupiti ispitu.");
- }
- }
- void operator = (Ispit & obj) {
- //delete[]_opis;
- int size = strlen(obj._opis) + 1;
- _opis = new char[size];
- strcpy_s(_opis, size, obj._opis);
- //delete _listaStudenata;
- _listaStudenata = new Kolekcija < Student, string >(*obj._listaStudenata);
- }
- bool operator==(Ispit & obj) {
- if (strcmp(_opis, obj._opis) == 0) {
- /*if (strcmp(_opis, "test") == 0) {
- Student blankiestudent;
- /*if (!_listaStudenata->AddElement(blankiestudent, "whatevs")) {
- _listaStudenata->RemoveElement()
- return 2;
- }*/
- /*if (_listaStudenata->RemoveElement(blankiestudent) == 0)
- return 2;
- }*/
- return 1;
- }
- return 0;
- }
- void Info() {
- cout << _opis << endl;
- _listaStudenata->Info();
- cout << endl;
- }
- friend ostream & operator << (ostream & COUT, Ispit & obj);
- /*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). */
- };
- ostream & operator << (ostream & COUT, Ispit & obj) {
- COUT << obj._opis;
- obj._listaStudenata->Info();
- return COUT;
- }
- class Predmet{
- char * _nazivPredmeta;
- char * _profesor;
- //1. potrebne funkcije
- public:
- Predmet(char * predmet="TP", char * profa="TP") {
- int size = strlen(predmet) + 1;
- _nazivPredmeta = new char[size];
- strcpy_s(_nazivPredmeta, size, predmet);
- int size2 = strlen(profa) + 1;
- _profesor = new char[size2];
- strcpy_s(_profesor, size2, profa);
- }
- Predmet(Predmet & obj) {
- int size = strlen(obj._nazivPredmeta) + 1;
- _nazivPredmeta = new char[size];
- strcpy_s(_nazivPredmeta, size, obj._nazivPredmeta);
- int size2 = strlen(obj._profesor) + 1;
- _profesor = new char[size2];
- strcpy_s(_profesor, size2, obj._profesor);
- }
- Predmet & operator = ( Predmet & obj) {
- delete[]_nazivPredmeta;
- int size = strlen(obj._nazivPredmeta) + 1;
- _nazivPredmeta = new char[size];
- strcpy_s(_nazivPredmeta, size, obj._nazivPredmeta);
- delete[] _profesor;
- int size2 = strlen(obj._profesor) + 1;
- _profesor = new char[size2];
- strcpy_s(_profesor, size2, obj._profesor);
- return *this;
- }
- friend bool operator == (Predmet & obj, Predmet & obj2);
- ~Predmet() {
- delete[]_nazivPredmeta;
- _nazivPredmeta = nullptr;
- delete[]_profesor;
- _profesor = nullptr;
- }
- friend ostream & operator << (ostream & COUT, Predmet & obj);
- };
- ostream & operator << (ostream & COUT, Predmet & obj) {
- COUT << obj._nazivPredmeta;
- COUT << obj._profesor;
- return COUT;
- }
- bool operator == (Predmet & obj, Predmet & obj2) {
- if (strcmp(obj._nazivPredmeta, obj2._nazivPredmeta) == 0)
- return true;
- return false;
- }
- class SkolskaGodina{
- char * _skolskaGodina;//npr.2014/2015
- Kolekcija<Predmet, Ispit> * _odrzaniIspiti;
- public:
- SkolskaGodina(char * koagodina, Predmet & predmet, Ispit & ispit) {
- int size = strlen(koagodina) + 1;
- _skolskaGodina = new char[size];
- strcpy_s(_skolskaGodina, size, koagodina);
- cout << "In here";
- _odrzaniIspiti = new Kolekcija<Predmet, Ispit>(predmet,ispit);
- }
- ~SkolskaGodina() { delete[]_skolskaGodina; _skolskaGodina = nullptr; delete _odrzaniIspiti; _odrzaniIspiti = nullptr; }
- void AddIspit(Ispit & ispit, Predmet & predmet){
- _odrzaniIspiti->AddElement(predmet, ispit);
- }
- void RemoveIspit(Predmet & predmet, Ispit & ispit) {
- //Ispit blankie;
- Predmet blankie2;
- _odrzaniIspiti->AddElement(blankie2, ispit);
- }
- int GetBrojIzlazakaByPredmet() {
- }
- Student * operator() (string something) {
- }
- void Info() {
- cout << _skolskaGodina << endl;
- _odrzaniIspiti->Info();
- }
- /*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(){
- Kolekcija <int,double> objekat;
- for (int i = 0; i < 51; i++) {
- objekat.AddElement(i, i + 0.3);
- }
- objekat.Info();
- objekat.RemoveElement(5);
- objekat.Info();
- Kolekcija <int, double> objekat2;
- for (int i = 51; i < 101; i++) {
- objekat.AddElement(i, i + 0.3);
- }
- Kolekcija <int, double> objekat3(objekat+objekat2);
- //objekat3 = objekat + objekat2;
- objekat3.Info();
- try {
- Student peep("Nihad", "Hrnjic", "abcd12a");
- }
- catch (Greska err) {
- err.Info();
- }
- /*catch (...) {
- cout << "Unknown error.\n";
- }*/
- Student nihad("Nihad", "Hrnjic", "abcd12@.");
- nihad.Info();
- Student david("David", "Anic", "abcd12@.");
- david.Info();
- Ispit integral("integralni", nihad, "***");
- integral.Info();
- integral.AddStudent(david, "problematican");
- integral.Info();
- integral.AddStudent(david, "opet");
- integral.Info();
- Predmet programiranje("Programiranje", "Denis");
- SkolskaGodina skolgod("2014/2015", programiranje, integral);
- skolgod.Info();
- //pocetni broj indeksa odavde je 140002, jer je uvecavana static varijabla u testnim primjerima
- // Odavde testiram bez castanja consta u int, provjeravamo dal svi studenti u nizu poslije uklonjenog dobiju indeks za 1 manji
- cout << "TESTIRANJE: " << endl;
- indexator.settozero();
- Kolekcija<Student, int> testnakolekcija;
- Student student1("ime1", "prezime1");
- Student student2("ime2", "prezime2");
- Student student3("ime3", "prezime3");
- Student student4("ime4", "prezime4");
- Student student5("ime5", "prezime5");
- testnakolekcija.AddElement(student1, 1);
- testnakolekcija.AddElement(student2, 2);
- testnakolekcija.AddElement(student3, 3);
- testnakolekcija.AddElement(student4, 4);
- testnakolekcija.AddElement(student5, 5);
- cout << "INDEXI PRIJE IZBACIVANJA: " << endl;
- testnakolekcija.Info();
- Student zaizbacit("Ovog", "Izbacujemo");
- testnakolekcija.RemoveElement(student3);
- cout << "INDEXI POSLIJE IZBACIVANJA: " << endl;
- testnakolekcija.Info();
- //izbjegavajte koristenje vlastitog imena i prezimena
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa SkolskaGodina
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement