Página principal | Lista de namespace | Jerarquía de la clase | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros

decimal.h

Ir a la documentación de este archivo.
00001 // decimal.h (c) 2007
00002 
00003 /** \file  decimal.h
00004     \brief Declara el tipo \c "decimal".
00005     - La clase \c decimal implementa las operaciones aritméticas
00006       principales para números de tipo entero largo.
00007 
00008     - Permite usar decimales en cualquier sitio en donde se puedan
00009       usar valores numéricos.
00010 
00011     \author Elsie Castro-Armando Soto
00012     \date   2007
00013 */
00014 
00015 
00016 #ifndef decimal_h
00017 #define decimal_h ///< Evita la inclusión múltiple
00018 
00019 #include <iostream>
00020 #include "BigNum.h"
00021 #include  <cstdlib>
00022 #include  <cctype>     // isdigit()
00023 
00024 class decimal{
00025 private:
00026     BigNum m_num; ///< Numerador
00027     decimal( const BigNum& res ) { m_num = res; } 
00028 
00029 
00030 public:
00031     // constructores
00032     decimal() : m_num(0) { }  ///< Constructor de vector
00033     decimal(long num) : m_num(num) { } ///< Constructor a partir de un valor entero
00034     decimal(const decimal& o)       /// Constructor de copia
00035         { m_num = o.m_num; }
00036     ~decimal() { }      ///< Destructor
00037 
00038 
00039 //  void num(long n) { m_num=n; Simplify(); }  // FEO
00040 //  void den(long d) { m_den= ( d!=0 ? d : m_den) ; Simplify(); }  // FEO
00041 
00042     decimal& operator  = (const decimal&);  // Asignación (copia)
00043     decimal& operator  = (long);
00044     decimal& swap ( decimal& );
00045 
00046     decimal& operator += (const decimal&);
00047     decimal& operator -= (const decimal&);
00048     decimal& operator *= (const decimal&);
00049     decimal& operator /= (const decimal&);
00050 
00051     decimal operator  - () const;              // menos unario
00052 
00053     friend decimal operator + (const decimal&, const decimal&);
00054     friend decimal operator - (const decimal&, const decimal&);
00055     friend decimal operator * (const decimal&, const decimal&);
00056     friend decimal operator / (const decimal&, const decimal&);
00057         friend decimal operator % (const decimal&, const decimal&);
00058 
00059     friend bool operator == (const decimal&, const decimal&);
00060     friend bool operator <  (const decimal&, const decimal&);
00061     friend bool operator != (const decimal&, const decimal&);
00062     friend bool operator <= (const decimal&, const decimal&);
00063     friend bool operator >= (const decimal&, const decimal&);
00064     friend bool operator >  (const decimal&, const decimal&);
00065 
00066     friend ostream& operator << (ostream &, const decimal& );
00067     friend istream& operator >> (istream &,       decimal& );
00068 
00069 }; // rational
00070 
00071 
00072 /** Copia desde \c "o".
00073     - El valor anterior de \c "*this" se pierde.
00074     \par Complejidad:
00075          O( \c 1 )
00076     \returns *this
00077     \see http://www.di-mare.com/adolfo/binder/c04.htm#sc05
00078 */
00079 inline decimal& decimal::operator = (const decimal& o) {
00080     m_num = o.m_num;
00081    
00082 //  sobra invocar a "Simplify()" pues "o" ya está simplificado
00083     return *this;
00084 }  // operator =
00085 
00086 /** Intercambia los valores de \c "*this" y \c "o".
00087       \par Complejidad:
00088          O( \c 1 )
00089 
00090     \returns *this
00091 
00092     \see http://www.di-mare.com/adolfo/binder/c04.htm#sc08
00093 */
00094 inline decimal& decimal::swap ( decimal& o ) {
00095     #if 1
00096         decimal tmp = o;
00097         o = *this;
00098         *this = tmp;
00099     #else
00100         // Esto NO funciona para objetos, métodos virtuales, etc.
00101         char tmp[ sizeof( *this ) ];
00102         memcpy( tmp,   o,     sizeof( *this ) ); // tmp = o;
00103         memcpy( o,    *this,  sizeof( *this ) ); // o = *this;
00104         memcpy( *this, tmp,   sizeof( *this ) ); // *this = tmp;
00105     #endif
00106     return *this;
00107 }
00108 
00109 /// Asignación desde un \c "long".
00110 inline decimal& decimal::operator = (long entero) {
00111     m_num = entero;
00112     return *this;
00113 }  // operator =
00114 
00115 /// Multiplica \c "*this" por \c "num".
00116 inline decimal& decimal::operator *= (const decimal& num) {
00117     BigNum m_res;
00118 
00119         m_res = m_num * num.m_num;
00120         m_num = m_res;
00121 
00122     return *this;
00123 }  // operator *=
00124 
00125 /**  Divide \c "*this" por el valor de \c "num".
00126     \pre
00127     - (num != 0)
00128 */
00129 inline decimal& decimal::operator /= (const decimal& num) {//lo cambiamos
00130     BigNum m_res;
00131 
00132         m_res = m_num / num.m_num;
00133         m_num = m_res;
00134 
00135     return *this;
00136 }  // operator /=
00137 
00138 /// \c "-x".
00139 /// - Menos unario
00140 /// - Calcula y retorna el valor \c "-x"
00141 inline decimal decimal::operator - () const {
00142     decimal tmp = (*this);  // tmp.rational( *this );
00143     tmp.m_num = - tmp.m_num;
00144     return tmp;
00145 }  // operator -
00146 
00147 /// ¿ x == y ?
00148 inline bool operator == (const decimal &x, const decimal &y) {
00149     return (x.m_num == y.m_num);
00150 
00151 }  // operator ==
00152 
00153 /// ¿ x < y ?
00154 
00155 inline bool operator < (const decimal &x, const decimal &y) {
00156     return x.m_num < y.m_num;
00157 
00158 }  // operator <
00159 
00160 /// ¿ x > y ?
00161 inline bool operator > (const decimal &x, const decimal &y) {
00162     return (y < x);
00163 }  // operator >
00164 
00165 /// ¿ x != y ?
00166 inline bool operator != (const decimal& x, const decimal& y) {
00167     return !(x == y);
00168 }  // operator !=
00169 
00170 /// ¿ x <= y ?
00171 inline bool operator <= (const decimal& x, const decimal& y) {
00172     return !(y < x);
00173 }  // operator <=
00174 
00175 /// ¿ x >= y ?
00176 inline bool operator >= (const decimal& x, const decimal& y) {
00177     return !(x < y);
00178 }  // operator >=
00179 
00180 
00181 // EOF: rational.h
00182 
00183 
00184 /// Le suma a \c "*this" el valor de \c "otro".
00185 decimal& decimal::operator += (const decimal& otro) {
00186     BigNum m_res;
00187 
00188         m_res = m_num + otro.m_num;
00189         m_num = m_res;
00190 
00191     return *this;
00192 }  // operator +=
00193 
00194 
00195 /// Le resta a \c "*this" el valor de \c "otro".
00196 decimal& decimal::operator -= (const decimal& otro) {
00197     BigNum m_res;
00198 
00199         m_res = m_num - otro.m_num;
00200         m_num = m_res;
00201 
00202     return *this;
00203 }  // operator -=
00204 
00205 
00206 /** Graba el valor de \c "r" en el flujo \c "COUT".
00207     - Graba el valor en el formato [num/den].
00208     - En particular, este es el operador que se invoca
00209       cuando se usa, por ejemplo, este tipo de instrucción:
00210      \code
00211           cout << r << q;
00212      \endcode
00213 */
00214 ostream& operator<< (ostream &COUT, const decimal& r) {
00215    
00216         return COUT << "[" << r.m_num << "]" ;
00217  
00218 }  // operator <<
00219 
00220 /** Lee del flujo de texto \c "CIN" el valor de \c "r".
00221     \pre
00222     El número rational debe haber sido escrito usando
00223     el formato "[r/den]", aunque es permisible usar
00224     algunos blancos.
00225     - Se termina de leer el valor sólo cuando encuentra \c "]".
00226     - <code> [ -+-+-+-+- 4 / -- -+ -- 32  ] </code> se lee como
00227       <code> [1/8] </code>
00228 */
00229 istream& operator >> (istream &CIN, decimal& r) {
00230     /*char ch;  // valor leido, letra por letra, de "CIN"
00231 
00232     bool es_positivo = true;    // manejo de los signos + y -
00233 
00234     // se brinca todo hasta el primer dígito
00235     do {
00236         CIN >> ch;
00237         if (ch == '-') {  // cambia de signo
00238             es_positivo = !es_positivo;
00239         }
00240     } while (!isdigit(ch));
00241 
00242     // se traga el numerador
00243     r.m_num = 0;
00244     while (isdigit(ch)) { // convierte a decimal: izq --> der
00245         r.m_num = 10 * r.m_num + (ch-'0');
00246         CIN >> ch;
00247     }
00248 
00249     // se brinca los blancos después del numerador
00250     while (isspace(ch)) {
00251         CIN >> ch;
00252     }
00253 
00254     if (ch ==']') { // es un número entero
00255         r.m_den = 1;
00256     }
00257     else {
00258         do {  // se brinca todo hasta el denominador
00259             CIN >> ch;
00260             if (ch == '-') {
00261                 es_positivo = !es_positivo;
00262             }
00263         } while (!isdigit(ch));
00264 
00265         // se traga el denominador
00266         r.m_den = 0;
00267         while (isdigit(ch)) {
00268             r.m_den = 10 * r.m_den + (ch-'0');
00269             CIN >> ch;
00270         }
00271 
00272         // El programa se duerme si en el flujo de entrada
00273         // NO aparece el caracter delimitador final "]",
00274         // pues la lectura termina hasta encontrar el "]".
00275         while (ch != ']') {
00276             CIN >> ch;
00277         }
00278     }   // corrección: Andrés Arias <[email protected]>
00279 
00280 
00281     // le cambia el signo, si hace falta
00282     if (! es_positivo) {
00283         r.m_num = -r.m_num;
00284     }
00285 
00286     return CIN;
00287 
00288 */
00289         return CIN;
00290 
00291 }  // operator >>
00292 
00293 /// \c "x+y".
00294 /// - Calcula y retorna la suma \c "x+y".
00295 decimal operator + (const decimal &x, const decimal &y) {
00296 
00297     return decimal(x.m_num + y.m_num);
00298 }  // operator + ()
00299 
00300 /// \c "x-y".
00301 
00302 /// - Calcula y retorna la resta \c "x-y".
00303 decimal operator - (const decimal &x, const decimal &y) {
00304     
00305         return decimal(x.m_num - y.m_num);
00306 }  // operator - ()
00307 
00308 /// \c "x*y".
00309 /// - Calcula y retorna la multiplicación \c "x*y".
00310 decimal operator * (const decimal &x, const decimal &y) {
00311 
00312     return decimal(x.m_num * y.m_num);
00313 }  // operator * ()
00314 
00315 /// \c "x/y".
00316 /// - Calcula y retorna la división \c "x/y".
00317 /// \pre <code> y != 0 </code>
00318 decimal operator / (const decimal &x, const decimal &y) {
00319     
00320     return decimal(x.m_num / y.m_num);
00321 }  // operator / ()
00322 
00323 decimal operator % (const decimal &x, const decimal &y) {
00324     
00325     return decimal(x.m_num % y.m_num);
00326 }  // operator / ()
00327 
00328 #endif // rational_h
00329 
00330 // EOF: rational.cpp

Generado el Thu Sep 20 12:33:06 2007 para Clase decimal: por  doxygen 1.4.1
Hosted by www.Geocities.ws

1