Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/06/2012, 13:56
elignorante
 
Fecha de Ingreso: febrero-2010
Mensajes: 26
Antigüedad: 14 años, 3 meses
Puntos: 0
novato: no entiendo el resultado de una suma de quebrados(y el algoritmo está bien¿?)

Hola, hace tiempo que me registré en forosdelweb sobre todo para aprender css y diseño web, y vaya que si aprendí...
ahora estoy empezando a aprender java, uno que es medio friki, y me compré un manual. lo sigo pero me complico yo por mi cuenta.
El caso es que uno de los ejercicios era hacer un método para sumar números racionales (quebrados). lo hacía para números racionales con el mismo denominador, y eso es bien fácil, pero yo me lo compliqué un poco y me puse a hacer el método para que pudiese sumar números racionales con diferente denominador.

El caso es que creo que el algoritmo está bien, pero el resultado que me da no coincide con lo que debería ser la suma. Por eso he vuelto a forosdelweb, para ver si alguien me lo puede explicar. No me interesa que me resolvais el problema, lo que quiero es aprender, si alguien me puede decir dónde está el error y en que consiste todo mi agradecimiento para él o ella. Porque llevo toda la tarde intentando saber en qué estoy fallando y no lo veo... en serio, no lo veo. lo traduzco a mi propio lenguaje o paso mentalmente los datos que envío desde el objeto al método y me da bien, pero a la hora de compilar fallo.

Aquí está el código...
Primero el main:

Cita:
class CrearRacional {

//en el main creo objetos que llaman a los métodos

public static void main(String[]args){
Racionales r1 = new Racionales(2,3);
Racionales r2 = new Racionales(5,7);
Racionales r3 = new Racionales(5,9);
Racionales rsuma1 = new Racionales();
Racionales rsuma2 = new Racionales();

rsuma1.sumarRacionales(r1.numerador, r1.denominador, r2.numerador, r2.denominador);
System.out.println("el resultado de sumar " + r1.visualizarRacional() + " + " + r3.visualizarRacional() + " es igual a " + rsuma1.visualizarRacional());

rsuma2.sumarRacionales(r1.numerador, r1.denominador, r4.numerador, r4.denominador);
System.out.println("el resultado de sumar " + r1.visualizarRacional() + " + " + r4.visualizarRacional() + " es igual a " + rsuma2.visualizarRacional());
}
y esta es clase con los métodos para crear el número racional, visualizarlo, y hacer la suma:

Cita:
class Racionales {
int numerador;
int denominador;

//constructores con parámetros y sin parámetros.
public Racionales(){}
public Racionales (int num, int den){
añadirFactores (num, den);
}

public void añadirFactores(int num, int den)
{
numerador = num;
denominador = den;
}

public void sumarRacionales (int num1, int den1, int num2, int den2)
{
int aux1;
int aux2;

if (den1 == den2) //si los denominadores son iguales se suman los numeradores de forma normal.
{
numerador = num1 + num2;
denominador = den1;
}

if (den1 > den2) //si el primer denominador es mayor que el segundo...
{
for (int i=1; (den1*i)%den2 == 0; i++) //hago un bucle que vaya aumentando el contador hasta dar con el mínimo común denominador

/* es decir, que i aumente uno a uno hasta que llegue a un número que, multiplicado por el primer denominador, haga que el resto entre este y el segundo sea cero. (por ejemplo, si el primer denominador es siete y el segundo 3, cuando i llegue a 3 hará 7*3=21 y 21/3 da como resto cero. siendo 21 el común denominador*/
{
if ((den1*i)%den2 == 0) //cuando encuentre ese número
{
denominador = den1 * i; //lo paso a la variable denominador (porque es el denominador de la suma.


aux1 = denominador/den1;
aux2 = denominador/den2;
numerador = (num1 * aux1) + (num2 * aux2); //y calculo el numerador: multiplico cada cual por el número necesario y hago la suma
}
}
}


//El mismo paso pero calculándolo para el segundo denominador mayor que el primero, porque no se porqué si no hago esto me da error al calcularlo

if (den1 < den2)
{
for (int i=1; (den2*i)%den1 == 0; i++)
{
if ((den2*i)%den1 == 0)
{
denominador = den2 * i;
aux1 = denominador/den1;
aux2 = denominador/den2;
numerador = (num1 * aux1) + (num2 * aux2);
}
}
}

}


public String visualizarRacional(){ //visualizar el racional por pantalla

String quebrado = numerador + "/" + denominador;
return quebrado;
}
}


el caso es que siguiendo el algoritmo para los números que se crean con los objetos, y pasándolo por el algoritmo que pienso que tengo, me da bien. pero el resultado e sumar 2/3 y 5/7 me da 0/0 y el resultado de 2/3 y 5/9 es -1670265062/2147483646.

¿por qué?
¿qué hago mal?


gracias a los que respondan, y a los que lo lean también. gracias a todo el que me ayude y al que se preocupe también, que no tenéis por qué hacerlo, pero estáis ayudando a alguien que, por ahora, y me da que durante un tiempo, será un ignorante en java, y gracias a vosotros cada vez menos...

Última edición por elignorante; 03/06/2012 a las 14:24