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:
- 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;
- 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”;
- Destruktor, koji oslobađa memoriju zauzetu konstruktorom;
- 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;
- Preklopljeni operator dodjele, koji garantira sigurno dodjeljivanje jednog skupa drugom skupu, bez problema koji mogu biti uzrokovani kreiranjem plitkih kopija;
- 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;
- Metodu bez parametara, koja vraća kao rezultat broj elemenata u vreći;
- 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;
- 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.
- 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
|
|