Foros del Web » Programación para mayores de 30 ;) » Java »

novato: no entiendo el resultado de una suma de quebrados(y el algoritmo está bien¿?)

Estas en el tema de novato: no entiendo el resultado de una suma de quebrados(y el algoritmo está bien¿?) en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 03/06/2012, 13:56
 
Fecha de Ingreso: febrero-2010
Mensajes: 26
Antigüedad: 14 años, 2 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
  #2 (permalink)  
Antiguo 03/06/2012, 14:24
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 3 meses
Puntos: 57
Respuesta: novato: no entiendo el resultado de una suma de quebrados(y el algoritmo e

Tienes un problema en los for que estas utilizando

Código Java:
Ver original
  1. for (int i=1; (den1*i)%den2 == 0; i++)

La segunda parte del for es como un while, es decir, indica que el for se ejecutara mientras la condicion sea verdadera. En el codigo que utilizas estas indicando que el for se ejecutara mientras el resultado de la operacion sea cero. Como el resultado de la operacion durante la primer pasada no es cero, se finaliza inmediatamente y no continua el for

Trata cambiando la condicion a que se ejecute mientras no sea cero.

No segui revisando el codigo por mas errores
  #3 (permalink)  
Antiguo 03/06/2012, 14:32
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 3 meses
Puntos: 57
Respuesta: novato: no entiendo el resultado de una suma de quebrados(y el algoritmo e

Tambien acabo de ver que el codigo que tienes para hacer operaciones dentro del for no se va a ejecutar. Cuando el resultado de la operacion sea 0 entonces se va a terminar el for y no se va a ejecutar tu codigo, Tendrias que ponerlo despues del for

Código Java:
Ver original
  1. int i;
  2. for (i=1; (den1*i)%den2 == 0; i++) {}
  3. if ((den1*i)%den2 == 0) {
  4.     denominador = den1 * i;
  5.     aux1 = denominador/den1;
  6.     aux2 = denominador/den2;
  7.     numerador = (num1 * aux1) + (num2 * aux2);
  8. }

NOTA: Tienes que declarar el contador i antes del for para que se mantenga su valor despues de terminado el ciclo
  #4 (permalink)  
Antiguo 03/06/2012, 14:36
 
Fecha de Ingreso: febrero-2010
Mensajes: 26
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: novato: no entiendo el resultado de una suma de quebrados(y el algoritmo e

Muchas gracias por la info.
La verdad, pensé que la segunda parte del bucle for significaba "hasta que se de tal condición" y no "mientras"...

Aún así no funciona, ahora el resultado es que todas las sumas (todas) son = a 0/0.

seguiré cambiando cositas y rompiéndome el coco. Pero aunque no funcione, gracias por la info :)




P.D: llegué tarde a la respuesta para el primer comentario. voy a mirar lo que me dices en el segundo.
:)
  #5 (permalink)  
Antiguo 03/06/2012, 14:50
 
Fecha de Ingreso: enero-2008
Mensajes: 614
Antigüedad: 16 años, 3 meses
Puntos: 57
Respuesta: novato: no entiendo el resultado de una suma de quebrados(y el algoritmo e

A mi me funciona bien haciendo las modificaciones que te dije (cambiando el FOR, declarar i antes del FOR, codigo con operaciones despues del FOR)

http://imageshack.us/photo/my-images...oard01bzu.jpg/
  #6 (permalink)  
Antiguo 03/06/2012, 14:53
 
Fecha de Ingreso: febrero-2010
Mensajes: 26
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: novato: no entiendo el resultado de una suma de quebrados(y el algoritmo e

Entendido y aplicado
¡¡FUNCIONA!!

muchas gracias Posman!!!


P.D:jo ahora lo veo y estaba claro, pero sin que me apuntaras eso de que se acababa el for antes de entrar en el condicional no lo veía.
ya no necesito el condicional. aumento el contador en el bucle for y luego lo multiplico fuera del bucle para sacar el común denominador. más fácil de lo que yo estaba haciendo. gracias.

Etiquetas: clase, programa, string, suma, resultados, algoritmos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:47.