#ifndef __REAL_H #define __REAL_H #ifndef __STRINGS_H #include "strings.h" #endif #define ALL_DECIMALS 883 #define AUTO_DECIMALS -883 #define AUTO_PRICES_DECIMALS -884 #ifdef __LONGDOUBLE__ // @doc EXTERNAL // @class real | Classe per la gestione dei numeri reali // // @base public | TObject class real : public TObject // @comm Questa classe utilizza i long double definiti per Visual C++. Esiste un'altra classe // real: per accedere scegliere il tasto successivo () dalla barra dei bottoni // @author:(INTERNAL) Guido { // @access:(INTERNAL) Private Member // @cmember:(INTERNAL) Numero reale long double _dec; // @access Protected Member protected: // @cmember Permette di stampare l'oggetto virtual void print_on(ostream& out) const; // @cmember Duplica il numero reale (vedi classe ) virtual TObject* dup() const; // @cmember Traduce in lettere il numero reale const char* literals() const; // @cmember Inserisce i punti separatori delle migliaia e riempe i decimali // alla lunghezza passata (es: 3.000,20) const char* points(int decimals = 0) const; // @access Public Member public: // @cmember long double | operator long double | | Ritorna il numero reale operator long double () const { return _dec; } // @cmember Trasforma un numero dal formato inglese (decimali con punto) in // formato italiano (decimali con virgola) static const char* eng2ita(char* s); // @cmember Trasforma un numero dal formato italiano (decimali con virgola) in // formato inglese (decimali con punto) static const char* ita2eng(const char* s); // @cmember Controlla se si tratta di un numero reale (TRUE se vero) static bool is_real(const char* n); // @cmember Controlla se si tratta di un numero naturale intero (TRUE se vero) static bool is_natural(const char* n); // @cmember Controlla se si tratta di uno zero (TRUE se vero) static bool is_null(const char* n); // @cmember Trasforma un reale in stringa const char* string(int len = 0, int dec = UNDEFINED, char pad = ' ') const; // @cmember Trasforma un reale in stringa (chiama ), ma // ritorna il formato italiano const char* stringa(int len = 0, int dec = UNDEFINED, char pad = ' ') const; // @cmember Ritorna la stringa con il formato passato const char* string(const char* picture) const; // @cmember Ritorna la precisione del reale (numero di decimali) int precision() const; // @cmember Controlla se si tratta di un reale uguale 0 (TRUE se 0) bool is_zero() const { return _dec == 0.0; } // @cmember Ritorna il segno del reale int sign() const; // @cmember Trasforma il reale in intero (operator int era troppo pericoloso) long integer() const; // @cmember Arrotonda al numero di decimali passati real& round(int prec = 0) ; // @cmember Tronca al numero di decimali passati (default 0) real& trunc(int prec = 0) ; // @cmember Arrotonda al numero successivo (della precisione passata) real& ceil(int prec = 0); // @cmember Arrotonda al numero precedente (della precisione passata) real& floor(int prec = 0); // @cmember Assegna un reale real& operator = (const real& a); // @cmember Assegna un reale real& operator =(long double a); // @cmember Assegna un __int64 ad un reale void set_int64(__int64 b); // @cmember Aggiunge ad un reale il valore passato (passato per indirizzo) real& operator +=(long double a); // @cmember Sottrae ad un reale il valore passato (passato per indirizzo) real& operator -=(long double b); // @cmember Moltiplica un reale per il valore passato (passato per indirizzo) real& operator *=(long double b); // @cmember Divide un reale per il valore passato (passato per indirizzo) real& operator /=(long double b); // @cmember Ritorna la negazione di un reale (TRUE se 0, altrimenti FALSE) bool operator !() const { return _dec == 0.0; } // @cmember Ritorna il risultato della differenza tra due reali real operator -() const; // @cmember Costruttore real(); // @cmember Costruttore real(const real& b); // @cmember Costruttore real(long double a); // @cmember Costruttore real(const char* s); // @cmember Distruttore virtual ~real() {} }; inline long double fnc_min(long double a, long double b){ return a < b ? a : b; } inline long double fnc_max(long double a, long double b) { return a > b ? a : b; } long double operator%(const real& a, const real& b); void swap(real& a, real& b) ; long double sqrt(long double) ; long double sqr(long double) ; long double exp10(long double) ; long double pow(long double, long double) ; long double exp(long double a) ; long double log10(long double a) ; long double log(long double a) ; long double sin(long double a) ; long double cos(long double a) ; long double tan(long double a) ; long double abs(long double a) ; #else #ifndef __IOSTREAM_H #include #endif #ifndef GMDOTH #include "../gfm/gmsys1.h" #include "../gfm/gfd.h" #endif // @doc EXTERNAL // @class real (per GREENLEAF) | Classe per la gestione dei numeri reali // // @base public | TObject class real : public TObject // @comm Questa classe utilizza i DEC definiti per GREENLEAF. Esiste un'altra classe // real: per accedere scegliere il tasto precedente () dalla barra deo bottoni // @author:(INTERNAL) Guido { // @access:(INTERNAL) Private Member // @cmember:(INTERNAL) Numero reale DEC _dec; // @access Protected Member protected: // @cmember Permette di stampare l'oggetto virtual void print_on(ostream& out) const; // @cmember Duplica il numero reale (vedi classe ) virtual TObject* dup() const; // @cmember Traduce in lettere il numero reale const char* literals() const; // @cmember Inserisce i punti separatori delle migliaia e riempe i decimali // alla lunghezza passata (es: 3.000,20) const char* points(int decimals = 0) const; // @access Public Member public: // @cmember Rimuove gli zeri prima della virgola, aggiustando la precisione void trail( ); // @cmember Trasforma un numero dal formato inglese (decimali con punto) in // formato italiano (decimali con virgola) static const char* eng2ita(char* s); // @cmember Trasforma un numero dal formato italiano (decimali con virgola) in // formato inglese (decimali con punto) static const char* ita2eng(const char* s); // @cmember Controlla se si tratta di un numero reale (TRUE se vero) static bool is_real(const char* n); // @cmember Controlla se si tratta di un numero naturale intero (TRUE se vero) static bool is_natural(const char* n); // @cmember Controlla se si tratta di uno zero (TRUE se vero) static bool is_null(const char* n); // @cmember Ritorna l'indirizzo del numero reale DEC* ptr() const { return (DEC*)&_dec; } // @cmember Trasforma un reale in stringa const char* string(int len = 0, int dec = UNDEFINED, char pad = ' ') const; // @cmember Trasforma un reale in stringa (chiama ), ma // ritorna il formato italiano const char* stringa(int len = 0, int dec = UNDEFINED, char pad = ' ') const; // @cmember Ritorna la stringa con il formato passato const char* string(const char* picture) const; // @cmember Ritorna la precisione del reale (numero di decimali) int precision() const; // @cmember Controlla se si tratta di un reale uguale 0 (TRUE se 0) bool is_zero() const; // @cmember Ritorna il segno del reale int sign() const; // @cmember Trasforma il reale in intero (operator int era troppo pericoloso) long integer() const; // @cmember Arrotonda al numero di decimali passati real& round(int prec = 0) ; // @cmember Tronca al numero di decimali passati (default 0) real& trunc(int prec = 0) ; // @cmember Arrotonda al numero successivo (della precisione passata) real& ceil(int prec = 0); // @cmember Arrotonda al numero precedente (della precisione passata) real& floor(int prec = 0); // @cmember Assegna un reale real& operator =(double a); // @cmember Assegna un __int64 ad un reale void set_int64(__int64 b); // @cmember Assegna un reale (passato per indirizzo) real& operator =(const real& b); // @cmember Aggiunge ad un reale il valore passato (passato per indirizzo) real& operator +=(const real& b); // @cmember Aggiunge ad un reale il valore passato real& operator +=(double a); // @cmember Sottrae ad un reale il valore passato (passato per indirizzo) real& operator -=(const real& b); // @cmember Moltiplica un reale per il valore passato (passato per indirizzo) real& operator *=(const real& b); // @cmember Divide un reale per il valore passato (passato per indirizzo) real& operator /=(const real& b); // @cmember Ritorna la negazione di un reale (TRUE se 0, altrimenti FALSE) bool operator !() const { return is_zero(); } // @cmember Ritorna il risultato della differenza tra due reali real operator -() const; // @cmember Costruttore real(); // @cmember Costruttore real(const real& b); // @cmember Costruttore real(double a); // @cmember Costruttore real(const char* s); // @cmember Distruttore virtual ~real() {} }; /////////////////////////////////////////////////////////// // Math operators /////////////////////////////////////////////////////////// ostream& operator <<(ostream& out, const real& a) ; istream& operator >>(istream& in, real& a) ; real operator +(const real& a, const real& b) ; real operator +(double a, const real& b) ; real operator +(const real& a, double b) ; real operator -(const real& a, const real& b) ; real operator -(double a, const real& b) ; real operator -(const real& a, double b) ; real operator *(const real& a, const real& b) ; real operator *(double a, const real& b) ; real operator *(const real& a, double b) ; real operator /(const real& a, const real& b) ; real operator /(double a, const real& b) ; real operator /(const real& a, double b) ; bool operator <(const real& a, const real& b) ; bool operator <(double a, const real& b) ; bool operator >(const real& a, const real& b) ; bool operator >(double a, const real& b) ; bool operator <=(const real& a, const real& b) ; bool operator <=(double a, const real& b) ; bool operator >=(const real& a, const real& b) ; bool operator >=(double a, const real& b) ; bool operator ==(const real& a, const real& b) ; bool operator ==(double a, const real& b) ; bool operator !=(const real& a, const real& b) ; bool operator !=(double a, const real& b) ; inline bool operator <(const real& a, double b) { return operator >(b, a); } inline bool operator >(const real& a, double b) { return operator <(b, a); } inline bool operator <=(const real& a, double b) { return operator >=(b, a); } inline bool operator >=(const real& a, double b) { return operator <=(b, a); } inline bool operator ==(const real& a, double b) { return operator ==(b, a); } inline bool operator !=(const real& a, double b) { return operator !=(b, a); } real operator %(const real& a, const real& b) ; void swap(real& a, real& b) ; const real& fnc_min(const real& a, const real& b) ; const real& fnc_max(const real& a, const real& b) ; real sqrt(const real& a) ; real sqr(const real& a) ; real exp10(const real& a) ; real pow(const real& a, const real& b) ; real exp(const real& a) ; real log10(const real& a) ; real log(const real& a) ; real sin(const real& a) ; real cos(const real& a) ; real tan(const real& a) ; real abs(const real& a) ; #endif // TReal implementato coi maledetti DEC extern const real ZERO; extern const real UNO; extern const real CENTO; // @doc EXTERNAL // @class TDistrib | Classe per dividere un in varie sue percentuali // in modo che la loro somma dia sempre il real di partenza // // @base public | TObject class TDistrib : public TObject // @author:(INTERNAL) Guido { // @access:(INTERNAL) Private Member // @cmember:(INTERNAL) Totale da ripartire real _tot; // @cmember:(INTERNAL) Progressivo gia' distribuito real _prog; // @cmember:(INTERNAL) Pronto per essere usato (tutti gli fatti) bool _ready; // @cmember:(INTERNAL) Percentuali da distribuire TArray _slices; // @cmember:(INTERNAL) Indice delle percentuali aggiunte o estratte int _current; // @cmember:(INTERNAL) Precisione int _decs; // @access Public Member public: // @cmember Aggiunge una percentuale per la ripartizione void add(real slice); // @cmember Ritorna il successivo degli importi suddivisi 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,"TDistrib: slices not set"); return (const real&)_slices[_current-1]; } // @cmember Costruttore TDistrib(const real& r,int round=UNDEFINED) : _prog(0.0),_tot(r),_ready(FALSE),_current(0),_decs(round),_slices(4) {} // @cmember Distruttore virtual ~TDistrib() {} }; // @doc EXTERNAL // @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:(INTERNAL) Private Member // @cmember:(INTERNAL) Totale da ripartire real _tot; // @cmember:(INTERNAL) Totale parti da distribuire real _totslices; // @cmember:(INTERNAL) Pronto per essere usato (tutti gli add() fatti) bool _ready; // @cmember:(INTERNAL) Percentuali da distribuire TArray _slices; // @cmember:(INTERNAL) Indice delle percentuali aggiunte o estratte int _current; // @cmember:(INTERNAL) 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() {} }; // @doc EXTERNAL // @class TImporto | Classe per la definizione di oggetti con sezione e importo // // @base public | TSortable class TImporto : public TSortable // @author:(INTERNAL) Guido { // @access:(INTERNAL) Private Member // @cmember:(INTERNAL) Sezione alla quale apprtiene l'importo char _sezione; // @cmember:(INTERNAL) Valore dell'importo real _valore; // @access Protected Member protected: // @cmember Permette la comparazione degli importi (0 se uguali in valore // ed importo) virtual int compare(const TSortable& s) const; // @access Public Member public: // @cmember Ritorna la sezione dell'importo char sezione() const { return _sezione; } // @cmember Ritorna il valore dell'importo const real& valore() const { return _valore; } // @cmember Ritorna il valore dell'importo real& valore() { return _valore; } // @cmember Controlla se l'importo e' 0 (in qualsiasi sezione, TRUE se 0) bool is_zero() const; // @cmember Assegna l'importo passato const TImporto& operator=(const TImporto& i) { return set(i.sezione(), i.valore()); } // @cmember Assegna l'importo da una (sezione ambigua se // ZERO) const TImporto& operator=(TToken_string& sv); // @cmember Aggiunge all'importo l'oggetto passato const TImporto& operator+=(const TImporto& i); // @cmember Sottrae all'importo l'oggetto passato const TImporto& operator-=(const TImporto& i); // @cmember Normalizza il segno o la sezione in base al parametro s const TImporto& normalize(char s = '\0'); // @cmember Inverte la sezione dell'importo const TImporto& swap_section(); // @cmember Assegna sezione ed importo all'oggetto const TImporto& set(char s, const real& v); // @cmember Setta i due elementi pos e pos+1 della // al valore dell'importo, lasciando bianco il dare (pos) o l'avere (pos+1) const TImporto& add_to(TToken_string& s, int pos) const; // @cmember Costruttore TImporto(char s = 'D', const real& v = ZERO) { set(s, v); } // @cmember Costruttore (copia l'oggetto) TImporto(const TImporto& i) : _sezione(i._sezione), _valore(i._valore) {} }; #endif // __REAL_H