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 (INT num=INT(0), INT den=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. | |
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 43 del archivo rational.h.
| void rational< NUM >::simplify | ( | ) | [inline, private] |
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 466 del archivo rational.h.
| void rational< INT >::set | ( | INT | n = INT(0), |
|
| 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 125 del archivo rational.h.
| const INT& rational< INT >::num | ( | ) | const [inline] |
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 59 del archivo rational.h.
| const INT& rational< INT >::den | ( | ) | const [inline] |
| 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 149 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 191 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 169 del archivo rational.h.
| rational< INT > & rational< INT >::operator+= | ( | const rational< INT > & | otro | ) | [inline] |
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 488 del archivo rational.h.
| rational< INT > & rational< INT >::operator-= | ( | const rational< INT > & | otro | ) | [inline] |
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 503 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 204 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 220 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 237 del archivo rational.h.
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 635 del archivo rational.h.
friend class test_rational [friend] |
| 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 699 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 716 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 733 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 751 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 250 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 776 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 796 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 530 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 553 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 352 del archivo rational.h.
1.5.6