Foro de elhacker.net

Programación => Java => Mensaje iniciado por: wung en 28 Diciembre 2018, 12:46 pm



Título: Ejercicio de métodos que no devuelven el valor al main
Publicado por: wung en 28 Diciembre 2018, 12:46 pm
Buenas, el tema es que quiero hacer un programa con el que pueda calcular la longitud de una circunferencia cuyo radio se introduce por teclado, y quiero hacerlo usando dos métodos, uno para coger el radio por teclado y otro para hacer la operación del cálculo de la longitud. No soy capaz de hacer que los datos sean devueltos correctamente al método main, el resultado da siempre 0 (es decir el valor con el lo inicializo). Si alguien me explica qué falla lo agradecería, aquí está el código que tengo:


Código
  1. public class Ejercicio1 {
  2.  
  3.    static Scanner teclado = new Scanner(System.in);
  4.  
  5.    public static void main(String[] args) {
  6.        double radio=0, longitud=0;
  7.        introducirRadio(radio);
  8.        calcularLongitud(radio, longitud);
  9.        System.out.println("La longitud de la circunferencia es " + longitud);
  10.    }
  11.  
  12.    public static void introducirRadio(double radio){
  13.        System.out.println("Introduzca el radio de la circunferencia");
  14.        radio = teclado.nextDouble();
  15.    }
  16.  
  17.    public static double calcularLongitud(double radio, double longitud){
  18.        longitud = 2 * radio * (Math.PI);
  19.        return longitud;
  20.    }
  21.  
  22. }
  23.  


Título: Re: Ejercicio de métodos que no devuelven el valor al main
Publicado por: rub'n en 28 Diciembre 2018, 14:57 pm
Debes definir variables de clase, que tienen alcance en todo el cuerpo de la clase, tal cual como hiciste con Scanner
Y tú método calcularLongitud te retorna un valor, no lo estas usando...


Título: Re: Ejercicio de métodos que no devuelven el valor al main
Publicado por: wung en 28 Diciembre 2018, 15:55 pm
Hola, gracias por responder.

Vale, he puesto static double radio=0, longitud=0; fuera de main, pero no sé como hacer para usar el valor que retorna calcularLongitud. Mi idea era que al devolver longitud luego la siguiente línea de main lo usara para imprimirla (aunque ahora que lo pienso por ese mismo razonamiento debería haberlo hecho también con radio). He probado haciéndolos ambos void y haciendo que ambos retornen valores pero nada.


Título: Re: Ejercicio de métodos que no devuelven el valor al main
Publicado por: HardC0d3 en 28 Diciembre 2018, 21:42 pm
Citar
...pero no sé como hacer para usar el valor que retorna calcularLongitud.

Al llamar al método calcularLongitud, en la línea 8 de tu código, no estás asignando el valor devuelto a ninguna variable.
Código
  1. calcularLongitud(radio, longitud);

El valor que devuelve el método calcularLongitud lo  tienes que guardar/asignar en tu variable longitud
Código
  1. longitud = calcularLongitud(radio, longitud);

A partir de ahí, si la variable longitud es global, podrás usarla en cualquier parte del código.


Título: Re: Ejercicio de métodos que no devuelven el valor al main
Publicado por: wung en 28 Diciembre 2018, 21:46 pm
Entiendo, ya me funciona, muchas gracias!


Título: Re: Ejercicio de métodos que no devuelven el valor al main
Publicado por: rub'n en 29 Diciembre 2018, 12:23 pm
Entiendo, ya me funciona, muchas gracias!

Esta linea también te funcionaba o hacer la asignación con = , pero previamente definiendolas como variables de clase con static para que puedar usarlas en el main (revisa diferencias entre variables de instancia, variables de clase)

Código
  1. System.out.println("La longitud de la circunferencia es " + calcularLongitud(radio, longitud));


@wung emplea el uso de  constructores en vez de hacer toda la lógica en el main doc, y te servirían ambos tipos de variables tanto de clase como de instancia, en este ejemplo no tienes que crear la variables estáticas, aunque también puede hacerlo



Código
  1. package foro;
  2.  
  3. import java.util.Scanner;
  4. import java.util.logging.Level;
  5. import java.util.logging.Logger;
  6.  
  7.  
  8.  
  9. public class Ejercicion1 {
  10.  
  11.  
  12.    /**
  13.      * usando variables de instancia, cuando son static se llaman de clase
  14.      * usando modificador de acceso private por convension en java un standar
  15.      */
  16.    private Scanner leer = new Scanner(System.in);
  17.    private double radio;
  18.    private double longitud;
  19.  
  20.    /*uso de logger, es mejor que usar un vulgar System.out.println() que exponer información sensitiva de la app */
  21.    private static final Logger LOGGER = Logger.getLogger(Ejercicio1.class.getName());
  22.    public Ejercicion1() {
  23.  
  24.        instroducirRadio();
  25.        //final double resultado = calcularLongitud(radio);
  26.        //LOGGER.log(Level.INFO, "La longitud es " + resultado );
  27.  
  28.  
  29.        LOGGER.log(Level.INFO, "La longitud es " + calcularLongitud(radio));
  30.    }
  31.  
  32.    private double calcularLongitud(double radio) {
  33.        this.longitud = ((radio * 2) * Math.PI);
  34.        return longitud;
  35.    }
  36.  
  37.    /**
  38.      * No es la mejor manera de usar esta metodo , se podria hacer sin el parametro double radio
  39.      *
  40.      */
  41.    private void instroducirRadio() {
  42.        System.out.println("Instroduce radio ");
  43.  
  44.  
  45.        /*puedes tambien usar el puntero this para diferenciar la variable de instancia al parametros*/
  46.        this.radio = leer.nextDouble();
  47.    }
  48.  
  49.    public static void main(String ...blablalba) {
  50.        new Ejercicion1();
  51.    }
  52. }
  53.  


que tal @HardC0d3, en java no existen variables globales, se les llaman variables de instancia y variables de clase cuando son static