Ejemplo de examen
Duración: 4 horas
- Lee atentamente cada ejercicio antes de empezar.
- Se debe crear un único proyecto. Cada ejercicio estará dentro de un paquete.
- Los ejercicios son independientes entre sí. Puedes hacerlos en cualquier orden.
- Para que una parte de un ejercicio puntúe, debe estar realizado correctamente.
- Escribe código limpio, bien documentado y estructurado.
- Si en el enunciado no se indica un nombre específico de clase/método y/o tipos de datos a utilizar, se debe elegir uno, indicando en un comentario el motivo de su elección.
- Aplica correctamente los principios de POO.
- Gestiona las excepciones de forma apropiada.
Descargar solución del aula virtual. Ejercicio resuelto con IntelliJ IDEA Community Edition.
EJERCICIO 1: Sistema de gestión de vehículos (2,5 puntos)
Desarrolla un sistema para gestionar vehículos de una empresa de alquiler:
Parte A (1 punto)
Diseña la siguiente jerarquía de clases:
- Interfaz
Alquilablecon métodos:calcularPrecioAlquiler(int dias)estaDisponible()
- Clase abstracta
Vehiculoque implementaAlquilablecon atributos:matrícula(String)marca(String)modelo(String)anio(int)precioBaseDia(double)alquilado(boolean)
- Clase
Cocheque extiendeVehiculoy añade:numPuertas(int)tipoCombustible(enum:GASOLINA,DIESEL,ELECTRICO,HIBRIDO)
- Clase
Motocicletaque extiendeVehiculoy añade:cilindrada(int)tieneAbs(boolean)
Parte B (0,8 puntos)
- Para cada clase, implementa:
- Un constructor sin parámetros.
- Un constructor con todos los parámetros. Se deben realizar las siguintes validaciones:
matriculasólo puede contener números y letras.aniono puede ser futuro.numPuertas,precioBaseDiaycilindradano pueden ser negativas.- Si alguna validación falla, se debe lanzar la excepción
IllegalArgumentException.
- Utiliza encapsulamiento (getters/setters) para todos los atributos.
- En
Coche: el precio final de alquiler esprecioBaseDia * 1.1si esELECTRICO, sinoprecioBaseDia. - En
Motocicleta: el precio final de alquiler esprecioBaseDia * 0.8. - Sobrescribe
equals()para comparar vehículos por matrícula.
Parte C (0,7 puntos)
Crea una clase EmpresaAlquiler que:
- Mantén una colección de vehículos usando
LinkedList. - Implementa los métodos:
registrarVehiculo(Vehiculo vehiculo): registrar un vehículo nuevo. No se puede registrar dos vehículos con la misma matrícula.alquilarVehiculo(Vehiculo vehiculo): alquilar vehículo (cambiar estado). No se puede alquilar un vehículo ya alquilado.devolverVehiculo(Vehiculo vehiculo): devolver vehículo (cambiar estado). No se puede devolver un vehículo que no estaba alquilado previamente.mostrarVehiculos(): obtener toda la flota de vehículos.mostrarVehiculosDisponibles(): obtener todos los vehículos disponibles.
- Si en alguno de los métodos anteriores no se puede llevar a cabo la operación, se debe lanzar una excepción
IllegalArgumentException.
Crea una clase Main que:
- Cree 3 coches y 2 motocicletas de ejemplo.
- Calcule los ingresos totales si se alquilaran los vehículos disponibles (los que están sin alquilar) por 7 días.
EJERCICIO 2: Análisis de ventas con colecciones (2 puntos)
Parte A (1 punto)
Implementa una clase GestionVentas que:
- Lea un archivo
ventas.txtdonde cada línea tiene:fecha,producto,cantidad,precioUnitario(ejemplo:2024-11-12,Laptop,2,850.50). Si una línea tiene un formato incorrecto, se debe ignorar y mostrar un aviso. - Almacene los datos en un
HashMapdonde la clave (key) sea el nombre del producto y el valor (value) sea el total vendido (cantidad * precio). - Cree un
HashMapque almacene la cantidad de veces se ha vendido cada producto. La clave (key) será el nombre del producto y el valor (value) la cantidad de veces que se ha vendido el producto. - Si un producto aparece varias veces, debe sumar sus ventas totales.
- Usa
try-with-resourcespara la lectura del archivo.
Puedes utilizar el siguiente contenido de ejemplo para el fichero ventas.txt (tiene 9 productos válidos):
2024-01-15,Laptop,2,899.99
2024-01-16,Mouse,5,24.50
2024-01-16,Teclado,3,45.00
2024-01-17Monitor,1,299.00 --error
2024-01-18,Webcam,4,67.90
2024-01-19,Auriculares,8,35.75
2024-01-20,Disco Duro SSD,2,120.00
2024-01-21,Memoria RAM,6,78.50
2024-01-16,Teclado,5,45.00
2024-01-22,Cable HDMI,10,12.99
2024-01-23,Hub USB,3,28.00
Parte B (1 punto)
Para la clase GestionVentas, implementa los métodos:
mostarVentasPorProducto(): muestra una lista de los productos, ingresos totales generados y unidades vendidas.mostrarTop3Productos(): muestra por pantalla los 3 productos que más ingresos han generado.calcularImportePromedio(): calcular el importe promedio de venta por producto.calcularTotal(): calcular los ingresos totales por las ventas.filtrarVentasDestacadas(): filtrar productos cuyas ventas totales superen el umbral (1000€) y guardarlos en un archivoventas_destacadas.txt. El umbral y el nombre del archivo deben guardarse como constantes de la clase.
En una clase Main, crea un objeto de GestionVentas, el cual utilices para leer el archivo y llamar a todos los métodos anteriores.
EJERCICIO 3: Validador de formularios web (1,5 puntos)
Crea una clase ValidadorWeb que valide campos de un formulario.
Parte A (0,6 puntos)
Implementa validadores con expresiones regulares para:
- Contraseña segura: mínimo 8 caracteres, al menos una mayúscula, una minúscula, un número y un caracter especial (sólo son válidos
!@#$%^&*). - Nombre de usuario: entre 4 y 20 caracteres, solo letras, números y guiones bajos, debe empezar con letra.
Los métodos deben ser:
validarContrasena(String contrasena)validarUsuario(String usuario)
Parte B (0,5 puntos)
- Fecha en formato
DD/MM/YYYY: día válido (01-31), mes (01-12), año (1900-2099). Para el mes de febrero se debe calcular si el año es bisiesto. Un año es bisiesto si es divisible por 4 sin ser divisible por 100; o si es divisible por 400. - Tarjeta de crédito: 16 dígitos agrupados de 4 en 4 con espacios o guiones (ejemplo:
1234-5678-9012-3456).
Los métodos debe ser:
validarFecha(String fecha)validarTarjeta(String tarjeta)
Parte C (0,4 puntos)
Crea excepciones personalizadas (todas ellas reciben un String):
ContrasenaInvalidaExceptionUsuarioInvalidoExceptionFormatoFechaInvalidoExceptionTarjetaInvalidaException
Crea una clase Main donde:
- Se llama cada uno de los métodos creados. No se debe crear ningún objeto
ValidadorWeb, sino llamar directamente a los métodos. - Comprueba que lance las excepciones apropiadas. Para ello, utiliza un
try-catchpara cada validación.
EJERCICIO 4: Cola de prioridad (2 puntos)
Implementa una cola de prioridad desde cero para simular un sistema de emergencias, donde los pacientes con más prioridad serán atendidos antes.
Parte A (1,2 puntos)
- Crea una clase
ColaPrioridadpara la cola. Internamente debe usar nodos creados manualmente para crear la cola. - Crea una clase interna
Nodocon:dato(String)prioridad(int)siguiente(Nodo)
- Implementa los métodos:
encolar(String paciente, int prioridad)desencolar()frente()estaVacia()tamanio()
- Los elementos con mayor prioridad (número más alto) deben salir primero.
- Al encolar, mantén la lista ordenada por prioridad.
- Lanza excepciones apropiadas (crea
ColaVaciaException).
Parte B (0,8 puntos)
Crea una clase Main que use la cola. Para ello:
- Añade 8 pacientes con diferentes gravedades.
- Procesa la cola mostrando el orden de atención. Se debe mostrar los nombres por orden de atención (de primero a último).
- Muestra datos estadísticos:
- Número de pacientes iniciales en la cola.
- Tiempo de atención por paciente. El valor debe ser 10 minutos y se debe guardar en una constante.
- Tiempo promedio de espera (asumiendo 10 minutos por paciente).
- Tiempo total estimado de espera, teniendo en cuenta todos los pacientes que hay en cola.
EJERCICIO 5: Algoritmos de ordenación y búsqueda (1,5 puntos)
Parte A (0,8 puntos)
Implementa el algoritmo Insertion Sort para ordenar un array de objetos Producto:
- Clase
Productocon:nombre(String)precio(BigDecimal)stock(int)
- Ordena por precio de menor a mayor.
- Implementa la interfaz
Comparable<Producto>. - Cuenta e imprime el número de desplazamientos realizados.
- Muestra el array después de cada inserción.
Parte B (0,7 puntos)
Implementa un método de Linear Search mejorado que:
- Busque un producto por nombre (ignorando mayúsculas/minúsculas).
- Devuelva una lista con todas las coincidencias (pueden existir productos con nombres similares).
- Use un
ArrayListpara almacenar los resultados. - Si no encuentra ninguno, devuelva una lista vacía (en vez de
null). - Cuenta cuántas comparaciones realizó.
Crea un programa de prueba con al menos 12 productos.
EJERCICIO 6: Procesamiento funcional de texto (0,5 puntos)
Dado un archivo de texto procesar.txt con múltiples líneas, usa Streams y lambdas para realizar en una única cadena de operaciones:
- Leer todas las líneas del archivo.
- Convertir cada línea a minúsculas.
- Dividir cada línea en palabras (usar
split("\\s+")). - Filtrar palabras con más de 4 caracteres.
- Eliminar duplicados.
- Ordenar alfabéticamente.
- Crear un
HashMap<Character, Integer>que cuente cuántas palabras empiezan con cada letra.
Escribe el código completo incluyendo la lectura del archivo procesar.txt y el procesamiento con Streams.
Puedes utilizar el siguiente contenido de ejemplo para el fichero procesar.txt:
Este es un archivo de ejemplo para practicar lectura
Cada línea contiene un pequeño fragmento de texto
Puedes contar palabras caracteres o líneas
También puedes buscar patrones o reemplazar texto
El archivo puede servir para probar practicar programación funcional
Algunas líneas son más largas que otras intencionadamente
Procesar texto es una tarea común en muchos lenguajes
Intenta extraer información relevante de este contenido
Fin del archivo de ejemplo