COMPARTE ESTE ARTÍCULO

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:

  1. Añadir pacientes y doctores.
  2. Listar pacientes y doctores.
  3. Asignar doctores a pacientes.
  4. Guardar y cargar los datos en/desde ficheros de texto y binarios.
  5. Buscar pacientes y doctores por nombre o especialidad.
  6. Eliminar pacientes y doctores.
  7. Manejar excepciones para operaciones como manejo de ficheros.
  8. 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

  1. Clases Persona, Paciente, y Doctor:
    • Persona es una clase abstracta que sirve como base para Paciente y Doctor.
    • Cada subclase hereda de Persona y añade atributos específicos (enfermedad para Paciente y especialidad para Doctor).
  2. 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.
  3. 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

Contenido restringido

Acceso de usuarios existentes
   
Registro de un nuevo usuario
*Campo necesario

Categories:

Tags:

Comments are closed

Estado de acceso
ESTADO DE ACCESO
TRADUCTORES
COMPARTENOS
error: CONTENIDO PROTEGIDO