prilazem pomenuti header fajl:
#ifndef _predmet_h_
#define _predmet_h_
#define pi 3.141592
#include<iostream>
using namespace std;
class Predmet
{
protected:
char oznaka;
public:
virtual double V()=0;
virtual double T()=0;
virtual void citaj(istream& d){cout<<"oznaka?\n";d>>oznaka;}
virtual void pisi(ostream& d){d<<oznaka;}
virtual Predmet* kopija() const=0;
friend istream& operator>> (istream& d, Predmet& p)
{p.citaj(d);return d;}
friend ostream& operator<< (ostream& d, Predmet& p)
{p.pisi(d);return d;}
Predmet(){oznaka=' ';}
Predmet(char oz){oznaka=oz;}
virtual ~Predmet(){}
};
class Telo : public Predmet
{
protected:
double spec;
public:
virtual void pisi(ostream& d)
{
Predmet:
isi(d);d<<" , "<<"gustina = "<<spec;
}
Telo()
redmet(){spec=1;}
Telo(char oz,double sp=1)
redmet(oz){spec=sp;}
virtual ~Telo(){}
};
class Sfera : public Telo
{
double rad;
public:
Sfera():Telo(){rad=0;oznaka='s';}
Sfera(double sp,double r):Telo('s',sp){rad=r;}
~Sfera(){}
virtual double T(){ return V()*spec;}
virtual double V(){ return 4.0f/3.0f*rad*rad*rad*pi; }
Sfera* kopija() const
{return new Sfera(*this);}
void pisi(ostream& d)
{
d<<"<";
Telo:
isi(d);
d<<" ,radijus = "<<rad<<" , zapremina "<<V()<<" ,tezina "<<T()<<" >"<<endl;
}
void citaj(istream& d)
{
oznaka='s';
cout<<"radijus?\t";
d>>rad;
cout<<"specificna tezina?"<<endl;
d>>spec;
}
};
class Kupa : public Telo
{
double rad,vis;
public:
Kupa():Telo(){rad=0;oznaka='k';}
Kupa(double sp,double r,double v):Telo('k',sp){rad=r;vis=v;}
~Kupa(){}
virtual double V(){return rad*rad*pi*vis/3.0f;}
virtual double T(){return V()*spec;}
Kupa* kopija() const
{return new Kupa(*this);}
void pisi(ostream& d)
{
d<<"<";
Telo:
isi(d);
d<<"(radijus = "<<rad<<",visina = "<<vis<<")";
d<<" , zapremina "<<V()<<" ,tezina "<<T()<<">\n";
}
void citaj(istream& d)
{
oznaka='k';
cout<<"radijus?\t";
d>>rad;
cout<<"\nvisina?\t";
d>>vis;
cout<<"\nspecificna tezina?\t";
d>>spec;
}
};
class Valjak : public Telo
{
double rad,vis;
public:
Valjak():Telo(){rad=0;oznaka='v';}
Valjak(double sp,double r,double v):Telo('v',sp){rad=r;vis=v;}
~Valjak(){}
double V(){return rad*rad*pi*vis;}
double T(){return V()*spec;}
Valjak* kopija() const
{return new Valjak(*this);}
void pisi(ostream& d)
{
d<<"<";
Telo:
isi(d);d<<"(radijus = "<<rad<<" , visina = "<<vis<<")";
d<<" , zapremina "<<V()<<" ,tezina "<<T()<<">\n";
}
void citaj(istream& d)
{
oznaka='v';
cout<<"radijus?\t";
d>>rad;
cout<<"\nvisina?\t";
d>>vis;
cout<<"\nspecificna tezina?"<<endl;
d>>spec;
}
};
//////////////////////////////////////////////////////////////////////////////////////////////
// klase za greske //
//////////////////////////////////////////////////////////////////////////////////////////////
class PrekZap{};
class PrekTez{};
class GrIndeks{};
class GrNepoznatIzbor{};
/////////////////////////////////////////////////////////////////////////////////////////////
// klasa Sklop //
/////////////////////////////////////////////////////////////////////////////////////////////
class Sklop
ublic Predmet
{
protected:
Predmet** pr;
int broj;
public:
Sklop(){pr=new Predmet*;broj=0;}
virtual ~Sklop()
{for(int i=0;i<broj;i++)pr
=0;broj=0;}
Sklop* kopija() const {return new Sklop(*this);}
//////////////////////////////////////////////////////////////////////////////////////////////
// dodavanje jednog predmeta //
//////////////////////////////////////////////////////////////////////////////////////////////
virtual void dodaj(istream& d)
{
cout<<"tip? ((s)fera,(k)upa,(v)aljak)";
char izbor;
d>>izbor;
switch(izbor)
{
case 's': case 'S' :
{pr[broj]=new Sfera;pr[broj++]->citaj(d);break;}
case 'k': case 'K' :
{pr[broj]=new Kupa;pr[broj++]->citaj(d);break;}
case 'v': case 'V' :
{pr[broj]=new Valjak;pr[broj++]->citaj(d);break;}
default : {throw GrNepoznatIzbor();break;}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
// vadjenje jednog elementa //
//////////////////////////////////////////////////////////////////////////////////////////////
void izvadi(int br)
{
Predmet* pomocni;
if(br<1 || br>broj){throw GrIndeks();}
for(int i=br;i<broj;i++)
{
pomocni=pr[i-1];
pr[i-1]=pr;
pr=pomocni;
}
delete pr[--broj];
}
//////////////////////////////////////////////////////////////////////////////////////////////
// ispis u konzoli //
//////////////////////////////////////////////////////////////////////////////////////////////
void pisi(ostream& d)
{for(int i=0;i<broj;i++){d<<"indeks = "<<i+1<<"\n";pr->pisi(d);}}
/////////////////////////////////////////////////////////////////////////////////////////////
// tezina i zapremina //
/////////////////////////////////////////////////////////////////////////////////////////////
double V()
{
double rez=0;
for(int i=0;i<broj;rez+=pr[i++]->V()){}
return rez;
}
double T()
{
double rez=0;
for(int i=0;i<broj;rez+=pr[i++]->T()){}return rez;
}
virtual void citaj(istream& d){dodaj(d);}
};
//////////////////////////////////////////////////////////////////////
// dozvoljena duzina reda //
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
// skladiste //
//////////////////////////////////////////////////////////////////////////////////////////////
class Skladiste ublic Sklop
{
double ukzap,uktez;
public:
Skladiste(double ukz,double ukt):Sklop(){ukzap=ukz;uktez=ukt;}
~Skladiste(){ukzap=uktez=0;}
void ubaci(Predmet* p)
{
Sklop:r[broj]=p;
Sklop::broj+=1;
}
void dodaj(istream& d)
{
cout<<"tip? ((s)fera,(k)upa,(v)aljak)";
char izbor;
d>>izbor;
switch(izbor)
{
case 's': case 'S' :
{
pr[broj]=new Sfera;
pr[broj++]->citaj(d);
if(T()>uktez){izvadi(broj);throw PrekTez();}
else if(V()>ukzap){izvadi(broj);throw PrekZap();}
break;
}
case 'k': case 'K' :
{
pr[broj]=new Kupa;
pr[broj++]->citaj(d);
if(T()>uktez){izvadi(broj);throw PrekTez();}
else if(V()>ukzap){izvadi(broj);throw PrekZap();}
break;}
case 'v': case 'V' :
{
pr[broj]=new Valjak;
pr[broj++]->citaj(d);
if(T()>uktez){izvadi(broj);throw PrekTez();}
else if(V()>ukzap){izvadi(broj);throw PrekZap();}
break;
}
default : {throw GrNepoznatIzbor();break;}
}
}
void citaj(istream& d)
{dodaj(d);}
};
#endif