Autor Tema: Ejercicio resuelto Java Paciente Historial Clinico menú JOptionPane #codigoJava  (Leído 40336 veces)

xtnite

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Hola, soy principiante en programacion Java y tengo un proyecto del cual tengo muchos problemas para concluir. Si alguien pudiera ayudarme mandándome el proyecto, los códigos, como lo harían..., para poder comparar con el mío lo agradecería infinitamente. Les copio el proyecto para quien pueda ayudar:




CONSIGNA DEL EJERCICIO

Fuiste contratado por una institución de salud para desarrollar un software basado en Java y que permita gestionar la información de los historiales clínicos de sus pacientes.

Las entidades definidas para este software son:

Pacientes: Es la entidad que representa un paciente afiliado a la entidad de salud. Cada uno de los pacientes deberá estar asignado a su respectivo historial clínico.

Médicos: Es la entidad que representa un médico en la entidad de salud. Cada uno de los médicos deberá estar asignado a respectivos historiales clínicos.

Historiales Clínicos: Es la entidad que representa los historiales clínicos de la entidad de salud, en los cuales se asignan pacientes y médicos para su gestión.

El aplicativo deberá ser desarrollado en Java y deberá tener las siguientes características y funcionalidades:

El software permitirá registrar, consultar, modificar y eliminar los datos para los atributos de la entidad Paciente, es decir, debes desarrollar una clase “Paciente” donde definas los atributos para dicha entidad, los cuales son: identificación, nombres, apellidos, edad y género.

El software permitirá registrar, consultar, modificar y eliminar los datos para los atributos de la entidad Medico, es decir, debes desarrollar una clase “Medico” donde definas los atributos para dicha entidad, los cuales son: identificación, nombres, apellidos y especialidad.

El software permitirá registrar, consultar, modificar y eliminar los datos para los atributos de la entidad Historiales Clínicos, es decir, debes desarrollar una clase “HistorialClinico” donde definas los atributos para dicha entidad, los cuales son: código, fecha, idPaciente, idMedico y observaciones.

Para cada entidad, se deberá crear los distintos métodos para la manipulación (insertar, eliminar, consultar y modificar) de los atributos de cada entidad incluyendo Getters y Setters. Así como cualquier método que considere necesario.

Todos los datos de las entidades son cadena de textos excepto el atributo “edad” de la entidad “Paciente”, que es numérico de tipo entero.

El aplicativo debe mostrar un menú principal con las opciones:

Gestionar Pacientes.
Gestionar Médicos.
Gestionar Historial Clínico.
Salir

Luego al entrar a cada entidad se debe mostrar un submenú con las opciones de la entidad, por ejemplo para Pacientes:

Registrar Pacientes.
Mostrar Pacientes.
Modificar Pacientes.
Eliminar Pacientes.
Atrás

Luego al entrar se debe pedir o mostrar la información según la acción, por ejemplo:

Registrar Pacientes: Pedir los datos de un paciente a registrar.
Mostrar Pacientes: Mostrar todos los pacientes registrados con sus atributos.
Modificar Paciente: Modificar los atributos de un paciente a partir del IdPaciente (Si el idPaciente no existe decir paciente no encontrado.).
Eliminar Paciente: Pedir el IdPaciente y eliminarlo (Si el idPaciente no existe decir paciente no encontrado.).
Atrás
« Última modificación: 31 de Octubre 2020, 14:32 por Alex Rodríguez »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ayuda URGENTE
« Respuesta #1 en: 14 de Septiembre 2018, 01:49 »
Hola.
Quizás sería más interesante que mostraras lo que tienes hecho y donde te has atascado para poder ayudarte.
O bien volver a empezar desde el principio y rehacer el programa juntos..

En fin, vamos paso a paso.
Estas serían las clases básicas conforme a lo que pide el enunciado. No creo que aquí hayas tenido ningún problema.
Clase Paciente
Código: [Seleccionar]
package clinica;

public final class Paciente {

private String id;
private String nombre;
private String apellidos;
private int edad;
private String genero;

public Paciente(String id, String nombre, String apellidos, int edad, String genero) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.edad = edad;
this.genero = genero;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

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

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public int getEdad() {
return edad;
}

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

public String getGenero() {
return genero;
}

public void setGenero(String genero) {
this.genero = genero;
}

/**
* Muestra por consola todos los datos del Paciente
*/
public void mostrar() {
System.out.println("\n\t---------------");
System.out.println("ID Paciente: " + id);
System.out.println("Nombre: " + nombre);
System.out.println("Apellidos: " + apellidos);
System.out.println("Edad: " + edad);
System.out.println("Genero: " + genero);
System.out.println("\t---------------");
}
}

Clase Medico
Código: [Seleccionar]
package clinica;

public final class Medico {

private String id;
private String nombre;
private String apellidos;
private String especialidad;

public Medico(String id, String nombre, String apellidos, String especialidad) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.especialidad = especialidad;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

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

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public String getEspecialidad() {
return especialidad;
}

public void setEspecialidad(String especialidad) {
this.especialidad = especialidad;
}

/**
* Muestra por consola todos los datos del Medico
*/
public void mostrar() {
System.out.println("\n\t---------------");
System.out.println("ID Medico: " + id);
System.out.println("Nombre: " + nombre);
System.out.println("Apellidos: " + apellidos);
System.out.println("Especialidad: " + especialidad);
System.out.println("\t---------------");
}

}

Clase HistorialClinico
Código: [Seleccionar]
package clinica;

public final class HistorialClinico {

private String codigo;
private String fecha;
private String idPaciente;
private String idMedico;
private String observaciones;

public HistorialClinico(String codigo, String fecha, String idPaciente,
String idMedico, String observaciones) {
this.codigo = codigo;
this.fecha = fecha;
this.idPaciente = idPaciente;
this.idMedico = idMedico;
this.observaciones = observaciones;
}

public String getCodigo() {
return codigo;
}

public void setCodigo(String codigo) {
this.codigo = codigo;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fecha) {
this.fecha = fecha;
}

public String getIdPaciente() {
return idPaciente;
}

public void setIdPaciente(String idPaciente) {
this.idPaciente = idPaciente;
}

public String getIdMedico() {
return idMedico;
}

public void setIdMedico(String idMedico) {
this.idMedico = idMedico;
}

public String getObservaciones() {
return observaciones;
}

public void setObservaciones(String observaciones) {
this.observaciones = observaciones;
}

/**
* Muestra por consola todos los datos del Historial Clinico
*/
public void mostrar() {
System.out.println("\n\t---------------");
System.out.println("Codigo Historial: " + codigo);
System.out.println("Fecha: " + fecha);
System.out.println("ID Pacielnte: " + idPaciente);
System.out.println("ID Medico: " + idMedico);
System.out.println("Observaciones:\n" + observaciones);
System.out.println("\t---------------");
}
}

Fíjate que en cada clase, les he creado un metodo llamado mostrar() que se encargaría de mostrar por pantalla todos los datos de la clase en cuestión.

Bueno, esta es la parte fácil.
La otra parte, en realidad no es nada difícil, pero si tiene el inconveniente de que requiere mucho código.
Hay que escribir un menu principal, un menu para las opciones del Paciente, Medico e Historial, submenus para crear y modificar Pacientes, Medicos e Historiales...

Repito que no es nada dificil, pero tantas líneas de código, si no se organizan correctamente, tendremos un código enooooorme, muy caótico, dificil de comprender y de mantener.. que solo mirarlo ya nos dará dolor de cabeza.

Y es entonces cuando yo te pregunto: ¿Sabes si hay que ceñirse únicamente a esas clases?
¿O podríamos crear otras clases que nos ayuden a facilitar la tarea?


De hecho, sería lo lógico y lo que cualquier programador haría para encarar este ejercicio.
Podríamos hacer tres nuevas clases, las cuáles cada una se encargaría de la gestión de cada una de las anteriores.
Por ejemplo, una clase llamada GestorPacientes, tendría como atributo un ArrayList                                                                                     donde se guardarían los Pacientes.
Y tendría unos métodos para cada una de las acciones necesarias para gestionar esta base de datos.
Un metodo para dar de alta un nuevo Paciente, otro para mostrar listado de pacientes, otro para modificar, otro para borrar...
De este modo, todo el código necesario para gestionar Pacientes, estaría concentrado en su propia clase y separado de todo el código necesario para gestionar Medicos y de todo el código necesario para gestionar Historiales, los cuáles estarían en sus respectivas clases de Gestion.

La clase GestorPacientes podría ser como la que pongo a continuación. Aunque no está completa, solo incluye los metodos para crear nuevo Paciente y para mostrar todo el listado de pacientes.
Faltarían los metodos para modificar y borrar pacientes.

Clase GestorPacientes
Código: [Seleccionar]
package clinica;

import java.util.ArrayList;
import java.util.Scanner;

public final class GestorPacientes {

private ArrayList<Paciente> pacientes;
private Scanner teclado;

public GestorPacientes() {
pacientes = new ArrayList<Paciente>();
teclado = new Scanner(System.in);
}

/**
* Crea y registra un nuevo paciente.
* @return True si se pudo registrar con éxito el nuevo paciente.
* False si no fue posible registrarlo.
*/
public boolean nuevoPaciente() {
System.out.println("\n\tALTA NUEVO PACIENTE");
System.out.print("Introduzca Identificador: ");
String id = teclado.nextLine();
System.out.print("Nombre: ");
String nombre = teclado.nextLine();
System.out.print("Apellidos: ");
String apellidos = teclado.nextLine();
System.out.print("Genero: ");
String genero = teclado.nextLine();
System.out.print("Edad: ");
int edad = teclado.nextInt();
teclado.nextLine();//Tras leer un int, conviene "limpiar" el stream de entrada, para evitar problemas al querer leer luego datos String
Paciente nuevoPaciente = new Paciente(id, nombre, apellidos, edad, genero);
return pacientes.add(nuevoPaciente);//Devuelve TRUE si se insertó correctamente, FALSE si no se pudo insertar
}

/**
* Lista por pantalla los datos de todos los pacientes registrados.
*/
public void mostrarPacientes() {
for (Paciente p: pacientes)
p.mostrar();
}

}

Si crees que es posible enfocar el ejercicio de esta manera, podemos seguir adelante a partir de aquí.
Intenta completar los dos métodos que faltarían para esta clase y tomandola como ejemplo, intenta escribir las clases GestorMedicos y GestorHistoriales

Fíjate que tienen un segundo atributo, un Scanner para pedir datos por pantalla.
Cada clase tendrá su propio Scanner

He usado un Scanner porque es lo habitual para pedir datos por consola. Si estas acostumbrado a pedir datos al usuario usando otras formas como la clase JOptionPane que muestra pequeñas ventanas de dialogo para que el usuario meta datos, podemos modificarlo.


Insisto en que lo ideal e inteligente sería crear estas tres nuevas clases para separa la gestión de las tres entidades principales.
Crear estas tres nuevas clases no supone escribir más código. La cantidad de código será la misma, solo que de este modo está mejor organizado.
Si no usamos estas tres clases para la gestión, todo este código estará escrito en la clase donde pongamos el metodo main(), con lo cuál será una clases muy sobrecargada de 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

xtnite

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 2
    • Ver Perfil
Re:Ayuda URGENTE
« Respuesta #2 en: 14 de Septiembre 2018, 05:31 »
Primero que todo, la ayuda es increible y lo agradezco bastante, pero en un dato tiene razon, este caso se trabaja con JOptionPane pues estan pidiendo un menu, segundo la parte de Paciente, Medico e Historial estan cubiertos en si el problema mas grande se me presenta en la clase main y en la programacion que se requiere para tener el menu principal y que lleva a cada menu secundario y el codigo para darle funcionalidad a cada operacion, registrar, MODIFICAR y ELIMINAR:

El aplicativo debe mostrar un menú principal con las opciones:

Gestionar Pacientes.
Gestionar Médicos.
Gestionar Historial Clínico.
Salir
Luego al entrar a cada entidad se debe mostrar un submenú con las opciones de la entidad, por ejemplo para Pacientes:

Registrar Pacientes.
Mostrar Pacientes.
Modificar Pacientes.
Eliminar Pacientes.
Atrás
Luego al entrar se debe pedir o mostrar la información según la acción, por ejemplo:

Registrar Pacientes: Pedir los datos de un paciente a registrar.
Mostrar Pacientes: Mostrar todos los pacientes registrados con sus atributos.
Modificar Paciente: Modificar los atributos de un paciente a partir del IdPaciente (Si el idPaciente no existe decir paciente no encontrado.).
Eliminar Paciente: Pedir el IdPaciente y eliminarlo (Si el idPaciente no existe decir paciente no encontrado.).
Atrás

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ayuda URGENTE
« Respuesta #3 en: 15 de Septiembre 2018, 02:08 »
Vale.
Mira, te explico mi propuesta.
Para solucionar el ejercicio, de manera limpia y ordenada, propongo usar 7 clases.

Las 3 clases básicas: Paciente, Medico e HistorialClinico

Otras 3 clases, que se encargarán de gestionar las anteriores: GestorPacientes, GestorMedicos y GestorHistoriales

Y por ultimo, la clase con el metodo main() que mostrará los menus al usuario y según lo que este escoja, llamará a las clases "gestoras" para que hagan lo que el usuario haya solicitado.
Esta clase puede llamarse TestClinica

Bueno, a continuacion pongo las 3 clases básicas. Son las mismas que puse antes, solo he modifiado el metodo mostrar() que ahora muestra los datos en un panel de JOptionPane en lugar mostrarlos por consola.

Paciente
Código: [Seleccionar]
package clinica;

import javax.swing.JOptionPane;

public final class Paciente {

private String id;
private String nombre;
private String apellidos;
private int edad;
private String genero;

public Paciente(String id, String nombre, String apellidos, int edad, String genero) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.edad = edad;
this.genero = genero;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

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

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public int getEdad() {
return edad;
}

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

public String getGenero() {
return genero;
}

public void setGenero(String genero) {
this.genero = genero;
}

/**
* Muestra en un panel todos los datos del Paciente
*/
public void mostrar() {
String mensaje = "ID Paciente: " + id + "\nNombre: " + nombre
+ "\nApellidos: " + apellidos + "\nEdad: " + edad
+ "\nGenero: " + genero;
JOptionPane.showMessageDialog(null, mensaje, "Mostrar Paciente", JOptionPane.INFORMATION_MESSAGE);
}

}

Medico
Código: [Seleccionar]
package clinica;

import javax.swing.JOptionPane;

public final class Medico {

private String id;
private String nombre;
private String apellidos;
private String especialidad;

public Medico(String id, String nombre, String apellidos, String especialidad) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.especialidad = especialidad;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getNombre() {
return nombre;
}

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

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

public String getEspecialidad() {
return especialidad;
}

public void setEspecialidad(String especialidad) {
this.especialidad = especialidad;
}

/**
* Muestra por panel todos los datos del Medico
*/
public void mostrar() {
String mensaje = "ID Medico: " + id + "\nNombre: " + nombre
+ "\nApellidos: " + apellidos + "\nEspecialidad: " + especialidad;
JOptionPane.showMessageDialog(null, mensaje, "Mostrar Medico", JOptionPane.INFORMATION_MESSAGE);
}

}

HistorialClinico
Código: [Seleccionar]
package clinica;

import javax.swing.JOptionPane;

public final class HistorialClinico {

private String codigo;
private String fecha;
private String idPaciente;
private String idMedico;
private String observaciones;

public HistorialClinico(String codigo, String fecha, String idPaciente,
String idMedico, String observaciones) {
this.codigo = codigo;
this.fecha = fecha;
this.idPaciente = idPaciente;
this.idMedico = idMedico;
this.observaciones = observaciones;
}

public String getCodigo() {
return codigo;
}

public void setCodigo(String codigo) {
this.codigo = codigo;
}

public String getFecha() {
return fecha;
}

public void setFecha(String fecha) {
this.fecha = fecha;
}

public String getIdPaciente() {
return idPaciente;
}

public void setIdPaciente(String idPaciente) {
this.idPaciente = idPaciente;
}

public String getIdMedico() {
return idMedico;
}

public void setIdMedico(String idMedico) {
this.idMedico = idMedico;
}

public String getObservaciones() {
return observaciones;
}

public void setObservaciones(String observaciones) {
this.observaciones = observaciones;
}

/**
* Muestra por panel todos los datos del Historial Clinico
*/
public void mostrar() {
String mensaje = "Codigo Historial: " + codigo + "\nFecha: " + fecha
+ "\nID Paciente: " + idPaciente + "\nID Medico: " + idMedico
+ "\nObservaciones:\n" + observaciones;
JOptionPane.showMessageDialog(null, mensaje, "Mostrar Medico", JOptionPane.INFORMATION_MESSAGE);
}
}

Ahora vendrían las clases "gestoras", solo he escrito la que gestiona los Pacientes.
Es similar a la que puse en el mensaje anterior, solo que ahora ya no usamos Scanner, sino que usamos la clase JOptionPane para mostrar y pedir datos.
Y además ahora ya si está completa. Tiene los cuatro metodos necesarios para hacer las operaciones que nos solicitan: nuevo Paciente, mostrar listado de pacientes, modificar un paciente y eliminar un paciente.

Te la pongo a continuación. Fíjate que tiene bastante código.
Imagina poner todo ese código, junto con el necesario para gestionar las otras dos clases, junto con el codigo necesario para mostrar menus, más un metodo main(), todo junto en una única clase... sería una locura. Por eso mejor dividir y separar el codigo en más clases.
 Revisala, intenta comprenderla, pregunta lo que no entiendas o que te parezca extraño. Y una vez la tengas clara, intenta escribir tu las clases GestorMedicos y GestorHistoriales
Estas dos clases serán prácticamente idénticas a la que yo he puesto, solo hay que cambiar los datos que se piden y muestran para que sean acordes a los atributos de las clases Medico e HistorialClinico

GestorPacientes
Código: [Seleccionar]
package clinica;

import java.util.ArrayList;

import javax.swing.JOptionPane;

public final class GestorPacientes {

private ArrayList<Paciente> pacientes;

public GestorPacientes() {
pacientes = new ArrayList<Paciente>();
}

/**
* Crea y registra un nuevo paciente.
* @return True si se pudo registrar con éxito el nuevo paciente.
* False si no fue posible registrarlo.
*/
public boolean nuevoPaciente() {
String id = JOptionPane.showInputDialog(null, "Introduzca Identificador:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);
String nombre = JOptionPane.showInputDialog(null, "Nombre:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);
String apellidos = JOptionPane.showInputDialog(null, "Apellidos:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);
String genero = JOptionPane.showInputDialog(null, "Genero:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE);
int edad = 0;
try {
edad = Integer.parseInt(JOptionPane.showInputDialog(null, "Edad:", "Nuevo Paciente", JOptionPane.QUESTION_MESSAGE));
}
catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Solo se admite introducir numeros para la edad\nNo se ha registrado el valor introducido",
"Error", JOptionPane.WARNING_MESSAGE);
}
Paciente nuevoPaciente = new Paciente(id, nombre, apellidos, edad, genero);
return pacientes.add(nuevoPaciente);//Devuelve TRUE si se insertó correctamente, FALSE si no se pudo insertar
}

/**
* Lista por pantalla los datos de todos los pacientes registrados.
*/
public void mostrarPacientes() {
if (pacientes.isEmpty())
JOptionPane.showMessageDialog(null, "No hay Pacientes registrados", "Mostrar Pacientes",
JOptionPane.WARNING_MESSAGE);
else {
for (Paciente p: pacientes)
p.mostrar();
}
}

/**
* Modifica el Paciente que el usuario solicite mediante el ID de Paciente.
* @return True al finalizar la modificacion correctamente.
* False si no se encontró ningun paciente con el ID indicado.
*/
public boolean modificarPaciente() {
String id = JOptionPane.showInputDialog(null, "Introduzca Identificador del paciente a modificar:",
"Modificar Paciente", JOptionPane.QUESTION_MESSAGE);
/*
* Ahora buscaremos el paciente en el ArrayList y si lo encontramos lo referenciaremos
* a otro objeto de la clase Paciente que incialmente tiene valor null.
* Si tras finalizar la búsqueda, este objeto sigue valiendo null significa que no hemos
* encontrado el Paciente que nos han pedido e informaremos al usuario.
*/
Paciente paciente = null;
for (int i = 0; i < pacientes.size(); i++){
if (pacientes.get(i).getId().equals(id)) {
paciente = pacientes.get(i);//Referenciamos a otro nombre de objeto
break;//No hace falta seguir buscando, "rompemos" el bucle for
}
}

if (paciente == null) {
JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n" + id,
"Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
return false;
}
else {
//Comienza el proceso de modificacion
paciente.setId(JOptionPane.showInputDialog(null, "ID actual: " + paciente.getId()
+ "\nIntroduzca nuevo identificador:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE));
paciente.setNombre(JOptionPane.showInputDialog(null, "Nombre actual: " + paciente.getNombre()
+ "\nIntroduzca nuevo nombre:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE));
paciente.setApellidos(JOptionPane.showInputDialog(null, "Apellidos actuales: " + paciente.getApellidos()
+ "\nIntroduzca nuevos apellidos:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE));
paciente.setGenero(JOptionPane.showInputDialog(null, "Genero actual: " + paciente.getGenero()
+ "\nIntroduzca nuevo genero:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE));
try {
paciente.setEdad(Integer.parseInt(JOptionPane.showInputDialog(null, "Edad actual: " + paciente.getEdad()
+ "\nIntroduzca nueva edad:", "Modificar Paciente", JOptionPane.QUESTION_MESSAGE)));
}
catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Solo se admite introducir numeros para la edad\nNo se ha registrado el valor introducido",
"Error", JOptionPane.WARNING_MESSAGE);
}
return true;
}
}

/**
* Elimina el Paciente indicado por el usuario mediante el ID del Paciente.
* @return True si tuvo éxito la eliminacion.
* False si no se encontró el Paciente indicado.
*/
public boolean borrarPaciente() {
String id = JOptionPane.showInputDialog(null, "Introduzca Identificador del paciente a borrar:",
"Borrar Paciente", JOptionPane.QUESTION_MESSAGE);

Paciente paciente = null;
for (int i = 0; i < pacientes.size(); i++){
if (pacientes.get(i).getId().equals(id))
paciente = pacientes.remove(i);//Al eliminar el objeto, el ArrayList nos lo devuelve y lo recogemos en "paciente"
}

if (paciente == null) {
JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n" + id,
"Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
return false;
}
else {
JOptionPane.showMessageDialog(null, "Se elimino el paciente con ID:\n" + id,
"Paciente Eliminado", JOptionPane.INFORMATION_MESSAGE);
return true;
}
}

}


Por último, te dejo aquí una primera versión de la clase TestClinica.
Esta es una versión puramente de prueba, no hay menus todavía ni nada.
Es solo para que veas en funcionamiento la clase GestorPacientes
Cuando la ejecutes, lo que hace es:
- ofrece registrar dos pacientes nuevos.
- muestra los pacientes registrados.
- ofrece modificar un paciente.
- vuelve a mostrar los pacientes registrados, para que se vea la modificacion.
- ofrece eliminar un paciente.
- muestra una vez mas los pacientes registrados, para verificar que se ha eliminado el paciente indicado.

TestClinica
Código: [Seleccionar]
package clinica;

public final class TestClinica {

static GestorPacientes pacientes = new GestorPacientes();

public static void main(String[] args) {

pacientes.nuevoPaciente();
pacientes.nuevoPaciente();
pacientes.mostrarPacientes();
pacientes.modificarPaciente();
pacientes.mostrarPacientes();
pacientes.borrarPaciente();
pacientes.mostrarPacientes();

}

}

Cuando tengamos las clases "gestoras" terminadas, daremos forma a la clase TestClinica para que ya si muestre menus y podamos gestionar todo.
Pero esto lo dejamos para el final.
« Última modificación: 17 de Febrero 2022, 17:59 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

EmethP

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Kabuto, buenas tardes.

Yo tengo el mismo problema con el ejercicio solo que el mio es un poco mas sencillo. Tomando como base lo que compartiste, podrias ayudarme con la clase que despliega menus?

Te agradezco de antemano.

Estos son los requerimientos de mi ejercicio:

El producto final será un programa que simulará un sistema de administración de citas con las siguientes funcionalidades:

Dar de alta doctores: se deberán poder dar de alta los doctores del consultorio médico, los datos básicos serán:

• Identificador único.
• Nombre completo.
• Especialidad.

Dar de alta pacientes: se deberán poder registrar los pacientes que acudan al consultorio médico, los datos básicos serán:

• Identificador único.
• Nombre completo.

Crear una cita con fecha y hora: se deberán poder crear múltiples citas, los datos básicos serán:

• Identificador único.
• Fecha y hora de la cita.
• Motivo de la cita.

Relacionar una cita con un doctor y un paciente: cada una de las citas creadas deberá estar relacionada con un doctor y un paciente.

Tener control de acceso mediante administradores: solo ciertos usuarios podrán acceder al sistema mediante un identificador y una contraseña.

Toda la información deberá ser almacenada en archivos de texto plano con formato CSV, o en su defecto utilizar algún formato más avanzado como JSON o XML.
« Última modificación: 08 de Octubre 2021, 21:53 por EmethP »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Hola EmethP.

Échale un ojo a este tema del año pasado donde con otro forero resolvimos exactamente el mismo ejercicio que propones.

Mira a ver si te resulta útil, si hay cosas que prefieres cambiar, si hay cosas que no entiendes del todo..., sea lo que sea, consúltalo y lo vemos.

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

EmethP

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 6
    • Ver Perfil
Hola Kabuto,

Muchas gracias, le dare una checada y si hay algo que no entiendo te busco por ese tema.

Te agradezco de antemano.

Un saludo

moniVeme

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Hola Kabuto:
Estos ejercicios son similares al mío, te explico como esta conformada la idea del programa. Se requiere que un doctor tenga acceso por medio de una contraseña a un menú donde se despliegan las siguientes opciones:
1. Agregar nuevo Paciente
2. Agendar nueva cita(metodo de clase Cita)
3. Modificar cita(metodo de la clase Cita)
4. Cancelar cita(metodo de la clase Cita)
5. Salir
      Agregar nuevo paciente
Aquí tiene como atributos:
private int id=identificador,
public nom=nombre, ed=edad, dir=domicilio, int telPac=telefono, int celPac=celular de referencia, corr_ele=correo electrónico
     
      Agregar nueva cita
En esta parte va ligada con el nuevo paciente y tendrá como atributos
public String hora, String fecha
   
       Modificar cita
Por medio del identificador del paciente, se mostraran sus datos añadiendo la fecha y hora de la cita para después realizar su cambio.

        Cancelar cita
Sería la misma idea de "Modificar cita", sin embargo, en lugar de realizar el cambio de fecha y hora se deberá cancelar la cita.



Para todo esto me estoy guiando en las clases de este ejercicio, por lo que ya tengo las clases datosPacientes, gestionPacientes y estructura menu.
Sin embargo, en lugar de mostrar todos los datos de los pacientes, quiero con solo ingresar el ID de un paciente me muestre sus datos sin necesidad de mostrar todos.


« Última modificación: 06 de Noviembre 2021, 01:46 por moniVeme »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Hola.
Puedes crear un nuevo método basándote en borrarPaciente() de la clase GestorPacientes

Fíjate que en ese método pedimos un ID para saber que paciente queremos borrar:
Citar
   public boolean borrarPaciente() {
      String id = JOptionPane.showInputDialog(null, "Introduzca Identificador del paciente a borrar:",
            "Borrar Paciente", JOptionPane.QUESTION_MESSAGE);
      
      Paciente paciente = null;
      for (int i = 0; i < pacientes.size(); i++){
         if (pacientes.get(i).getId().equals(id))
            paciente = pacientes.remove(i);
//Al eliminar el objeto, el ArrayList nos lo devuelve y lo recogemos en "paciente"
      }
      
      if (paciente == null) {
         JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n" + id,
               "Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
         return false;
      }
      else {
         JOptionPane.showMessageDialog(null, "Se elimino el paciente con ID:\n" + id,
               "Paciente Eliminado", JOptionPane.INFORMATION_MESSAGE);
         return false;
      }
   }

Pues se puede modificar para que, en lugar de eliminar al paciente, lo que haga sea mostrar en pantalla sus datos.
O bien retornar el objeto Paciente encontrado para recibirlo en el programa principal y mostrarlos desde ahí.

Siempre controlando si se encuentra o no el Paciente solicitado.

Inténtalo, y si te atascas, comparte tu código y miramos de resolverlo.

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

moniVeme

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Gracias Kabuto, deja lo checo, le trato de dar el cambio y le platico qué tal me fue.
Sinceramente me atasque en la línea de la clase gestionPaciente:
-public boolean mostrarPaciente(){
-paciente=pacientes.; En esta linea en particular me aparece tres opciones: remove(i), get(i) y set(i)
Te adjunto la clase datosPacientes y gestionPacientes
Código: [Seleccionar]
public final class datosPacientes {
   public String nom, telPac,celPac,corr_ele,dir;
   public int ed;
   private String id;
        public datosPacientes(String nom, String telPac, String celPac,
                String corr_ele, String dir, String id, int ed){
            this.id=id;
            this.nom=nom;
            this.ed=ed;
            this.dir=dir;
            this.telPac=telPac;
            this.celPac=celPac;
            this.corr_ele=corr_ele;
        }
       
        public String getID(){
            return id;
        }
        public void setID(String id){
            this.id=id;
        }
        public void mostrarDatos(String id){
            System.out.println("\n\t---------------");
            System.out.println("ID Paciente: "+id);
            System.out.println("Nombre: "+nom);
            System.out.println("Edad: "+ed+" años");
            System.out.println("Domicilio: "+dir);
            System.out.println("Telefóno: "+telPac);
            System.out.println("Celular : "+celPac);
            System.out.println("Correo electrónico: "+corr_ele);
            System.out.println("\t---------------");
        }     
}
Clase gestionPacientes
Código: [Seleccionar]
import java.util.*;
import javax.swing.JOptionPane;
public final class gestionPaciente {
    private ArrayList<datosPacientes>pacientes;
    private Scanner leer;
        public gestionPaciente(){
            pacientes=new ArrayList<datosPacientes>();
            leer=new Scanner(System.in);
        }
        public boolean nuevoPaciente() {
            System.out.println("\n\t NUEVO PACIENTE");
            System.out.println("Introduzca ID: ");
            String id=leer.next();
            System.out.println("Ingrese el nombre: ");
            String nom=leer.next();
            System.out.println("Ingrese el domicilio: ");
            String dir=leer.next();
            System.out.println("Ingrese el número de telefono: ");
            String telPac=leer.next();
            System.out.println("Ingrese el número celular: ");
            String celPac=leer.nextLine();
            System.out.println("Ingrese el correo electrónico: ");
            String corr_ele=leer.nextLine();
            System.out.println("Ingrese la edad: ");
            int ed=leer.nextInt();
            leer.nextLine();
            datosPacientes nuevoPaciente =new datosPacientes( nom, telPac, celPac,
                 corr_ele,  dir,  id,  ed);
            return pacientes.add(nuevoPaciente);
        }
        public boolean mostrarPaciente(){
            String id=JOptionPane.showInputDialog(null,"Introduzca identificador del paciente para mostrar datos: ",
                    "Mostrar datos del paciente",JOptionPane.QUESTION_MESSAGE);
            datosPacientes paciente=null;
            for (int i=0;i<pacientes.size();i++){
                if(pacientes.get(i).getID().equals(id)){
                    paciente=pacientes.get(i);
                }
            }
            if(paciente==null){
                JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n"+id,
                        "Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
                return false;
            } 
        }
}
« Última modificación: 06 de Noviembre 2021, 23:16 por moniVeme »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
get() te proporciona el objeto., ya solo tendrías que llamar al método mostrarDatos() de la clase datosPaciente. Por cierto, este método no necesita recibir ningún String id entre paréntesis, porque lo que hace es mostrar el valor de los atributos de ese objeto en concreto.
Ni necesita, ni puede.., localizar otro objeto por el id, solo tiene acceso al datosPaciente desde el que se le invoca

Citar
        public void mostrarDatos(String id){//No necesita recibir nada por paréntesis
            System.out.println("\n\t---------------");
            System.out.println("ID Paciente: "+id);
            System.out.println("Nombre: "+nom);
            System.out.println("Edad: "+ed+" años");
            System.out.println("Domicilio: "+dir);
            System.out.println("Telefóno: "+telPac);
            System.out.println("Celular : "+celPac);
            System.out.println("Correo electrónico: "+corr_ele);
            System.out.println("\t---------------");
        }

Citar
        public boolean mostrarPaciente(){
            String id=JOptionPane.showInputDialog(null,"Introduzca identificador del paciente para mostrar datos: ",
                    "Mostrar datos del paciente",JOptionPane.QUESTION_MESSAGE);
            datosPacientes paciente=null;
            for (int i=0;i<pacientes.size();i++){
                if(pacientes.get(i).getID().equals(id)){
                    paciente=pacientes.get(i);
                    paciente.mostrarDatos();//Mostramos datos en pantalla
                }
            }
            if(paciente==null){
                JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n"+id,
                        "Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
                return false;
            }
        }


Con esto creo que funcionaría.
Ya nos contarás.

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

moniVeme

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Hola de nuevo, el código de la gestión pacientes funciono bien, intente hacer lo mismo creando una claseCita y gestionCitas. Quería heredar la gestionPacientes a la gestionCitas o a la claseCita por requisito del proyecto, así que intente heredar la gestionPacientes a gestionCitas, pues al momento de agregar una nueva cita se requerirán datos del paciente de la misma manera que los metodos "modificarCita" y "eliminarCita".
Adjunto los códigos claseCita y gestionCitas...
Clase Cita
Código: [Seleccionar]
import java.util.*;
public class claseCita   {
    public String hora,mes,dia,anio;
    private datosPacientes pac;
        public claseCita(String hora, String dia, String mes, String anio){
            this.hora=hora;
            this.dia=dia;
            this.mes=mes;
            this.anio=anio;
        }
       
        public String getHora(){
            return hora;
        }
        public void setHora(){
           this.hora=hora;
        }
        public String getDia(){
            return dia;
        }
        public void setDia(){
           this.dia=dia;
        }
        public String getMes(){
            return mes;
        }
        public void setMes(){
           this.mes=mes;
        }
        public String getAño(){
            return anio=anio;
        }
        public void setAño(){
           this.anio=anio;
        }
       
        public void mostrarDatos(){
            System.out.println("\n\t---------------");
            System.out.println("ID Paciente: "+pac);
            System.out.println("Fecha: ");
            System.out.println(dia+"/"+mes+"/"+anio);
            System.out.println("Hora: ");
            System.out.println(hora);
            System.out.println("\t---------------");
        }
}

gestionCitas
Código: [Seleccionar]
import java.util.*;
import javax.swing.JOptionPane;
public class gestionCitas extends gestionPaciente {
    private ArrayList<claseCita>citas;
    private Scanner leer;
        public gestionCitas(){
            citas=new ArrayList<claseCita>();
            leer=new Scanner(System.in);
            gestionPaciente pac=new gestionPaciente();
        }   
        public boolean nuevaCita(){
                System.out.println("\n\t NUEVO CITA");
                String id=JOptionPane.showInputDialog(null,"Introduzca identificador del paciente para mostrar datos: ",
                    "Mostrar datos del paciente",JOptionPane.QUESTION_MESSAGE);
                datosPacientes paciente=null;
                        for (int i=0;i<pacientes.size();i++){
                            if(pacientes.get(i).getID().equals(id)){
                                 paciente=pacientes.get(i);
                                 paciente.mostrarDatos();
                        }if(paciente==null){
                             JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n"+id,
                                "Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
                        } 
                System.out.println("Ingresa el día: ");
                String dia=leer.nextLine();
                System.out.println("Ingresa el mes: ");
                String mes=leer.nextLine();
                System.out.println("Ingresa el año(los últimos dos dígitos): ");
                String año=leer.nextLine();
                System.out.println("Ingresa hora: ");
                String hora=leer.nextLine();
                claseCita nuevaCita= new claseCita(hora,dia,mes,año);
                return citas.add(nuevaCita);
            }
            public boolean modificarDatos(){
                String id=JOptionPane.showInputDialog(null,"Introduzca identificador del paciente para mostrar datos: ",
                    "Mostrar datos del paciente",JOptionPane.QUESTION_MESSAGE);
                datosPacientes paciente=null;
                        for (int i=0;i<pacientes.size();i++){
                            if(pacientes.get(i).getID().equals(id)){
                                 paciente=pacientes.get(i);
                                 break;
                        }if(paciente==null){
                             JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n"+id,
                                "Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
                             return false;
                        }else{
                           
                     }                       
            }   
        }
}

Saludos.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
No tengo claro que la herencia sea lo más correcto.

Hay que tener claro lo que implica "heredar".
Cuando decimos que la clase Perro hereda de Animal, estamos diciendo que un perro es un animal.
Y es cierto.

Si decimos que la clase Empleado hereda de Persona, estamos diciendo que un empleado es una persona.
Y es cierto.

Si decimos que la clase GestionCitas hereda de GestionPaciente, estamos diciendo que un gestor de citas es un gestor de pacientes.
Pero no creo que eso sea cierto.
Son cosas distintas, puede existir una relación entre ellas, pero no de herencia.

Lo que se desea es que al gestionar una cita con gestionCitas, tengamos rápido acceso a los pacientes creados en gestionPaciente.
Vale, pero porque hagamos una herencia, no vamos a tener acceso a esos pacientes que pertenecen a otro objeto.

En el programa, hay un objeto gestionPaciente que tendrá unos pacientes creados.
Pero cuando tu creas un objeto gestionCitas, aunque le des herencia a gestionPaciente, en realidad estarás creando un nuevo gestor de Pacientes, que no tiene los pacientes que se hayan creado en el otro objeto gestor de pacientes.
Al hacer herencia, gestionCitas ahora tendrá su propio ArrayList de pacientes, e insisto en que será totalmente ajeno al "otro" ArrayList del otro gestor de pacientes.

Entonces, yo personalmente no haría una herencia.
Si quiero que el gestor de citas tenga una relación directa con el gestor de pacientes, lo que haría sería colocarle un atributo gestionPacientes y pasarle por el constructor una referencia al objeto gestionPacientes que habremos construido en el programa principal.
No sería una relación de herencia, sino una relación "de inclusión".

Citar
public class gestionCitas {
    private gestionPacientes pacientes;
    private ArrayList<claseCita>citas;
    private Scanner leer;
        public gestionCitas(gestionPacientes paci){ //Constructor recibe referencia
            pacientes  = paci; //El gestor de pacientes, queda aquí referenciado
            citas=new ArrayList<claseCita>();
            leer=new Scanner(System.in);
            gestionPaciente pac=new gestionPaciente();
        }

Esto implica que en el programa principal, creare los dos objetos gestores, y uno recibirá al otro por su constructor, para que así queden relacionados.

Citar
public final class TestClinica {
   
   static gestionPacientes gestorPaci = new gestionPacientes();
   static gestionCitas gestorCitas = new gestionCitas(gestorPaci); //Citas recibe referencia de pacientes

   public static void main(String[] args) {
      

   }

De esta manera, hay un único gestor de pacientes, pero tiene dos referencias apuntando a él, la del programa principal y el atributo que hemos puesto en el gestor de citas.
De esta forma, el gestor de citas tiene acceso directo a los pacientes.
Y no es necesaria hacer ninguna herencia.

Ahora bien, dicho esto, si el enunciado exige hacerlo por herencia, pues se puede hacer.
Pero para que funcione bien, el programa principal solamente ha de tener un objeto de gestor de citas. Nada más.

Citar
public final class TestClinica {
   
   static gestionCitas gestorCitas = new gestionCitas();

   public static void main(String[] args) {
      

   }

Pero entonces, ¿Dónde están los pacientes?¿Quién los gestiona?

Bueno, si hacemos herencia, estamos diciendo que un gestor de citas, es un gestor de pacientes.....
Por lo tanto, el gestor de citas será quien se encargue de todo, de gestionar las citas, y también los pacientes.
Al hacer herencia, recibe un ArrayList donde insertar objetos de la clase Paciente, y recibe también todos los métodos necesarios para gestionarlos.

Solo habría que prestar atención a dos cosas.
Una, asegurarnos con la instrucción super() de que al construir un gestor de citas, se construye el gestor de pacientes.
No es obligatorio poner super(), pero siempre es mejor ponerlo, aunque solo sea para recalcar que existe una relación de herencia.

Citar
public class gestionCitas extends gestionPaciente {
    private ArrayList<claseCita>citas;
    private Scanner leer;
        public gestionCitas(){
            super(); //Nos aseguramos de que primero se construye la clase madre, o sea,  el gestor de pacientes
            citas=new ArrayList<claseCita>();
            leer=new Scanner(System.in);
        }

Y lo segundo, es irnos a la clase gestionPacientes y cambiar la visibilidad de su ArrayList, de private a protected.
Citar
public final class gestionPaciente {
    protected ArrayList<datosPacientes>pacientes;
    private Scanner leer;
        public gestionPaciente(){
            pacientes=new ArrayList<datosPacientes>();
            leer=new Scanner(System.in);
        }
De esta manera, sigue siendo privado para que clases ajenas no puedan meterle mano, pero si es visible para sus clases hijas, en este caso gestionCitas, quien sí necesita acceso al ArrayList de pacientes.

Ahora la clase gestionCitas, debería poder nombrar directamente al ArrayList de pacientes, como si fuera suyo (de hecho, sí lo es).
Si no ponemos protected, creo que las llamadas al ArrayList que marco en azul a continuación, no habrían funcionado.
Citar
public class gestionCitas extends gestionPaciente {
    private ArrayList<claseCita>citas;
    private Scanner leer;
        public gestionCitas(){
            super();
            citas=new ArrayList<claseCita>();
            leer=new Scanner(System.in);
        }   
        public boolean nuevaCita(){
                System.out.println("\n\t NUEVO CITA");
                String id=JOptionPane.showInputDialog(null,"Introduzca identificador del paciente para mostrar datos: ",
                    "Mostrar datos del paciente",JOptionPane.QUESTION_MESSAGE);
                datosPacientes paciente=null;
                        for (int i=0;i<pacientes.size();i++){
                            if(pacientes.get(i).getID().equals(id)){
                                 paciente=pacientes.get(i);
                                 paciente.mostrarDatos();
                        }


Y de esta manera, el gestor de citas , será también el gestor de pacientes, dos en uno.
Así que si queremos crear un paciente, el gestor de citas será quien se encargue porque dispone de los métodos necesarios.

Citar
public final class TestClinica {
   
   static gestionCitas gestorCitas = new gestionCitas();

   public static void main(String[] args) {
      
      gestorCitas().nuevoPaciente();//El gestor de citas puede crear pacientes, porque es un gestor de pacientes
   }


Espero que se haya entendido la explicación, puede ser un poco liosa la filosofía de la programación orientada a objetos.

Lo que se pide se puede resolver con una relación de herencia, pero si nos ponemos un poco filosóficos, no sería la forma correcta.

Si quiero modelar un coche con su motor y tal.
Y digo:
Código: [Seleccionar]
public Coche extends Motor {

    public Coche() {
        super();
    }

}
Sí, he conseguido que el coche tenga acceso a un motor, pero lo que estoy diciendo es que un Coche es un Motor..., y eso es una burrada.

Un Coche, tiene un Motor, lo correcto sería una relación de inclusión: Coche incluye a Motor (pero no son lo mismo)

Código: [Seleccionar]
public Coche {

    Motor motor;

    public Coche() {
        motor = new Motor();
    }
}

A efectos prácticos puede parecer lo mismo una relación que la otra...., pero no, no son lo mismo... y de hecho en según que escenarios elegir la relación equivocada puede traer complicaciones no deseadas.

Pero bueno, si el enunciado manda herencia, pues herencia...  ::)
« Última modificación: 11 de Noviembre 2021, 20:05 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

moniVeme

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Hola, muchas gracias por hacerme retroalimentar, tuve que platicar con la profesora para que me diera oportunidad de poner la herencia en otro lugar; ya tengo el proyecto completo, sin embargo al momento de ejecutar el caso 2, cuando se selecciona la opción 'N', no muestra más información; en el caso 3 y 4 no muestran información y en el caso 5 no muestra información, estuve revisando cuáles podían ser los motivos pero no veo nada malo. ¿Me podría revisar e indicar mis errores por favor?
Clase Principal
Código: [Seleccionar]
import java.util.Scanner;

public class HelpingTheDentist {
    public static void main(String[] args) {
        Scanner leer=new Scanner(System.in);
        String contra="1234567",con;
       
        estructuraMenu menu=new estructuraMenu();
        do{
        System.out.println("Hola, ingrese la contraseña(cédula profesional) por favor");
        con=leer.next();
       
        }while(! con.equals(contra));
        menu.estructuraMenu();
       
  }
}
Estructura Menú
Código: [Seleccionar]
import java.util.*;

public class estructuraMenu {
    void estructuraMenu(){
        Scanner leer=new Scanner(System.in);
        gestionPaciente datos=new gestionPaciente();
        gestionHorario info = new gestionHorario(datos);
      int op;
      boolean Salir=false;
        System.out.println("Menú de acciones");
        System.out.println("1. Registrar nuevo paciente");
        System.out.println("2. Agendar Cita (Ya sea nuevo o no el paciente)");
        System.out.println("3. Mostrar datos del Paciente");
        System.out.println("4. Mostrar datos de la Cita");
        System.out.println("4. Eliminar cita");
        System.out.println("6. Salir");
       while(!Salir){
        try {
            System.out.println("¿Cuál acción desea realizar?");
            op=leer.nextInt();
             switch (op){
                 case 1:
                     datos.nuevo();
                     break;
                 case 2:
                     info.nuevo();
                     break;
                 case 3:     
                    datos.mostrar();
                     break;
                 case 4:             
                    info.mostrar();
                     break;
                 case 5:             
                    info.eliminar();
                     break;
                 case 6:
                     Salir=true;
                     break;
                 default:
                     System.out.println("Debe elegir solo números entre 1 y 5");
             }
       
        }catch (InputMismatchException e){
            System.out.println("Valor no reconocido, se debe ingresar un número");
            leer.next();
        }
        }
    }
}
Persona
Código: [Seleccionar]
public class Persona {
    public String nom, tel,cel,corr_ele,dir;
   public int ed;
}
datosPacientes
Código: [Seleccionar]
public class datosPacientes extends Persona {
   protected String id;
        public datosPacientes(String nom, String tel, String cel,
                String corr_ele, String dir, String id, int ed){
            this.id=id;
            this.nom=nom;
            this.ed=ed;
            this.dir=dir;
            this.tel=tel;
            this.cel=cel;
            this.corr_ele=corr_ele;
        }
       
        public String getID(){
            return id;
        }
        public void setID(String id){
            this.id=id;
        }
        public void mostrarDatos(){
            System.out.println("\n\t---------------");
            System.out.println("ID Paciente: "+id);
            System.out.println("Nombre: "+nom);
            System.out.println("Edad: "+ed+" años");
            System.out.println("Domicilio: "+dir);
            System.out.println("Telefóno: "+tel);
            System.out.println("Celular : "+cel);
            System.out.println("Correo electrónico: "+corr_ele);
            System.out.println("\t---------------");
        }     
}
gestionPaciente
Código: [Seleccionar]
import java.util.*;
import javax.swing.JOptionPane;
public final class gestionPaciente  {
    protected ArrayList<datosPacientes>pacientes;
    private Scanner leer;
        public gestionPaciente(){
            pacientes=new ArrayList<datosPacientes>();
            leer=new Scanner(System.in);
        }
        public boolean nuevo() {
            System.out.println("\n\t NUEVO PACIENTE");
            System.out.println("Introduzca ID: ");
            String id=leer.next();
            System.out.println("Ingrese el nombre: ");
            String nom=leer.next();
            leer.nextLine();
            System.out.println("Ingrese el domicilio: ");
            String dir=leer.next();
            leer.nextLine();
            System.out.println("Ingrese el número de telefono: ");
            String telPac=leer.next();
            leer.nextLine();
            System.out.println("Ingrese el número celular: ");
            String celPac=leer.next();
            System.out.println("Ingrese el correo electrónico: ");
            String corr_ele=leer.next();
            System.out.println("Ingrese la edad: ");
            int ed=leer.nextInt();
            leer.nextLine();
            datosPacientes nuevoPaciente =new datosPacientes( nom, telPac, celPac,
                 corr_ele,  dir,  id,  ed);
            return pacientes.add(nuevoPaciente);
        }
        public boolean mostrar(){
            String id=JOptionPane.showInputDialog(null,"Introduzca identificador del paciente para mostrar datos: ",
                    "Mostrar datos del paciente",JOptionPane.QUESTION_MESSAGE);
            datosPacientes paciente=null;
            for (int i=0;i<pacientes.size();i++){
                if(pacientes.get(i).getID().equals(id)){
                    paciente=pacientes.get(i);
                    paciente.mostrarDatos();
                }
            }
            if(paciente==null){
                JOptionPane.showMessageDialog(null, "No se encuentra Paciente con el ID:\n"+id,
                        "Paciente no encontrado", JOptionPane.WARNING_MESSAGE);
            } 
        return false;
        }
        public datosPacientes getPac(String id){
            for (datosPacientes pac:pacientes){
                if (pac.getID().equals(id)){
                    return pac;
                }
            }
            return null;
        }
}
Horarios
Código: [Seleccionar]
public class Horarios {
    private String hora,fecha,cita;
   // private gestionPaciente paciente;
    public Horarios(String fecha, String hora, String cita){
        this.hora=hora;
        this.fecha=fecha;
        this.cita=cita;
        //this.paciente=paciente;
    }
    String getFecha(){
        return fecha;
    }
    void setfecha(){
        this.fecha=fecha;
    }
    String getHora(){
        return hora;
    }
    void setHora(){
        this.hora=hora;
    }
   String getCita(){
        return cita;
    }
    void setCita(){
        this.cita=cita;
    }
   // gestionPaciente getPac(){
      //  return paciente;
    //}
    //void setPac(){
      //  this.paciente=paciente;
    //}
    public void mostrar(){
            System.out.println("\n\t---------------");
            System.out.println("HORARIO");
            System.out.println("ID Cita: ");
            System.out.println(cita);
            System.out.println("Fecha: ");
            System.out.println(fecha);
            System.out.println("Hora: "+hora);
            System.out.println("\t---------------");
    }
}
gestionHorario
Código: [Seleccionar]
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class gestionHorario{
    private ArrayList<Horarios>horas;
    private Scanner leer;
    private gestionPaciente pacientes;
        public gestionHorario(gestionPaciente paci){
            horas=new ArrayList<Horarios>();
            leer=new Scanner(System.in);
            pacientes= paci;
        }
    public boolean nuevo() {
        char op;
     System.out.println("¿Es nuevo el paciente?(S/N)");   
        do{
            op=leer.next().charAt(0);
                if((op!='S')&&(op!='N')){
                   System.out.println("Vuelva a introducir el dato correcto.");
                }
                    if(op=='S'){
                        System.out.println("Introduzca el ID de la cita");
                        String cita=leer.next();
                        leer.nextLine();
                        pacientes.nuevo();
                        System.out.println("Introduzca la hora:");
                        String hora=leer.nextLine();
                        System.out.println("Introduzca la fecha (dd/mm/aa)");
                        String fecha=leer.nextLine();
                        Horarios nuevo=new Horarios(cita,hora,fecha);
                        return horas.add(nuevo);
                    }if(op=='N'){
                        System.out.println("Introduzca el ID de la cita");
                        String cita=leer.nextLine();
                        System.out.println("Inroduce el ID del paciente");
                        String id=leer.nextLine();
                        pacientes.mostrar();
                        System.out.println("Introduzca la hora:");
                        String hora=leer.nextLine();
                        System.out.println("Introduzca la fecha (dd/mm/aa)");
                        String fecha=leer.nextLine();
                         Horarios nuevo=new Horarios(cita,hora,fecha);
                        return horas.add(nuevo);
                    }
                   
        }while((op!='S')&&(op!='N'));
        return horas.add(null);
    }
    public boolean mostrar(){
         String cita=JOptionPane.showInputDialog(null,"Introduzca identificador de la cita para mostar datos: ",
                   "Mostrar datos de la cita",JOptionPane.QUESTION_MESSAGE);
             Horarios citas=null;
                    for (int i=0;i<horas.size();i++){
                        if(horas.get(i).getCita().equals(cita)){
                                citas=horas.get(i);
                                citas.mostrar();
                        }
                    }
                        if(citas==null){
                            JOptionPane.showMessageDialog(null, "No se encuentra ninguna cita con el ID:\n"+cita,
                                 "Cita no encontrada", JOptionPane.WARNING_MESSAGE);
                        } 
                        return false;
     }
     public boolean eliminar(){
         String cita=JOptionPane.showInputDialog(null,"Introduzca identificador de la cita para mostar datos: ",
                    "Mostrar datos de la cita",JOptionPane.QUESTION_MESSAGE);
             Horarios citas=null;
                for (int i=0;i<horas.size();i++){
                    if(horas.get(i).getCita().equals(cita)){
                        citas=horas.remove(i);
                    }
                }
                if(citas==null){
                    JOptionPane.showMessageDialog(null, "No se encuentra ninguna cita con el ID:\n"+cita,
                        "Cita no encontrada", JOptionPane.WARNING_MESSAGE);
                    return false;
                }else {
                    JOptionPane.showMessageDialog(null, "Se elimino el paciente con ID:\n" + cita,
                        "Paciente Eliminado", JOptionPane.INFORMATION_MESSAGE);
                    return false;
                }
     }   
}   


Aquí están los códigos del programa, de antemano gracias :)

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
A ver, alguna pequeña mejora.
El menú mejor meterlo dentro del bucle while, así se muestra siempre después de cada acción.
De lo contrario, solo se muestra una vez

Citar
   void estructuraMenu(){
      Scanner leer=new Scanner(System.in);
      gestionPaciente datos=new gestionPaciente();
      gestionHorario info = new gestionHorario(datos);
      int op;
      boolean Salir=false;
      
      while(!Salir){
         System.out.println("\nMenú de acciones");
         System.out.println("1. Registrar nuevo paciente");
         System.out.println("2. Agendar Cita (Ya sea nuevo o no el paciente)");
         System.out.println("3. Mostrar datos del Paciente");
         System.out.println("4. Mostrar datos de la Cita");
         System.out.println("4. Eliminar cita");
         System.out.println("6. Salir");

         try {
            System.out.println("¿Cuál acción desea realizar?");
            op=leer.nextInt();
            switch (op){

Sobre el caso 2.
Yo lo que detecto al indicar 'N' es que el Scanner se salta la lectura de la cita;
Citar
if(op=='N'){
            System.out.println("Introduzca el ID de la cita");
            String cita=leer.nextLine();

Y eso se debe a que anteriormente, se ha hecho una lectura con next()
Citar
public boolean nuevo() {
      char op;
      System.out.println("¿Es nuevo el paciente?(S/N)");   
      do{
         op=leer.next().charAt(0);


next() debería usarse solo en caso concretos (yo de hecho no lo uso prácticamente nunca), porque no hace una lectura "completa" de lo que ha entrado por teclado.
next() devuelve lo "siguiente" que se pueda considerar una palabra o una letra, pero deja en el buffer de entrada cosas como el caracter "retorno de carro", que es un carácter especial que generamos cada vez que pulsamos la tecla enter/intro para introducir un dato.
¿Problema?
Que si luego queremos hacer una lectura con nextLine(), este método si retorna TODO lo que se encuentre en el buffer. Entonces, si al momento de invocarlo se encuentra con que el buffer de entrada ya tiene un carácter de "retorno de carro" disponible, entonces nextLine() piensa que el usuario ya ha terminado de introducir el dato, pero no es cierto.

Por eso, al menos a mi me ocurre, se me salta la lectura del ID de la cita y pasa a la del paciente, sin que yo haya podido teclear nada.

Citar
Vuelva a introducir el dato correcto.
n
Vuelva a introducir el dato correcto.
N
Introduzca el ID de la cita
Inroduce el ID del paciente
2
Esto se soluciona haciendo siempre lecturas con nextLine(), así las lecturas son "completas" y no se dejan restos que luego puedan falsear lecturas posteriores.

A partir de ahí, al introducir id de paciente, nos encontramos con un error de metodología.
Pedimos el ID, pero no hacemos absolutamente nada con ese dato. Lo siguiente que se hace es llamar al método mostrar() del gestor de pacientes, que lo que hace es pedir de nuevo el id mediante un JOptionPane.
Citar
         if(op=='N'){
            System.out.println("Introduzca el ID de la cita");
            String cita=leer.nextLine();
            System.out.println("Inroduce el ID del paciente");
            String id=leer.nextLine();
            pacientes.mostrar();

Por cierto, según el programa que estés usando para ejecutar el código, puede que no veas el JOptionPane porque se queda por detrás del programa. Esto ocurre también con los otros case del switch.

A mí me pasa usando Eclipse, parece que al llegar a ese punto la aplicación no está haciendo nada, pero en realidad ha salido un JOptionPane que para verlo tengo que minimizar Eclipse.

Pero supongo que no necesitamos que nos muestren ningún paciente, si no que nos retornen uno a partir del ID.

Y con el paciente y los otros datos, debemos crear una cita, bueno, lo que tu has llamado como clase Horarios.
Pero veo que en esta clase (donde por cierto los métodos setter están mal), has comentado las líneas relativas al paciente:
Citar
public class Horarios {
   
   private String hora,fecha,cita;
   // private gestionPaciente paciente;
   
   public Horarios(String fecha, String hora, String cita){
      this.hora=hora;
      this.fecha=fecha;
      this.cita=cita;
      //this.paciente=paciente;
   }
   
   String getFecha(){
      return fecha;
   }
   void setfecha(){
      this.fecha=fecha;
   }
   String getHora(){
      return hora;
   }
   void setHora(){
      this.hora=hora;
   }
   String getCita(){
      return cita;
   }
   void setCita(){
      this.cita=cita;
   }
   // gestionPaciente getPac(){
   //  return paciente;
   //}
   //void setPac(){
   //  this.paciente=paciente;
   //
}
   public void mostrar(){
      System.out.println("\n\t---------------");
      System.out.println("HORARIO");
      System.out.println("ID Cita: ");
      System.out.println(cita);
      System.out.println("Fecha: ");
      System.out.println(fecha);
      System.out.println("Hora: "+hora);
      System.out.println("\t---------------");
   }
}

¿Por qué? ¿No se debe incluir al paciente en la cita?
¿Cómo sabemos luego a cuál paciente corresponde cada cita agendada?

Creo que lo correcto es que sí esté incluido, pero no un gestionPaciente, si no un datosPacientes, que es la clase que representa a un paciente en concreto.

Quedaría así la clase Horarios(con setters corregidos)
Citar
public class Horarios {

   private String hora,fecha,cita;
   private datosPacientes paciente;

   public Horarios(String fecha, String hora, String cita, datosPacientes paciente){
      this.hora=hora;
      this.fecha=fecha;
      this.cita=cita;
      this.paciente=paciente;
   }

   public String getFecha(){
      return fecha;
   }
   public void setfecha(String fecha){
      this.fecha=fecha;
   }
   public String getHora(){
      return hora;
   }
   public void setHora(String hora){
      this.hora=hora;
   }
   public String getCita(){
      return cita;
   }
   public void setCita(String cita){
      this.cita=cita;
   }
   public datosPacientes getPac(){
      return paciente;
   }
   public void setPac(datosPacientes paciente){
      this.paciente=paciente;
   }

   public void mostrar(){
      System.out.println("\n\t---------------");
      System.out.println("HORARIO");
      System.out.println("ID Cita: ");
      System.out.println(cita);
      System.out.println("Fecha: ");
      System.out.println(fecha);
      System.out.println("Hora: "+hora);
      System.out.println("Paciente: " + paciente.nom);
      System.out.println("\t---------------");
   }
}

Y ahora, en el case 2 donde agendamos las citas, podemos usar nextLine() para las lecturas de Strings y caracteres char (además nos permite transformar lo tecleado a mayúsculas) y también rediseñar los condicionales IF, con IF ELSE... para quede un poco más elegante.

Cuando se introduzca N para indicar que el paciente ya existe, debemos pedir el ID y que el gestor de pacientes nos retorne el paciente correspondiente.
Y con ese paciente creamos el objeto Horarios.
El método que nos retorna el paciente según el ID, si no encuentra el paciente nos va a retornar null. Esto estaría bien controlarlo, pero para no complicar más el código, yo de momento lo dejaría sin controlar, y en todo caso, cuando ya todo funcione y se tenga más clara la lógica que se está siguiendo, entonces se pueden mejorar estos detalles.

Pero, ¿y cuando se introduce S? Hay que crear un paciente nuevo, pero además necesitamos tenerlo a mano para crear el objeto Horarios.
El paciente se crea DENTRO del método pacientes.nuevo(), pero FUERA de él, que es donde nos encontramos en el momento en que lo llamamos, no nos va a quedar nada para identificar al paciente que se acaba de crear: ni el id, ni el nombre, ni nada...

Es decir, en la línea que marco en rojo, se ha creado un paciente, pero en las siguientes líneas no tenemos nada para encontrar el paciente que se acaba de crear, y lo necesitamos para agendar la cita en el objeto Horarios

Citar
if(op=='S'){
            System.out.println("Introduzca el ID de la cita");
            String cita=leer.next();
            leer.nextLine();
            pacientes.nuevo();
            System.out.println("Introduzca la hora:");
            String hora=leer.nextLine();
            System.out.println("Introduzca la fecha (dd/mm/aa)");
            String fecha=leer.nextLine();
            Horarios nuevo=new Horarios(cita,hora,fecha);
            horas.add(nuevo);

Para solucionarlo y agilizar el código, podemos cambiar el método que crea pacientes.
Ahora mismo es de tipo boolean, devuelve true o false, y la verdad es que no estamos dando uso a ese boolean. No nos aporta nada.

Podemos cambiarlo, y hacer que una vez creado el paciente, además de guardarlo nos lo retorne. Así podemos recogerlo y usarlo para agendar la cita.

En la clase gestionPaciente, cambiamos el método nuevo():
Citar
   public datosPacientes nuevo() {
      System.out.println("\n\t NUEVO PACIENTE");
      System.out.println("Introduzca ID: ");
      String id=leer.next();
      System.out.println("Ingrese el nombre: ");
      String nom=leer.next();
      leer.nextLine();
      System.out.println("Ingrese el domicilio: ");
      String dir=leer.next();
      leer.nextLine();
      System.out.println("Ingrese el número de telefono: ");
      String telPac=leer.next();
      leer.nextLine();
      System.out.println("Ingrese el número celular: ");
      String celPac=leer.next();
      System.out.println("Ingrese el correo electrónico: ");
      String corr_ele=leer.next();
      System.out.println("Ingrese la edad: ");
      int ed=leer.nextInt();
      leer.nextLine();
      datosPacientes nuevoPaciente =new datosPacientes( nom, telPac, celPac,
            corr_ele,  dir,  id,  ed);
      pacientes.add(nuevoPaciente);
      return nuevoPaciente; //Retornamos el paciente recién creado
   }

Así, al crear un paciente nuevo cuando agendamos cita, recibimos el paciente creado para poder dárselo al objeto Horarios

En la clase gestionHorario, aplicamos todos estos cambios al método nuevo():
Citar
public void nuevo() {
      char op;
      System.out.println("¿Es nuevo el paciente?(S/N)");   
      do{
         op=leer.nextLine().toUpperCase().charAt(0);
         
         if(op=='S'){
            System.out.println("Introduzca el ID de la cita");
            String cita=leer.next();
            leer.nextLine();
            datosPacientes paci = pacientes.nuevo();//Se crea un paciente y nos lo retornan
            System.out.println("Introduzca la hora:");
            String hora=leer.nextLine();
            System.out.println("Introduzca la fecha (dd/mm/aa)");
            String fecha=leer.nextLine();
            Horarios nuevo=new Horarios(cita,hora,fecha,paci);
            horas.add(nuevo);
         }
         else if(op=='N'){
            System.out.println("Introduzca el ID de la cita");
            String cita=leer.nextLine();
            System.out.println("Introduzca el ID del paciente");
            String idPaci = leer.nextLine();
            datosPacientes paci = pacientes.getPac(idPaci); //No estamos controlando si retorna null
            System.out.println("Introduzca la hora:");
            String hora=leer.nextLine();
            System.out.println("Introduzca la fecha (dd/mm/aa)");
            String fecha=leer.nextLine();
            Horarios nuevo=new Horarios(cita,hora,fecha,paci);
            horas.add(nuevo);
         }
         else
            System.out.println("Vuelva a introducir el dato correcto.");

      }while((op!='S')&&(op!='N'));
   }

Ahora ya podemos agendar citas, sin embargo, todavía hay un error.
Si pedimos que se muestren las citas agendadas (recuerda que el JOptionPane se queda escondido detrás de tu editor de código), falla al encontrar citas buscando por el id de la cita.

Y es porque al construir los objetos Horarios, no estamos dando los parámetros en el orden correcto.
Para crearlos estamos dando el id de la cita, la hora, la fecha y el paciente:
Código: [Seleccionar]
Horarios nuevo=new Horarios(cita,hora,fecha,paci);
Pero en su clase, el constructor lo hemos definido con un orden distinto.
Primero la fecha, luego la hora, luego el id de la cita y finalmente el paciente
Código: [Seleccionar]
public Horarios(String fecha, String hora, String cita, datosPacientes paciente)
Hay que construir los Horarios dandole los datos en el mismo orden que hemos establecido en el constructor, si no, los valores de los atributos están intercambiados unos con otros y por eso ahora no se encuentran citas por el id de cita.
Hay que corregirlo:
Código: [Seleccionar]
Horarios nuevo=new Horarios(fecha,hora,cita,paci);

Y con esto, ya parece funcionar más o menos todo bien.
Habrá cosas y detalles por pulir, por ejemplo, al eliminar una cita el mensaje que se muestra en pantalla es que se ha eliminado un paciente y no una cita
Citar
   public boolean eliminar(){
      String cita=JOptionPane.showInputDialog(null,"Introduzca identificador de la cita para mostar datos: ",
            "Mostrar datos de la cita",JOptionPane.QUESTION_MESSAGE);
      Horarios citas=null;
      for (int i=0;i<horas.size();i++){
         if(horas.get(i).getCita().equals(cita)){
            citas=horas.remove(i);
         }
      }
      if(citas==null){
         JOptionPane.showMessageDialog(null, "No se encuentra ninguna cita con el ID:\n"+cita,
               "Cita no encontrada", JOptionPane.WARNING_MESSAGE);
         return false;
      }else {
         JOptionPane.showMessageDialog(null, "Se elimino el paciente con ID:\n" + cita,
               "Paciente Eliminado", JOptionPane.INFORMATION_MESSAGE);

         return false;
      }
   }

Pero son detalles para ir puliendo poco a poco.

Sobre todo recuerda que cuando al elegir una opción parezca que el programa no hace nada, seguramente es que ha aparecido un JOptionPane que se ha quedado detrás del editor de código.
Minimiza el editor, o usa las teclas ALT+TAB para rotar entre las ventanas abiertas.

Si no es obligatorio usar los JOptionPane, yo lo quitaría y lo haría todo por la consola de texto.

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

keyner15

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil

Buenas noches quisiera saber como podría crear el menú , sobremenú , gestionar médicos y gestionar historial clínico


CONSIGNA DEL EJERCICIO

Fuiste contratado por una institución de salud para desarrollar un software basado en Java y que permita gestionar la información de los historiales clínicos de sus pacientes.

Las entidades definidas para este software son:

Pacientes: Es la entidad que representa un paciente afiliado a la entidad de salud. Cada uno de los pacientes deberá estar asignado a su respectivo historial clínico.

Médicos: Es la entidad que representa un médico en la entidad de salud. Cada uno de los médicos deberá estar asignado a respectivos historiales clínicos.

Historiales Clínicos: Es la entidad que representa los historiales clínicos de la entidad de salud, en los cuales se asignan pacientes y médicos para su gestión.

El aplicativo deberá ser desarrollado en Java y deberá tener las siguientes características y funcionalidades:

El software permitirá registrar, consultar, modificar y eliminar los datos para los atributos de la entidad Paciente, es decir, debes desarrollar una clase “Paciente” donde definas los atributos para dicha entidad, los cuales son: identificación, nombres, apellidos, edad y género.

El software permitirá registrar, consultar, modificar y eliminar los datos para los atributos de la entidad Medico, es decir, debes desarrollar una clase “Medico” donde definas los atributos para dicha entidad, los cuales son: identificación, nombres, apellidos y especialidad.

El software permitirá registrar, consultar, modificar y eliminar los datos para los atributos de la entidad Historiales Clínicos, es decir, debes desarrollar una clase “HistorialClinico” donde definas los atributos para dicha entidad, los cuales son: código, fecha, idPaciente, idMedico y observaciones.

Para cada entidad, se deberá crear los distintos métodos para la manipulación (insertar, eliminar, consultar y modificar) de los atributos de cada entidad incluyendo Getters y Setters. Así como cualquier método que considere necesario.

Todos los datos de las entidades son cadena de textos excepto el atributo “edad” de la entidad “Paciente”, que es numérico de tipo entero.

El aplicativo debe mostrar un menú principal con las opciones:

Gestionar Pacientes.
Gestionar Médicos.
Gestionar Historial Clínico.
Salir

Luego al entrar a cada entidad se debe mostrar un submenú con las opciones de la entidad, por ejemplo para Pacientes:

Registrar Pacientes.
Mostrar Pacientes.
Modificar Pacientes.
Eliminar Pacientes.
Atrás

Luego al entrar se debe pedir o mostrar la información según la acción, por ejemplo:

Registrar Pacientes: Pedir los datos de un paciente a registrar.
Mostrar Pacientes: Mostrar todos los pacientes registrados con sus atributos.
Modificar Paciente: Modificar los atributos de un paciente a partir del IdPaciente (Si el idPaciente no existe decir paciente no encontrado.).
Eliminar Paciente: Pedir el IdPaciente y eliminarlo (Si el idPaciente no existe decir paciente no encontrado.).

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Veamos..
Unas páginas más atrás, publiqué las clases necesarias para realizar este ejercicio.
No las puse todas, dejé sin publicar dos de las clases "gestoras" para que fueran desarrolladas por la persona que abrió este hilo.
Esas dos clases se podían desarrollar fácilmente tomando como ejemplo una de las que puse.
Yo publiqué la clase que se encarga de gestionar pacientes, faltaban las clases para gestionar médicos e historiales clínicos. Y como digo, para hacer esas clases básicamente es copiar la clase que sí puse y modificarla para adaptarla a Médicos e Historiales.

Tampoco hice una clase principal con menús y submenús, ya que también lo deje para que lo desarrollase el autor de este hilo.

Bien, puedo comenzar ahora esta clase principal, pero sin completarla. Solo poner el suficiente código para que pueda tomarse como ejemplo y poder hacer el resto, ya que no me corresponde a mí escribirlas ni creo que sea una ayuda real darlo todo ya terminado.

En esta clase principal, comienzo declarando como atributos tres objetos de las clases "gestoras".
Muestro el menú principal con un JOptionPane (ya que así comenzamos a desarrollar este programa) y con un switch evaluamos la elección del usuario.
Dentro del switch, según el caso, llamaremos a los métodos que se encargarán de mostrar los submenús.

Estos submenús serán similares al menú principal, lo mostramos con JOptionPane, recogemos respuesta y evaluamos con switch.
Según lo que se elija, pediremos a la clase gestora correspondiente que realice la operación solicitada: registrar un paciente, modificarlo, etc...

Pongo el código con el menú principal y el submenú para gestionar pacientes. Tomando este como ejemplo, se pueden escribir los otros submenús.

Fijaos que el texto de los menús de los JOptionPane los declaro al final del programa en unos String. Esto es para que los métodos no tengan exceso de líneas y sean más legibles, por eso a parto el texto de los String al final de todo, donde no molesten.

Código: [Seleccionar]
import javax.swing.JOptionPane;

public final class TestClinica {

//Clases "gestoras"
static GestorPacientes pacientes = new GestorPacientes();
static GestorMedicos medicos = new GestorMedicos();
static GestorHistorial historiales = new GestorHistorial();

public static void main(String[] args) {

String opcion = "";

while (!opcion.equals("4")) {
opcion = JOptionPane.showInputDialog(null, TEXTO_MENU_PR,
"Menu Clinica", JOptionPane.QUESTION_MESSAGE);
switch(opcion) {
case "1":
gestionarPacientes();
break;
case "2":
//gestionarMedicos();
break;
case "3":
//gestionarHistoriales();
break;
case "4":
JOptionPane.showMessageDialog(null, "FIN DE PROGRAMA", "Menu Clinica",
JOptionPane.INFORMATION_MESSAGE);
break;
default:
JOptionPane.showMessageDialog(null, "Opción equivocada", "Menu Clinica",
JOptionPane.ERROR_MESSAGE);
}
}

}

//Métodos para mostrar los submenús
static void gestionarPacientes() {
String opcion = "";

while (!opcion.equals("5")) {
opcion = JOptionPane.showInputDialog(null, TEXTO_MENU_GP,
"Gestion Pacientes", JOptionPane.QUESTION_MESSAGE);
switch(opcion) {
case "1":
pacientes.nuevoPaciente();
break;
case "2":
pacientes.mostrarPacientes();
break;
case "3":
pacientes.modificarPaciente();
break;
case "4":
pacientes.borrarPaciente();
break;
case "5":
JOptionPane.showMessageDialog(null, "Volviendo al Menu Principal", "Gestion Pacientes",
JOptionPane.INFORMATION_MESSAGE);
break;
default:
JOptionPane.showMessageDialog(null, "Opción equivocada", "Menu Clinica",
JOptionPane.ERROR_MESSAGE);
}
}
}

//Textos para los menus JOptionPane
static final String TEXTO_MENU_PR = "[1] - Gestionar Pacientes\n[2] - Gestionar Medicos"
+ "\n[3] - Gestionar Historiales\n[4] - Salir";
static final String TEXTO_MENU_GP = "[1] - Registrar Pacientes\n[2] - Mostrar Pacientes"
+ "\n[3] - Modificar Pacientes\n[4] - Eliminar Pacientes\n[5] - Volver";

}
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

JosueVillaper

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Hola Kabuto
Tengo una consulta, quisiera agregar los siguientes estrucuturas de datos, al ejercicio que resolviste.

- Generacidad
- Interfaces
- Listas
- Hash abierto o cerrado

Concideras que es factible podere aplicar todos. Gracias de antemano.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Hola.
Supongo que las clases "gestoras" (GestorPacientes, GestorMedicos, GestorHistoriales) pueden reescribirse para que implementen una misma interfaz con genéricos..

Todas estas clases tenían un ArrayList (que puede sustituirse por un HashMap u otra estructura de colección de datos).
Y todas tenían unos método similares:
- crearNuevo()
- modificar()
- eliminar()
- mostrar()
-....
La diferencia era que una trataba Pacientes, otra Médicos y la otra Historiales...así que con genéricos se puede declarara un interfaz con una colección de datos y esos métodos.

Luego las clases gestoras tendrían que implementar esa interfaz, y ya entonces escribir el código de esos métodos implementados para adaptarlos a las clases que corresponda.
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

Rance021

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Hola.
Soy nuevo programando en java y el tema de generacidad se me complica bastante podrías ayudarme con un ejemplo de una de esas clases. Por favor. Y con respecto a la interfaz a crear esta tendría los métodos crearNuevo(), modificar(), eliminar() y mostrar(). Como reescribiría el código de las clases para usar esta interfaz. Se usaría polimorfismo, verdad?

 

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