Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*POSTAVKA
- template<class T1>
- class Kolekcija{
- T1 * _elementi1;
- int _trenutnoElemenata;
- //1. potrebne funkcije
- //2.operator+= :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko prosiranje kolekcije,
- //te onemoguciti ponavljanje elemenata. U zavisnosti od uspjesnosti operacije funkcija vraca true ili
- //false.
- //3.operator-= :: na osnovu parametra tipa T1 uklanja element iz kolekcije. Ukoliko je potrebno, prilikom
- //uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje neinicijaliziranih elemenata, te
- //ocuvati redoslijed dodavanja elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
- //false
- };
- class Datum{
- int * _dan, *_mjesec, *_godina;
- //1. potrebne funkcije
- };
- class TelefonskiPrikljucak{
- Datum _datumPrikljucenja;
- char* _telefonskiBroj;//036 111 222
- bool _aktivan; //u slucaju da se broj više ne koristi
- //1. potrebne funkcije
- };
- class TelecomKorisnik{
- char * _imePrezimeKorisnika;
- Kolekcija<TelefonskiPrikljucak> * _telefonskiPrikljucci;
- vector<float> _dugovi; //odnosi se na neizmirene dugove na svakom telefonskom prikljucku
- //1. operator [] :: vraca pokazivac na objekat tipa TelefonskiPrikljucak kod koga je broj telefona
- //identican onome koji je proslijedjen kao parametar. U slucaju da trazeni broj ne postoji funkcija
- //vraca NULL.
- //2.AddTelefonskiPrikljucak :: dodaje podatke o novom telefonskom priljucku korisnika. Nije dozvoljeno
- //dodati dva identicna telefonska broja. Prilikom dodavanja novog prikljucka iznos duga treba biti
- //postavljen na 0. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false.
- //3.RemoveTelefonskiPrikljucakByDatum :: na osnovu dva primljena parametra (tipa Datum) uklanja podatke o
- //svim telefonskim prikljuccima koji su izvrseni u periodu izmedju ta dva datuma. Nije dozvoljeno
- //uklanjanje informacija o prikljuccima za koje postoji evidentiran dug. Nakon uklanjanja informacija o
- //prikljucku, potrebno je ukloniti i lokacije na kojima se cuvala informacija o njihovim dugovima.
- //Funkcija vraca broj uklonjenih prikljucaka.
- };
- void PretragaPoBroju(Kolekcija<TelecomKorisnik> BHTelecomKorisnici, char * trazeniBroj);
- //Funkcija treba da ispise podatke o korisniku prikljucka koji je vlasnik trazenog broja
- int main(){
- //izbjegavajte koristenje vlastitog imena i prezimena.
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu BHTelecomKorisnici
- Kolekcija<TelecomKorisnik> BHTelecomKorisnici;
- system("pause>0");
- return 0;
- }*/
- /*RJESENJE by rijads*/
- #include<iostream>
- #include<string>
- #include<vector>
- #include<algorithm>
- using namespace std;
- template<class T1>
- class Kolekcija{
- private:
- T1 * _elementi1;
- int _trenutnoElemenata;
- public:
- //1. potrebne funkcije
- Kolekcija(){
- _trenutnoElemenata = 0;
- _elementi1 = new T1[_trenutnoElemenata + 1];
- }
- Kolekcija(Kolekcija& obj){
- if (this != &obj){
- _trenutnoElemenata = obj._trenutnoElemenata;
- _elementi1 = new T1[_trenutnoElemenata + 1];
- for (int i = 0; i < _trenutnoElemenata; i++){
- _elementi1[i] = obj._elementi1[i];
- }
- }
- }
- ~Kolekcija(){
- delete[]_elementi1;
- _elementi1 = NULL;
- }
- int gettrentuno(){
- return _trenutnoElemenata;
- }
- T1& gett1(int lok){
- return _elementi1[lok];
- }
- friend ostream& operator<< <>(ostream&, Kolekcija<T1>&);
- //2.operator+= :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko prosiranje kolekcije,
- //te onemoguciti ponavljanje elemenata. U zavisnosti od uspjesnosti operacije funkcija vraca true ili
- //false.
- bool operator +=(T1& el){
- if (_trenutnoElemenata == 0){
- _elementi1[_trenutnoElemenata] = el;
- _trenutnoElemenata++;
- }
- else{
- for (int i = 0; i < _trenutnoElemenata; i++){ //provjerava da li se element ponavlja
- if(_elementi1[i] == el)
- return false;
- }
- T1* temp;
- temp = new T1[_trenutnoElemenata + 1];
- for (int i = 0; i < _trenutnoElemenata; i++){
- temp[i] = _elementi1[i];
- }
- delete[]_elementi1;
- _elementi1 = temp;
- _elementi1[_trenutnoElemenata] = el; // Ne zaboraviti ovu liniju koda i ne izgubiti na tome pola sata trazeci zasto se ne dodaju novi elementi...............
- _trenutnoElemenata++;
- }
- return true;
- }
- //3.operator-= :: na osnovu parametra tipa T1 uklanja element iz kolekcije. Ukoliko je potrebno, prilikom
- //uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje neinicijaliziranih elemenata, te
- //ocuvati redoslijed dodavanja elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
- //false
- bool operator-=(T1& obj){
- for (int i = 0; i < _trenutnoElemenata; i++){
- if (_elementi1[i] == obj){
- for (int j = i; j < _trenutnoElemenata - 1; j++){
- _elementi1[j] = _elementi1[j + 1];
- }
- _trenutnoElemenata--;
- return true;
- }
- }
- return false;
- }
- };
- template<class T1>
- ostream& operator<< <>(ostream& out, Kolekcija<T1>& obj){
- for (int i = 0; i < obj._trenutnoElemenata; i++){
- out << obj._elementi1[i] << endl;
- }
- return out;
- }
- class Datum{
- private:
- int * _dan, *_mjesec, *_godina;
- public:
- Datum(int d = 1, int m = 1, int g = 1900){
- _dan = new int(d);
- _mjesec = new int(m);
- _godina = new int(g);
- }
- Datum(Datum& obj){
- if (this != &obj){
- _dan = new int(*(obj._dan));
- _mjesec = new int(*(obj._mjesec));
- _godina = new int(*(obj._godina));
- }
- }
- ~Datum(){
- delete _dan;
- _dan = NULL;
- delete _mjesec;
- _mjesec = NULL;
- delete _godina;
- _godina = NULL;
- }
- //1. potrebne funkcije
- friend ostream& operator<<(ostream&, Datum&);
- Datum& operator=(Datum& obj){
- delete _dan;
- _dan = new int(*(obj._dan));
- delete _mjesec;
- _mjesec = new int(*(obj._mjesec));
- delete _godina;
- _godina = new int(*(obj._godina));
- return *this;
- }
- bool operator==(Datum& obj){
- if (*_dan == (*obj._dan) && *_mjesec == (*obj._mjesec) && *_godina == (*obj._godina))
- return true;
- return false;
- }
- bool operator <(Datum& obj){
- if (*_godina < (*obj._godina) || *_mjesec < (*obj._mjesec) && *_godina == (*obj._godina) || *_dan < (*obj._dan) && *_mjesec == (*obj._mjesec) && *_godina == (*obj._godina))
- return true;
- else
- return false;
- }
- };
- ostream& operator<<(ostream& out, Datum& obj){
- out << *(obj._dan) << "." << *(obj._mjesec) << "." << *(obj._godina);
- return out;
- }
- class TelefonskiPrikljucak{
- private:
- Datum _datumPrikljucenja;
- char* _telefonskiBroj;//036 111 222
- bool _aktivan; //u slucaju da se broj više ne koristi
- public:
- //1. potrebne funkcije
- TelefonskiPrikljucak(char* tb = "033 111 111", bool a = true) :_datumPrikljucenja(){
- _telefonskiBroj = new char[strlen(tb) + 1];
- strcpy_s(_telefonskiBroj, strlen(tb) + 1, tb);
- _aktivan = a;
- }
- TelefonskiPrikljucak(char* tb, bool a, Datum d){
- _datumPrikljucenja = d;
- _telefonskiBroj = new char[strlen(tb) + 1];
- strcpy_s(_telefonskiBroj, strlen(tb) + 1, tb);
- _aktivan = a;
- }
- TelefonskiPrikljucak(TelefonskiPrikljucak& obj){
- _telefonskiBroj = new char[strlen(obj._telefonskiBroj) + 1];
- strcpy_s(_telefonskiBroj, strlen(obj._telefonskiBroj) + 1, obj._telefonskiBroj);
- _aktivan = obj._aktivan;
- _datumPrikljucenja = obj._datumPrikljucenja;
- }
- ~TelefonskiPrikljucak(){
- delete[]_telefonskiBroj;
- _telefonskiBroj = NULL;
- }
- friend ostream& operator<<(ostream&, TelefonskiPrikljucak&);
- TelefonskiPrikljucak& operator=(TelefonskiPrikljucak& obj){
- delete[]_telefonskiBroj;
- _telefonskiBroj = new char[strlen(obj._telefonskiBroj) + 1];
- strcpy_s(_telefonskiBroj, strlen(obj._telefonskiBroj) + 1, obj._telefonskiBroj);
- _aktivan = obj._aktivan;
- _datumPrikljucenja = obj._datumPrikljucenja;
- return *this;
- }
- char* telbr(){
- return _telefonskiBroj;
- }
- Datum getdat(){
- return _datumPrikljucenja;
- }
- bool operator==(TelefonskiPrikljucak& obj){
- if (_datumPrikljucenja == obj._datumPrikljucenja&&_aktivan == obj._aktivan&&strcmp(_telefonskiBroj, obj._telefonskiBroj) == NULL)
- return true;
- return false;
- }
- };
- ostream& operator<<(ostream& out, TelefonskiPrikljucak& obj){
- out << "Telefonski prikljucak ";
- if (obj._aktivan)
- out << "je aktivan";
- else
- out << "nije aktivan";
- out << endl <<"Datum prikljucenja: "<<obj._datumPrikljucenja<<endl<<"Telefonski broj: " << obj._telefonskiBroj << endl;
- return out;
- }
- class TelecomKorisnik{
- private:
- char * _imePrezimeKorisnika;
- Kolekcija<TelefonskiPrikljucak> * _telefonskiPrikljucci;
- vector<float> _dugovi; //odnosi se na neizmirene dugove na svakom telefonskom prikljucku
- public:
- TelecomKorisnik(char*ime = "<nepoznato>"){
- _imePrezimeKorisnika = new char[strlen(ime) + 1];
- strcpy_s(_imePrezimeKorisnika, strlen(ime) + 1, ime);
- _telefonskiPrikljucci = new Kolekcija<TelefonskiPrikljucak>();
- }
- friend ostream& operator<<(ostream&, TelecomKorisnik&);
- bool operator==(TelecomKorisnik& obj){
- if (strcmp(_imePrezimeKorisnika, obj._imePrezimeKorisnika) == NULL&&_dugovi == obj._dugovi)//treba dodati kolekciju
- return true;
- return false;
- }
- Kolekcija<TelefonskiPrikljucak> getkoltelpr(){
- return *_telefonskiPrikljucci;
- }
- //1. operator [] :: vraca pokazivac na objekat tipa TelefonskiPrikljucak kod koga je broj telefona
- //identican onome koji je proslijedjen kao parametar. U slucaju da trazeni broj ne postoji funkcija
- //vraca NULL.
- TelefonskiPrikljucak* operator[](char* tb){
- for (int i = 0; i < (*_telefonskiPrikljucci).gettrentuno(); i++){
- if (strcmp(tb, (*_telefonskiPrikljucci).gett1(i).telbr())==NULL){
- return &((*_telefonskiPrikljucci).gett1(i));
- }
- }
- return NULL;
- }
- //2.AddTelefonskiPrikljucak :: dodaje podatke o novom telefonskom priljucku korisnika. Nije dozvoljeno
- //dodati dva identicna telefonska broja. Prilikom dodavanja novog prikljucka iznos duga treba biti
- //postavljen na 0. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false.
- bool AddTelefonskiPrikljucak(TelefonskiPrikljucak telpr){
- for (int i = 0; i < (*_telefonskiPrikljucci).gettrentuno(); i++){
- if (strcmp(telpr.telbr(), (*_telefonskiPrikljucci).gett1(i).telbr()) == NULL) //U slucaju da se dodaje identican telefonski broj
- return false;
- }
- (*_telefonskiPrikljucci) += telpr;
- _dugovi.push_back(0);//postavljanje duga na 0
- return true;
- }
- //3.RemoveTelefonskiPrikljucakByDatum :: na osnovu dva primljena parametra (tipa Datum) uklanja podatke o
- //svim telefonskim prikljuccima koji su izvrseni u periodu izmedju ta dva datuma. Nije dozvoljeno
- //uklanjanje informacija o prikljuccima za koje postoji evidentiran dug. Nakon uklanjanja informacija o
- //prikljucku, potrebno je ukloniti i lokacije na kojima se cuvala informacija o njihovim dugovima.
- //Funkcija vraca broj uklonjenih prikljucaka.
- int RemoveTelefonskiPrikljucakByDatum(Datum& dat1, Datum& dat2){
- int brojac = 0;
- float dug = 0;
- for (int i = 0; i < (*_telefonskiPrikljucci).gettrentuno(); i++){
- if (dat1 < (*_telefonskiPrikljucci).gett1(i).getdat() && (*_telefonskiPrikljucci).gett1(i).getdat() < dat2){
- for (vector<float>::iterator it = _dugovi.begin(); it != _dugovi.end(); it++){
- dug += *it;
- }
- if (dug > 0)//U slucaju da ima duga ne uklanja telefonski prikljucak
- break;
- (*_telefonskiPrikljucci) -= (*_telefonskiPrikljucci).gett1(i);
- brojac++;
- dug = 0;
- }
- }
- return brojac;
- }
- };
- ostream& operator<<(ostream& out, TelecomKorisnik& obj){
- out << "Telecom korisnik: " << obj._imePrezimeKorisnika << endl;
- out << "Dugovi: ";
- for (vector<float>::iterator it = obj._dugovi.begin(); it != obj._dugovi.end(); it++){
- out << *it << ", ";
- }
- out << endl << "Telefonski prikljucci" << endl;
- out << (*obj._telefonskiPrikljucci);
- return out;
- }
- void PretragaPoBroju(Kolekcija<TelecomKorisnik> BHTelecomKorisnici, char * trazeniBroj);
- //Funkcija treba da ispise podatke o korisniku prikljucka koji je vlasnik trazenog broja
- void PretragaPoBroju(Kolekcija<TelecomKorisnik> BHTelecomKorisnici, char * trazeniBroj){
- for (int i = 0; i < BHTelecomKorisnici.gettrentuno(); i++){
- for (int j = 0; j < BHTelecomKorisnici.gett1(i).getkoltelpr().gettrentuno(); j++){
- if (strcmp(trazeniBroj, BHTelecomKorisnici.gett1(i).getkoltelpr().gett1(j).telbr()) == NULL){
- cout << BHTelecomKorisnici.gett1(i);
- break;
- }
- }
- }
- }
- int main(){
- //izbjegavajte koristenje vlastitog imena i prezimena.
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu BHTelecomKorisnici
- Datum dat1;
- Datum dat2(26, 3, 2014);
- Datum dat3(28, 3, 2014);
- Datum dat4(1, 1, 2015);
- TelefonskiPrikljucak telpr1;
- TelefonskiPrikljucak telpr2("033 666 666", false,dat2);
- TelefonskiPrikljucak telpr3("061 777 555", true,dat3);
- TelefonskiPrikljucak telpr4("061 777 555", false,dat4);
- cout << dat2 << endl;
- cout << telpr2 << endl;
- TelecomKorisnik telkor1;
- TelecomKorisnik telkor2("Mike Smith");
- TelecomKorisnik telkor3("David Sedmi");
- telkor2.AddTelefonskiPrikljucak(telpr1);
- telkor2.AddTelefonskiPrikljucak(telpr2);
- telkor2.AddTelefonskiPrikljucak(telpr3);
- telkor2.AddTelefonskiPrikljucak(telpr4);// ne dodaje posto je isti broj
- telkor3.AddTelefonskiPrikljucak(telpr2);
- telkor3.AddTelefonskiPrikljucak(telpr4);
- cout << telkor2 << endl;
- Kolekcija<TelecomKorisnik> BHTelecomKorisnici;
- BHTelecomKorisnici += telkor1;
- BHTelecomKorisnici += telkor2;
- BHTelecomKorisnici += telkor2;//ne dodaje isti element u kolekciju
- BHTelecomKorisnici += telkor3;
- BHTelecomKorisnici -= telkor1;//brise korisnika
- cout << "Ispis glavne kolekcije: "<<endl << BHTelecomKorisnici<<endl;
- cout << endl << endl << "Ispis prije uklanjanja" << endl << telkor2;
- cout<<"Uklonjeno je: "<<telkor2.RemoveTelefonskiPrikljucakByDatum(dat2, dat4)<<" pregleda."<<endl;//brise sve izmedju dat2 i dat 4 tj
- cout << "Ispis poslje uklanjanja: " << telkor2;
- cout << endl << "Testiranje operatora []" << endl;
- if (&(*(telkor2["033 666 666"])) != NULL)
- cout << *(telkor2["033 666 666"]);
- else
- cout << "Ne postoji";
- cout << endl << endl << "Testiranje funkcije PretragaPoBroju:" << endl;
- PretragaPoBroju(BHTelecomKorisnici, "033 666 666");
- system("pause>0");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment