24.11.2.24011930. Definirati i implementirati generičku klasu “Vreca” koja služi za smještanje kolekcije elemenata jednakog ali proizvoljnog tipa, pri čemu poredak elemenata u kolekciji nije bitan, i nije moguće imati dva identična elementa unutar kolekcije (slično matematskom pojmu skupa). Kolekcija treba da sadrži sljedeće elemente:

  1. Privatne atribute koji redom predstavljaju broj elemenata u vreći, kapacitet vreće (tj. maksimalni broj elemenata koji se mogu smjestiti u vreću), te pokazivač na dinamički alocirani niz (preciznije, na njegov prvi element) koji ce čuvati elemente vreće;
  2. Konstruktor sa jednim parametrom tipa cijeli broj, koji predstavlja kapacitet vreće, i koji vrši dinamičku alokaciju prostora za čuvanje elementa vreće. Inicijalno vreća treba da bude prazna. Pri tome je potrebno zabraniti da se ovaj konstruktor koristi za automatsku konverziju cjelobrojnog tipa u tip “Vreca”;
  3. Destruktor, koji oslobađa memoriju zauzetu konstruktorom;
  4. Konstruktor kopije koji će osigurati da se objekti tipa “Vreca” mogu bezbjedno prenositi kao parametri po vrijednosti, koristiti za inicijalizaciju drugih objekata istog tipa i vraćati kao rezultati iz funkcija;
  5. Preklopljeni operator dodjele, koji garantira sigurno dodjeljivanje jednog skupa drugom skupu, bez problema koji mogu biti uzrokovani kreiranjem plitkih kopija;
  6. Metodu sa jednim parametrom, koja dodaje u vreću element predstavljen parametrom. U slučaju da se takav element već nalazi u vreći, unos elementa treba ignorirati. U slučaju da je dostignut kapacitet vreće, metoda treba da baci izuzetak;
  7. Metodu bez parametara, koja vraća kao rezultat broj elemenata u vreći;
  8. Metodu sa jednim parametrom, koja vraća kao rezultat “true” ukoliko se element predstavljen parametrom nalazi u vreći, a “false” ukoliko se ne nalazi;
  9. Metodu sa jednim parametrom koja uklanja element predstavljen parametrom iz vreće. U slučaju da se takav element ne nalazi u vreći, metoda treba da baci izuzetak.
  10. Metodu bez parametara koja vraća kao rezultat neki od elemenata iz vreće po slučajnom izboru, osim u slučaju kada je vreća prazna (u tom slučaju, treba baciti izuzetak).
Sve metode implementirati izvan deklaracije klase, osim trivijalnih metoda koje treba implementirati direktno unutar deklaracije klase. Napisane metode testirati u testnom programu koji unosi niz riječi sa tastature, trpa ih u vreću, a zatim ispisuje na ekran sve riječi smještene u vreću (koristeći samo metode koje objekti tipa “Vreca” podržavaju).

Opis rješenja:

Listing programa:

#include <iostream>
#include <conio.h>
#include <algorithm>
#include <cstdlib>
#include <ctime>
using namespace std;
template<typename tip>
class Vreca{
int brel;
const int maxbrel;
tip *elem;
public:
explicit Vreca(int maxbrel):maxbrel(maxbrel),brel(0),elem(new tip[maxbrel]){}
Vreca(const Vreca &v);
~Vreca(){delete[] elem;}
Vreca &operator =(const Vreca &v);
void Dodaj(const tip &e);
int brelUV(){return brel;}
bool ImaLiGa(const tip &e);
void LisiGa(const tip &e);
tip Slucajni();

void Ispis(){
    cout<<endl<<brel<<endl<<maxbrel<<endl
        ;
    }
};
template<typename tip>
Vreca<tip>::Vreca(const Vreca &v):brel(v.brel),maxbrel(v.maxbrel),
                            elem(new tip[v.maxbrel]){
    copy(v.elem,v.elem+v.maxbrel,elem);
    }
template<typename tip>    
Vreca<tip> &Vreca<tip>::operator =(const Vreca &v){
if(maxbrel<v.maxbrel){
    delete[] elem;
    elem=new tip[v.maxbrel];
    }
maxbrel=v.maxbrel;
brel=v.brel;
copy(v.elem,v.elem+v.maxbrel,elem);
return *this;
}
template<typename tip>
void Vreca<tip>::Dodaj(const tip &e){
if(brel==maxbrel)throw "nesto ne valja!";
bool t(true);
for(int i=0;i<brel;i++){
    if(elem[i]==e){
        t=false;
        break;
        }
    }
if(t) elem[brel++]=e;
}
template<typename tip>
bool Vreca<tip>::ImaLiGa(const tip &e){
    for(int i=0;i<brel;i++)
        if(elem[i]==e)return true;
return false;
}
template<typename tip>
void Vreca<tip>::LisiGa(const tip &e){
bool t(true);int j(0);
for(int i=0;i<brel;i++)
        if(elem[i]==e){t=false;j=i;break;}
if(t)throw "error!";
for(int i=j;i<brel-1;i++)
    elem[i]=elem[i+1]; 
//delete elem[brel-1];       
brel--;
}
template<typename tip>
tip Vreca<tip>::Slucajni(){
if(brel==0)throw "error!";
if(brel==1)
    return elem[0];
int i(0);
i=rand()%brel;        
return elem[i];
}


int main(){
srand(time(0));
try{
//Ovde testirati klasu...
}
catch(...){
    cout<<"nesto ne valja!";
    }
getch();
return 0;
}

Ispis na ekranu:

Riješeni zadaci 2    Index