Este ejercicio avanzado combinará varios conceptos fundamentales en Java: tipos de datos y operaciones de entrada y salida, estructuras básicas, programación modular y funciones, vectores unidimensionales y bidimensionales, programación orientada a objetos (POO), tratamiento de excepciones y ficheros de texto y binarios, y estructuras dinámicas de datos como ArrayList
.
Descripción del Ejercicio
Vamos a crear un sistema de gestión de hospital que permita:
- Añadir pacientes y doctores.
- Listar pacientes y doctores.
- Asignar doctores a pacientes.
- Guardar y cargar los datos en/desde ficheros de texto y binarios.
- Buscar pacientes y doctores por nombre o especialidad.
- Eliminar pacientes y doctores.
- Manejar excepciones para operaciones como manejo de ficheros.
- Utilizar vectores unidimensionales y bidimensionales para representar algunas estructuras de datos.
Estructura del Código
Clase Persona
import java.io.Serializable;
abstract class Persona implements Serializable {
private static final long serialVersionUID = 1L;
protected String nombre;
protected int edad;
protected String id;
public Persona(String nombre, int edad, String id) {
this.nombre = nombre;
this.edad = edad;
this.id = id;
}
public String getNombre() {
return nombre;
}
public int getEdad() {
return edad;
}
public String getId() {
return id;
}
public abstract void mostrarInformacion();
}
Clase Paciente
class Paciente extends Persona {
private static final long serialVersionUID = 1L;
private String enfermedad;
public Paciente(String nombre, int edad, String id, String enfermedad) {
super(nombre, edad, id);
this.enfermedad = enfermedad;
}
public String getEnfermedad() {
return enfermedad;
}
@Override
public void mostrarInformacion() {
System.out.println("Paciente [Nombre: " + nombre + ", Edad: " + edad + ", ID: " + id + ", Enfermedad: " + enfermedad + "]");
}
}
Clase Doctor
class Doctor extends Persona {
private static final long serialVersionUID = 1L;
private String especialidad;
public Doctor(String nombre, int edad, String id, String especialidad) {
super(nombre, edad, id);
this.especialidad = especialidad;
}
public String getEspecialidad() {
return especialidad;
}
@Override
public void mostrarInformacion() {
System.out.println("Doctor [Nombre: " + nombre + ", Edad: " + edad + ", ID: " + id + ", Especialidad: " + especialidad + "]");
}
}
Clase Hospital
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
public class Hospital {
private ArrayList<Paciente> pacientes;
private ArrayList<Doctor> doctores;
private static final String FICHERO_TEXTO = "hospital.txt";
private static final String FICHERO_BINARIO = "hospital.bin";
public Hospital() {
pacientes = new ArrayList<>();
doctores = new ArrayList<>();
}
public void añadirPaciente(Paciente paciente) {
pacientes.add(paciente);
}
public void añadirDoctor(Doctor doctor) {
doctores.add(doctor);
}
public void listarPersonas() {
if (pacientes.isEmpty() && doctores.isEmpty()) {
System.out.println("No hay pacientes ni doctores para mostrar.");
} else {
System.out.println("Pacientes:");
for (Paciente paciente : pacientes) {
paciente.mostrarInformacion();
}
System.out.println("Doctores:");
for (Doctor doctor : doctores) {
doctor.mostrarInformacion();
}
}
}
public void asignarDoctorAPaciente(String idPaciente, String idDoctor) {
Paciente paciente = buscarPacientePorId(idPaciente);
Doctor doctor = buscarDoctorPorId(idDoctor);
if (paciente != null && doctor != null) {
System.out.println("Asignando Doctor " + doctor.getNombre() + " al Paciente " + paciente.getNombre());
// Aquí se podría añadir la lógica para relacionar doctor y paciente
} else {
System.out.println("Paciente o Doctor no encontrado.");
}
}
private Paciente buscarPacientePorId(String id) {
for (Paciente paciente : pacientes) {
if (paciente.getId().equalsIgnoreCase(id)) {
return paciente;
}
}
return null;
}
private Doctor buscarDoctorPorId(String id) {
for (Doctor doctor : doctores) {
if (doctor.getId().equalsIgnoreCase(id)) {
return doctor;
}
}
return null;
}
public void guardarEnFicheroTexto() {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(FICHERO_TEXTO))) {
for (Paciente paciente : pacientes) {
writer.write("Paciente," + paciente.getNombre() + "," + paciente.getEdad() + "," + paciente.getId() + "," + paciente.getEnfermedad());
writer.newLine();
}
for (Doctor doctor : doctores) {
writer.write("Doctor," + doctor.getNombre() + "," + doctor.getEdad() + "," + doctor.getId() + "," + doctor.getEspecialidad());
writer.newLine();
}
System.out.println("Datos guardados en " + FICHERO_TEXTO);
} catch (IOException e) {
System.out.println("Error al guardar en fichero de texto: " + e.getMessage());
}
}
public void cargarDesdeFicheroTexto() {
try (BufferedReader reader = new BufferedReader(new FileReader(FICHERO_TEXTO))) {
String linea;
pacientes.clear();
doctores.clear();
while ((linea = reader.readLine()) != null) {
String[] partes = linea.split(",");
if (partes[0].equals("Paciente")) {
pacientes.add(new Paciente(partes[1], Integer.parseInt(partes[2]), partes[3], partes[4]));
} else if (partes[0].equals("Doctor")) {
doctores.add(new Doctor(partes[1], Integer.parseInt(partes[2]), partes[3], partes[4]));
}
}
System.out.println("Datos cargados desde " + FICHERO_TEXTO);
} catch (IOException e) {
System.out.println("Error al cargar desde fichero de texto: " + e.getMessage());
}
}
public void guardarEnFicheroBinario() {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FICHERO_BINARIO))) {
oos.writeObject(pacientes);
oos.writeObject(doctores);
System.out.println("Datos guardados en " + FICHERO_BINARIO);
} catch (IOException e) {
System.out.println("Error al guardar en fichero binario: " + e.getMessage());
}
}
public void cargarDesdeFicheroBinario() {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FICHERO_BINARIO))) {
pacientes = (ArrayList<Paciente>) ois.readObject();
doctores = (ArrayList<Doctor>) ois.readObject();
System.out.println("Datos cargados desde " + FICHERO_BINARIO);
} catch (IOException | ClassNotFoundException e) {
System.out.println("Error al cargar desde fichero binario: " + e.getMessage());
}
}
public void buscarPersonaPorNombre(String nombre) {
for (Paciente paciente : pacientes) {
if (paciente.getNombre().equalsIgnoreCase(nombre)) {
paciente.mostrarInformacion();
return;
}
}
for (Doctor doctor : doctores) {
if (doctor.getNombre().equalsIgnoreCase(nombre)) {
doctor.mostrarInformacion();
return;
}
}
System.out.println("Persona no encontrada.");
}
public void buscarDoctorPorEspecialidad(String especialidad) {
for (Doctor doctor : doctores) {
if (doctor.getEspecialidad().equalsIgnoreCase(especialidad)) {
doctor.mostrarInformacion();
}
}
}
public void eliminarPersonaPorId(String id) {
for (Paciente paciente : pacientes) {
if (paciente.getId().equalsIgnoreCase(id)) {
pacientes.remove(paciente);
System.out.println("Paciente eliminado.");
return;
}
}
for (Doctor doctor : doctores) {
if (doctor.getId().equalsIgnoreCase(id)) {
doctores.remove(doctor);
System.out.println("Doctor eliminado.");
return;
}
}
System.out.println("Persona no encontrada.");
}
public static void main(String[] args) {
Hospital hospital = new Hospital();
Scanner scanner = new Scanner(System.in);
int opcion;
do {
System.out.println("1. Añadir paciente");
System.out.println("2. Añadir doctor");
System.out.println("3. Listar personas");
System.out.println("4. Asignar doctor a paciente");
System.out.println("5. Guardar en fichero de texto");
System.out.println("6. Cargar desde fichero de texto");
System.out.println("7. Guard
ar en fichero binario");
System.out.println("8. Cargar desde fichero binario");
System.out.println("9. Buscar persona por nombre");
System.out.println("10. Buscar doctor por especialidad");
System.out.println("11. Eliminar persona por ID");
System.out.println("12. Salir");
System.out.print("Seleccione una opción: ");
opcion = scanner.nextInt();
scanner.nextLine(); // Consumir el salto de línea
switch (opcion) {
case 1:
System.out.print("Nombre del paciente: ");
String nombrePaciente = scanner.nextLine();
System.out.print("Edad del paciente: ");
int edadPaciente = scanner.nextInt();
scanner.nextLine(); // Consumir el salto de línea
System.out.print("ID del paciente: ");
String idPaciente = scanner.nextLine();
System.out.print("Enfermedad del paciente: ");
String enfermedad = scanner.nextLine();
hospital.añadirPaciente(new Paciente(nombrePaciente, edadPaciente, idPaciente, enfermedad));
break;
case 2:
System.out.print("Nombre del doctor: ");
String nombreDoctor = scanner.nextLine();
System.out.print("Edad del doctor: ");
int edadDoctor = scanner.nextInt();
scanner.nextLine(); // Consumir el salto de línea
System.out.print("ID del doctor: ");
String idDoctor = scanner.nextLine();
System.out.print("Especialidad del doctor: ");
String especialidad = scanner.nextLine();
hospital.añadirDoctor(new Doctor(nombreDoctor, edadDoctor, idDoctor, especialidad));
break;
case 3:
hospital.listarPersonas();
break;
case 4:
System.out.print("ID del paciente: ");
String idPacienteAsignar = scanner.nextLine();
System.out.print("ID del doctor: ");
String idDoctorAsignar = scanner.nextLine();
hospital.asignarDoctorAPaciente(idPacienteAsignar, idDoctorAsignar);
break;
case 5:
hospital.guardarEnFicheroTexto();
break;
case 6:
hospital.cargarDesdeFicheroTexto();
break;
case 7:
hospital.guardarEnFicheroBinario();
break;
case 8:
hospital.cargarDesdeFicheroBinario();
break;
case 9:
System.out.print("Ingrese el nombre de la persona a buscar: ");
String nombreBuscar = scanner.nextLine();
hospital.buscarPersonaPorNombre(nombreBuscar);
break;
case 10:
System.out.print("Ingrese la especialidad del doctor a buscar: ");
String especialidadBuscar = scanner.nextLine();
hospital.buscarDoctorPorEspecialidad(especialidadBuscar);
break;
case 11:
System.out.print("Ingrese el ID de la persona a eliminar: ");
String idEliminar = scanner.nextLine();
hospital.eliminarPersonaPorId(idEliminar);
break;
case 12:
System.out.println("Saliendo del programa.");
break;
default:
System.out.println("Opción no válida.");
}
} while (opcion != 12);
scanner.close();
}
}
Explicación del Código
- Clases
Persona
,Paciente
, yDoctor
:Persona
es una clase abstracta que sirve como base paraPaciente
yDoctor
.- Cada subclase hereda de
Persona
y añade atributos específicos (enfermedad
paraPaciente
yespecialidad
paraDoctor
).
- Clase
Hospital
:- Contiene listas dinámicas (
ArrayList
) de pacientes y doctores. - Métodos para añadir, listar, buscar, eliminar personas, asignar doctores a pacientes, y guardar y cargar datos desde ficheros de texto y binarios.
- El método
main
proporciona un menú interactivo para gestionar el hospital.
- Contiene listas dinámicas (
- Manejo de Excepciones:
- Se manejan excepciones durante la lectura y escritura de ficheros.
- Uso de
try-with-resources
para asegurar el cierre de recursos como ficheros.
Este ejercicio avanzado proporciona una práctica completa para mejorar tus habilidades en Java, abarcando una amplia gama de conceptos y técnicas fundamentales. ¡Sigue practicando y explorando más sobre Java para convertirte en un programador más competente!
… … …
¡Coméntanos que te ha parecido este artículo al final de la página!
TÚ OPINIÓN IMPORTA
NUESTRAS ÚLTIMAS PUBLICACIONES
- La vida nos aguarda triunfos importantes. Sé resiliente.
- Creación de una Calculadora de Ecuación de Segundo Grado con HTML, CSS y JavaScript
- Comunicado a nuestros amigos, alumnos y compañeros de Valencia.
- Artículo: Funciones esenciales de C para la manipulación de cadenas: fgets, strlen, stdin, y más
- Uso de la Clase DAO sin Interfaces en Java: Ejemplo de Gestión de Trabajadores
- Uso de DAO en Java: Simplificando el Acceso a Datos con el Patrón DAO
- Guía Completa para la Creación de Gramáticas en JFLAP: Ejercicios y Soluciones
- Generación de Lenguajes en JFLAP con Gramáticas: Ejercicios y Estrategias
- Máquinas de Turing y Enumeración de Números Binarios: Diseño y Funcionamiento en JFLAP
Contenido restringido
Comments are closed