[C con Clase] Ejercicio Racional

Luis Gutierrez Gomez gutierrezgl en hotmail.com
Mar Abr 17 05:16:57 CEST 2012


Cordiales Saludos:

Tengo el siguiente ejercicio cuyo enunciado dice:

 

Cree una clase llamada Racional para realizar aritmetica con fracciones. Escriba
un programa controlador para evaluar su clase.
Utilice variables enteras para representar los datos de tipo private de la clase,
es decir el numerador y el denominador. Proporcione un constructor que permita a
un objeto de esta clase que se inicialice cuando se declare.
El constructor debe contener valores predeterminados en caso de que no se propor-
cionen inicializadores, y debe almacenar la fraccion en su forma reducida. Por
ejemplo, la fraccion:
       2
       -
       4
se almacenaria en el objeto como 1 en el numerador y 2 en el denominador. Pro-
porcione una funcion miembro public para realizar cada una de las siguientes
tareas:
a) Suma de dos numeros racionales: el resultado debe almacenarse en forma redu-
 cida.
b) Resta de dos numeros racionales: el resultados debe almacen. en forma reduc.
c) Multiplicacion de dos numeros racionales:        idem                     .
d) Division de dos numeros racionales:              idem                     .
e) Impresion de numeros racionales de la forma a/b donde a num. y b den.
f) Impresion de numeros racionales en formato de punto flotante.

 


La solucion que le di fue:

--------------------------

 

 

#include <iostream>

 

using std::cout;
using std::endl;

 

class Racional {


public:
 Racional( int num = 1, int den = 2 );
 void EstableceRacional( int numera, int denomi);
 Racional ObtieneRacional();
 Racional SumaRacional( const Racional &der )const;
    Racional RestaRacional( const Racional &der ) const;
 Racional MultiplicaRacional( const Racional &der ) const;
 Racional DivideRacional( const Racional &der ) const;
 void ImprimeRacional();
 void ImprimeFlotante();

 

private:
 void ReduceRacional();
 int numerador;
 int denominador;
};

 

Racional::Racional( int num, int den )
{
 EstableceRacional( num, den );
 ReduceRacional();
}

 

void Racional::EstableceRacional( int numera, int denomi )
{
 numerador = numera;
 denominador = denomi;
}

 

Racional Racional::ObtieneRacional()
{
 Racional Rdev;
 Rdev.numerador = numerador;
 Rdev.denominador = denominador;
 return Rdev;
}


void Racional::ReduceRacional()
{
 int menor;

 menor = numerador  < denominador ? numerador : denominador;
 while (  menor > 1 ){
  if ( ( numerador % menor == 0  )&&( denominador % menor == 0 ) ){
   numerador = numerador/menor;
   denominador = denominador/menor;
  }
  menor--;
 }
}

 

Racional Racional::SumaRacional( const Racional &der ) const
{
 Racional Rr;

 Rr.denominador = denominador * der.denominador;
 Rr.numerador = ( ( ( Rr.denominador / denominador ) * numerador ) + ( ( Rr.denominador / der.denominador ) * der.numerador ) );
 Rr.ReduceRacional();
 return Rr;
}

 

Racional Racional::RestaRacional( const Racional &der ) const
{
 Racional Rr;

 Rr.denominador = denominador * der.denominador;
 Rr.numerador = ( ( ( Rr.denominador / denominador ) * numerador ) - ( ( Rr.denominador / der.denominador ) * der.numerador ) );
 Rr.ReduceRacional();
 return Rr;
}

 

Racional Racional::MultiplicaRacional( const Racional &der ) const
{
 Racional Rr;

 Rr.numerador = numerador * der.numerador;
 Rr.denominador = denominador * der.denominador;
 Rr.ReduceRacional();
 return Rr;
}

 

Racional Racional::DivideRacional( const Racional &der ) const
{
 Racional Rr;

 Rr.numerador = numerador * der.denominador;
 Rr.denominador = denominador * der.numerador;
 Rr.ReduceRacional();
 return Rr;
}


void Racional::ImprimeRacional()
{
 cout << numerador <<" / " << denominador << endl;
}

 

void Racional::ImprimeFlotante()
{
 cout << (float)numerador / (float)denominador << endl;

}

 

int main ()
{
 Racional R1, R2( 8, 12), R8( 6, 26);
 R2.ImprimeRacional();
 R1 = R2.SumaRacional(R8);
 R1.ImprimeRacional();
 R1.ImprimeFlotante();
 R1 = R2.RestaRacional(R8);
 R1.ImprimeRacional();
 R1.ImprimeFlotante();
 R1 = R2.MultiplicaRacional(R8);
 R1.ImprimeRacional();
 R1.ImprimeFlotante();
 R1 = R2.DivideRacional(R8);
 R1.ImprimeRacional();
 R1.ImprimeFlotante();
 return 0;
}


///////////////////////////////////////////////////////////////////////////////////////

Esperaré sus correcciones o sugerencias de mejoras atentamente

 

Gracias

 

Luis 		 	   		  



Más información sobre la lista de distribución Cconclase