rijads

PR2_12.02.2014_NEDOVRSEN

Sep 15th, 2014
318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.36 KB | None | 0 0
  1. /*POSTAVKA
  2. template<class T1, class T2>
  3. class Kolekcija{
  4. T1 * _elementi1;
  5. T2 * _elementi2;
  6. int * _max;
  7. int * _trenutnoElemenata;
  8. //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko
  9. // prosiranje kolekcije ukoliko broj elemenata dostigne trenutni maksimum, te onemoguciti
  10. // ponavljanje elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
  11. //   false
  12. //2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije. Ukoliko je
  13. // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
  14. // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata. U zavisnosti od
  15. // uspjesnosti operacije, funkcija vraca true ili false
  16. //3. potrebne funkcije
  17. };
  18. class Datum{
  19. int _dan, _mjesec, _godina;
  20. //1. potrebne funkcije
  21. };
  22. class Ostecenje{
  23. char * _nazivOstecenogDijela;
  24. float _cijenaOriginalnogDijela;
  25. float _cijenaZamjenskogDijela;
  26. bool _mogucPopravak;
  27. //1. potrebne funkcije
  28. };
  29. class Nezgoda{
  30. string _lokacija;//npr.magistralni put M17
  31. Datum _datumNezgode;
  32. //string u kolekciji(T2) se odnosi na napomenu (dodatne informacije) o ostecenom dijelu
  33. Kolekcija<Ostecenje, string> _listaOstecenja;
  34. //1. potrebne funkcije
  35. //2. AddOstecenje :: dodaje podatke o ostecenom dijelu. Svako ostecenje ne mora imati napomenu
  36. //3. RemoveOstecenje:: uklanja podatke o ostecenju na osnovu naziva ostecenog dijela koji je
  37. //  primljen kao parametar
  38. };
  39. class Vozilo{
  40. char * _vlasnikVozila;
  41. char JMBG[14];
  42. vector<Nezgoda> _listaNezgoda;
  43. //1. potrebne funkcije
  44. //2. Info :: ispisuje sve podatke o vozilu. Prije ispisa sve podatke o nezgodama sortirati po
  45. //  datumu
  46. //3. operator+= :: dodaje informacije o nezgodi. Onemoguciti ponavljanje informacija o
  47. //   nezgodama
  48. //4. operator-= :: uklanja podatke o nezgodi na osnovu parametra koji opisuje lokaciju na
  49. //   kojoj se nezgoda desila
  50. //5. operator [] :: vraca Ostecenje na osnovu naziva ostecenja koji je proslijedjen kao
  51. //  parametar
  52. //6. GetOstecenjeByCijena :: vraca Ostecenje kod koga je najveca razlika izmedju cijene
  53. //   originalnog i zamjenskog dijela
  54. };
  55. void main(){
  56. //izbjegavajte koristenje vlastitog imena i prezimena.
  57. //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Vozilo
  58. }
  59. */
  60. /*RJESENJE by rijads*/
  61. #include<iostream>
  62. #include<string>
  63. #include<vector>
  64. #include<algorithm>
  65. using namespace std;
  66.  
  67. template<class T1, class T2>
  68. class Kolekcija{
  69. protected:
  70.     T1 * _elementi1;
  71.     T2 * _elementi2;
  72.     int * _max;
  73.     int * _trenutnoElemenata;
  74. public:
  75.     //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko
  76.     // prosiranje kolekcije ukoliko broj elemenata dostigne trenutni maksimum, te onemoguciti
  77.     // ponavljanje elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
  78.     //   false
  79.     bool AddElement(T1 el1, T2 el2){
  80.         for (int i = 0; i < *_trenutnoElemenata; i++){
  81.             if (_elementi1[i] == el1&&_elementi2[i] == el2)
  82.                 return false;
  83.         }
  84.         if (*_trenutnoElemenata == *_max){
  85.             T1* temp1;
  86.             T2* temp2;
  87.             (*_max) += 3;
  88.             temp1 = new T1[*_max];
  89.             temp2 = new T2[*_max];
  90.             for (int i = 0; i < *_trenutnoElemenata; i++){
  91.                 temp1[i] = _elementi1[i];
  92.                 temp2[i] = _elementi2[i];
  93.             }
  94.             delete[]_elementi1;
  95.             _elementi1 = temp1;
  96.             delete[]_elementi2;
  97.             _elementi2 = temp2;
  98.         }
  99.         _elementi1[*_trenutnoElemenata] = el1;
  100.         _elementi2[*_trenutnoElemenata] = el2;
  101.         (*_trenutnoElemenata)++;
  102.         return true;
  103.     }
  104.     //2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente iz kolekcije. Ukoliko je
  105.     // potrebno,prilikom uklanjanja elementa izvrsiti dealokaciju. Onemoguciti pojavljivanje
  106.     // neinicijaliziranih elemenata, te ocuvati redoslijed dodavanja elemenata. U zavisnosti od
  107.     // uspjesnosti operacije, funkcija vraca true ili false
  108.     bool RemoveElement(T1 el){
  109.         for (int i = 0; i < *_trenutnoElemenata; i++){
  110.             if (_elementi1[i] == el){
  111.                 for (int j = i; j < *_trenutnoElemenata - 1; j++){//nije potrebno izvrsavati dealokaciju, u slucaju da se radi o programu koji dosta stvari brise napravio bih nove nizove(sa manje memorije) i brisao stare
  112.                     _elementi1[j] = _elementi1[j + 1];
  113.                     _elementi2[j] = _elementi2[j + 1];
  114.                 }
  115.                 (*_trenutnoElemenata)--;//onemogucava pojavljivanje neinicijaliziranih elemenata (ispisuju se samo do trenutnog elementa) i cuva redosljed dodavanja elemenata.
  116.                 return true;
  117.             }
  118.         }
  119.         return false;
  120.     }
  121.     //3. potrebne funkcije
  122.     Kolekcija(){
  123.         _trenutnoElemenata = new int(0);
  124.         _max = new int(3);
  125.         _elementi1 = new T1[*_max];
  126.         _elementi2 = new T2[*_max];
  127.     }
  128.     Kolekcija(const Kolekcija& obj){
  129.         _trenutnoElemenata = new int(*(obj._trenutnoElemenata));
  130.         _max = new int(*(obj._max));
  131.         _elementi1 = new T1[*_max];
  132.         _elementi2 = new T2[*_max];
  133.         for (int i = 0; i < *_trenutnoElemenata; i++){
  134.             _elementi1[i] = obj._elementi1[i];
  135.             _elementi2[i] = obj._elementi2[i];
  136.         }
  137.     }
  138.     ~Kolekcija(){
  139.         delete[]_elementi1; _elementi1 = NULL;
  140.         delete[]_elementi2; _elementi2 = NULL;
  141.         delete _max; _max = NULL;
  142.         delete _trenutnoElemenata; _trenutnoElemenata = NULL;
  143.     }
  144.     friend ostream& operator<< <>(ostream&, const Kolekcija<T1, T2>&);
  145.     T1 getT1(int lok){
  146.         return _elementi1[lok];
  147.     }
  148.     int getTrenutno(){
  149.         return *_trenutnoElemenata;
  150.     }
  151.     Kolekcija<T1, T2>& operator=(const Kolekcija<T1, T2>& obj){
  152.         delete _trenutnoElemenata;
  153.         _trenutnoElemenata = new int(*(obj._trenutnoElemenata));
  154.         delete _max;
  155.         _max = new int(*(obj._max));
  156.         delete[]_elementi1;
  157.         _elementi1 = new T1[*_max];
  158.         delete[] _elementi2;
  159.         _elementi2 = new T2[*_max];
  160.         for (int i = 0; i < *_trenutnoElemenata; i++){
  161.             _elementi1[i] = obj._elementi1[i];
  162.             _elementi2[i] = obj._elementi2[i];
  163.         }
  164.         return *this;
  165.     }
  166.     bool operator==(const Kolekcija<T1, T2>& obj){
  167.         bool isti = true;
  168.         if (*_trenutnoElemenata != (*obj._trenutnoElemenata))
  169.             return false;
  170.         if (*_max != (*obj._max))
  171.             return false;
  172.         for (int i = 0; i < *_trenutnoElemenata; i++){
  173.             if ((_elementi1[i] != obj._elementi1[i]) || _elementi2[i] != obj._elementi2[i])
  174.                 return false;
  175.         }
  176.         return true;
  177.     }
  178. };
  179. template<class T1, class T2>
  180. ostream& operator<<(ostream& out, const Kolekcija<T1, T2>& obj){
  181.     for (int i = 0; i < (*obj._trenutnoElemenata); i++){
  182.         out << obj._elementi1[i] << endl << "Napomena: " << obj._elementi2[i] << endl;
  183.     }
  184.     return out;
  185. }
  186. class Datum{
  187. protected:
  188.     int _dan, _mjesec, _godina;
  189. public:
  190.     //1. potrebne funkcije
  191.     Datum(int d = 1, int m = 1, int g = 1900){
  192.         _dan = d;
  193.         _mjesec = m;
  194.         _godina = g;
  195.     }
  196.     Datum(const Datum& obj){
  197.         _dan = obj._dan;
  198.         _mjesec = obj._mjesec;
  199.         _godina = obj._godina;
  200.     }
  201.     friend ostream& operator<<(ostream&, const Datum&);
  202.     Datum& operator=(const Datum& obj){
  203.         _dan = obj._dan;
  204.         _mjesec = obj._mjesec;
  205.         _godina = obj._godina;
  206.         return *this;
  207.     }
  208.     bool operator==(const Datum& obj){
  209.         if (_dan == obj._dan&&_mjesec == obj._mjesec&&_godina == obj._godina)
  210.             return true;
  211.         else
  212.             return false;
  213.     }
  214.     bool operator<(const Datum& obj){
  215.         if (_godina < obj._godina)
  216.             return true;
  217.         else if (_mjesec < obj._mjesec&&_godina == obj._godina)
  218.             return true;
  219.         else if (_dan < obj._dan&&_mjesec == obj._mjesec&&_godina == obj._godina)
  220.             return true;
  221.         else
  222.             return false;
  223.     }
  224. };
  225. ostream& operator<<(ostream& out, const Datum& obj){
  226.     out << obj._dan << "." << obj._mjesec << "." << obj._godina;
  227.     return out;
  228. }
  229. class Ostecenje{
  230. protected:
  231.     char * _nazivOstecenogDijela;
  232.     float _cijenaOriginalnogDijela;
  233.     float _cijenaZamjenskogDijela;
  234.     bool _mogucPopravak;
  235. public:
  236.     //1. potrebne funkcije
  237.     Ostecenje(char* naziv = "nepoznat", float cod = 0, float czd = 0, bool mp = false){
  238.         _nazivOstecenogDijela = new char[strlen(naziv) + 1];
  239.         strcpy_s(_nazivOstecenogDijela, strlen(naziv) + 1, naziv);
  240.         _cijenaOriginalnogDijela = cod;
  241.         _cijenaZamjenskogDijela = czd;
  242.         _mogucPopravak = mp;
  243.     }
  244.     Ostecenje(const Ostecenje& obj){
  245.         _nazivOstecenogDijela = new char[strlen(obj._nazivOstecenogDijela) + 1];
  246.         strcpy_s(_nazivOstecenogDijela, strlen(obj._nazivOstecenogDijela) + 1, obj._nazivOstecenogDijela);
  247.         _cijenaOriginalnogDijela = obj._cijenaOriginalnogDijela;
  248.         _cijenaZamjenskogDijela = obj._cijenaZamjenskogDijela;
  249.         _mogucPopravak = obj._mogucPopravak;
  250.     }
  251.     ~Ostecenje(){
  252.         delete[]_nazivOstecenogDijela;
  253.         _nazivOstecenogDijela = NULL;
  254.     }
  255.     friend ostream& operator<<(ostream&, const Ostecenje&);
  256.  
  257.     Ostecenje& operator=(const Ostecenje& obj){
  258.         delete[]_nazivOstecenogDijela;
  259.         _nazivOstecenogDijela = new char[strlen(obj._nazivOstecenogDijela) + 1];
  260.         strcpy_s(_nazivOstecenogDijela, strlen(obj._nazivOstecenogDijela) + 1, obj._nazivOstecenogDijela);
  261.         _cijenaOriginalnogDijela = obj._cijenaOriginalnogDijela;
  262.         _cijenaZamjenskogDijela = obj._cijenaZamjenskogDijela;
  263.         _mogucPopravak = obj._mogucPopravak;
  264.         return *this;
  265.     }
  266.     char* getNazivDjela(){
  267.         return _nazivOstecenogDijela;
  268.     }
  269.     bool operator!=(const Ostecenje& obj){//provjeriti radi li kako treba
  270.         if ((strcmp(_nazivOstecenogDijela, obj._nazivOstecenogDijela) == NULL) && _cijenaOriginalnogDijela == obj._cijenaOriginalnogDijela&&_cijenaZamjenskogDijela == obj._cijenaZamjenskogDijela&&_mogucPopravak == obj._mogucPopravak)
  271.             return false;
  272.         else
  273.             return true;
  274.     }
  275.     float getCod(){
  276.         return _cijenaOriginalnogDijela;
  277.     }
  278.     float getCzd(){
  279.         return _cijenaZamjenskogDijela;
  280.     }
  281.     bool operator<(const Ostecenje& obj){//Vraca true ako je veca razlika cijena izmedju originalnog i zamjenskog djela
  282.         float razlika = 0;
  283.         if (_cijenaOriginalnogDijela <= _cijenaZamjenskogDijela)
  284.             razlika = _cijenaZamjenskogDijela - _cijenaOriginalnogDijela;
  285.         else
  286.             razlika = _cijenaOriginalnogDijela - _cijenaOriginalnogDijela;
  287.         float objrazlika = 0;
  288.         if (obj._cijenaOriginalnogDijela <= obj._cijenaZamjenskogDijela)
  289.             objrazlika = obj._cijenaZamjenskogDijela - _cijenaOriginalnogDijela;
  290.         else
  291.             objrazlika = obj._cijenaOriginalnogDijela - obj._cijenaZamjenskogDijela;
  292.         if (razlika < objrazlika)
  293.             return true;
  294.         else
  295.             return false;
  296.     }
  297.     bool operator==(const Ostecenje& obj){
  298.         if ((strcmp(_nazivOstecenogDijela, obj._nazivOstecenogDijela) == NULL) && _cijenaOriginalnogDijela == obj._cijenaOriginalnogDijela&&_cijenaZamjenskogDijela == obj._cijenaZamjenskogDijela&&_mogucPopravak == obj._mogucPopravak)
  299.             return true;
  300.         else
  301.             return false;
  302.     }
  303. };
  304. ostream& operator<<(ostream& out, const Ostecenje& obj){
  305.     out << "Dio: " << obj._nazivOstecenogDijela << endl << "Cijena originalnog djela: " << (int)obj._cijenaOriginalnogDijela << endl << "Cijena zamjenskog djela: " << (int)obj._cijenaZamjenskogDijela << endl;
  306.     return out;
  307. }
  308. class Nezgoda{
  309. protected:
  310.     string _lokacija;//npr.magistralni put M17
  311.     Datum _datumNezgode;
  312.     //string u kolekciji(T2) se odnosi na napomenu (dodatne informacije) o ostecenom dijelu
  313.     Kolekcija<Ostecenje, string> _listaOstecenja;
  314. public:
  315.     //1. potrebne funkcije
  316.     Nezgoda(string l = "nepoznata lokacija") :_datumNezgode(){
  317.         _lokacija = l;
  318.     }
  319.     Nezgoda(const Nezgoda& obj){
  320.         _lokacija = obj._lokacija;
  321.         _datumNezgode = obj._datumNezgode;
  322.         _listaOstecenja = obj._listaOstecenja;
  323.     }
  324.     bool operator==(const Nezgoda& obj){
  325.         if ((_lokacija.compare(obj._lokacija) == NULL) && _datumNezgode == obj._datumNezgode&&_listaOstecenja == obj._listaOstecenja)
  326.             return true;
  327.         else
  328.             return false;
  329.     }
  330.     string vratiLok(){
  331.         return _lokacija;
  332.     }
  333.  
  334.     friend ostream& operator<<(ostream&, const Nezgoda&);
  335.     //2. AddOstecenje :: dodaje podatke o ostecenom dijelu. Svako ostecenje ne mora imati napomenu
  336.     void AddOstecenje(Ostecenje el1, string el2 = ""){
  337.         if (_listaOstecenja.AddElement(el1, el2))
  338.             cout << "Ostecenje dodato" << endl;
  339.         else
  340.             cout << "Ostecenje vec postoji" << endl;
  341.     }
  342.     //3. RemoveOstecenje:: uklanja podatke o ostecenju na osnovu naziva ostecenog dijela koji je
  343.     //  primljen kao parametar
  344.     void RemoveOstecenje(char* dio){
  345.         for (int i = 0; i < _listaOstecenja.getTrenutno(); i++){
  346.             if (strcmp(dio, _listaOstecenja.getT1(i).getNazivDjela()) == NULL){
  347.                 _listaOstecenja.RemoveElement(_listaOstecenja.getT1(i));
  348.             }
  349.         }
  350.     }
  351.     bool operator<(const Nezgoda& obj){
  352.         if (_datumNezgode < obj._datumNezgode)
  353.             return true;
  354.         else
  355.             return false;
  356.     }
  357.     Kolekcija<Ostecenje, string> & returnListaOst() {
  358.         return _listaOstecenja;
  359.     }
  360. };
  361. ostream& operator<<(ostream& out, const Nezgoda& obj){
  362.     out << "Lokacija nezgode: " << obj._lokacija << endl << "Datum nezgode: " << obj._datumNezgode << endl << "Lista ostecenja: " << endl;
  363.     out << obj._listaOstecenja << endl;
  364.     return out;
  365. }
  366. class Vozilo{
  367. protected:
  368.     char * _vlasnikVozila;
  369.     char JMBG[14];
  370.     vector<Nezgoda> _listaNezgoda;
  371. public:
  372.     //1. potrebne funkcije
  373.     Vozilo(char* vv = "nepoznat vlasnik", char* jm = "1234567890123"){
  374.         _vlasnikVozila = new char[strlen(vv) + 1];
  375.         strcpy_s(_vlasnikVozila, strlen(vv) + 1, vv);
  376.         strncpy_s(JMBG, 14, jm, _TRUNCATE);
  377.     }
  378.     Vozilo(const Vozilo& obj){
  379.         _vlasnikVozila = new char[strlen(obj._vlasnikVozila) + 1];
  380.         strcpy_s(_vlasnikVozila, strlen(obj._vlasnikVozila) + 1, obj._vlasnikVozila);
  381.         strncpy_s(JMBG, 14, obj.JMBG, _TRUNCATE);
  382.     }
  383.     ~Vozilo(){
  384.         delete[]_vlasnikVozila;
  385.         _vlasnikVozila = NULL;
  386.     }
  387.     //2. Info :: ispisuje sve podatke o vozilu. Prije ispisa sve podatke o nezgodama sortirati po
  388.     //  datumu
  389.     void Info(){
  390.         cout << "Vlasnik vozila: " << _vlasnikVozila << endl << "JMBG: " << JMBG << endl << "Liste nezgoda:" << endl;
  391.         sort(_listaNezgoda.begin(), _listaNezgoda.end());//Sortira po datumu, ne zaboraviti preklopiti operator< u Nezgoda klasi i Datum klasi.
  392.         for (vector<Nezgoda>::iterator it = _listaNezgoda.begin(); it != _listaNezgoda.end(); it++){
  393.             cout << *it << endl;
  394.         }
  395.     }
  396.     //3. operator+= :: dodaje informacije o nezgodi. Onemoguciti ponavljanje informacija o
  397.     //   nezgodama
  398.     bool operator+=(const Nezgoda& obj){
  399.         for (unsigned int i = 0; i < _listaNezgoda.size(); i++){// onemogucava ponavljanje nezgoda (Uzima 20 min preklapanje operatora NE RADITI NA ISPITU)
  400.             if (_listaNezgoda[i] == obj)
  401.                 return false;
  402.         }
  403.         _listaNezgoda.push_back(obj);
  404.         return true;
  405.     }
  406.     //4. operator-= :: uklanja podatke o nezgodi na osnovu parametra koji opisuje lokaciju na
  407.     //   kojoj se nezgoda desila
  408.     bool operator-=(const string nez){
  409.         for (unsigned int i = 0; i < _listaNezgoda.size(); i++){
  410.             if (nez.compare(_listaNezgoda[i].vratiLok()) == NULL){
  411.                 _listaNezgoda.erase(_listaNezgoda.begin() + i);
  412.                 return true;
  413.             }
  414.         }
  415.         return false;
  416.     }
  417.     //5. operator [] :: vraca Ostecenje na osnovu naziva ostecenja koji je proslijedjen kao
  418.     //  parametar
  419.     Ostecenje operator[](const char* naziv){
  420.         for (unsigned int i = 0; i < _listaNezgoda.size(); i++){
  421.             for (int j = 0; j < _listaNezgoda[i].returnListaOst().getTrenutno(); j++){//Provjerava naziv ostecenja
  422.                 if (strcmp(_listaNezgoda[i].returnListaOst().getT1(j).getNazivDjela(), naziv) == NULL)
  423.                     return _listaNezgoda[i].returnListaOst().getT1(j);
  424.             }
  425.         }
  426.     }
  427.     //6. GetOstecenjeByCijena :: vraca Ostecenje kod koga je najveca razlika izmedju cijene
  428.     //   originalnog i zamjenskog dijela
  429.     Ostecenje* GetOstecenjeByCijena(){
  430.         Ostecenje *najvRazl = new Ostecenje(_listaNezgoda[0].returnListaOst().getT1(0));
  431.         for (unsigned int i = 0; i < _listaNezgoda.size(); i++){
  432.             cout << _listaNezgoda[i].returnListaOst().getTrenutno() << endl;
  433.             for (int j = 0; j < _listaNezgoda[i].returnListaOst().getTrenutno(); j++){
  434.                 if (*najvRazl < _listaNezgoda[i].returnListaOst().getT1(j))
  435.                     najvRazl = &(_listaNezgoda[i].returnListaOst().getT1(j));
  436.             }
  437.         }
  438.         return najvRazl;
  439.     }
  440. };
  441. void main(){
  442.     //izbjegavajte koristenje vlastitog imena i prezimena.
  443.     //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Vozilo
  444.     Ostecenje ost1("Na trotinetu", 300, 600, true);
  445.     Ostecenje ost2("Na necijem mozgu", 850, 400, false);
  446.     Ostecenje ost3("Guvernala", 350, 250, false);
  447.     Nezgoda nez1;
  448.     Nezgoda nez2("Buca potok");
  449.     Nezgoda nez3("Dobrinja");
  450.     nez2.AddOstecenje(ost1,"Jebeno");
  451.     nez2.AddOstecenje(ost2,"Debil neki");
  452.     nez2.AddOstecenje(ost2,"Pametan momak");
  453.     nez2.AddOstecenje(ost2, "Pametan momak");
  454.     nez2.AddOstecenje(ost3,"Boze sacuvaj");
  455.     nez2.RemoveOstecenje("Na trotinetu");
  456.     Vozilo voz1;
  457.     Vozilo voz2("Nenad desni Cubic", "6663336669996");
  458.     voz2 += nez1;
  459.     voz2 += nez1;//ne dodaje dupli
  460.     voz2 += nez2;
  461.     voz2 += nez3;
  462.     voz2 -= "Dobrinja";//Brise nez3
  463.     voz2.Info();
  464.     cout <<"Ostecenje operator[]" <<endl<< voz2["Na trotinetu"];
  465.     //cout << endl << "izmedju cjena" << endl <<    (*voz2.GetOstecenjeByCijena()) << endl; // Nek ne radi ko ga jebeeeee
  466.     system("pause>0");
  467. }
Advertisement
Add Comment
Please, Sign In to add comment