Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*POSTAVKA
- template<class T1, class T2>
- class Kolekcija{
- T1 * _elementi1;
- T2 * _elementi2;
- int * _max;
- int * _trenutnoElemenata;
- //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko
- // prosiranje kolekcije ukoliko broj elemenata dostigne trenutni maksimum, te onemoguciti
- // ponavljanje elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
- // false
- //2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente 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
- //3. potrebne funkcije
- };
- class Datum{
- int _dan, _mjesec, _godina;
- //1. potrebne funkcije
- };
- class Ostecenje{
- char * _nazivOstecenogDijela;
- float _cijenaOriginalnogDijela;
- float _cijenaZamjenskogDijela;
- bool _mogucPopravak;
- //1. potrebne funkcije
- };
- class Nezgoda{
- string _lokacija;//npr.magistralni put M17
- Datum _datumNezgode;
- //string u kolekciji(T2) se odnosi na napomenu (dodatne informacije) o ostecenom dijelu
- Kolekcija<Ostecenje, string> _listaOstecenja;
- //1. potrebne funkcije
- //2. AddOstecenje :: dodaje podatke o ostecenom dijelu. Svako ostecenje ne mora imati napomenu
- //3. RemoveOstecenje:: uklanja podatke o ostecenju na osnovu naziva ostecenog dijela koji je
- // primljen kao parametar
- };
- class Vozilo{
- char * _vlasnikVozila;
- char JMBG[14];
- vector<Nezgoda> _listaNezgoda;
- //1. potrebne funkcije
- //2. Info :: ispisuje sve podatke o vozilu. Prije ispisa sve podatke o nezgodama sortirati po
- // datumu
- //3. operator+= :: dodaje informacije o nezgodi. Onemoguciti ponavljanje informacija o
- // nezgodama
- //4. operator-= :: uklanja podatke o nezgodi na osnovu parametra koji opisuje lokaciju na
- // kojoj se nezgoda desila
- //5. operator [] :: vraca Ostecenje na osnovu naziva ostecenja koji je proslijedjen kao
- // parametar
- //6. GetOstecenjeByCijena :: vraca Ostecenje kod koga je najveca razlika izmedju cijene
- // originalnog i zamjenskog dijela
- };
- void main(){
- //izbjegavajte koristenje vlastitog imena i prezimena.
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Vozilo
- }
- */
- /*RJESENJE by rijads*/
- #include<iostream>
- #include<string>
- #include<vector>
- #include<algorithm>
- using namespace std;
- template<class T1, class T2>
- class Kolekcija{
- protected:
- T1 * _elementi1;
- T2 * _elementi2;
- int * _max;
- int * _trenutnoElemenata;
- public:
- //1. AddElement :: omogucava dodavanje novog elementa u kolekciju. Osigurati automatsko
- // prosiranje kolekcije ukoliko broj elemenata dostigne trenutni maksimum, te onemoguciti
- // ponavljanje elemenata. U zavisnosti od uspjesnosti operacije, funkcija vraca true ili
- // false
- bool AddElement(T1 el1, T2 el2){
- for (int i = 0; i < *_trenutnoElemenata; i++){
- if (_elementi1[i] == el1&&_elementi2[i] == el2)
- return false;
- }
- if (*_trenutnoElemenata == *_max){
- T1* temp1;
- T2* temp2;
- (*_max) += 3;
- temp1 = new T1[*_max];
- temp2 = new T2[*_max];
- for (int i = 0; i < *_trenutnoElemenata; i++){
- temp1[i] = _elementi1[i];
- temp2[i] = _elementi2[i];
- }
- delete[]_elementi1;
- _elementi1 = temp1;
- delete[]_elementi2;
- _elementi2 = temp2;
- }
- _elementi1[*_trenutnoElemenata] = el1;
- _elementi2[*_trenutnoElemenata] = el2;
- (*_trenutnoElemenata)++;
- return true;
- }
- //2. RemoveElement :: na osnovu parametra tipa T1 uklanja elemente 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 RemoveElement(T1 el){
- for (int i = 0; i < *_trenutnoElemenata; i++){
- if (_elementi1[i] == el){
- 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
- _elementi1[j] = _elementi1[j + 1];
- _elementi2[j] = _elementi2[j + 1];
- }
- (*_trenutnoElemenata)--;//onemogucava pojavljivanje neinicijaliziranih elemenata (ispisuju se samo do trenutnog elementa) i cuva redosljed dodavanja elemenata.
- return true;
- }
- }
- return false;
- }
- //3. potrebne funkcije
- Kolekcija(){
- _trenutnoElemenata = new int(0);
- _max = new int(3);
- _elementi1 = new T1[*_max];
- _elementi2 = new T2[*_max];
- }
- Kolekcija(const Kolekcija& obj){
- _trenutnoElemenata = new int(*(obj._trenutnoElemenata));
- _max = new int(*(obj._max));
- _elementi1 = new T1[*_max];
- _elementi2 = new T2[*_max];
- for (int i = 0; i < *_trenutnoElemenata; i++){
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- }
- ~Kolekcija(){
- delete[]_elementi1; _elementi1 = NULL;
- delete[]_elementi2; _elementi2 = NULL;
- delete _max; _max = NULL;
- delete _trenutnoElemenata; _trenutnoElemenata = NULL;
- }
- friend ostream& operator<< <>(ostream&, const Kolekcija<T1, T2>&);
- T1 getT1(int lok){
- return _elementi1[lok];
- }
- int getTrenutno(){
- return *_trenutnoElemenata;
- }
- Kolekcija<T1, T2>& operator=(const Kolekcija<T1, T2>& obj){
- delete _trenutnoElemenata;
- _trenutnoElemenata = new int(*(obj._trenutnoElemenata));
- delete _max;
- _max = new int(*(obj._max));
- delete[]_elementi1;
- _elementi1 = new T1[*_max];
- delete[] _elementi2;
- _elementi2 = new T2[*_max];
- for (int i = 0; i < *_trenutnoElemenata; i++){
- _elementi1[i] = obj._elementi1[i];
- _elementi2[i] = obj._elementi2[i];
- }
- return *this;
- }
- bool operator==(const Kolekcija<T1, T2>& obj){
- bool isti = true;
- if (*_trenutnoElemenata != (*obj._trenutnoElemenata))
- return false;
- if (*_max != (*obj._max))
- return false;
- for (int i = 0; i < *_trenutnoElemenata; i++){
- if ((_elementi1[i] != obj._elementi1[i]) || _elementi2[i] != obj._elementi2[i])
- return false;
- }
- return true;
- }
- };
- template<class T1, class T2>
- ostream& operator<<(ostream& out, const Kolekcija<T1, T2>& obj){
- for (int i = 0; i < (*obj._trenutnoElemenata); i++){
- out << obj._elementi1[i] << endl << "Napomena: " << obj._elementi2[i] << endl;
- }
- return out;
- }
- class Datum{
- protected:
- int _dan, _mjesec, _godina;
- public:
- //1. potrebne funkcije
- Datum(int d = 1, int m = 1, int g = 1900){
- _dan = d;
- _mjesec = m;
- _godina = g;
- }
- Datum(const Datum& obj){
- _dan = obj._dan;
- _mjesec = obj._mjesec;
- _godina = obj._godina;
- }
- friend ostream& operator<<(ostream&, const Datum&);
- Datum& operator=(const Datum& obj){
- _dan = obj._dan;
- _mjesec = obj._mjesec;
- _godina = obj._godina;
- return *this;
- }
- bool operator==(const Datum& obj){
- if (_dan == obj._dan&&_mjesec == obj._mjesec&&_godina == obj._godina)
- return true;
- else
- return false;
- }
- bool operator<(const Datum& obj){
- if (_godina < obj._godina)
- return true;
- else if (_mjesec < obj._mjesec&&_godina == obj._godina)
- return true;
- else if (_dan < obj._dan&&_mjesec == obj._mjesec&&_godina == obj._godina)
- return true;
- else
- return false;
- }
- };
- ostream& operator<<(ostream& out, const Datum& obj){
- out << obj._dan << "." << obj._mjesec << "." << obj._godina;
- return out;
- }
- class Ostecenje{
- protected:
- char * _nazivOstecenogDijela;
- float _cijenaOriginalnogDijela;
- float _cijenaZamjenskogDijela;
- bool _mogucPopravak;
- public:
- //1. potrebne funkcije
- Ostecenje(char* naziv = "nepoznat", float cod = 0, float czd = 0, bool mp = false){
- _nazivOstecenogDijela = new char[strlen(naziv) + 1];
- strcpy_s(_nazivOstecenogDijela, strlen(naziv) + 1, naziv);
- _cijenaOriginalnogDijela = cod;
- _cijenaZamjenskogDijela = czd;
- _mogucPopravak = mp;
- }
- Ostecenje(const Ostecenje& obj){
- _nazivOstecenogDijela = new char[strlen(obj._nazivOstecenogDijela) + 1];
- strcpy_s(_nazivOstecenogDijela, strlen(obj._nazivOstecenogDijela) + 1, obj._nazivOstecenogDijela);
- _cijenaOriginalnogDijela = obj._cijenaOriginalnogDijela;
- _cijenaZamjenskogDijela = obj._cijenaZamjenskogDijela;
- _mogucPopravak = obj._mogucPopravak;
- }
- ~Ostecenje(){
- delete[]_nazivOstecenogDijela;
- _nazivOstecenogDijela = NULL;
- }
- friend ostream& operator<<(ostream&, const Ostecenje&);
- Ostecenje& operator=(const Ostecenje& obj){
- delete[]_nazivOstecenogDijela;
- _nazivOstecenogDijela = new char[strlen(obj._nazivOstecenogDijela) + 1];
- strcpy_s(_nazivOstecenogDijela, strlen(obj._nazivOstecenogDijela) + 1, obj._nazivOstecenogDijela);
- _cijenaOriginalnogDijela = obj._cijenaOriginalnogDijela;
- _cijenaZamjenskogDijela = obj._cijenaZamjenskogDijela;
- _mogucPopravak = obj._mogucPopravak;
- return *this;
- }
- char* getNazivDjela(){
- return _nazivOstecenogDijela;
- }
- bool operator!=(const Ostecenje& obj){//provjeriti radi li kako treba
- if ((strcmp(_nazivOstecenogDijela, obj._nazivOstecenogDijela) == NULL) && _cijenaOriginalnogDijela == obj._cijenaOriginalnogDijela&&_cijenaZamjenskogDijela == obj._cijenaZamjenskogDijela&&_mogucPopravak == obj._mogucPopravak)
- return false;
- else
- return true;
- }
- float getCod(){
- return _cijenaOriginalnogDijela;
- }
- float getCzd(){
- return _cijenaZamjenskogDijela;
- }
- bool operator<(const Ostecenje& obj){//Vraca true ako je veca razlika cijena izmedju originalnog i zamjenskog djela
- float razlika = 0;
- if (_cijenaOriginalnogDijela <= _cijenaZamjenskogDijela)
- razlika = _cijenaZamjenskogDijela - _cijenaOriginalnogDijela;
- else
- razlika = _cijenaOriginalnogDijela - _cijenaOriginalnogDijela;
- float objrazlika = 0;
- if (obj._cijenaOriginalnogDijela <= obj._cijenaZamjenskogDijela)
- objrazlika = obj._cijenaZamjenskogDijela - _cijenaOriginalnogDijela;
- else
- objrazlika = obj._cijenaOriginalnogDijela - obj._cijenaZamjenskogDijela;
- if (razlika < objrazlika)
- return true;
- else
- return false;
- }
- bool operator==(const Ostecenje& obj){
- if ((strcmp(_nazivOstecenogDijela, obj._nazivOstecenogDijela) == NULL) && _cijenaOriginalnogDijela == obj._cijenaOriginalnogDijela&&_cijenaZamjenskogDijela == obj._cijenaZamjenskogDijela&&_mogucPopravak == obj._mogucPopravak)
- return true;
- else
- return false;
- }
- };
- ostream& operator<<(ostream& out, const Ostecenje& obj){
- out << "Dio: " << obj._nazivOstecenogDijela << endl << "Cijena originalnog djela: " << (int)obj._cijenaOriginalnogDijela << endl << "Cijena zamjenskog djela: " << (int)obj._cijenaZamjenskogDijela << endl;
- return out;
- }
- class Nezgoda{
- protected:
- string _lokacija;//npr.magistralni put M17
- Datum _datumNezgode;
- //string u kolekciji(T2) se odnosi na napomenu (dodatne informacije) o ostecenom dijelu
- Kolekcija<Ostecenje, string> _listaOstecenja;
- public:
- //1. potrebne funkcije
- Nezgoda(string l = "nepoznata lokacija") :_datumNezgode(){
- _lokacija = l;
- }
- Nezgoda(const Nezgoda& obj){
- _lokacija = obj._lokacija;
- _datumNezgode = obj._datumNezgode;
- _listaOstecenja = obj._listaOstecenja;
- }
- bool operator==(const Nezgoda& obj){
- if ((_lokacija.compare(obj._lokacija) == NULL) && _datumNezgode == obj._datumNezgode&&_listaOstecenja == obj._listaOstecenja)
- return true;
- else
- return false;
- }
- string vratiLok(){
- return _lokacija;
- }
- friend ostream& operator<<(ostream&, const Nezgoda&);
- //2. AddOstecenje :: dodaje podatke o ostecenom dijelu. Svako ostecenje ne mora imati napomenu
- void AddOstecenje(Ostecenje el1, string el2 = ""){
- if (_listaOstecenja.AddElement(el1, el2))
- cout << "Ostecenje dodato" << endl;
- else
- cout << "Ostecenje vec postoji" << endl;
- }
- //3. RemoveOstecenje:: uklanja podatke o ostecenju na osnovu naziva ostecenog dijela koji je
- // primljen kao parametar
- void RemoveOstecenje(char* dio){
- for (int i = 0; i < _listaOstecenja.getTrenutno(); i++){
- if (strcmp(dio, _listaOstecenja.getT1(i).getNazivDjela()) == NULL){
- _listaOstecenja.RemoveElement(_listaOstecenja.getT1(i));
- }
- }
- }
- bool operator<(const Nezgoda& obj){
- if (_datumNezgode < obj._datumNezgode)
- return true;
- else
- return false;
- }
- Kolekcija<Ostecenje, string> & returnListaOst() {
- return _listaOstecenja;
- }
- };
- ostream& operator<<(ostream& out, const Nezgoda& obj){
- out << "Lokacija nezgode: " << obj._lokacija << endl << "Datum nezgode: " << obj._datumNezgode << endl << "Lista ostecenja: " << endl;
- out << obj._listaOstecenja << endl;
- return out;
- }
- class Vozilo{
- protected:
- char * _vlasnikVozila;
- char JMBG[14];
- vector<Nezgoda> _listaNezgoda;
- public:
- //1. potrebne funkcije
- Vozilo(char* vv = "nepoznat vlasnik", char* jm = "1234567890123"){
- _vlasnikVozila = new char[strlen(vv) + 1];
- strcpy_s(_vlasnikVozila, strlen(vv) + 1, vv);
- strncpy_s(JMBG, 14, jm, _TRUNCATE);
- }
- Vozilo(const Vozilo& obj){
- _vlasnikVozila = new char[strlen(obj._vlasnikVozila) + 1];
- strcpy_s(_vlasnikVozila, strlen(obj._vlasnikVozila) + 1, obj._vlasnikVozila);
- strncpy_s(JMBG, 14, obj.JMBG, _TRUNCATE);
- }
- ~Vozilo(){
- delete[]_vlasnikVozila;
- _vlasnikVozila = NULL;
- }
- //2. Info :: ispisuje sve podatke o vozilu. Prije ispisa sve podatke o nezgodama sortirati po
- // datumu
- void Info(){
- cout << "Vlasnik vozila: " << _vlasnikVozila << endl << "JMBG: " << JMBG << endl << "Liste nezgoda:" << endl;
- sort(_listaNezgoda.begin(), _listaNezgoda.end());//Sortira po datumu, ne zaboraviti preklopiti operator< u Nezgoda klasi i Datum klasi.
- for (vector<Nezgoda>::iterator it = _listaNezgoda.begin(); it != _listaNezgoda.end(); it++){
- cout << *it << endl;
- }
- }
- //3. operator+= :: dodaje informacije o nezgodi. Onemoguciti ponavljanje informacija o
- // nezgodama
- bool operator+=(const Nezgoda& obj){
- for (unsigned int i = 0; i < _listaNezgoda.size(); i++){// onemogucava ponavljanje nezgoda (Uzima 20 min preklapanje operatora NE RADITI NA ISPITU)
- if (_listaNezgoda[i] == obj)
- return false;
- }
- _listaNezgoda.push_back(obj);
- return true;
- }
- //4. operator-= :: uklanja podatke o nezgodi na osnovu parametra koji opisuje lokaciju na
- // kojoj se nezgoda desila
- bool operator-=(const string nez){
- for (unsigned int i = 0; i < _listaNezgoda.size(); i++){
- if (nez.compare(_listaNezgoda[i].vratiLok()) == NULL){
- _listaNezgoda.erase(_listaNezgoda.begin() + i);
- return true;
- }
- }
- return false;
- }
- //5. operator [] :: vraca Ostecenje na osnovu naziva ostecenja koji je proslijedjen kao
- // parametar
- Ostecenje operator[](const char* naziv){
- for (unsigned int i = 0; i < _listaNezgoda.size(); i++){
- for (int j = 0; j < _listaNezgoda[i].returnListaOst().getTrenutno(); j++){//Provjerava naziv ostecenja
- if (strcmp(_listaNezgoda[i].returnListaOst().getT1(j).getNazivDjela(), naziv) == NULL)
- return _listaNezgoda[i].returnListaOst().getT1(j);
- }
- }
- }
- //6. GetOstecenjeByCijena :: vraca Ostecenje kod koga je najveca razlika izmedju cijene
- // originalnog i zamjenskog dijela
- Ostecenje* GetOstecenjeByCijena(){
- Ostecenje *najvRazl = new Ostecenje(_listaNezgoda[0].returnListaOst().getT1(0));
- for (unsigned int i = 0; i < _listaNezgoda.size(); i++){
- cout << _listaNezgoda[i].returnListaOst().getTrenutno() << endl;
- for (int j = 0; j < _listaNezgoda[i].returnListaOst().getTrenutno(); j++){
- if (*najvRazl < _listaNezgoda[i].returnListaOst().getT1(j))
- najvRazl = &(_listaNezgoda[i].returnListaOst().getT1(j));
- }
- }
- return najvRazl;
- }
- };
- void main(){
- //izbjegavajte koristenje vlastitog imena i prezimena.
- //provjeriti validnost izvrsenja svih dostupnih funkcionalnosti na objektu tipa Vozilo
- Ostecenje ost1("Na trotinetu", 300, 600, true);
- Ostecenje ost2("Na necijem mozgu", 850, 400, false);
- Ostecenje ost3("Guvernala", 350, 250, false);
- Nezgoda nez1;
- Nezgoda nez2("Buca potok");
- Nezgoda nez3("Dobrinja");
- nez2.AddOstecenje(ost1,"Jebeno");
- nez2.AddOstecenje(ost2,"Debil neki");
- nez2.AddOstecenje(ost2,"Pametan momak");
- nez2.AddOstecenje(ost2, "Pametan momak");
- nez2.AddOstecenje(ost3,"Boze sacuvaj");
- nez2.RemoveOstecenje("Na trotinetu");
- Vozilo voz1;
- Vozilo voz2("Nenad desni Cubic", "6663336669996");
- voz2 += nez1;
- voz2 += nez1;//ne dodaje dupli
- voz2 += nez2;
- voz2 += nez3;
- voz2 -= "Dobrinja";//Brise nez3
- voz2.Info();
- cout <<"Ostecenje operator[]" <<endl<< voz2["Na trotinetu"];
- //cout << endl << "izmedju cjena" << endl << (*voz2.GetOstecenjeByCijena()) << endl; // Nek ne radi ko ga jebeeeee
- system("pause>0");
- }
Advertisement
Add Comment
Please, Sign In to add comment