Ayuda con Constructores en Java - Eclipse

Iniciado por JADP, 11 Noviembre 2013, 20:43 PM

0 Miembros y 1 Visitante están viendo este tema.

JADP

Hola a todos, estoy haciendo un programa que tiene que calcular la distancia entre 2 puntos ubicados en el plano cartesiano, en la clase Calculadora se hace el proceso donde se haya la distancia entre los 2 puntos ubicados en el plano cartesiano, ese resultado lo tengo que enviar a una clase que se llama Punto, en La clase Distancia es donde se obtiene el resultado que esta en la clase Punto y luego imprime.

Ya tengo hecho todo esto pero al final siempre me imprime como resultado 0.0. Quisiera que por favor me ayudaran a solucionar este problema, me gusta mucho la programacion.

Este es el link que contiene un archivo con las 4 clases que yo hice + la explicacion del ejercicio: http://goo.gl/eOk0x3

El paquete del proyecto se llama Hoy,  Agradezco sus ayudas...

Mitsu

#1
Hola. Mira un poco más arriba y verás el foro de Java ;)

He mirado tu código de reojo, y sinceramente no sé por qué te dejan hacer eso en 3 clases, cuando en una clase puedes tener todos los métodos estáticos que quieras, y no sería necesario crear objetos de esa clase.

Quizás el problema sea por que al momento de pasarle el resultado a la clase Punto, creas un objeto Punto para utilizar setDistancia() y guardar el resultado en la variable distancia de Punto, pero al no ser estática la variable, esto quiere decir que todo objeto tendrá copias de dicha variable. Por lo que al obtener el resultado desde el método getDistancia() desde la clase Distancia, se hace uso de otro objeto Punto, que tendría también su propia copia de distancia, y esta estará en 0.

Objeto Punto N° 1:
1) La clase Calculadora hace el proceso en el método calcularDiferencia().
2) Crea un objeto Punto para utilizar el metodo setDistancia()
3) Le pasa el resultado por medio del método
4) Al salir del metodo el objeto Punto se destruye (por ser local) y con el, la variable distancia en donde estaba el resultado..

Objeto Punto N° 2:
1) En la clase Distancia creas otro objeto Punto
2) Obtiene la distancia desde la clase Punto con getDistancia
3) Te devolverá 0 por que este otro objeto nunca estableció un valor para su copia de la variable distancia

Tienes que hacer la variable de resultado estática, para que exista sola una versión compartida entre todos los objetos de punto.


Ejemplo:

Clase Calculadora:


Código (=java) [Seleccionar]

public class Calculadora {

private float coordenadaX;
private float coordenadaX2;
private float coordenadaY;
private float coordenadaY2;

public Calculadora() {
   
}

public Calculadora (float x1, float x2, float y1, float y2)
{
  this.coordenadaX= x1;
  this.coordenadaX2= x2;
  this.coordenadaY= y1;
  this.coordenadaY2= y2;
}

/*
  *  SETTERS DE LAS COORDENADAS
  */


public void setCoordenadaX1 (float x1)
{
  this.coordenadaX = x1;
}

public void setCoordenadaX2 (float x2)
{
  this.coordenadaX2 = x2;
}

public void setCoordenadaY1 (float y1)
{
  this.coordenadaY = y1;
}

public void setCoordenadaY2 (float y2)
{
  this.coordenadaY2 = y2;
}

/*
  *  GETTERS DE LAS COORDENADAS
  */


public float getX ()
{
  return coordenadaX;
}

public float getX2 ()
{
  return coordenadaX2;
}

public float getY ()
{
  return coordenadaY;
}

public float getY2 ()
{
  return coordenadaY2;
}

/* ***********************************************************
  *  DEVUELVE LA SUMA DE LAS POTENCIAS DE LAS DIFERENCIAS ENTRE
  *  LAS COORDENADAS X,X2 / Y,Y2
  * **********************************************************/
public void calcularDiferencia()
{
  float potencia = 2;
  float diferencia_x = 0;
  float diferencia_y = 0;
  float pow_diferencia_x = 0;
  float pow_diferencia_y = 0;
  float suma_potencias = 0;
  float distancia = 0;
 
  diferencia_x = (this.coordenadaX - this.coordenadaX2);
  diferencia_y = (this.coordenadaY - this.coordenadaY2);
  pow_diferencia_x =  (float) Math.pow(diferencia_x,potencia);
  pow_diferencia_y = (float) Math.pow(diferencia_y,potencia);
  suma_potencias = pow_diferencia_x + pow_diferencia_y; 
  distancia= (float) Math.sqrt(suma_potencias);
 
  Punto punto = new Punto();
  punto.setDistance(distancia);
 
}
}


Clase Leer:

Código (=java) [Seleccionar]

import javax.swing.JOptionPane;

public class Leer {

public final static int ERROR=0;
public final static int INFCIR=1;
public final static int INFTRI=2;
public final static int INFO=3;

/*
  *  Constructor por defecto de la clase (esto es una clase con el nombre leer igual que el
  */

public Leer()
{
 
}

/*
  *  Metodo para leer un entero
  *  @param msn  mensaje para mostrar por pantalla
  *  @param ex esto es el error
  *  @return retorna un entero
  */

public static int setPoint (String mensaje, String error)
{
  int coordenada = 0;
  boolean condicion = true;
 
  do
  {
   try
   {
    coordenada = Integer.parseInt(JOptionPane.showInputDialog(mensaje));
    condicion = false;
    return coordenada;
   }
   catch (Exception ex1)
   {
    JOptionPane.showMessageDialog(null, error);
   }
  } while (condicion);
     return 0;
}

/*
  * Metodo para leer entero manipulando el icono
  * @param msn
  * @param ex
  * @param icono
  * @return
  */

public static int setPoint (String mensaje, String error, int icono)
{
  int coordenada = 0;
  boolean condicion = true;
 
  do
  {
   try
   {
    coordenada = Integer.parseInt(JOptionPane.showInputDialog(null, mensaje, " ", icono));
    condicion = false;
    return coordenada;
   }
   catch (Exception ex1)
   {
    JOptionPane.showMessageDialog(null, error);
   }
  }
 
  while (condicion);
  return 0;
}

/* Metodo para leer un decimal
  * @param msn
  * @param ex
  * @return
  */

public static float setPointDecimal (String mensaje, String error)
{
  float coordenada = 0;
  boolean condicion = true;
 
  do
  {
   try
   {
    coordenada = Float.parseFloat(JOptionPane.showInputDialog(mensaje)); // convierte el numero a float
    condicion = false;
    return coordenada; // devuelve el numero y termina el metodo
   }
   catch (Exception ex1)
   {
    JOptionPane.showMessageDialog(null, error); // nostramos la excepcion
   }
 
  } while (condicion);
 
      return 0;
}


public String setMessage (String mensaje)
{
  return JOptionPane.showInputDialog (mensaje);
}


public boolean setState (String mensaje, String titulo)
{
  int opcion = JOptionPane.showConfirmDialog(null, mensaje, titulo, 0,1);
 
  if (opcion == 0)
  {
   return true;
  }
  else
  {
   return false;
  }
}
}


Clase Punto:

Código (=java) [Seleccionar]

public class Punto {

  private static float distancia = 0f; // estatico. Solo habra 1 version de esta variable

public void setDistance(float distancia) {
 
   this.distancia = distancia;

}

public float getDistance() {

   return this.distancia;
}

}


Clase Distancia:

Código (=java) [Seleccionar]

import javax.swing.JOptionPane;

public class Distancia {

public static void main(String[] args) {
 
  Calculadora calcula = new Calculadora();
  Punto punto = new Punto();
 
  calcula.setCoordenadaX1(Leer.setPoint("Digite La Coordenada X1", "Ingrese un numero real por favor."));
  calcula.setCoordenadaX2(Leer.setPoint("Digite La Coordenada X2", "Ingrese un numero real por favor."));
  calcula.setCoordenadaY1(Leer.setPoint("Digite La Coordenada Y1", "Ingrese un numero real por favor."));
  calcula.setCoordenadaY2(Leer.setPoint("Digite La Coordenada Y2", "Ingrese un numero real por favor."));
 
  calcula.calcularDiferencia();
 
  float distancia = punto.getDistance();
 
  JOptionPane.showMessageDialog(null, "La Diferencia Entre Las 2 Coordenadas es: " + distancia);   
}
}

Mitsu

#2
Me disculparás pero le he retocado un poquitín el código, no he alcanzado a modificarlo todo porque no tengo tiempo xD

Como recomendaciónes:

  • Utiliza identificadores para tus variables/objetos que representen su propósito. Vamos, que escribir un poco más no es demasiaaaado trabajo.
  • Cuando tengas que hacer operaciones que no necesitas de ningún objeto para que se pueda utilizar, hazla static.


    Saludos.