Aggiunto TGenerici_distrib

git-svn-id: svn://10.65.10.50/trunk@2561 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1996-02-05 14:53:21 +00:00
parent b795040bbb
commit 42bd4c1615
2 changed files with 101 additions and 0 deletions

View File

@ -1327,6 +1327,52 @@ void TDistrib::init (
if (zap) _slices.destroy();
}
///////////////////////////////////////////////////////////
// Generic_distrib
// Oggetto per dividere un real in parti prefissate
// in modo che la loro somma dia sempre il real di partenza
// /////////////////////////////////////////////////////////
void TGeneric_distrib::add(real slice)
{
CHECK (!_ready, "TGeneric_distrib: les jeux sont faits");
_totslices += slice;
_slices.add (slice);
}
real TGeneric_distrib::get ()
{
_ready = TRUE;
CHECK (_current < _slices.items(), "TGeneric_distrib: too many gets");
real & currslice = (real &) _slices[_current++];
real r = (_tot * currslice) / _totslices;
r.round (_decs);
_tot -= r;
_totslices -= currslice;
return r;
}
// @mfunc Inizializza l'oggetto
void TGeneric_distrib::init (
const real & r, // @parm Importo da dividere
bool zap) // @parm Permette di cancellare le percenutali immesse
// (default FALSE)
// @comm Se <p zap> e' vero cancella tutte le percentuali immesse, altrimenti
// cambia solo il totale
{
_current = 0; _totslices = 0;
_tot = r; _ready = FALSE;
if (zap) _slices.destroy();
else
{
const int items = _slices.items();
for (int i = 0; i < items; i++)
_totslices += (real &) _slices[i];
}
}
///////////////////////////////////////////////////////////
// Importo
///////////////////////////////////////////////////////////

View File

@ -340,6 +340,61 @@ public:
{}
};
// @class TGeneric_distrib | Classe per dividere un real in parti fissate
// in modo che la loro somma dia sempre il real di partenza
//
// @base public | TObject
class TGeneric_distrib : public TObject
{
// @access Private Member
// @cmember Totale da ripartire
real _tot;
// @cmember Totale parti da distribuire
real _totslices;
// @cmember Pronto per essere usato (tutti gli add() fatti)
bool _ready;
// @cmember Percentuali da distribuire
TArray _slices;
// @cmember Indice delle percentuali aggiunte o estratte
int _current;
// @cmember Precisione
int _decs;
// @access Public Member
public:
// @cmember Aggiunge una percentuale per la ripartizione
virtual void add(real slice);
// @cmember Ritorna il successivo degli importi suddivisi
virtual real get();
// @cmember Inizializza il numero di decimali
void set_dec(int decs) { _decs = decs;}
// @cmember Inizializza l'oggetto
void init(const real& r, bool zap = FALSE);
// @cmember Assegnamento di un importo
void operator =(const real& r)
{ init(r); }
// @cmember Ritorna l'ultima percentuale aggiunta
const real& last_slice() const
{
CHECK(_current,"TGeneric_distrib: slices not set");
return (const real&)_slices[_current-1];
}
// @cmember Costruttore
TGeneric_distrib(const real& r,int round=0) : _totslices(0.0),_tot(r),_ready(FALSE),_current(0),_decs(round),_slices(4)
{}
// @cmember Distruttore
virtual ~TGeneric_distrib()
{}
};
// @class TImporto | Classe per la definizione di oggetti con sezione e importo
//
// @base public | TSortable