Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <regex>
- #include <algorithm>
- #include <thread>
- #include <mutex>
- #include <iterator>
- #include <string>
- using namespace std;
- char *crt = "\n---------------------------------------\n";
- mutex cuvarResursa;
- class DatumVrijeme {
- int *_dan, *_mjesec, *_godina, *_sati, *_minuti;
- public:
- DatumVrijeme(int dan = 1, int mjesec = 1, int godina = 2000, int sati = 0, int minuti = 0) {
- _dan = new int(dan);
- _mjesec = new int(mjesec);
- _godina = new int(godina);
- _sati = new int(sati);
- _minuti = new int(minuti);
- }
- ~DatumVrijeme() {
- delete _dan; _dan = nullptr;
- delete _mjesec; _mjesec = nullptr;
- delete _godina; _godina = nullptr;
- delete _sati; _sati = nullptr;
- delete _minuti; _minuti = nullptr;
- }
- DatumVrijeme(const DatumVrijeme &obj) {
- _dan = new int(*obj._dan);
- _mjesec = new int(*obj._mjesec);
- _godina = new int(*obj._godina);
- _sati = new int(*obj._sati);
- _minuti = new int(*obj._minuti);
- }
- DatumVrijeme & operator = (const DatumVrijeme &obj) {
- if (this != &obj) {
- delete _dan, _mjesec, _godina, _sati, _minuti;
- _dan = new int(*obj._dan);
- _mjesec = new int(*obj._mjesec);
- _godina = new int(*obj._godina);
- _sati = new int(*obj._sati);
- _minuti = new int(*obj._minuti);
- } return *this;
- }
- friend ostream& operator<< (ostream &COUT, const DatumVrijeme &obj);
- friend bool operator == (const DatumVrijeme &d1, const DatumVrijeme &d2);
- };
- bool operator == (const DatumVrijeme &d1, const DatumVrijeme &d2) {
- return *d1._dan == *d2._dan && *d1._mjesec == *d2._mjesec && *d1._godina == *d2._godina && *d1._sati == *d2._sati;
- }
- ostream& operator<< (ostream &COUT, const DatumVrijeme &obj) {
- COUT << *obj._dan << "." << *obj._mjesec << "." << *obj._godina << " " << *obj._sati << ":" << *obj._minuti;
- return COUT;
- }
- template<class T1, class T2 = int>
- class FITKolekcija {
- T1 * _elementi1;
- T2 * _elementi2;
- int _trenutno;
- public:
- FITKolekcija() {
- _elementi1 = nullptr;
- _elementi2 = nullptr;
- _trenutno = 0;
- }
- ~FITKolekcija() {
- delete[] _elementi1; _elementi1 = nullptr;
- delete[] _elementi2; _elementi2 = nullptr;
- }
- FITKolekcija(const FITKolekcija &obj) {
- _elementi1 = new T1[obj._trenutno];
- _elementi2 = new T2[obj._trenutno];
- for (int i = 0; i < obj._trenutno; i++) {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- _trenutno = obj._trenutno;
- }
- void Dodaj(T1 e1, T2 e2) {
- T1 *temp1 = new T1[_trenutno+1];
- T2 *temp2 = new T2[_trenutno+1];
- for (int i = 0; i < _trenutno; i++) {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- temp1[_trenutno] = e1;
- temp2[_trenutno++] = e2;
- delete[]_elementi1; delete[]_elementi2;
- _elementi1 = temp1; _elementi2 = temp2;
- }
- void Sortiraj() {
- for (int i = _trenutno; i > 0; i--) {
- for (int j = 1; j < i; j++) {
- if (_elementi1[j] < _elementi1[j-1]) {
- swap(_elementi1[j], _elementi1[j-1]);
- swap(_elementi2[j], _elementi2[j-1]);
- }
- }
- }
- }
- void DodajNaLokaciju(T1 e1, T2 e2, int lokacija) {
- if (lokacija < 0 || lokacija >= _trenutno) return;
- _trenutno++;
- T1 *temp1 = new T1[_trenutno];
- T2 *temp2 = new T2[_trenutno];
- for (int i = 0; i < _trenutno; i++) {
- if (i > lokacija) {
- temp1[i] = _elementi1[i-1];
- temp2[i] = _elementi2[i-1];
- } else {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- }
- temp1[lokacija] = e1;
- temp2[lokacija] = e2;
- delete[]_elementi1; delete[]_elementi2;
- _elementi1 = temp1; _elementi2 = temp2;
- }
- void RemoveElement(int lokacija) {
- if (lokacija < 0 || lokacija >= _trenutno) return;
- T1 *temp1 = new T1[_trenutno-1];
- T2 *temp2 = new T2[_trenutno-1];
- for (int i = 0; i < _trenutno-1; i++) {
- if (i < lokacija) {
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- } else {
- temp1[i] = _elementi1[i+1];
- temp2[i] = _elementi2[i+1];
- }
- }
- _trenutno--;
- delete[]_elementi1; delete[]_elementi2;
- _elementi1 = temp1; _elementi2 = temp2;
- }
- FITKolekcija * GetJedinstveni() {
- FITKolekcija * _lista = new FITKolekcija<T1, T2>(); bool nijeJedinstven;
- for (int i = 0; i < _trenutno; i++) {
- nijeJedinstven = false;
- for (int j = 0; j < _trenutno; j++) {
- if (i != j) {
- if (_elementi1[i] == _elementi1[j] && _elementi2[i] == _elementi2[j])
- nijeJedinstven = true;
- }
- }
- if (!nijeJedinstven) {
- for (int e = 0; e < _lista->_trenutno; e++) {
- if (_lista->_elementi1[e] == _elementi1[i] && _lista->_elementi2[e] == _elementi2[i])
- nijeJedinstven = true;
- }
- if (!nijeJedinstven) _lista->Dodaj(_elementi1[i], _elementi2[i]);
- }
- } return _lista;
- }
- FITKolekcija * GetDuplikate() {
- FITKolekcija * _lista = new FITKolekcija<T1, T2>(); bool Duplikat;
- for (int i = 0; i < _trenutno; i++) {
- Duplikat = false;
- for (int j = 0; j < _trenutno; j++) {
- if (i != j) {
- if (_elementi1[i] == _elementi1[j] && _elementi2[i] == _elementi2[j])
- Duplikat = true;
- }
- }
- if (Duplikat) {
- for (int e = 0; e < _lista->_trenutno; e++) {
- if (_lista->_elementi1[e] == _elementi1[i] && _lista->_elementi2[e] == _elementi2[i])
- Duplikat = false;
- }
- if (Duplikat) _lista->Dodaj(_elementi1[i], _elementi2[i]);
- }
- }
- return _lista;
- }
- FITKolekcija & operator = (const FITKolekcija &obj) {
- if (this != &obj) {
- delete[]_elementi1;
- delete[]_elementi2;
- _elementi1 = new T1[obj._trenutno];
- _elementi2 = new T2[obj._trenutno];
- for (int i = 0; i < obj._trenutno; i++) {
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- _trenutno = obj._trenutno;
- } return *this;
- }
- T1 & GetT1(int lokacija) const { if (lokacija >= 0 && lokacija < _trenutno) return _elementi1[lokacija]; }
- T2 & GetT2(int lokacija) const { if (lokacija >= 0 && lokacija < _trenutno) return _elementi2[lokacija]; }
- int GetTrenutno() { return _trenutno; }
- friend ostream& operator<< <> (ostream &COUT, const FITKolekcija<T1, T2> &obj);
- };
- template<class T1, class T2>
- ostream& operator<< <> (ostream &COUT, const FITKolekcija<T1, T2> &obj) {
- for (size_t i = 0; i < obj._trenutno; i++)
- COUT << obj._elementi1[i] << " - " << obj._elementi2[i] << endl;
- return COUT;
- }
- enum vrstaDokumenta { PDF, DOC, TXT, HTML };
- char *_ispisDokumenta[]{ "pdf", "doc", "txt", "html" };
- class Dokument {
- vrstaDokumenta _vrsta;
- string _naziv;
- string _sadrzaj;
- int _brojStranica;
- public:
- Dokument() { _brojStranica = 0; }
- Dokument(vrstaDokumenta vrsta, string naziv) {
- _naziv = naziv; _vrsta = vrsta; _brojStranica = 0;
- }
- Dokument(const Dokument &obj) {
- _vrsta = obj._vrsta;
- _naziv = obj._naziv;
- _sadrzaj = obj._sadrzaj;
- _brojStranica = obj._brojStranica;
- }
- ~Dokument() {}
- string GetNaziv() { return _naziv; };
- string GetSadrzaj() { return _sadrzaj; };
- vrstaDokumenta GetVrsta() { return _vrsta; };
- void UvecajBrojStranica() { _brojStranica++; }
- int GetBrojStranica() { return _brojStranica; }
- void DodajSadrzaj(string sadrzaj) {
- _sadrzaj += sadrzaj;
- _brojStranica = (_sadrzaj.size() / 30) + 1;
- }
- friend ostream & operator<< (ostream&COUT, const Dokument & obj);
- };
- ostream & operator<< (ostream&COUT, const Dokument & obj) {
- COUT << obj._naziv << "." << _ispisDokumenta[obj._vrsta] << " (" << obj._brojStranica << ")\n" << obj._sadrzaj << endl;
- return COUT;
- }
- class Uredjaj {
- protected:
- char *_proizvodjac;
- char *_model;
- public:
- Uredjaj(char * proizvodjac, char * model) {
- int vel = strlen(proizvodjac) + 1;
- _proizvodjac = new char[vel];
- strcpy_s(_proizvodjac, vel, proizvodjac);
- vel = strlen(model) + 1;
- _model = new char[vel];
- strcpy_s(_model, vel, model);
- }
- virtual ~Uredjaj() = 0 {
- delete[] _proizvodjac; _proizvodjac = nullptr;
- delete[] _model; _model = nullptr;
- }
- Uredjaj(const Uredjaj &obj) {
- int vel = strlen(obj._proizvodjac) + 1;
- _proizvodjac = new char[vel];
- strcpy_s(_proizvodjac, vel, obj._proizvodjac);
- vel = strlen(obj._model) + 1;
- _model = new char[vel];
- strcpy_s(_model, vel, obj._model);
- }
- Uredjaj & operator= (const Uredjaj &obj) {
- if (this != &obj) {
- delete[]_proizvodjac;
- delete[]_model;
- int vel = strlen(obj._proizvodjac) + 1;
- _proizvodjac = new char[vel];
- strcpy_s(_proizvodjac, vel, obj._proizvodjac);
- vel = strlen(obj._model) + 1;
- _model = new char[vel];
- strcpy_s(_model, vel, obj._model);
- } return *this;
- }
- };
- void Print(string nazivDokumenta, string sadrzajDokumenta, DatumVrijeme &dV) {
- lock_guard<mutex> locker(cuvarResursa); //~safe(lock - unlock)
- //cuvarResursa.lock();
- cout << nazivDokumenta << endl << sadrzajDokumenta << endl << dV << endl;
- this_thread::sleep_for(chrono::seconds(1));
- //cuvarResursa.unlock();
- }
- class Printer: public Uredjaj {
- FITKolekcija<DatumVrijeme, Dokument> _printaniDokumenti;
- vector<string> _zabranjeneRijeci;
- public:
- Printer(char *proizvodjac, char * model): Uredjaj(proizvodjac, model) {}
- virtual ~Printer() {}
- Printer(const Printer &obj): Uredjaj(obj) {
- _printaniDokumenti = obj._printaniDokumenti;
- _zabranjeneRijeci = obj._zabranjeneRijeci;
- }
- Printer & operator= (const Printer &obj) {
- Uredjaj::operator=(obj);
- _printaniDokumenti = obj._printaniDokumenti;
- _zabranjeneRijeci = obj._zabranjeneRijeci;
- return *this;
- }
- int GetProsjecanBrojStranicaPoDatumu(DatumVrijeme &datum) {
- int brStrainica = 0;
- for (int i = 0; i < _printaniDokumenti.GetTrenutno(); i++) {
- if (datum == _printaniDokumenti.GetT1(i))
- brStrainica += _printaniDokumenti.GetT2(i).GetBrojStranica();
- } return brStrainica;
- }
- FITKolekcija<DatumVrijeme, Dokument> & GetPrintaniDokumenti() { return _printaniDokumenti; };
- vector<string> & GetZabranjeneRijeci() { return _zabranjeneRijeci; };
- void UkloniDokumente() {
- for (int i = 0; i < _printaniDokumenti.GetTrenutno(); i++) {
- if (!_provjeraIspravnosti(_printaniDokumenti.GetT2(i).GetNaziv(), _printaniDokumenti.GetT2(i).GetSadrzaj())) {
- _printaniDokumenti.RemoveElement(i);
- }
- }
- }
- void DodajZabranjenuRijec(string zabranjenaRijec) {
- vector<string>::iterator it = _zabranjeneRijeci.begin();
- for (it; it != _zabranjeneRijeci.end(); it++) {
- if (zabranjenaRijec == *it)
- return;
- }
- _zabranjeneRijeci.push_back(zabranjenaRijec);
- }
- string GetTopZabranjenuRijec() {
- int trenutno = 0, najvise = 0, indeks = 0;
- for (int j = 0; j < _zabranjeneRijeci.size(); j++) {
- trenutno = 0;
- regex reg("(" + _zabranjeneRijeci[j] + ")");
- for (int i = 0; i < _printaniDokumenti.GetTrenutno(); i++) {
- string tekst = _printaniDokumenti.GetT2(i).GetSadrzaj();
- sregex_iterator its(tekst.begin(), tekst.end(), reg);
- sregex_iterator ite;
- while (its!=ite) {
- its++;
- trenutno++;
- }
- }
- if (trenutno > najvise) { najvise = trenutno; indeks = j; }
- } return _zabranjeneRijeci[indeks];
- }
- bool _provjeraIspravnosti(string naziv, string sadrzaj) {
- string praviloNaziv = "^([a-zA-Z]{5,15})\\.((" + (string)_ispisDokumenta[PDF] + ")|(" + (string)_ispisDokumenta[DOC] + ")|(" + (string)_ispisDokumenta[TXT] + ")|(" + (string)_ispisDokumenta[HTML] + "))";
- string praviloSadrzaj = "(?:(";
- for (int i = 0; i < _zabranjeneRijeci.size(); i++) {
- if (i == _zabranjeneRijeci.size() - 1)
- praviloSadrzaj += _zabranjeneRijeci[i] + "))";
- else
- praviloSadrzaj += _zabranjeneRijeci[i] + "|";
- }
- return regex_match(naziv, regex(praviloNaziv)) && !regex_search(sadrzaj, regex(praviloSadrzaj));
- }
- //DA BI PRINTER ISPRINTAO NEKI DOKUMENT MORAJU BITI ZADOVOLJENA SLJEDEĆA PRAVILA:
- //1. NAZIV DOKUMENTA MORA BITI U SLJEDEĆEM FORMATU npr: ispitPRIII.doc
- //NAZIV DOKUMENTA MOŽE SADRŽAVATI SAMO SLOVA (NAJMANJE 5, NAJVIŠE 15), A EKSTENZIJA MOŽE
- //BITI SAMO NEKA OD DOZVOLJENIH VRSTOMDOKUMENTA
- //2. SADRŽAJ DOKUMENTA U SEBI NE SMIJE POSJEDOVATI NITI JEDNU ZABRANJENU RIJEČ
- //UKOLIKO NEKI OD NAVEDENIH USLOVA NIJE ZADOVOLJEN FUNKCIJA TREBA DA BACI EXCEPTION SA
- //ODGOVARAJUĆOM PORUKOM, ALI ĆE DOKUMENT BITI POHRANJEN U KOLEKCIJU _printaniDokumenti.
- //UKOLIKO DOKUMENT ISPUNJAVA SVE USLOVE ZA PRINTANJE POTREBNO JE NA KONZOLU ISPISATI
- //SADRŽAJ DOKUMENTA KOJI SE PRINTA
- //IMPLEMENTIRATI PRINTANJE U ZASEBNIM NITIMA UZ KORIŠTENJE sleep_for FUNKCIJE
- //VODITI RAČUNA O DIJELJENJU ZAJEDNIČKIH RESURSA
- void Printaj(DatumVrijeme datum, Dokument &dokument) {
- _printaniDokumenti.Dodaj(datum, dokument);
- if (_provjeraIspravnosti(dokument.GetNaziv(), dokument.GetSadrzaj())) {
- thread printThread(&Print, dokument.GetNaziv(), dokument.GetSadrzaj(), ref(datum));
- printThread.join();
- } else throw exception("\nGreksa! U dokumentu je pronadjena zabranjena rijec.\n");
- } //za do sada koristene vrste izuzetaka nije poznat nacin da se izuzetak proslijedi iz jednog thread-a u drugi thread (jer svaki thread ima svoj stek) //crash
- friend ostream & operator << (ostream &C, const Printer &obj);
- };
- ostream & operator << (ostream &C, const Printer &obj) {
- C << crt << obj._proizvodjac << " - " << obj._model << crt;
- C << obj._printaniDokumenti;
- C << "Lista zabranjenih rijeci: ";
- for (int i = 0; i < obj._zabranjeneRijeci.size(); i++)
- C << obj._zabranjeneRijeci[i] << " ";
- return C;
- }
- void main() {
- //****************************************************************************
- //1. SVE KLASE TREBAJU POSJEDOVATI ADEKVATAN DESTRUKTOR
- //2. NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO "RE"
- //3. SPAŠAVAJTE PROJEKAT KAKO BI SE SPRIJEČILO GUBLJENJE URAĐENOG ZADATKA
- //4. PROGRAMSKI CODE SE TAKOĐER NALAZI U FAJLU CODE.TXT
- //5. NAZIVI FUNKCIJA, TE BROJ I TIP PARAMETARA MORAJU BITI IDENTIČNI ONIMA KOJI SU KORIŠTENI U TESTNOM CODE-U, OSIM U SLUČAJU DA POSTOJI ADEKVATAN RAZLOG ZA NJIHOVU MODIFIKACIJU. OSTALE, POMOĆNE FUNKCIJE MOŽETE IMENOVATI I DODAVATI PO ŽELJI.
- //6. IZUZETAK BACITE U FUNKCIJAMA U KOJIMA JE TO NAZNAČENO.
- //****************************************************************************
- #pragma region TestiranjeDatumVrijeme
- DatumVrijeme danas(1, 2, 2017, 10, 15);
- DatumVrijeme sutra(danas);
- DatumVrijeme prekosutra;
- prekosutra = danas;
- cout << danas << endl << sutra << endl << prekosutra << crt;
- #pragma endregion
- #pragma region FITKolekcija
- int v6 = 6, v13 = 13, v32 = 32, v63 = 63, v98 = 98, v109 = 109, v196 = 196;
- FITKolekcija<int, int> brojevi;
- brojevi.Dodaj(v196, v6);
- brojevi.Dodaj(v13, v32);
- brojevi.Dodaj(v98, v196);
- brojevi.Dodaj(v63, v13);
- brojevi.Dodaj(v98, v196);
- brojevi.Dodaj(v196, v6);
- cout << brojevi << crt+1;
- //SORTIRANJE ČLANOVA KOLEKCIJE SE VRŠI U RASTUĆEM REDOSLIJEDU NA OSNOVU VRIJEDNOSTI ELEMENTA TIPA T1
- brojevi.Sortiraj();
- cout << brojevi << crt+1;
- //BROJ 2 SE ODNOSI NA LOKACIJU/INDEKS UNUTAR LISTE NA KOJI JE POTREBNO DODATI NOVE ELEMENTE
- brojevi.DodajNaLokaciju(v109, v6, 2);
- cout << brojevi << crt+1;
- brojevi.Sortiraj();
- cout << brojevi << crt+1;
- //METODA GetJedinstveni VRAĆA LISTU JEDINSTVENIH ELEMENATA TJ. ELEMENATA KOJI NE SADRŽE DUPLIKATE (POJAM DUPLIKAT SE ODNOSI NA ISTE VRIJEDNOSTI ELEMENATA T1 I T2). ELEMENTI KOJI SE DUPLIRAJU SE U OVOJ LISTI TREBAJU POJAVITI SAMO JEDNOM.
- FITKolekcija<int, int> * jedinstveni = brojevi.GetJedinstveni();
- cout << *jedinstveni << crt+1;
- //*jedinstveni = brojevi;
- //cout << *jedinstveni << crt;
- FITKolekcija<int, int> * duplikati = brojevi.GetDuplikate();
- cout << *duplikati << crt+1;
- Dokument ispitPRIII(DOC, "ispitPRIII.doc");
- //BROJ STRANICA DOKUMENTA SE AUTOMATSKI ODREĐUJE PRILIKOM DODAVANJA SADRŽAJA. ZA POTREBE ISPITA PRETPOSTAVLJAMO DA NA JEDNU STRANICU MOŽE STATI 30 ZNAKOVA UKLJUČUJUĆI I RAZMAKE
- ispitPRIII.DodajSadrzaj("NAMJERNO IZOSTAVLJANJE KOMPLETNIH I/ILI POJEDINIH DIJELOVA DESTRUKTORA KOJI UZROKUJU RUNTIME ERROR ĆE BITI OZNACENO KAO RE");
- cout << "Broj stranica -> " << ispitPRIII.GetBrojStranica() << endl;
- cout << ispitPRIII << endl;
- Dokument ispitBaze(DOC, "ispitBaze.doc");
- ispitBaze.DodajSadrzaj("PROGRAMSKI CODE SE TAKOĐER NALAZI U FAJLU CODE.TXT");
- cout << ispitBaze << endl;//ISPISUJE SVE DOSTUPNE PODATKE O DOKUMENTU
- Printer hp3200("HP", "3200");
- //PRINTER NEĆE DOZVOLITI PRINTANJE DOKUMENATA U ČIJEM SADRŽAJU SE NALAZI NEKA OD ZABRANJENIH RIJEČI
- hp3200.DodajZabranjenuRijec("RE");// :)
- hp3200.DodajZabranjenuRijec("RAT");
- hp3200.DodajZabranjenuRijec("UBITI");
- hp3200.DodajZabranjenuRijec("RE");// ONEMOGUĆITI PONAVLJANJE ZABRANJENIH RIJEČI, KORISTITI ITERATORE
- hp3200.DodajZabranjenuRijec("MRZITI");
- try {
- //IMPLEMENTIRATI PRINTANJE U ZASEBNIM NITIMA UZ KORIŠTENJE sleep_for FUNKCIJE
- //VODITI RAČUNA O DIJELJENJU ZAJEDNIČKIH RESURSA
- hp3200.Printaj(danas, ispitBaze);
- hp3200.Printaj(danas, ispitPRIII);
- } catch (exception& err) {
- cout << err.what() << endl;
- }
- //KOD POREĐENJA DATUMA PRINTANJA NIJE POTREBNO POREDITI MINUTE, SAMO DATUM I SATE
- cout << "Prosjecan broj printanih stranica za " << danas << " je -> " << hp3200.GetProsjecanBrojStranicaPoDatumu(danas) << crt;
- cout << "Najcesce koristena zabranjena rijec je -> " << hp3200.GetTopZabranjenuRijec() << crt;
- cout << hp3200 << crt;
- Printer hp4000(hp3200);
- cout << "Prosjecan broj printanih stranica za " << danas << " je -> " << hp4000.GetProsjecanBrojStranicaPoDatumu(danas) << crt;
- cout << "Najcesce koristena zabranjena rijec je -> " << hp4000.GetTopZabranjenuRijec() << crt;
- hp4000.UkloniDokumente();//UKLANJA SVE DOKUMENTE KOJI NISU ZADOVOLJILI USLOVE ZA PRINTANJE
- cout << hp4000 << crt;
- #pragma endregion
- getchar();
- }
Add Comment
Please, Sign In to add comment