La Matriz Abstracta no Polimorfica:
|
La clase rational
implementa las operaciones aritméticas principales para números rationales.
Más...
#include <rational.h>
Métodos públicos | |
rational () | |
Constructor de vector. | |
rational (INT num) | |
Constructor a partir de un valor entero. | |
rational (INT num, INT den) | |
Constructor a partir de un valor quedbrado. | |
rational (const rational &o) | |
Constructor de copia. | |
~rational () | |
Destructor. | |
void | set (const INT &n=INT(0), const INT &d=INT(1)) |
Cambia el valor del número rational a "n/d" . | |
const INT & | num () const |
Acceso al numerador. | |
const INT & | den () const |
Acceso al denomirador (siempre >0). | |
rational & | operator= (const rational &) |
Copia desde "o" . | |
rational & | operator= (INT) |
Asignación desde un "INT" . | |
rational & | swap (rational &) |
Intercambia los valores de "*this" y "o" . | |
rational & | operator+= (const rational &) |
Le suma a "*this" el valor de "otro" . | |
rational & | operator-= (const rational &) |
Le resta a "*this" el valor de "otro" . | |
rational & | operator*= (const rational &) |
Multiplica "*this" por "num" . | |
rational & | operator/= (const rational &) |
Divide "*this" por el valor de "num" . | |
rational | operator- () const |
"-x" . | |
rational & | fromString (const char *nStr) |
Establece el varlor de "*this" a partir de la hilera "nStr" . | |
Métodos privados | |
void | simplify () |
Simplifica el numerador y el denomidador. | |
Atributos privados | |
INT | m_num |
Numerador. | |
INT | m_den |
Denominador. | |
Amigas | |
class | test_rational |
Datos de prueba para la clase. | |
template<class NUM > | |
rational< NUM > | operator+ (const rational< NUM > &, const rational< NUM > &) |
"x+y" . | |
template<class NUM > | |
rational< NUM > | operator- (const rational< NUM > &, const rational< NUM > &) |
"x-y" . | |
template<class NUM > | |
rational< NUM > | operator* (const rational< NUM > &, const rational< NUM > &) |
"x*y" . | |
template<class NUM > | |
rational< NUM > | operator/ (const rational< NUM > &, const rational< NUM > &) |
"x/y" . | |
template<class NUM > | |
bool | operator== (const rational< NUM > &, const rational< NUM > &) |
¿ x == y ?. | |
template<class NUM > | |
bool | operator< (const rational< NUM > &, const rational< NUM > &) |
¿ x < y ? | |
template<class NUM > | |
bool | operator!= (const rational< NUM > &, const rational< NUM > &) |
¿ x != y ? | |
template<class NUM > | |
bool | operator<= (const rational< NUM > &, const rational< NUM > &) |
¿ x <= y ? | |
template<class NUM > | |
bool | operator>= (const rational< NUM > &, const rational< NUM > &) |
¿ x >= y ? | |
template<class NUM > | |
bool | operator> (const rational< NUM > &, const rational< NUM > &) |
¿ x > y ? | |
template<class NUM > | |
rational< NUM > & | operator++ (rational< NUM > &r) |
++r . | |
template<class NUM > | |
rational< NUM > | operator++ (rational< NUM > &r, int) |
r++ . | |
template<class NUM > | |
rational< NUM > & | operator-- (rational< NUM > &r) |
--r . | |
template<class NUM > | |
rational< NUM > | operator-- (rational< NUM > &r, int) |
r-- . | |
template<class NUM > | |
ostream & | operator<< (ostream &, const rational< NUM > &) |
Graba el valor de "r" en el flujo "COUT" . | |
template<class NUM > | |
istream & | operator>> (istream &, rational< NUM > &) |
Lee del flujo de texto "CIN" el valor de "r" . | |
template<class NUM > | |
double | real (const rational< NUM > &) |
Convertidor a punto flotante. | |
template<class NUM > | |
long | integer (const rational< NUM > &) |
Convertidor a punto fijo. | |
template<class NUM > | |
bool | check_ok (const rational< NUM > &r) |
Verifica la invariante de la clase rational . |
La clase rational
implementa las operaciones aritméticas principales para números rationales.
[1/3] == [2/6] == ... [9/27] == ...
[1/3] * [2/6] / [3/9] - [9/27]
Definición en la línea 33 del archivo rational.h.
Constructor de vector.
Definición en la línea 42 del archivo rational.h.
Constructor a partir de un valor entero.
Definición en la línea 43 del archivo rational.h.
Constructor a partir de un valor quedbrado.
Definición en la línea 44 del archivo rational.h.
Constructor de copia.
Definición en la línea 47 del archivo rational.h.
Destructor.
Definición en la línea 48 del archivo rational.h.
Simplifica el numerador y el denomidador.
(m_num==0) ==> (m_den==1)
.m_num
y m_den
sean números primos relativos ie, mcd(m_num,m_den) == 1
.m_den
sea un número positivo.rational
.{{ // test::simplify() rational<INT> half(1,2); half.m_num *= 23; half.m_den *= 23; assertTrue( half != rational<INT>(23, 23*2) ); half.simplify(); assertTrue( half == rational<INT>(23, 23*2) ); }}
Definición en la línea 479 del archivo rational.h.
void rational< INT >::set | ( | const INT & | n = INT(0) , |
const INT & | d = INT(1) |
||
) | [inline] |
Cambia el valor del número rational a "n/d"
.
d != 0
.{{ // test::set() rational<INT> r; assertTrue( r == rational<INT>( 0 ) ); r.set(-3, -4); assertTrue( r == rational<INT>( 3*11 , 4*11 ) ); }}
Definición en la línea 123 del archivo rational.h.
Acceso al numerador.
{{ // test::num_den() rational<INT> r; assertTrue( r.num() == 0 && r.den() == 1 ); r.set( -1*13, -4*13 ); assertTrue( r.num() == 1 && r.den() == 4 ); r.set( -2*11, 5*11 ); assertTrue( r.num() == -2 && r.den() == 5 ); r.set( 2*17, -6*17 ); assertTrue( r.num() == -1 && r.den() == 3 ); }}
Definición en la línea 57 del archivo rational.h.
Acceso al denomirador (siempre >0).
Definición en la línea 59 del archivo rational.h.
rational< INT > & rational< INT >::operator= | ( | const rational< INT > & | o | ) | [inline] |
Copia desde "o"
.
"*this"
se pierde.1
) {{ // test::op_equal() rational<INT> r(1), s(18,56); assertTrue( r == rational<INT>(1) ); r = s; assertTrue( r == ( r / ( r / s ) ) ); r = 34; assertTrue( r == rational<INT>(34) ); s = -3; assertTrue( s == rational<INT>(-3) ); }}
Definición en la línea 152 del archivo rational.h.
Asignación desde un "INT"
.
{{ // test::op_equal() rational<INT> r(1), s(18,56); assertTrue( r == rational<INT>(1) ); r = s; assertTrue( r == ( r / ( r / s ) ) ); r = 34; assertTrue( r == rational<INT>(34) ); s = -3; assertTrue( s == rational<INT>(-3) ); }}
Definición en la línea 195 del archivo rational.h.
Intercambia los valores de "*this"
y "o"
.
1
) {{ // test::swap() rational<INT> r, s(18,56); assertTrue( r == rational<INT>(0) ); r.swap( s ); assertTrue( s == rational<INT>(0) ); assertTrue( r == rational<INT>(18,56) ); }}
Definición en la línea 172 del archivo rational.h.
Le suma a "*this"
el valor de "otro"
.
{{ // test::op_add_equal() rational<INT> add(0), sub(0); for ( int i=20; i>=-20; --i ) { add += rational<INT>(i-i, 20*i+1); sub -= rational<INT>(i-i, 20*i+1); } assertTrue( add == sub ); }}
Definición en la línea 502 del archivo rational.h.
Le resta a "*this"
el valor de "otro"
.
{{ // test::op_add_equal() rational<INT> add(0), sub(0); for ( int i=20; i>=-20; --i ) { add += rational<INT>(i-i, 20*i+1); sub -= rational<INT>(i-i, 20*i+1); } assertTrue( add == sub ); }}
Definición en la línea 516 del archivo rational.h.
rational< INT > & rational< INT >::operator*= | ( | const rational< INT > & | num | ) | [inline] |
Multiplica "*this"
por "num"
.
{{ // test::op_mult_equal() rational<INT> mlt(1), div(1); for ( int i=15; i>=-15; --i ) { mlt *= rational<INT>(17*i-1, 13*i+1); div /= rational<INT>(13*i+1, 17*i-1); } assertTrue( mlt == div ); }}
Definición en la línea 208 del archivo rational.h.
rational< INT > & rational< INT >::operator/= | ( | const rational< INT > & | num | ) | [inline] |
Divide "*this"
por el valor de "num"
.
{{ // test::op_mult_equal() rational<INT> mlt(1), div(1); for ( int i=15; i>=-15; --i ) { mlt *= rational<INT>(17*i-1, 13*i+1); div /= rational<INT>(13*i+1, 17*i-1); } assertTrue( mlt == div ); }}
Definición en la línea 224 del archivo rational.h.
"-x"
.
"-x"
.{{ // test::op_minus() rational<INT> half_n(1,-2), quarter_n(-1,4); assertTrue( - half_n == rational<INT>(-1) * half_n ); assertTrue( half_n * half_n == - quarter_n ); assertTrue( half_n * half_n * half_n == - quarter_n * half_n ); }}
Definición en la línea 241 del archivo rational.h.
rational< NUM > & rational< NUM >::fromString | ( | const char * | nStr | ) |
Establece el varlor de "*this"
a partir de la hilera "nStr"
.
"nStr"
debe estar escrita en el formato "[num/den]".{{ // test::fromString() rational<INT> r, half(1,2), quarter(1,4); assertTrue( - half == r.fromString( "[---12/24]" ) ); assertTrue( quarter == r.fromString( "[ -03/ -12 ]") ); r.fromString( "[ -+-+-+-+- 4 / -- -+ -- 32 ]" ); assertTrue( r == rational<INT>(1,8) ); }}
Definición en la línea 648 del archivo rational.h.
friend class test_rational [friend] |
Datos de prueba para la clase.
Definición en la línea 104 del archivo rational.h.
rational<NUM> operator+ | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
"x+y"
.
"x+y"
.{{ // test::op_add() rational<INT> add(0), sub(0); for ( int i=20; i>=-20; --i ) { add = add + rational<INT>(i-i, 20*i+1); sub = sub - rational<INT>(i-i, 20*i+1); } assertTrue( add == sub ); }}
Definición en la línea 712 del archivo rational.h.
rational<NUM> operator- | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
"x-y"
.
"x-y"
.{{ // test::op_add() rational<INT> add(0), sub(0); for ( int i=20; i>=-20; --i ) { add = add + rational<INT>(i-i, 20*i+1); sub = sub - rational<INT>(i-i, 20*i+1); } assertTrue( add == sub ); }}
Definición en la línea 729 del archivo rational.h.
rational<NUM> operator* | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
"x*y"
.
"x*y"
.{{ // test::op_mult() rational<INT> mlt(1), div(1); for ( int i=15; i>=-15; --i ) { mlt = mlt * rational<INT>(17*i-1, 13*i+1); div = div / rational<INT>(13*i+1, 17*i-1); } assertTrue( mlt == div ); }}
Definición en la línea 746 del archivo rational.h.
rational<NUM> operator/ | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
"x/y"
.
"x/y"
. y != 0
{{ // test::op_mult() rational<INT> mlt(1), div(1); for ( int i=15; i>=-15; --i ) { mlt = mlt * rational<INT>(17*i-1, 13*i+1); div = div / rational<INT>(13*i+1, 17*i-1); } assertTrue( mlt == div ); }}
Definición en la línea 764 del archivo rational.h.
bool operator== | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
¿ x == y ?.
{{ // test::op_comp() rational<INT> neg_half(-1,2), quarter(1,4); assertTrue( neg_half == -(-neg_half) ); assertTrue( neg_half < quarter ); assertTrue( quarter > neg_half ); assertTrue( neg_half <= quarter ); assertTrue( quarter >= neg_half ); assertTrue( neg_half != quarter ); }}
Definición en la línea 254 del archivo rational.h.
bool operator< | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
¿ x < y ?
Definición en la línea 266 del archivo rational.h.
bool operator!= | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
¿ x != y ?
Definición en la línea 295 del archivo rational.h.
bool operator<= | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
¿ x <= y ?
Definición en la línea 301 del archivo rational.h.
bool operator>= | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
¿ x >= y ?
Definición en la línea 307 del archivo rational.h.
bool operator> | ( | const rational< NUM > & | x, |
const rational< NUM > & | y | ||
) | [friend] |
¿ x > y ?
Definición en la línea 289 del archivo rational.h.
++r
.
{{ // test::op_cpp() rational<INT> r(3,2); assertTrue( r++ == rational<INT>(3,2) ); assertTrue( r == rational<INT>(5,2) ); assertTrue( r-- == rational<INT>(5,2) ); assertTrue( r == rational<INT>(3,2) ); assertTrue( --r == rational<INT>(1,2) ); }}
Definición en la línea 789 del archivo rational.h.
rational<NUM> operator++ | ( | rational< NUM > & | r, |
int | |||
) | [friend] |
r++
.
Definición en la línea 796 del archivo rational.h.
--r
.
{{ // test::op_cpp() rational<INT> r(3,2); assertTrue( r++ == rational<INT>(3,2) ); assertTrue( r == rational<INT>(5,2) ); assertTrue( r-- == rational<INT>(5,2) ); assertTrue( r == rational<INT>(3,2) ); assertTrue( --r == rational<INT>(1,2) ); }}
Definición en la línea 809 del archivo rational.h.
rational<NUM> operator-- | ( | rational< NUM > & | r, |
int | |||
) | [friend] |
r--
.
Definición en la línea 816 del archivo rational.h.
ostream& operator<< | ( | ostream & | COUT, |
const rational< NUM > & | r | ||
) | [friend] |
Graba el valor de "r"
en el flujo "COUT"
.
cout << r << q;
{{ // test::op_out() std::basic_ostringstream<char> ost; // receptor de salida ost.str(""); ost << rational<INT>(-1,2); assertTrue( ost.str() == "[-1/2]" ); ost.str(""); ost << rational<INT>(-12); assertTrue( ost.str() == "[-12]" ); ost.str(""); ost << rational<INT>(1-1,8); assertTrue( ost.str() == "[0]" ); ost.str(""); // Borra el receptor de salida ost << rational<INT>(-1,2) << rational<INT>(-12) << rational<INT>(1-1,8); assertTrue( ost.str() == "[-1/2][-12][0]" ); }}
Definición en la línea 543 del archivo rational.h.
istream& operator>> | ( | istream & | CIN, |
rational< NUM > & | r | ||
) | [friend] |
Lee del flujo de texto "CIN"
el valor de "r"
.
"]"
. [ -+-+-+-+- 4 / -- -+ -- 32 ]
se lee como [1/8]
{{ // test::op_in() std::basic_istringstream<char> ist( "[-1/2] [-12] [0]" ); rational<INT> r(0); ist >> r; assertTrue( r == rational<INT>(-1,2) ); rational<INT> s(1); ist >> s; assertTrue( s == rational<INT>(-12) ); rational<INT> t(2); ist >> t; assertTrue( t == rational<INT>(0) ); ist.str( "[ -+-+-+-+- 4 / -- -+ -- 32 ]" ); rational<INT> u(3); ist >> u; assertTrue( u == rational<INT>(1,8) ); }}
Definición en la línea 566 del archivo rational.h.
Convertidor a punto flotante.
Definición en la línea 313 del archivo rational.h.
Convertidor a punto fijo.
Definición en la línea 319 del archivo rational.h.
Verifica la invariante de la clase rational
.
Ok()
{{ // test::check_ok() rational<INT> r, *nul=0; assertFalse( check_ok(*nul) ); r.m_num = 2; r.m_den = 0; assertFalse( check_ok( r ) ); r.m_num = 2; r.m_den = -1; assertFalse( check_ok( r ) ); r.m_num = 0; r.m_den = 2; assertFalse( check_ok( r ) ); r.m_num = 31; r.m_den = 31; assertFalse( check_ok( r ) ); r.simplify(); assertTrue ( check_ok( r ) ); }}
Definición en la línea 356 del archivo rational.h.
Numerador.
Definición en la línea 35 del archivo rational.h.
Denominador.
Definición en la línea 36 del archivo rational.h.