// IG17 2004-05, II17 2005-06 // Racional.h // 12-11-2004 // Ejemplo del Tema 2: // clase para representar numeros racionales con numerador y denominador de tipo entero // Dos racionales se consideran equivalentes si el resultado de dividir numerador/denominador // es en ambos el mismo. La funcion privada Normalizar() se usa para convertir todos los // racionales equivalentes en un unico representante, que es el que se visualiza con // el operador de salida. Por ejemplo, los racionales 5/7, 10/14, 15/21, -5/-7,... // se representan todos como 5/7. // La implementacion realizada ilustra una forma de garantizar que el valor almacenado // siempre este normalizado: // - En el constructor se llama a Normalizar(). // - En el operador de entrada se llama a Normalizar(). // - En los operadores aritmeticos se hace intervenir al constructor, que llama a Normalizar(). // Se consideran tambien los casos especiales: // - Cero: se representa como 0/1 // - Infinito positivo: se representa como 1/0 // - Infinito negativo: se representa como -1/0 // - Indeterminacion: se representa como 0/0 // El resultado de operar con ellos es el matematicamente correcto. Por ejemplo, el producto // de infinito por indeterminacion produce indeterminacion, el producto de infinito por cero // produce indeterminacion, la suma de infinito y cero produce infinito, etc. // En esta clase, el operador de asignacion por defecto, el constructor de copia // por defecto y el destructor por defecto funcionan correctamente, no es necesario // implementarlos. // Posibles ejercicios: anyadir a la clase operadores de resta (-, -=), de division (/, /=) // y de decremento (--) que tengan en cuenta los casos especiales; anyadir operadores // relacionales (>,<,>=,<=) que comparen el resultado de dividir numerador/denominador. #ifndef _RACIONAL_H #define _RACIONAL_H #include using namespace std; class Racional { int numerador, denominador; void Normalizar(); public: Racional (int = 1, int = 1); // Operadores relacionales friend bool operator== (Racional, Racional); friend bool operator!= (Racional, Racional); // Operadores aritmeticos binarios friend Racional operator+ (Racional, Racional); friend Racional operator* (Racional, Racional); Racional & operator+= (Racional); Racional & operator*= (Racional); // Operadores aritmeticos unarios Racional operator- () const; Racional & operator++ (); Racional operator++ (int); // Operadores de entrada/salida (el formato empleado consiste en // el numerador seguido de '/' seguido del denominador) friend ostream & operator<< (ostream &, Racional); friend istream & operator>> (istream &, Racional &); }; #endif