Este ejercicio de nivel medio combina 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 asesorías académicas que permita:
- Añadir estudiantes y asesores.
- Listar estudiantes y asesores.
- Asignar asesores a estudiantes.
- Guardar y cargar los datos en/desde ficheros de texto y binarios.
- Buscar estudiantes y asesores por nombre.
- Eliminar estudiantes y asesores.
- Manejar excepciones para operaciones como manejo de ficheros.
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 Estudiante
class Estudiante extends Persona {
private static final long serialVersionUID = 1L;
private String carrera;
public Estudiante(String nombre, int edad, String id, String carrera) {
super(nombre, edad, id);
this.carrera = carrera;
}
public String getCarrera() {
return carrera;
}
@Override
public void mostrarInformacion() {
System.out.println("Estudiante [Nombre: " + nombre + ", Edad: " + edad + ", ID: " + id + ", Carrera: " + carrera + "]");
}
}
Clase Asesor
class Asesor extends Persona {
private static final long serialVersionUID = 1L;
private String especialidad;
public Asesor(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("Asesor [Nombre: " + nombre + ", Edad: " + edad + ", ID: " + id + ", Especialidad: " + especialidad + "]");
}
}
Clase AsesoriaAcademica
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
public class AsesoriaAcademica {
private ArrayList<Estudiante> estudiantes;
private ArrayList<Asesor> asesores;
private static final String FICHERO_TEXTO = "asesoria.txt";
private static final String FICHERO_BINARIO = "asesoria.bin";
public AsesoriaAcademica() {
estudiantes = new ArrayList<>();
asesores = new ArrayList<>();
}
public void añadirEstudiante(Estudiante estudiante) {
estudiantes.add(estudiante);
}
public void añadirAsesor(Asesor asesor) {
asesores.add(asesor);
}
public void listarPersonas() {
if (estudiantes.isEmpty() && asesores.isEmpty()) {
System.out.println("No hay estudiantes ni asesores para mostrar.");
} else {
System.out.println("Estudiantes:");
for (Estudiante estudiante : estudiantes) {
estudiante.mostrarInformacion();
}
System.out.println("Asesores:");
for (Asesor asesor : asesores) {
asesor.mostrarInformacion();
}
}
}
public void asignarAsesorAEstudiante(String idEstudiante, String idAsesor) {
Estudiante estudiante = buscarEstudiantePorId(idEstudiante);
Asesor asesor = buscarAsesorPorId(idAsesor);
if (estudiante != null && asesor != null) {
System.out.println("Asignando Asesor " + asesor.getNombre() + " al Estudiante " + estudiante.getNombre());
// Aquí se podría añadir la lógica para relacionar asesor y estudiante
} else {
System.out.println("Estudiante o Asesor no encontrado.");
}
}
private Estudiante buscarEstudiantePorId(String id) {
for (Estudiante estudiante : estudiantes) {
if (estudiante.getId().equalsIgnoreCase(id)) {
return estudiante;
}
}
return null;
}
private Asesor buscarAsesorPorId(String id) {
for (Asesor asesor : asesores) {
if (asesor.getId().equalsIgnoreCase(id)) {
return asesor;
}
}
return null;
}
public void guardarEnFicheroTexto() {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(FICHERO_TEXTO))) {
for (Estudiante estudiante : estudiantes) {
writer.write("Estudiante," + estudiante.getNombre() + "," + estudiante.getEdad() + "," + estudiante.getId() + "," + estudiante.getCarrera());
writer.newLine();
}
for (Asesor asesor : asesores) {
writer.write("Asesor," + asesor.getNombre() + "," + asesor.getEdad() + "," + asesor.getId() + "," + asesor.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;
estudiantes.clear();
asesores.clear();
while ((linea = reader.readLine()) != null) {
String[] partes = linea.split(",");
if (partes[0].equals("Estudiante")) {
estudiantes.add(new Estudiante(partes[1], Integer.parseInt(partes[2]), partes[3], partes[4]));
} else if (partes[0].equals("Asesor")) {
asesores.add(new Asesor(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(estudiantes);
oos.writeObject(asesores);
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))) {
estudiantes = (ArrayList<Estudiante>) ois.readObject();
asesores = (ArrayList<Asesor>) 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 (Estudiante estudiante : estudiantes) {
if (estudiante.getNombre().equalsIgnoreCase(nombre)) {
estudiante.mostrarInformacion();
return;
}
}
for (Asesor asesor : asesores) {
if (asesor.getNombre().equalsIgnoreCase(nombre)) {
asesor.mostrarInformacion();
return;
}
}
System.out.println("Persona no encontrada.");
}
public void eliminarPersonaPorId(String id) {
for (Estudiante estudiante : estudiantes) {
if (estudiante.getId().equalsIgnoreCase(id)) {
estudiantes.remove(estudiante);
System.out.println("Estudiante eliminado.");
return;
}
}
for (Asesor asesor : asesores) {
if (asesor.getId().equalsIgnoreCase(id)) {
asesores.remove(asesor);
System.out.println("Asesor eliminado.");
return;
}
}
System.out.println("Persona no encontrada.");
}
public static void main(String[] args) {
AsesoriaAcademica asesoria = new AsesoriaAcademica();
Scanner scanner = new Scanner(System.in);
int opcion;
do {
System.out.println("1. Añadir estudiante");
System.out.println("2. Añadir asesor");
System.out.println("3. Listar personas");
System.out.println("4. Asignar asesor a estudiante");
System.out.println("5. Guardar en fichero de texto");
System.out.println("6. Cargar desde fichero de texto");
System.out.println("7. Guardar en
fichero binario");
System.out.println("8. Cargar desde fichero binario");
System.out.println("9. Buscar persona por nombre");
System.out.println("10. Eliminar persona por ID");
System.out.println("11. 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 estudiante: ");
String nombreEstudiante = scanner.nextLine();
System.out.print("Edad del estudiante: ");
int edadEstudiante = scanner.nextInt();
scanner.nextLine(); // Consumir el salto de línea
System.out.print("ID del estudiante: ");
String idEstudiante = scanner.nextLine();
System.out.print("Carrera del estudiante: ");
String carrera = scanner.nextLine();
asesoria.añadirEstudiante(new Estudiante(nombreEstudiante, edadEstudiante, idEstudiante, carrera));
break;
case 2:
System.out.print("Nombre del asesor: ");
String nombreAsesor = scanner.nextLine();
System.out.print("Edad del asesor: ");
int edadAsesor = scanner.nextInt();
scanner.nextLine(); // Consumir el salto de línea
System.out.print("ID del asesor: ");
String idAsesor = scanner.nextLine();
System.out.print("Especialidad del asesor: ");
String especialidad = scanner.nextLine();
asesoria.añadirAsesor(new Asesor(nombreAsesor, edadAsesor, idAsesor, especialidad));
break;
case 3:
asesoria.listarPersonas();
break;
case 4:
System.out.print("ID del estudiante: ");
String idEstudianteAsignar = scanner.nextLine();
System.out.print("ID del asesor: ");
String idAsesorAsignar = scanner.nextLine();
asesoria.asignarAsesorAEstudiante(idEstudianteAsignar, idAsesorAsignar);
break;
case 5:
asesoria.guardarEnFicheroTexto();
break;
case 6:
asesoria.cargarDesdeFicheroTexto();
break;
case 7:
asesoria.guardarEnFicheroBinario();
break;
case 8:
asesoria.cargarDesdeFicheroBinario();
break;
case 9:
System.out.print("Ingrese el nombre de la persona a buscar: ");
String nombreBuscar = scanner.nextLine();
asesoria.buscarPersonaPorNombre(nombreBuscar);
break;
case 10:
System.out.print("Ingrese el ID de la persona a eliminar: ");
String idEliminar = scanner.nextLine();
asesoria.eliminarPersonaPorId(idEliminar);
break;
case 11:
System.out.println("Saliendo del programa.");
break;
default:
System.out.println("Opción no válida.");
}
} while (opcion != 11);
scanner.close();
}
}
Explicación del Código
- Clases
Persona
,Estudiante
, yAsesor
:Persona
es una clase abstracta que sirve como base paraEstudiante
yAsesor
.- Cada subclase hereda de
Persona
y añade atributos específicos (carrera
paraEstudiante
yespecialidad
paraAsesor
).
- Clase
AsesoriaAcademica
:- Contiene listas dinámicas (
ArrayList
) de estudiantes y asesores. - Métodos para añadir, listar, buscar, eliminar personas, asignar asesores a estudiantes, y guardar y cargar datos desde ficheros de texto y binarios.
- El método
main
proporciona un menú interactivo para gestionar las asesorías.
- 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 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!
¿QUÉ TE HA PARECIDO EL ARTÍCULO? Danos tu opinión al final de la página.
Deja tu comentario y ayúdanos a crecer.
¡SÍGUENOS EN TUS REDES FAVORITAS!
AYUDANOS A CRECER Y QUE LLEGUEMOS A TODAS LAS PERSONAS QUE NOS NECESITANA. SÍGUENOS EN TUS REDES.
Entra AQUÍ y elíge donde seguirnos.

NUESTRAS ÚLTIMAS PUBLICACIONES
- 🛠️ Cómo crear un plugin en WordPress desde cero (Guía paso a paso)
- 📶 Cómo Crear un Hotspot WiFi en Windows 10 (Paso a Paso)
- 🕵️♂️ Aprende a usar Wireshark: Filtrar tráfico por IP, URL, MAC y más
- 🧩 Subconsultas, HAVING y Subconsultas Binomiales en MySQL: Guía Completa
- 🔍 Principales Comandos y Subconsultas en MySQL: SUM, AVG, MOD y Más
- 26 de marzo CERRADOS.
- ¡Aprende y Refuerza tus Consultas SQL en la Base de Datos de Alumnos!
- La Academia SanRoque lanza su primer podcast de historia: Un viaje a la España medieval
- OFERTA ESPECIAL PARA EL DÍA DEL PADRE.
ELIGE TU RED FAVORITA Y SÍGUENOS.
AYUDANOS A CRECER Y A LLEGAR A TODAS LAS PERSONAS QUE NOS NECESITAN.
Contenido restringido
Comments are closed