rijads

PR2_3.9.2014_rjesen

Sep 15th, 2014
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 17.71 KB | None | 0 0
  1. /*POSTAVKA
  2. template<class T1>
  3. class Kolekcija{
  4.         T1 * _elementi1;
  5.         int _trenutnoElemenata;
  6.         //1. potrebne funkcije
  7.         //2.operator+= :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko prosiranje kolekcije,
  8.         //te onemoguciti ponavljanje elemenata. U zavisnosti od uspjesnosti operacije funkcija vraca true ili
  9.         //false.
  10.         //3.operator-= :: na osnovu parametra tipa T1 uklanja element iz kolekcije. Ukoliko je potrebno, prilikom
  11.         //uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje neinicijaliziranih elemenata, te
  12.         //ocuvati redoslijed dodavanja elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
  13.         //false
  14. };
  15. class Datum{
  16.         int * _dan, *_mjesec, *_godina;
  17.         //1. potrebne funkcije
  18. };
  19.  
  20. class TelefonskiPrikljucak{
  21.         Datum _datumPrikljucenja;
  22.         char* _telefonskiBroj;//036 111 222
  23.         bool _aktivan; //u slucaju da se broj više ne koristi
  24.         //1. potrebne funkcije
  25. };
  26.  
  27. class TelecomKorisnik{
  28.         char * _imePrezimeKorisnika;
  29.         Kolekcija<TelefonskiPrikljucak> * _telefonskiPrikljucci;
  30.         vector<float> _dugovi; //odnosi se na neizmirene dugove na svakom telefonskom prikljucku
  31.         //1. operator [] :: vraca pokazivac na objekat tipa TelefonskiPrikljucak kod koga je broj telefona
  32.         //identican onome koji je proslijedjen kao parametar. U slucaju da trazeni broj ne postoji funkcija
  33.         //vraca NULL.
  34.         //2.AddTelefonskiPrikljucak :: dodaje podatke o novom telefonskom priljucku korisnika. Nije dozvoljeno
  35.         //dodati dva identicna telefonska broja. Prilikom dodavanja novog prikljucka iznos duga treba biti
  36.         //postavljen na 0. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false.
  37.         //3.RemoveTelefonskiPrikljucakByDatum :: na osnovu dva primljena parametra (tipa Datum) uklanja podatke o
  38.         //svim telefonskim prikljuccima koji su izvrseni u periodu izmedju ta dva datuma. Nije dozvoljeno
  39.         //uklanjanje informacija o prikljuccima za koje postoji evidentiran dug. Nakon uklanjanja informacija o
  40.         //prikljucku, potrebno je ukloniti i lokacije na kojima se cuvala informacija o njihovim dugovima.
  41.         //Funkcija vraca broj uklonjenih prikljucaka.
  42.  
  43. };
  44. void PretragaPoBroju(Kolekcija<TelecomKorisnik> BHTelecomKorisnici, char * trazeniBroj);
  45. //Funkcija treba da ispise podatke o korisniku prikljucka koji je vlasnik trazenog broja
  46. int main(){
  47.         //izbjegavajte koristenje vlastitog imena i prezimena.
  48.         //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu BHTelecomKorisnici  
  49.         Kolekcija<TelecomKorisnik> BHTelecomKorisnici;
  50.         system("pause>0");
  51.         return 0;
  52. }*/
  53. /*RJESENJE by rijads*/
  54. #include<iostream>
  55. #include<string>
  56. #include<vector>
  57. #include<algorithm>
  58.  
  59. using namespace std;
  60.  
  61. template<class T1>
  62. class Kolekcija{
  63. private:
  64.         T1 * _elementi1;
  65.         int _trenutnoElemenata;
  66. public:
  67.         //1. potrebne funkcije
  68.         Kolekcija(){
  69.                 _trenutnoElemenata = 0;
  70.                 _elementi1 = new T1[_trenutnoElemenata + 1];
  71.         }
  72.         Kolekcija(Kolekcija& obj){
  73.                 if (this != &obj){
  74.                         _trenutnoElemenata = obj._trenutnoElemenata;
  75.                         _elementi1 = new T1[_trenutnoElemenata + 1];
  76.                         for (int i = 0; i < _trenutnoElemenata; i++){
  77.                                 _elementi1[i] = obj._elementi1[i];
  78.                         }
  79.                 }
  80.         }
  81.         ~Kolekcija(){
  82.                 delete[]_elementi1;
  83.                 _elementi1 = NULL;
  84.         }
  85.         int gettrentuno(){
  86.                 return _trenutnoElemenata;
  87.         }
  88.         T1& gett1(int lok){
  89.                 return _elementi1[lok];
  90.         }
  91.         friend ostream& operator<< <>(ostream&, Kolekcija<T1>&);
  92.         //2.operator+= :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko prosiranje kolekcije,
  93.         //te onemoguciti ponavljanje elemenata. U zavisnosti od uspjesnosti operacije funkcija vraca true ili
  94.         //false.
  95.         bool operator +=(T1& el){
  96.                 if (_trenutnoElemenata == 0){
  97.                         _elementi1[_trenutnoElemenata] = el;
  98.                         _trenutnoElemenata++;
  99.                 }
  100.                 else{
  101.                         for (int i = 0; i < _trenutnoElemenata; i++){ //provjerava da li se element ponavlja
  102.                                 if(_elementi1[i] == el)
  103.                                         return false;
  104.                         }
  105.                         T1* temp;
  106.                         temp = new T1[_trenutnoElemenata + 1];
  107.                         for (int i = 0; i < _trenutnoElemenata; i++){
  108.                                 temp[i] = _elementi1[i];
  109.                         }
  110.                         delete[]_elementi1;
  111.                         _elementi1 = temp;
  112.                         _elementi1[_trenutnoElemenata] = el; // Ne zaboraviti ovu liniju koda i ne izgubiti na tome pola sata trazeci zasto se ne dodaju novi elementi...............
  113.                         _trenutnoElemenata++;
  114.                 }
  115.                 return true;
  116.         }
  117.  
  118.         //3.operator-= :: na osnovu parametra tipa T1 uklanja element iz kolekcije. Ukoliko je potrebno, prilikom
  119.         //uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje neinicijaliziranih elemenata, te
  120.         //ocuvati redoslijed dodavanja elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
  121.         //false
  122.         bool operator-=(T1& obj){
  123.                 for (int i = 0; i < _trenutnoElemenata; i++){
  124.                         if (_elementi1[i] == obj){
  125.                                 for (int j = i; j < _trenutnoElemenata - 1; j++){
  126.                                         _elementi1[j] = _elementi1[j + 1];
  127.                                 }
  128.                                 _trenutnoElemenata--;
  129.                                 return true;
  130.                         }
  131.                 }
  132.                 return false;
  133.         }
  134. };
  135. template<class T1>
  136. ostream& operator<< <>(ostream& out, Kolekcija<T1>& obj){
  137.         for (int i = 0; i < obj._trenutnoElemenata; i++){
  138.                 out << obj._elementi1[i] << endl;
  139.         }
  140.         return out;
  141. }
  142. class Datum{
  143. private:
  144.         int * _dan, *_mjesec, *_godina;
  145. public:
  146.         Datum(int d = 1, int m = 1, int g = 1900){
  147.                 _dan = new int(d);
  148.                 _mjesec = new int(m);
  149.                 _godina = new int(g);
  150.         }
  151.         Datum(Datum& obj){
  152.                 if (this != &obj){
  153.                         _dan = new int(*(obj._dan));
  154.                         _mjesec = new int(*(obj._mjesec));
  155.                         _godina = new int(*(obj._godina));
  156.                 }
  157.         }
  158.         ~Datum(){
  159.                 delete _dan;
  160.                 _dan = NULL;
  161.                 delete _mjesec;
  162.                 _mjesec = NULL;
  163.                 delete _godina;
  164.                 _godina = NULL;
  165.         }
  166.         //1. potrebne funkcije
  167.         friend ostream& operator<<(ostream&, Datum&);
  168.         Datum& operator=(Datum& obj){
  169.                 delete _dan;
  170.                 _dan = new int(*(obj._dan));
  171.                 delete _mjesec;
  172.                 _mjesec = new int(*(obj._mjesec));
  173.                 delete _godina;
  174.                 _godina = new int(*(obj._godina));
  175.                 return *this;
  176.         }
  177.         bool operator==(Datum& obj){
  178.                 if (*_dan == (*obj._dan) && *_mjesec == (*obj._mjesec) && *_godina == (*obj._godina))
  179.                         return true;
  180.                 return false;
  181.         }
  182.         bool operator <(Datum& obj){
  183.                 if (*_godina < (*obj._godina) || *_mjesec < (*obj._mjesec) && *_godina == (*obj._godina) || *_dan < (*obj._dan) && *_mjesec == (*obj._mjesec) && *_godina == (*obj._godina))
  184.                         return true;
  185.                 else
  186.                         return false;
  187.         }
  188. };
  189. ostream& operator<<(ostream& out, Datum& obj){
  190.         out << *(obj._dan) << "." << *(obj._mjesec) << "." << *(obj._godina);
  191.         return out;
  192. }
  193. class TelefonskiPrikljucak{
  194. private:
  195.         Datum _datumPrikljucenja;
  196.         char* _telefonskiBroj;//036 111 222
  197.         bool _aktivan; //u slucaju da se broj više ne koristi
  198. public:
  199.         //1. potrebne funkcije
  200.         TelefonskiPrikljucak(char* tb = "033 111 111", bool a = true) :_datumPrikljucenja(){
  201.                 _telefonskiBroj = new char[strlen(tb) + 1];
  202.                 strcpy_s(_telefonskiBroj, strlen(tb) + 1, tb);
  203.                 _aktivan = a;
  204.         }
  205.         TelefonskiPrikljucak(char* tb, bool a, Datum d){
  206.                 _datumPrikljucenja = d;
  207.                 _telefonskiBroj = new char[strlen(tb) + 1];
  208.                 strcpy_s(_telefonskiBroj, strlen(tb) + 1, tb);
  209.                 _aktivan = a;
  210.         }
  211.         TelefonskiPrikljucak(TelefonskiPrikljucak& obj){
  212.                 _telefonskiBroj = new char[strlen(obj._telefonskiBroj) + 1];
  213.                 strcpy_s(_telefonskiBroj, strlen(obj._telefonskiBroj) + 1, obj._telefonskiBroj);
  214.                 _aktivan = obj._aktivan;
  215.                 _datumPrikljucenja = obj._datumPrikljucenja;
  216.         }
  217.         ~TelefonskiPrikljucak(){
  218.                 delete[]_telefonskiBroj;
  219.                 _telefonskiBroj = NULL;
  220.         }
  221.         friend ostream& operator<<(ostream&, TelefonskiPrikljucak&);
  222.         TelefonskiPrikljucak& operator=(TelefonskiPrikljucak& obj){
  223.                 delete[]_telefonskiBroj;
  224.                 _telefonskiBroj = new char[strlen(obj._telefonskiBroj) + 1];
  225.                 strcpy_s(_telefonskiBroj, strlen(obj._telefonskiBroj) + 1, obj._telefonskiBroj);
  226.                 _aktivan = obj._aktivan;
  227.                 _datumPrikljucenja = obj._datumPrikljucenja;
  228.                 return *this;
  229.         }
  230.         char* telbr(){
  231.                 return _telefonskiBroj;
  232.         }
  233.         Datum getdat(){
  234.                 return _datumPrikljucenja;
  235.         }
  236.         bool operator==(TelefonskiPrikljucak& obj){
  237.                 if (_datumPrikljucenja == obj._datumPrikljucenja&&_aktivan == obj._aktivan&&strcmp(_telefonskiBroj, obj._telefonskiBroj) == NULL)
  238.                         return true;
  239.                 return false;
  240.         }
  241. };
  242. ostream& operator<<(ostream& out, TelefonskiPrikljucak& obj){
  243.         out << "Telefonski prikljucak ";
  244.         if (obj._aktivan)
  245.                 out << "je aktivan";
  246.         else
  247.                 out << "nije aktivan";
  248.         out << endl <<"Datum prikljucenja: "<<obj._datumPrikljucenja<<endl<<"Telefonski broj: " << obj._telefonskiBroj << endl;
  249.         return out;
  250. }
  251. class TelecomKorisnik{
  252. private:
  253.         char * _imePrezimeKorisnika;
  254.         Kolekcija<TelefonskiPrikljucak> * _telefonskiPrikljucci;
  255.         vector<float> _dugovi; //odnosi se na neizmirene dugove na svakom telefonskom prikljucku
  256. public:
  257.         TelecomKorisnik(char*ime = "<nepoznato>"){
  258.                 _imePrezimeKorisnika = new char[strlen(ime) + 1];
  259.                 strcpy_s(_imePrezimeKorisnika, strlen(ime) + 1, ime);
  260.                 _telefonskiPrikljucci = new Kolekcija<TelefonskiPrikljucak>();
  261.         }
  262.         friend ostream& operator<<(ostream&, TelecomKorisnik&);
  263.         bool operator==(TelecomKorisnik& obj){
  264.                 if (strcmp(_imePrezimeKorisnika, obj._imePrezimeKorisnika) == NULL&&_dugovi == obj._dugovi)//treba dodati kolekciju
  265.                         return true;
  266.                 return false;
  267.         }
  268.         Kolekcija<TelefonskiPrikljucak> getkoltelpr(){
  269.                 return *_telefonskiPrikljucci;
  270.         }
  271.         //1. operator [] :: vraca pokazivac na objekat tipa TelefonskiPrikljucak kod koga je broj telefona
  272.         //identican onome koji je proslijedjen kao parametar. U slucaju da trazeni broj ne postoji funkcija
  273.         //vraca NULL.
  274.         TelefonskiPrikljucak* operator[](char* tb){
  275.                 for (int i = 0; i < (*_telefonskiPrikljucci).gettrentuno(); i++){
  276.                         if (strcmp(tb, (*_telefonskiPrikljucci).gett1(i).telbr())==NULL){
  277.                                 return &((*_telefonskiPrikljucci).gett1(i));
  278.                         }
  279.                 }
  280.                 return NULL;
  281.         }
  282.         //2.AddTelefonskiPrikljucak :: dodaje podatke o novom telefonskom priljucku korisnika. Nije dozvoljeno
  283.         //dodati dva identicna telefonska broja. Prilikom dodavanja novog prikljucka iznos duga treba biti
  284.         //postavljen na 0. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili false.
  285.         bool AddTelefonskiPrikljucak(TelefonskiPrikljucak telpr){
  286.                 for (int i = 0; i < (*_telefonskiPrikljucci).gettrentuno(); i++){
  287.                         if (strcmp(telpr.telbr(), (*_telefonskiPrikljucci).gett1(i).telbr()) == NULL) //U slucaju da se dodaje identican telefonski broj
  288.                                 return false;
  289.                 }
  290.                 (*_telefonskiPrikljucci) += telpr;
  291.                 _dugovi.push_back(0);//postavljanje duga na 0
  292.                 return true;
  293.         }
  294.  
  295.         //3.RemoveTelefonskiPrikljucakByDatum :: na osnovu dva primljena parametra (tipa Datum) uklanja podatke o
  296.         //svim telefonskim prikljuccima koji su izvrseni u periodu izmedju ta dva datuma. Nije dozvoljeno
  297.         //uklanjanje informacija o prikljuccima za koje postoji evidentiran dug. Nakon uklanjanja informacija o
  298.         //prikljucku, potrebno je ukloniti i lokacije na kojima se cuvala informacija o njihovim dugovima.
  299.         //Funkcija vraca broj uklonjenih prikljucaka.
  300.         int RemoveTelefonskiPrikljucakByDatum(Datum& dat1, Datum& dat2){
  301.                 int brojac = 0;
  302.                 float dug = 0;
  303.                 for (int i = 0; i < (*_telefonskiPrikljucci).gettrentuno(); i++){
  304.                         if (dat1 < (*_telefonskiPrikljucci).gett1(i).getdat() && (*_telefonskiPrikljucci).gett1(i).getdat() < dat2){
  305.                                 for (vector<float>::iterator it = _dugovi.begin(); it != _dugovi.end(); it++){
  306.                                         dug += *it;
  307.                                 }
  308.                                 if (dug > 0)//U slucaju da ima duga ne uklanja telefonski prikljucak
  309.                                         break;
  310.                                 (*_telefonskiPrikljucci) -= (*_telefonskiPrikljucci).gett1(i);
  311.                                 brojac++;
  312.                                 dug = 0;
  313.                         }
  314.                 }
  315.                 return brojac;
  316.         }
  317.  
  318. };
  319. ostream& operator<<(ostream& out, TelecomKorisnik& obj){
  320.         out << "Telecom korisnik: " << obj._imePrezimeKorisnika << endl;
  321.         out << "Dugovi: ";
  322.         for (vector<float>::iterator it = obj._dugovi.begin(); it != obj._dugovi.end(); it++){
  323.                 out << *it << ", ";
  324.         }
  325.         out << endl << "Telefonski prikljucci" << endl;
  326.         out << (*obj._telefonskiPrikljucci);
  327.         return out;
  328. }
  329. void PretragaPoBroju(Kolekcija<TelecomKorisnik> BHTelecomKorisnici, char * trazeniBroj);
  330. //Funkcija treba da ispise podatke o korisniku prikljucka koji je vlasnik trazenog broja
  331. void PretragaPoBroju(Kolekcija<TelecomKorisnik> BHTelecomKorisnici, char * trazeniBroj){
  332.         for (int i = 0; i < BHTelecomKorisnici.gettrentuno(); i++){
  333.                 for (int j = 0; j < BHTelecomKorisnici.gett1(i).getkoltelpr().gettrentuno(); j++){
  334.                         if (strcmp(trazeniBroj, BHTelecomKorisnici.gett1(i).getkoltelpr().gett1(j).telbr()) == NULL){
  335.                                 cout << BHTelecomKorisnici.gett1(i);
  336.                                 break;
  337.                         }
  338.                 }
  339.         }
  340. }
  341.  
  342. int main(){
  343.         //izbjegavajte koristenje vlastitog imena i prezimena.
  344.         //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu BHTelecomKorisnici  
  345.         Datum dat1;
  346.         Datum dat2(26, 3, 2014);
  347.         Datum dat3(28, 3, 2014);
  348.         Datum dat4(1, 1, 2015);
  349.         TelefonskiPrikljucak telpr1;
  350.         TelefonskiPrikljucak telpr2("033 666 666", false,dat2);
  351.         TelefonskiPrikljucak telpr3("061 777 555", true,dat3);
  352.         TelefonskiPrikljucak telpr4("061 777 555", false,dat4);
  353.         cout << dat2 << endl;
  354.         cout << telpr2 << endl;
  355.         TelecomKorisnik telkor1;
  356.         TelecomKorisnik telkor2("Mike Smith");
  357.         TelecomKorisnik telkor3("David Sedmi");
  358.         telkor2.AddTelefonskiPrikljucak(telpr1);
  359.         telkor2.AddTelefonskiPrikljucak(telpr2);
  360.         telkor2.AddTelefonskiPrikljucak(telpr3);
  361.         telkor2.AddTelefonskiPrikljucak(telpr4);// ne dodaje posto je isti broj
  362.         telkor3.AddTelefonskiPrikljucak(telpr2);
  363.         telkor3.AddTelefonskiPrikljucak(telpr4);
  364.         cout << telkor2 << endl;
  365.         Kolekcija<TelecomKorisnik> BHTelecomKorisnici;
  366.         BHTelecomKorisnici += telkor1;
  367.         BHTelecomKorisnici += telkor2;
  368.         BHTelecomKorisnici += telkor2;//ne dodaje isti element u kolekciju
  369.         BHTelecomKorisnici += telkor3;
  370.         BHTelecomKorisnici -= telkor1;//brise korisnika
  371.         cout << "Ispis glavne kolekcije: "<<endl << BHTelecomKorisnici<<endl;
  372.         cout << endl << endl << "Ispis prije uklanjanja" << endl << telkor2;
  373.         cout<<"Uklonjeno je: "<<telkor2.RemoveTelefonskiPrikljucakByDatum(dat2, dat4)<<" pregleda."<<endl;//brise sve izmedju dat2 i dat 4 tj
  374.         cout << "Ispis poslje uklanjanja: " << telkor2;
  375.         cout << endl << "Testiranje operatora []" << endl;
  376.         if (&(*(telkor2["033 666 666"])) != NULL)
  377.                 cout << *(telkor2["033 666 666"]);
  378.         else
  379.                 cout << "Ne postoji";
  380.  
  381.         cout << endl << endl << "Testiranje funkcije PretragaPoBroju:" << endl;
  382.         PretragaPoBroju(BHTelecomKorisnici, "033 666 666");
  383.         system("pause>0");
  384.         return 0;
  385. }
Advertisement
Add Comment
Please, Sign In to add comment