Boletín de Ejercicios Adicional: Diseño de Clases en Java
Aquí tienes una serie de ejercicios para seguir practicando el diseño de clases en Java.
Ejercicio A1: Gestión de Libros en una Biblioteca
Crea una aplicación para gestionar libros en una biblioteca con 2 clases:
- 
Libro: Representará un libro con la siguiente información:- Atributos: titulo(String),autor(String),isbn(String),numeroDeCopiasDisponibles(int).
- Constructores:
- Uno que reciba todos los atributos.
- Otro que reciba titulo,autor,isbny establezcanumeroDeCopiasDisponiblesa 1 por defecto.
 
- Métodos:
- getterspara todos los atributos.
- setNumeroDeCopiasDisponibles(int numero)
- prestarLibro(): Decrementa el número de copias disponibles en 1 si hay copias. Devuelve- truesi se pudo prestar,- falseen caso contrario.
- devolverLibro(): Incrementa el número de copias disponibles en 1.
- toString(): Devuelve una representación en cadena del libro (ej: “El Quijote por Miguel de Cervantes (ISBN: XXX) - Copias: Y”).
 
 
- Atributos: 
- 
Biblioteca: Gestionará una colección de objetosLibro.- Atributos: Un array de Libroy una variable que indica cuántos libros distintos hay (no el total de copias). La capacidad inicial del array debe ser de 20 (CAPACIDAD_INICIAL).
- Constructores:
- Uno sin argumentos que inicialice el array con CAPACIDAD_INICIAL.
 
- Uno sin argumentos que inicialice el array con 
- Métodos:
- agregarLibro(Libro nuevoLibro): Añade un libro a la biblioteca. Si el libro (mismo ISBN) ya existe, simplemente incrementa su- numeroDeCopiasDisponiblescon las del- nuevoLibro. Si es un libro nuevo y no hay espacio, el array debe redimensionarse (aumentar su capacidad en 10).
- buscarLibroPorIsbn(String isbn): Devuelve el- Librocon ese ISBN, o- nullsi no se encuentra.
- listarLibrosDisponibles(): Imprime por consola los detalles de todos los libros que tengan al menos una copia disponible.
- totalLibrosDistintos(): Devuelve la cantidad de títulos diferentes en la biblioteca.
 
 
- Atributos: Un array de 
Ejercicio A2: Mejoras en la Gestión de Biblioteca
Realizar algunas mejoras sobre el ejercicio A1:
- Mejorar el método Biblioteca.agregarLibro(...):- Si se añade un libro con un ISBN que ya existe, en lugar de solo incrementar las copias, se debe actualizar el objeto Libroexistente con la información delnuevoLibro(título, autor) y sumar lasnumeroDeCopiasDisponibles.
- La operación de redimensionar el array si está lleno debe extraerse a un método privado redimensionarCatalogo().
 
- Si se añade un libro con un ISBN que ya existe, en lugar de solo incrementar las copias, se debe actualizar el objeto 
- Añadir a la clase Bibliotecaun métodolibrosPorAutor(String autor)que devuelva unLibro[](oArrayList<Libro>) con todos los libros de un autor específico.
Ejercicio A3: Simulación de Cuenta Bancaria
Crea una clase CuentaBancaria para simular las operaciones básicas de una cuenta.
- Atributos: numeroCuenta(String, único),nombreTitular(String),saldo(double),tipoCuenta(String, ej: “Ahorro”, “Corriente”).
- Constructores:
- Uno que reciba numeroCuenta,nombreTitular, ytipoCuenta. El saldo inicial será 0.
- Otro que reciba todos los atributos, incluyendo el saldo inicial.
 
- Uno que reciba 
- Métodos:
- depositar(double cantidad): Incrementa el saldo. La cantidad debe ser positiva.
- retirar(double cantidad): Decrementa el saldo.- Si la cantidad es positiva y hay saldo suficiente, realiza la operación y devuelve true.
- Si la cantidad es negativa o no hay saldo suficiente, no hace nada y devuelve false, imprimiendo un mensaje adecuado por consola.
 
- Si la cantidad es positiva y hay saldo suficiente, realiza la operación y devuelve 
- consultarSaldo(): Devuelve el saldo actual.
- getNumeroCuenta(),- getNombreTitular(),- getTipoCuenta().
- transferir(CuentaBancaria cuentaDestino, double cantidad): Transfiere una- cantidaddesde la cuenta actual a- cuentaDestino. Debe verificar que hay saldo suficiente en la cuenta origen y que la cantidad es positiva. Devuelve- truesi la transferencia fue exitosa,- falseen caso contrario.
 
Crea una clase EjercicioA3Main con un método main que demuestre el funcionamiento: crea dos cuentas, realiza depósitos, retiradas y una transferencia entre ellas. Muestra los saldos después de cada operación relevante.
Ejercicio A4: Generador de Equipos Aleatorios
Se necesita una clase GeneradorEquipos para formar equipos de jugadores.
- 
Clase interna (o separada) Jugador:- Atributos: nombre(String),nivelHabilidad(int, 1-10).
- Constructor para inicializar nombreynivelHabilidad.
- getterspara sus atributos.
- toString()que devuelva “Nombre (Nivel: X)“.
 
- Atributos: 
- 
Clase GeneradorEquipos:- Atributos: Un ArrayList<Jugador>llamadolistaJugadoresDisponibles.
- Constructores:
- Uno vacío que inicialice la lista de jugadores.
 
- Métodos:
- agregarJugador(Jugador jugador): Añade un jugador a la lista de disponibles.
- eliminarJugador(String nombreJugador): Elimina un jugador de la lista.
- generarEquipos(int numeroDeEquipos):- Recibe el número de equipos a formar.
- Distribuye los jugadores disponibles de la forma más equitativa posible entre el numeroDeEquiposespecificado. La equidad se puede basar primero en cantidad y luego intentar balancear pornivelHabilidad(opcional, para mayor desafío).
- Devuelve un ArrayList<ArrayList<Jugador>>, donde cadaArrayList<Jugador>interno representa un equipo.
- Si no hay suficientes jugadores para formar los equipos (ej. 1 jugador para 2 equipos), debe devolver una lista vacía o nully mostrar un mensaje.
 
- mostrarEquipos(ArrayList<ArrayList<Jugador>> equipos): Método estático (o de instancia) que imprime la conformación de los equipos de forma clara.
 
 
- Atributos: Un 
Implementa también una clase EjercicioA4Main para probar la funcionalidad: añade varios jugadores y genera 2 o 3 equipos.
Ejercicio A5: Sistema de Reservas de Vuelos Sencillo
Escribir una clase Vuelo y una clase SistemaReservas.
- 
Vuelo:- Atributos: codigoVuelo(String),origen(String),destino(String),capacidad(int),asientosOcupados(int).
- Constructor: Recibe codigoVuelo,origen,destino,capacidad. InicializaasientosOcupadosa 0.
- Métodos:
- getterspara todos los atributos.
- getAsientosDisponibles(): Devuelve- capacidad - asientosOcupados.
- reservarAsiento(): Si hay asientos disponibles, incrementa- asientosOcupadosen 1 y devuelve- true. Si no, devuelve- false.
- cancelarReserva(): Si hay asientos ocupados, decrementa- asientosOcupadosen 1 y devuelve- true. Si no, devuelve- false.
- toString(): Devuelve “Vuelo [CODIGO] de [ORIGEN] a [DESTINO] - Asientos disponibles: X/Y”.
 
 
- Atributos: 
- 
SistemaReservas:- Atributos: Un ArrayList<Vuelo>para almacenar los vuelos disponibles.
- Constructor: Inicializa la lista de vuelos.
- Métodos:
- agregarVuelo(Vuelo vuelo): Añade un nuevo vuelo al sistema.
- buscarVuelo(String codigoVuelo): Devuelve el objeto- Vuelocorrespondiente al código, o- nullsi no existe.
- realizarReserva(String codigoVuelo): Busca el vuelo y, si existe y hay disponibilidad, llama a su método- reservarAsiento(). Devuelve- truesi la reserva fue exitosa,- falseen caso contrario.
- cancelarReservaVuelo(String codigoVuelo): Busca el vuelo y, si existe, llama a su método- cancelarReserva(). Devuelve- truesi la cancelación fue posible,- falseen caso contrario.
- mostrarEstadoVuelos(): Itera sobre todos los vuelos e imprime su estado usando el método- toString()de- Vuelo.
 
 
- Atributos: Un 
Crea una clase principal para probar el sistema: añade vuelos, realiza y cancela reservas, y muestra el estado.