#ifndef __FRACTION_H #define __FRACTION_H #ifndef __REAL_H #include #endif // @doc EXTERNAL // @class fraction (per GREENLEAF) | Classe per la gestione dei numeri frazionari // // @base public | TObject class fraction : public TObject // @author:(INTERNAL) Alex { // @access:(INTERNAL) Private Member // @cmember:(INTERNAL) Numero fractione friend fraction operator *(const fraction & a, __int64 b); friend fraction operator /(const fraction & a, __int64 b); friend fraction operator /(__int64 a, const fraction & b); __int64 _num; __int64 _den; // @access Protected Member protected: // @cmember Duplica il numero frazionario (vedi classe ) virtual TObject* dup() const; // @cmember assegna il numero frazionario (vedi classe ) void simplify(); // @cmember Crea una frazione a partire da una stringa avente la VIRGOLA come separatore dei decimali! void build_fraction(const char* stringa); // @access Public Member public: // @cmember Controlla se si tratta di un fractione uguale 0 (TRUE se 0) bool is_zero() const { return _num == 0;} // @cmember Ritorna il segno del fraction int sign() const ; // @cmember Trasforma il fraction in intero (operator int era troppo pericoloso) __int64 integer() const { return _num / _den;} // @cmember Assegna una frazione fraction& operator =(const fraction& b); // @cmember Assegna una frazione fraction& operator =(const real& b) { build_fraction(b.stringa()); return *this; } // @cmember Aggiunge ad un frazione il valore passato fraction& operator +=(const fraction& b); // @cmember Sottrae ad un frazione il valore passato fraction& operator -=(const fraction& b); // @cmember Moltiplica un fractione per il valore passato (passato per indirizzo) fraction& operator *=(const fraction& b); // @cmember Divide un fractione per il valore passato (passato per indirizzo) fraction& operator /=(const fraction& b); // @cmember Ritorna la negazione di un frazione (TRUE se 0, altrimenti FALSE) bool operator !() const { return is_zero(); } // @cmember Ritorna il risultato della differenza tra due frazioni fraction operator -() const; // @cmember Trasforma il fraction in real operator real() const; // @cmember Costruttore fraction(); // @cmember Costruttore fraction(const real &num, const real& den); fraction(__int64 num, __int64 den = 1) : _num(num), _den(den) { simplify(); } // @cmember Costruttore fraction(const fraction& b) ; // @cmember Costruttore fraction(const char* stringa) { build_fraction(stringa); } // @cmember Distruttore virtual ~fraction() { } }; /////////////////////////////////////////////////////////// // Math operators /////////////////////////////////////////////////////////// fraction operator +(const fraction& a, const fraction& b) ; fraction operator -(const fraction& a, const fraction& b) ; fraction operator *(const fraction& a, const fraction& b) ; fraction operator /(const fraction& a, const fraction& b) ; bool operator <(const fraction& a, const fraction& b) ; bool operator >(const fraction& a, const fraction& b) ; bool operator <=(const fraction& a, const fraction& b) ; bool operator >=(const fraction& a, const fraction& b) ; bool operator ==(const fraction& a, const fraction& b) ; bool operator !=(const fraction& a, const fraction& b) ; #if 0 // Valanga apparentemente inutile: aggiungere solo cio' che serve veramente! inline fraction operator +(const real& a, const fraction& b) { return ::operator +((fraction)a, b);} inline fraction operator +(const fraction& a, const real& b) { return ::operator +(b, a);} inline fraction operator +(const fraction& a, __int64 b) { return ::operator +(a, (fraction)b);} inline fraction operator +(__int64 a, const fraction& b) { return ::operator +(b, a);} inline fraction operator -(const real& a, const fraction& b) { return ::operator -((fraction)a, b);} inline fraction operator -(const fraction& a, const real& b) { return ::operator -(a, (fraction)b);} inline fraction operator -(const fraction& a, __int64 b) { return ::operator -(a, (fraction)b);} inline fraction operator -(__int64 a, const fraction& b) { return ::operator -((fraction)a, b);} inline fraction operator *(const real& a, const fraction& b) { return ::operator *((fraction)a, b);} inline fraction operator *(const fraction& a, const real& b) { return ::operator *(b, a);} fraction operator *(const fraction& a, __int64 b); inline fraction operator *(__int64 a, const fraction& b) { return ::operator *(b, a);} inline fraction operator /(const real& a, const fraction& b) { return ::operator /((fraction)a, b);} inline fraction operator /(const fraction& a, const real& b) { return ::operator /(a, (fraction)b);} fraction operator /(const fraction& a, __int64 b); fraction operator /(__int64 a, const fraction& b); inline bool operator <(const real& a, const fraction& b) { return ::operator < (a, (real)b);} inline bool operator <(const fraction& a, const real& b) { return ::operator <((real) a, b);} inline bool operator >(const real& a, const fraction& b) { return ::operator > (a, (real)b);}; inline bool operator >(const fraction& a, const real& b) { return ::operator >((real) a, b);} inline bool operator <=(const real& a, const fraction& b) { return ::operator <= (a, (real)b);} inline bool operator <=(const fraction& a, const real& b) { return operator <=((real) a, b);} inline bool operator >=(const real& a, const fraction& b) { return operator >=(a, (real) b);} inline bool operator >=(const fraction& a, const real& b) { return operator >=((real) a, b);} inline bool operator ==(const real& a, const fraction& b) { return operator ==(a, (real) b);} inline bool operator ==(const fraction& a, const real& b) { return operator ==((real) a, b);} inline bool operator !=(const real& a, const fraction& b) { return operator !=(a, (real) b);} inline bool operator !=(const fraction& a, const real& b) { return operator !=((real) a, b);} #endif void swap(fraction& a, fraction& b) ; const fraction& fnc_min(const fraction& a, const fraction& b); const fraction& fnc_max(const fraction& a, const fraction& b); #endif