diff --git a/include/real.cpp b/include/real.cpp index 9c89a6678..27879ed1b 100755 --- a/include/real.cpp +++ b/include/real.cpp @@ -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
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 /////////////////////////////////////////////////////////// diff --git a/include/real.h b/include/real.h index 2dd984d73..e111d4069 100755 --- a/include/real.h +++ b/include/real.h @@ -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