Autor Tema: Calcular IMC (índice de masa corporal) como método Java dentro de clase Persona  (Leído 29635 veces)

CrossoverLw

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Hola a todos,

estoy aprendiendo a programar por primera vez, y he elegido Java. Os voy a copiar el ejercicio que estoy tratando de realizar, y ahora os comento donde estoy atascado, que es como darme contra un muro porque por más que estoy mirando por internet no encuentro la solución.

Ejercicio:
Citar
Haz una clase llamada Persona que siga las siguientes condiciones:
  • Sus atributos son: nombre, edad, DNI, sexo(H hombre, M mujer), peso y altura. No queremos que se accedan directamente a ellos. Piensa qué modificador de acceso es el más adecuado, también su tipo. Si quieres añadir algún atributo puedes hacerlo.
  • Por defecto, todos los atributos menos el DNI serán valores por defecto según su tipo (0 números, cadena vacía para String, etc.).

Se implementarán varios constructores:
  • Un constructor por defecto.
  • Un constructor con el nombre, edad y sexo, el resto por defecto.
  • Un constructor con todos los atributos como parámetro

Los métodos que se imprelentarán son:
  • calcularIMC(): calculará si la persona está en su peso ideal (peso en kg/(altura^2 enm)), devuelve un -1 si está por debajo de su peso ideal, un 0 si está en su peso ideal y un 1 si tiene sobrepeso. Te recomiendo que uses constantes para devolver estos valores.
  • esMayorDeEdad(): indica si es mayor de edad, devuelve un booleano.
  • comprobarSexo(): comprueba que el sexo introducido es correcto. Si no es correcto, será H. No será visible al exterior.
  • toString(): devuelve toda la información del objeto, por pantalla.
  • generaDNI(): genera un número aleatorio de 8 cifras, genera a partir de este su número su letra correspondiente. Este método será invocado cuando se construya el objeto. Puedes dividir el método para que te sea más fácil. No será visible al exterior.
  • Métodos set de cada parámetro, excepto de DNI

Ahora crea una clase ejecutable que haga lo siguiente:
  • Pide por teclado el nombre, la edad, sexo, peso y altura.
  • Crea 3 objetos de la clase anterior, el primer objeto obtendrá las anteriores variables pedidas por teclado, el segundo objeto obtendrá todos los anteriores menos el peso y la altura y el último por defecto, para este último utiliza los métodos set para darle a los atributos un valor.
  • Para cada objeto, deberá comprobar si está en su peso ideal, tiene sobrepeso o por debajo de su peso ideal con un mensaje.
  • Indicar para cada objeto si es mayor de edad.
  • Por último, mostrar la información de cada objeto.

Bien, ahora os pongo el código que he llegado a escribir:

Clase Persona

Código: [Seleccionar]
import java.util.Scanner;

public class Persona {

    private String nombre;
    private int edad;
    private long dni;
    private char sexo;
    private double peso;
    private double altura;

    public Persona() { [color=red]//primer constructor por defecto, con constructor por defecto se refiere a esto? [/color]
        nombre = "";
        edad = 0;
        dni = 0; [color=red]// me pide que todo por defecto menos dni, pero no se que poner en dni, si no pongo algo me da error[/color]
        sexo = 'H';
        peso = 0.0;
        altura = 0.0;
    }

    public Persona(String nombre, int edad, char sexo) { [color=red]//segundo constructor con nombre, edad y sexo. El resto por defecto. Tampoco se si estoy haciendo un uso correcto del this.[/color]
        this.nombre = nombre;
        this.edad = edad;
        this.sexo = sexo;
        this.dni = 0;
        this.sexo = 'H';
        this.peso = 0.0;
        this.altura = 0.0;
    }

    public Persona(String nombre, int edad, long dni, char sexo, double peso, double altura) { [color=red]// Tercer constructor con todos los atributos como parámetros[/color]
        this.nombre = nombre;
        this.edad = edad;
        this.dni = dni;
        this.sexo = sexo;
        this.peso = peso;
        this.altura = altura;
    }

    public void calcularIMC() {
        final int DEBAJO_PESO_IDEAL = -1;
        final int PESO_IDEAL = 0;
        final int SOBREPESO = 1;
        double imc;

        imc = peso / altura * altura;

        if (imc < 18.5) {
            System.out.println(DEBAJO_PESO_IDEAL);
        } else if (imc >= 18.5 && imc <= 25) {
            System.out.println(PESO_IDEAL);
        } else {
            System.out.println(SOBREPESO);
        }

    }

    public boolean esMayorDeEdad() {
        if (edad >= 18) {
            return true;
        } else {
            return false;
        }
    }

    private void comprobarSexo(char sexo) {
        if (sexo != 'H' || sexo != 'M') {
            sexo = 'H';
        }
    }

    public toString() { [color=red]//todavía no se bien como funciona este método[/color]

    }

    private void generaDNI() { [color=red]//intenté usar (int) en lugar de Math.floor para convertir decimal a entero, pero me generaba siempre la cifra 1 y la letra A, no entiendo el motivo[/color]
        double numero;
        int numero2;
        char letra;

        for (int i = 0; i < 9; i++) {
            numero = Math.floor(Math.random() * (0 - 9 + 1) + 9);
            numero2 = (int) numero;
            System.out.print(numero2);
        }
        numero = Math.floor(Math.random() * (65 - 90 + 1) + 90);
        numero2 = (int) numero;
        letra = (char) numero2;
        System.out.println(letra);
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public void setSexo(char sexo) {
        this.sexo = sexo;
    }

    public void setPeso(double peso) {
        this.peso = peso;
    }

    public void setAltura(double altura) {
        this.altura = altura;
    }


Clase con el main

Código: [Seleccionar]
    public static void main(String[] args) { [color=red]//esto lo tengo que escribir dentro de una clase ejecutable[/color]
        Persona dni = new Persona(); [color=red]// solo quería comprobar que funcionaba[/color]
        dni.generaDNI();

        Scanner scanner = new Scanner(System.in); [color=red]// intenté utilizar las variables de los constructores pero no me dejaba, imagino que porque el objeto scanner no llama a ningún constructor de esta clase, así que declaré otras variables para luego incluirlas como parámetros en el objeto. Aquí me he hecho la picha un lío así que no se qué estoy haciendo.[/color]
        System.out.println("Introduce tu nombre: ");
        String n = scanner.next();
        System.out.println("Introduce tu edad: ");
        int ed = scanner.nextInt();
        System.out.println("Introduce tu sexo (H o M): ");
        char sx = scanner.next().charAt(0); [color=red]//esto lo he visto en la red, me imagino que el método .charAt() toma la posición que escribas en el paréntesis, aunque no lo tengo muy claro[/color]
        System.out.println("Introduce tu peso: ");
        double p = scanner.nextDouble();
        System.out.println("Introduce tu altura: ");
        double al = scanner.nextDouble();

        Persona o1 = new Persona(n, ed, sx, p, al); [color=red]//aquí llegamos a mi principal problema, como creo un objeto con las variables anteriores pedidas por teclado, si no tengo un constructor que tenga ese número de atributos como parámetros?[/color]
    }
}

Ya no he seguido porque de aquí no paso, seguro que el lo siguientes objetos tengo más problemas, pero a lo mejor si consigo solucionar este también soluciono los siguientes.

Espero haberlo escrito con la suficiente claridad, no lo he puesto en código porque si no no podía darle color a los comentarios, o al menos, no se hacerlo. Si debo quitar el color y ponerlo en código lo modifico.

Gracias
« Última modificación: 29 de Enero 2016, 08:11 por Alex Rodríguez »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Ayuda con ejercicio
« Respuesta #1 en: 28 de Enero 2016, 16:00 »
Buenas tardes,

Uff que extenso, bueno vamos por partes solucionando, en el primer constructor dices, no se que poner en el DNI, el ejercicio te pide claramente que uses la funcion getDNI() para crear un DNI aleatorio. USA LA CLASE RANDOM


Ya sabes a que tienes que igualar dni en el contructor.


Segundo, el this, lo usas bien si, this hace referencia a la instancia, ESTE.DNI (el actual, el que esta vivo).

Cuando resuelvas la funcion getDNI() para que de un random y arregles los constructores avisame y seguimos arreglando.

CrossoverLw

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Ayuda con ejercicio
« Respuesta #2 en: 28 de Enero 2016, 16:09 »
Muchas gracias por responder, se que es una consulta un poco larga  :'( lo siento.

No entiendo bien a qué te refieres con lo del dni, igualar el atributo dni a getDNI(), pero no puedo igualar un atributo a un método no? Supongo que te refieres a igualarlo a un objeto que use el método para generar un DNI aunque tampoco se si se puede hacer eso.

El ejercicio pide crear un método que genere un número aleatorio para el DNI, ya está creado y se llama generaDNI().

Perdona es que como digo estoy muy verde, acabo de empezar con esto hace nada
Bueno, voy a ir probando cosas y te comento!
Saludos
« Última modificación: 28 de Enero 2016, 16:22 por CrossoverLw »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Re:Ayuda con ejercicio
« Respuesta #3 en: 28 de Enero 2016, 19:22 »
Si, claro que puedes igualar a un metodo, porque el método devuelve un valor, mas que un metodo es una función.

public long getDni(){}

tu lo has puesto como void, significa que devuelve vacio, eso es incorrecto, debes hacerlo como te indico para que devuelva un long, osea un dni aleatorio.

y luego igualas

dni = getDni();

Tranquilo poco a poco iremos haciendolo seguro, tienes un curso de Java gratuito genial en esta web:
http://aprenderaprogramar.com/index.php?option=com_content&view=category&id=68&Itemid=188
« Última modificación: 28 de Enero 2016, 19:27 por Lorenzo31 »

CrossoverLw

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Ay! siempre se me queda una cara de tonto cuando veo que la solución era tan sencilla xD

Muchas gracias Lorenzo!! al final se me ha quedado así, he cambiado bastantes cosas, sobre todo en el método para generar el DNI. Creo que ya queda poco, ahora tengo problemas con el método comprobarSexo() ya que me pide que por defecto sea H si el valor introducido no es correcto, pero tal y como lo tengo no funciona porque si pongo J imprime J.

Y por otro lado, algo no funciona en el método calcularIMC() porque siempre me da 1, y no se muy bien como utilizar el boolean para el esMayorDeEdad() y que al invocar el método me salga algo por pantalla. En general es que todavía no entiendo bien el funcionamiento del return creo yo, mañana le daré un vistazo más detenidamente.

Clase Persona:

Código: [Seleccionar]
package persona;
public class Persona {

    private String nombre;
    private int edad;
    private final String DNI;
    private char sexo;
    private double peso;
    private double altura;

    public Persona() {
        nombre = "";
        edad = 0;
        DNI= generaDNI();
        sexo = comprobarSexo();               
        peso = 0.0;
        altura = 0.0;
    }

    public Persona(String nombre, int edad, char sexo) {
        this.nombre = nombre;
        this.edad = edad;
        this.DNI= generaDNI();
        this.sexo = sexo;
        this.peso = 0.0;
        this.altura = 0.0;
    }

    public Persona(String nombre, int edad, String DNI, char sexo, double peso, double altura) {
        this.nombre = nombre;
        this.edad = edad;
        this.DNI = generaDNI();
        this.sexo = sexo;
        this.peso = peso;
        this.altura = altura;
    }

    public void calcularIMC() {
        final int DEBAJO_PESO_IDEAL = -1;
        final int PESO_IDEAL = 0;
        final int SOBREPESO = 1;
        double imc;

        imc = peso / altura * altura;

        if (imc < 18.5) {
            System.out.println(DEBAJO_PESO_IDEAL);
        } else if (imc >= 18.5 && imc <= 25) {
            System.out.println(PESO_IDEAL);
        } else {
            System.out.println(SOBREPESO);
        }

    }

    public boolean esMayorDeEdad() {
        if (edad >= 18){
            return true;
        }
        else{
            return false;
        }
       
    }

    private char comprobarSexo() {
        if (sexo != 'H' || sexo != 'M') {
            sexo = 'H';
        }
        return sexo;
    }

    public String toString() {
        return nombre+"/"+edad+"/"+DNI+"/"+sexo+"/"+peso+"/"+altura;
    }
     

    private String generaDNI() {
        double numero;
        int numero2;
        int dnirandom=0;
        char letra;
        String juegoCaracteres;
        String nif;

        for (int i = 0; i < 8; i++) {
            numero = Math.floor(Math.random() * (0 - 9) + 9);
            numero2 = (int) numero;
            dnirandom = dnirandom*10+numero2;           
        }               
        juegoCaracteres="TRWAGMYFPDXBNJZSQVHLCKET";
        int modulo = dnirandom % 23;
        letra = juegoCaracteres.charAt(modulo);
        nif = (""+dnirandom+letra+"");
       
        return nif;       
    }
   
   
   
   
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public void setSexo(char sexo) {
        this.sexo = sexo;
    }

    public void setPeso(double peso) {
        this.peso = peso;
    }

    public void setAltura(double altura) {
        this.altura = altura;
    }

}

Clase Ejecutable:

Código: [Seleccionar]
package persona;


import java.util.Scanner;


public class Ejecutable {
    public static void main(String[] args) {
       
        Scanner scanner = new Scanner(System.in);
        System.out.println("Introduce tu nombre: ");
        String n = scanner.next();
        System.out.println("Introduce tu edad: ");
        int ed = scanner.nextInt();
        System.out.println("Introduce tu sexo (H o M): ");
        char sx = scanner.next().charAt(0);
        System.out.println("Introduce tu peso: ");
        double p = scanner.nextDouble();
        System.out.println("Introduce tu altura: ");
        double al = scanner.nextDouble();

        Persona o1 = new Persona (n, ed, "", sx, p, al);     
        Persona o2 = new Persona(n, ed, sx);         
        Persona o3 = new Persona();       
       
        o1.calcularIMC();
        o1.esMayorDeEdad();
        o2.calcularIMC();
        o2.esMayorDeEdad();
        o3.setNombre("Fulano");
        o3.setEdad(28);
        o3.setSexo('J');
        o3.setPeso(70);
        o3.setAltura(1.88);
        o3.calcularIMC();
        o3.esMayorDeEdad();
       
        System.out.println(o1);
        System.out.println(o2);
        System.out.println(o3);
    }
}
« Última modificación: 30 de Enero 2016, 02:53 por CrossoverLw »

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Nada tranquilo, yo tampoco creas que se mucho de Java,

Para lo de por defecto H o M y no aceptar nada mas, puedes controlarlo al intruducir el dato.

Algo así:

Código: [Seleccionar]
   System.out.println("Introduce tu sexo (H o M): ");
        char sx = scanner.next().charAt(0);
        //si la letra que tiene sx es distinta de M, ponle a sx el valor "H"
         if(sx != "M"){ sx = "H"; }
Si quieres que esto lo haga el constructor, solo tienes que poner ese if una vez le pasas el valor a sx al constructor, en la clase.
El resto lo miro el lunes que ando liado el fin de semana ;) saludos.

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".