Version:0.9 StartHTML:0000000105 EndHTML:0000014760 StartFragment:0000000152 EndFragment:0000014726
/******************************************************/
/*************** Isidro Pastor Jorda ******************/
/*************** Noemi Ruth Moya Hinojo ***************/
/******************************************************/
/****************** Telematica ************************/
/******************** FPII ****************************/
/****************** Practica 2 ************************/
/******************************************************/
#include <iostream.h>
#include <stdlib.h>
#include "Fraccion.h"
/*****************************************************************************
* Funcion: Asignar
* Descripcion: Almacena la fracción que tiene numerador num y denominador
* denom en el objeto fracción que recibe el mensaje.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* num E Valor para el numerador
* denom E Valor para el denominador
*
*
* Valor devuelto:
* void, no devuelve nada y modifica los parametros del objeto
*****************************************************************************/
void Fraccion::Asignar (int num, int denom)
{
if (denom != 0) // El denominador pasado debe ser distinto de cero
{
if (denom < 0) // Si el denominador es negativo pasaremos el signo al numerador
{
denom = (-1) * denom;
num = (-1) * num;
}
numerador = num;
denominador = denom;
Simplificar();
}
else
{
numerador = num;
denominador = 1; // para que el programa pueda seguir ejecutandose sin que se quede colgado
cout << endl << "Error, el denominador debe ser distinto de cero" << endl;
cout << endl << " Usaremos el denominador 1 por defecto para esta fraccion " << endl;
}
};
/*****************************************************************************
* Funcion: Leer
* Descripcion: Lee por teclado los datos de una fracción y los almacena
* en el objeto que recibe el mensaje.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* void, no devuelve nada pide por teclado parametros para el objeto
*****************************************************************************/
void Fraccion::Leer()
{
do
{
cout << "Introduce numerador ->" ;
cin >> numerador;
cout << " Introduce el denominador -> ";
cin >> denominador;
if (denominador == 0)
cout << endl << " El denominador debe ser distinto de cero" << endl;
}
while (denominador == 0); // repetiremos la adquisicion de datos hasta que el denominador sea diferente a cero
if (denominador<0) // en caso de tener un denominador negativo pasaremos el signo al numerador
{
denominador = (-1) * denominador;
numerador = (-1) * numerador;
}
Simplificar();
};
/*****************************************************************************
* Funcion: Escribir
* Descripcion: Escribe por pantalla la fracción correspondiente al objeto
* que recibe el mensaje.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* void, no devuelve nada, escribe la fraccion por pantalla
*****************************************************************************/
void Fraccion::Escribir()
{
cout << numerador << " / " << denominador; // Mostramos por pantalla los datos del objeto
};
/*****************************************************************************
* Funcion: Sumar
* Descripcion: Suma dos fracciones, el objeto que recibe el mensaje más el
* objeto f. Devuelve el resultado de la suma y no modifica
* ninguno de los operandos.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* f E Objeto Fraccion a sumar al objeto que hace la llamada
*
*
*
* Valor devuelto:
* Devuelve un objeto Fraccion que es el resultado de sumar los dos
* objetos, el que hace la llamada y el pasado como parametro.
*****************************************************************************/
Fraccion Fraccion::Sumar (Fraccion f) const
{
int aux;
Fraccion suma; // Objeto fraccion auxiliar donde almacenar el resultado de las operaciones
aux = ((denominador) * (f.denominador));
suma.numerador = ( ( (aux * numerador)/denominador) + ( (aux * f.numerador)/f.denominador) ); // Obtenemos el valor del numerador
suma.denominador = aux; // El denominador sera la multiplicacion entre denominadores
suma.Simplificar(); // Simplificamos el objeto fraccion obtenido
return (suma);
};
/*****************************************************************************
* Funcion: Restar
* Descripcion: Resta dos fracciones, el objeto que recibe el mensaje menos el
* objeto f. Devuelve el resultado de la resta y no modifica
* ninguno de los operandos.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* f E Objeto Fraccion a restar al objeto que hace la llamada
*
*
*
* Valor devuelto:
* Devuelve un objeto Fraccion que es el resultado de restar los dos
* objetos, el que hace la llamada y el pasado como parametro.
*****************************************************************************/
Fraccion Fraccion::Restar (Fraccion f) const
{
int aux;
Fraccion resta; // Objeto fraccion auxiliar donde almacenar el resultado de las operaciones
aux = denominador * f.denominador;
resta.numerador = (( (aux * numerador)/denominador) - ( (aux * f.numerador)/f.denominador) ); // Obtenemos el valor del numerador
resta.denominador = aux; // El denominador sera la multiplicacion entre denominadores
resta.Simplificar(); // Simplificamos el objeto fraccion obtenido
return (resta);
};
/*****************************************************************************
* Funcion: Menos
* Descripcion: Devuelve, cambiada de signo, la fracción correspondiente
* al objeto que recibe el mensaje.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* Devuelve un objeto Fraccion igual al de la llamada cambiado de signo.
*****************************************************************************/
Fraccion Fraccion::Menos () const
{
Fraccion aux;
aux.numerador = (-1) * numerador; // cambiamos el signo del numerador
aux.denominador = denominador; // el denominador siempre sera positivo y no cambiara
return (aux);
};
/*****************************************************************************
* Funcion: Evaluar
* Descripcion: Devuelve el valor real equivalente a dividir el numerador y el
* denominador de la fracción correspondiente al objeto que recibe
* el mensaje.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* float, que sera el valor real equivalente a realizar la division del
* numerador y el denominador del objeto que hace la llamada.
*****************************************************************************/
float Fraccion::Evaluar()
{
float aux;
aux = float(numerador) / float(denominador); // Obtenemos el valor real de la fraccion
return aux;
};
/*****************************************************************************
* Funcion: Igual
* Descripcion: Compara la fracción correspondiente al objeto que recibe el
* mensaje y la fracción f y devuelve como resultado true si las
* dos fracciones son iguales y false en caso contrario.
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
* f E Objeto Fraccion a comparar con el objeto de la llamada
*
*
*
* Valor devuelto:
* Bool, como resultado de comparar los dos objetos.
*****************************************************************************/
bool Fraccion::Igual(Fraccion f)
{
bool aux;
if((numerador == f.numerador) && (denominador == f.denominador))
aux = true; // si tanto numerador como denominador de los dos objetos son iguales sera true
else
aux = false; // en caso contrario no seran objetos iguales y devolveremos false
return aux;
};
/*****************************************************************************
* Funcion: Simplificar
* Descripcion: Simplifica la fracción correspondiente al objeto que recibe el
* mensaje (es un método privado).
*
*
* Parametros:
*
* Nombre E/S Descripcion
* ------ ----- -----------
*
*
*
*
* Valor devuelto:
* void, simplifica unicamente la fraccion que le pasamos como objeto.
*****************************************************************************/
void Fraccion::Simplificar()
{
int a, b, mcd;
a = abs(numerador); // Usaremos el valor absoluto del numerador para que no de problemas el algoritmo
b = denominador; // Como el denominador siempre es positivo no hara falta usar abs.
/**************************************************************
* Algoritmo de Euclides para obtejet el Maximo Comun Divisor *
* de dos numeros para poder despues simplificar el objeto *
* fraccion con el que hemos hecho la llamada a la funcion *
* y obtener asi la forma canonica de dicha fraccion. *
**************************************************************/
if (a != 0)
{
while (a != b ) // Al final en a tendremos en maximo comun divisor de los dos numeros
{
if ( a > b)
a = a - b;
else
b = b - a;
mcd = a; // Asignamos el maximo comun divisor que sera a
};
}
else
mcd = 1; // En caso que el numerador sea cero dejaremos la fraccion tal cual esta
numerador = numerador / mcd; // Dividimos numerador y denominador por el mcd
denominador = denominador / mcd; // y asi obtendremos la fraccion canonica.
};