Autor Tema: Ayuda programacion POO java eclipse  (Leído 671 veces)

vicios

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
Ayuda programacion POO java eclipse
« en: 30 de Abril 2021, 05:34 »
Necesito ayuda para resolver este ejercicio, el IDE es eclipse:

La clínica “Contigo Aprendo” se especializa en la baja de peso de sus pacientes, para ello a cada uno lo controla mensualmente durante un año.
 A cada paciente se le registra su Rut, nombre, edad, sexo (F para femenino y M para masculino) y peso mensual (array con los pesos mensuales del año).
Crear la clase Paciente que contenga como atributos los datos que se le registra al paciente.      
Y los métodos:
Constructor que inicializa Rut, nombre, edad y sexo con los datos que llegan a través de paso de parámetro. El array que almacena el peso mensual se genera en forma aleatoria con números enteros en el rango [70,250].      
Accesadores y mutadores
menorPesoMensual: retorna el mes en que el paciente peso menos kilos.
indiceMasaCorporal: retorna el índice de masa corporal del paciente, para un mes x.         índice de masa corporal = peso/estatura2      
menosDeXKilos: retorna un nuevo array en el que se almacenan los meses en que el paciente pesó menos de X kilos. Si nunca lo hizo, retorna null.   
pesoMesX: retorna la palabra normal, sobrepeso u obeso de acuerdo con el índice de masa corporal (IMC) obtenido en el mes del año se indique. (Debe usar método indiceMasaCorporal)
 15 <= IMC < 20   ⇒  Normal
    20 <= IMC < 28   ⇒  Sobrepeso
             IMC >= 28   ⇒  Obeso         

Crear una aplicación que permita:
1) Crear un objeto de tipo Paciente.      
2) Mostrar todos los atributos del paciente registrado (objeto).      
3) Mostrar el mes con menor peso del paciente registrado (objeto).   
4) Solicitar el ingreso de un peso para comparar y si el método menosDeXKilos retorna valor distinto de null, mostrar array con los meses en que el paciente pesó menos kilos que los ingresados por el usuario, de lo contrario dar mensaje adecuado.   
5) Dada la estatura, mostrar la condición del paciente en el mes de noviembre (normal, sobrepeso u obeso).   
6) Salir   

Si alguien puede ayudarme :'(

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 702
    • Ver Perfil
Re: Ayuda programacion POO java eclipse
« Respuesta #1 en: 30 de Abril 2021, 19:08 »
Hola.
Comienza creando la clase Paciente con los atributos que indica el enunciado.

Hazlo como tú creas y llega hasta donde puedas. Cuando lo tengas compártelo por aquí y lo vemos, corregimos si es necesario y te ayudamos a completarlo.

Pero es importante que comiences tú el código, no importa si te equivocas, de hecho es la única forma de aprender.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

vicios

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Ayuda programacion POO java eclipse
« Respuesta #2 en: 30 de Abril 2021, 22:23 »
Toda la razón estimado:
la clase Paciente: necesito controlar el array de peso mensual, es decir me falta que solo mande datos rondón entre 70 y 250.

Actualmente estoy validando el calcular el índice de masa corporal... si pudieran guiarme

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 702
    • Ver Perfil
Re: Ayuda programacion POO java eclipse
« Respuesta #3 en: 01 de Mayo 2021, 01:28 »
Para conseguir el peso, quizás te resulte más fácil hacerlo así:

Código: [Seleccionar]

public Paciente(String rut, String nombre, int edad, char sexo) {
this.rut = rut;
this.nombre = nombre;
this.edad = edad;
this.sexo = sexo;
pesoMensual = new int[12];

Random azar = new Random();
for (int i = 0; i < 12; i++)
pesoMensual[i] = azar.nextInt(251-70) + 70;
}

Para calcular el índice de masa corporal, necesitas un método que reciba la estatura del paciente (valor float o double) y el número de mes (un int entre 0 y 11) para seleccionar uno de los pesos mensuales del array.
Aunque el enunciado especifica que este calculo se hará sobre el peso el mes de Noviembre (que sería el 10), pero yo igualmente escribiría el método de manera que estuviera pensado para poder seleccionar cualquier mes.
El resultado de calcular el IMC, puesto que es el resultado de una división, será un resultado float / double. Pero puedes optar por retornarlo como int si así lo prefieres.

Código: [Seleccionar]
private float indiceMasaCorporal(float estatura, int mes) {
return pesoMensual[mes] / (estatura * estatura);
}

Bien, con esto se puede calcular el IMC, pero en realidad este sería un método de "apoyo". El menú de la aplicación lo que pedirá es que según en que rango se encuentre el IMC calculado para Noviembre, se retornen unos mensajes tipo: "Normal", "SobrePeso", "Obeso"

Esta parte del enunciado, podría estar incompleta, ya que no se específica cuál mensaje debe aparecer en el caso de que el IMC fuese inferior a 15.
Quien escribiese este enunciado parece que no le importa este posible caso, pero el problema es que al compilador de Java sí le va a importar.
Cuando el "retorno" de un método depende de uno o varios condicionales, estos han de contemplar TODAS las posibilidades.

No podemos hacer un método en el que le digamos a  Java: - si el peso es igual o mayor a 15, retorna un String que diga "Normal"

Porque el compilador nos dirá: - Vale, me has dicho qué tengo que hacer si es igual o mayor que 15, pero no me estás diciendo qué tengo que hacer en el posible caso contrario. (que sea menor que 15)

Así que aunque el enunciado no lo indique, vamos a tener que escribir el método de forma que sí tenga en cuenta esa posibilidad.
Este método lo que haría sería primero calcular el IMC apoyándose en el método escrito antes.
Y una vez tenga el IMC, retornar un String con distintos mensajes, según en que rango se encuentre el IMC.

Código: [Seleccionar]
public String pesoMesX(float estatura, int mes) {
float imc = indiceMasaCorporal(estatura, mes);
if (imc < 15)
return "Inferior a Normal";
else if (imc >= 15 && imc < 20)
return "Normal";
else if (imc >= 20 && imc < 28)
return "SobrePeso";
else
return "Obeso";
}

Como ves, los if y else están escritos de manera que se contemplan TODAS las posibilidades, incluso las que en realidad sabemos que jamás van a ocurrir, como que por ejemplo el IMC calculado fuese un valor negativo (es decir, menor que 15).
O que el IMC calculado fuese 24.500.000 (es decir, mayor o igual que 28)

Nosotros como programadores sabemos que nunca vamos a obtener esos resultados tan absurdos, pero el compilador "no lo sabe", y por eso nos va a obligar a escribir el código de manera que haya un "retorno" garantizado, incluso para las situaciones más absurdas.
« Última modificación: 01 de Mayo 2021, 01:30 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

vicios

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Ayuda programacion POO java eclipse
« Respuesta #4 en: 01 de Mayo 2021, 21:52 »
Gracias por la sugerencias, tengo armado mis métodos pero sigo sin poder hacer que me cruja el cerebro para poder rescatar el valor del mes de noviembre en el case 5
Es decir: cuando entre al case 5, le solicito al paciente que ingrese su altura (double), y luego de esto como hago para que llegue la atura al método que esta en la clase paciente para luego retornar en el case 5 el resultado de su condición :c

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 702
    • Ver Perfil
Re: Ayuda programacion POO java eclipse
« Respuesta #5 en: 01 de Mayo 2021, 22:03 »
Mira, te dejo mis clases para que veas cómo lo tengo yo hecho.
Pregunta si hay algo que no entiendas.

Esta es la clase Paciente
Código: [Seleccionar]
import java.util.Random;

public class Paciente {

private String rut;
private String nombre;
private int edad;
private char sexo;
private int[] pesoMensual;

public Paciente(String rut, String nombre, int edad, char sexo) {
this.rut = rut;
this.nombre = nombre;
this.edad = edad;
this.sexo = sexo;
pesoMensual = new int[12];

Random azar = new Random();
for (int i = 0; i < 12; i++)
pesoMensual[i] = azar.nextInt(251-70) + 70;
}

public String getRut() {
return rut;
}

public void setRut(String rut) {
this.rut = rut;
}

public String getNombre() {
return nombre;
}

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

public int getEdad() {
return edad;
}

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

public char getSexo() {
return sexo;
}

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

/**
* De los 12 pesos mensuales, retorna el menor.
* @return Mes con el menor peso.
*/
public String getMenorPesoMensual() {

//Para poder comparar, tomamos como referencia el primer mes
int menor = pesoMensual[0];
int mes = 0;
//Recorremos los otros 11 meses, a ver si alguno tiene un peso menor
for (int i = 1; i < 12; i++) {
if (pesoMensual[i] < menor) {
menor = pesoMensual[i];
mes = i;
}
}

switch(mes) {
case 0:
return "Enero -> Peso: " + menor;
case 1:
return "Febrero -> Peso: " + menor;
case 2:
return "Marzo -> Peso: " + menor;
case 3:
return "Abril -> Peso: " + menor;
case 4:
return "Mayo -> Peso: " + menor;
case 5:
return "Junio -> Peso: " + menor;
case 6:
return "Julio -> Peso: " + menor;
case 7:
return "Agosto -> Peso: " + menor;
case 8:
return "Septiembre -> Peso: " + menor;
case 9:
return "Octubre -> Peso: " + menor;
case 10:
return "Noviembre -> Peso: " + menor;
default:
return "Diciembre -> Peso: " + menor;
}
}


/**
* Calcula el IMC del paciente.
* @param estatura Estatura del paciente expresada en metros.
* @param mes Índice (entre 0 y 11) del array de pesos correspondiente
* al mes para el cuál se quiere calcular el IMC.
* @return Valor calculado del IMC.
*/
private float indiceMasaCorporal(float estatura, int mes) {
return pesoMensual[mes] / (estatura * estatura);
}

/**
* Devuelve un array con los pesos menores que el indicado
* como parámetro. Si no los hubiera, se retorna valor null.
* @param peso Pero de referencia del cuál buscar pesos menores.
* @return Array con los pesos menores, valor null si no los hay.
*/
public int[] menosDeXKilos(int peso) {

int[] pesosMenosDeX = null;

//Primero contamos cuántos pesos hay menores que el indicado
int contador = 0;
for (int i = 0; i < 12; i++) {
if (pesoMensual[i] < peso)
contador++;
}
//Ahora que los hemos contado, ya sabemos cuánto ha de medir el array
if (contador > 0) {
pesosMenosDeX = new int[contador];
int indiceArray = 0; //El array de pesos menores necesita su propio indice
for (int i = 0; i < 12; i++) {
if (pesoMensual[i] < peso) {
pesosMenosDeX[indiceArray] = pesoMensual[i];
indiceArray++;
}
}
}

return pesosMenosDeX;
}

/**
* Retorna una valoración según el IMC calculado para
* un determinado mes.
* @param estatura Estatura del paciente expresada en metros.
* @param mes Índice (entre 0 y 11) del array de pesos correspondiente
* al mes para el cuál se quiere calcular el IMC.
* @return Palabra String para valorar el IMC calculado.
*/
public String pesoMesX(float estatura, int mes) {
float imc = indiceMasaCorporal(estatura, mes);
if (imc < 15)
return "Inferior a Normal";
else if (imc >= 15 && imc < 20)
return "Normal";
else if (imc >= 20 && imc < 28)
return "SobrePeso";
else
return "Obeso";
}

@Override
public String toString() {
return String.format("RUT: %s\nNombre: %s\nEdad: %d\nSexo: %s\n", rut, nombre, edad, sexo);
}
}

Y una clase Menu con el método main()
Código: [Seleccionar]
import java.util.Scanner;

public class Menu {

private static Paciente paciente; //Paciente sobre el que se va a trabajar
private static Scanner teclado = new Scanner(System.in);

public static void main(String[] args) {

String opcion = "";

while (!opcion.equals("6")) {
System.out.println("\n\t\tMenu Paciente");
System.out.println("\t\t---- --------\n");
System.out.println("[1] - Registrar Paciente.");
System.out.println("[2] - Mostrar datos del Paciente.");
System.out.println("[3] - Mostrar el mes con menor peso del Paciente.");
System.out.println("[4] - Listar pesos menores que un peso indicado.");
System.out.println("[5] - Ver condición del Paciente en mes de Noviembre");
System.out.println("[6] - SALIR");
System.out.print("Elija opción: ");
opcion = teclado.nextLine();

switch(opcion) {
case "1":
registrarPaciente();
break;

case "2":
System.out.println("\nDatos del Paciente.");
if (paciente != null)
System.out.println(paciente);
else
System.out.println("Aún no hay un Paciente registrado.");
break;

case "3":
System.out.println("\nMes con el menor peso:");
if (paciente != null)
System.out.println(paciente.getMenorPesoMensual());
else
System.out.println("Aún no hay un Paciente registrado.");
break;

case "4":
System.out.println("\nListar pesos menores que uno indicado.");
if (paciente != null) {
System.out.print("Indique peso: ");
int peso = Integer.parseInt(teclado.nextLine());
int[] menores = paciente.menosDeXKilos(peso);
if (menores == null)
System.out.println("No hay ningún peso mensual menor que el indicado");
else {
System.out.println("Pesos encontrados:");
for (int menor: menores)
System.out.println("-> " + menor);
}
}
else
System.out.println("Aún no hay un Paciente registrado.");
break;

case "5":
System.out.println("\nCondición del paciente en Noviembre");
if (paciente != null) {
System.out.println("Indique la altura (en metros): ");
float altura = Float.parseFloat(teclado.nextLine());
System.out.println("Condición: " + paciente.pesoMesX(altura, 10));//10 es Noviembre
}
else
System.out.println("Aún no hay un Paciente registrado.");
break;

case "6":
System.out.println("\n\t\tFIN DE PROGRAMA");
}
}
teclado.close();
}

private static void registrarPaciente() {
System.out.println("\nDatos nuevo Paciente.");
System.out.print("RUT: ");
String rut = teclado.nextLine();
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Edad: ");
int edad = Integer.parseInt(teclado.nextLine());
System.out.print("Sexo(M/F): ");
char sexo = teclado.nextLine().toUpperCase().charAt(0);
paciente = new Paciente(rut, nombre, edad, sexo);
System.out.println("\nNuevo Paciente Registrado...\n");
}

}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

vicios

  • Sin experiencia
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Ayuda programacion POO java eclipse
« Respuesta #6 en: 01 de Mayo 2021, 22:58 »
Wow excelente, se parece mucho a lo que tenia, no sabia como interpretarlo jaja me falta ser mas abstracto aun, viendo tu secuencia entendí como era el paso que me faltaba, sin dudas me ayudaste mucho!! te lo agradezco, excelente foro.

Nuevamente muchas gracias.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 702
    • Ver Perfil
Re: Ayuda programacion POO java eclipse
« Respuesta #7 en: 02 de Mayo 2021, 00:13 »
me falta ser mas abstracto aun

Esa es la clave, la abstracción.
Es cuestión de tiempo y práctica, ya verás como poco a poco tu mente irá pensando de forma "diferente" a la hora de escribir código.

Un saludo.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

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".