Boletín de repaso¶
Para qué sirve este boletín
Veinte ejercicios para repasar el Java que vas a necesitar en el módulo: de los tipos básicos y las cadenas a las colecciones, la herencia, las lambdas y los ficheros. Están ordenados de menor a mayor dificultad (★ a ★★★★★).
- Cada apartado de la teoría indica qué ejercicios le corresponden. Si te atascas, vuelve a la teoría.
- Compila con
javac *.javay ejecuta conjava NombreClase. Necesitas JDK 21 o superior (java -version). - Cada ejercicio indica la clase que debes crear.
- El último es un programa «filtro» que conecta directamente con el Tema 1: lee de la entrada estándar y escribe en la salida estándar.
Índice¶
| Nº | Ejercicio | Bloque | Nivel | Conceptos |
|---|---|---|---|---|
| 1 | Conversor de temperaturas | Fundamentos | ★☆☆☆☆ | Variables, tipos primitivos, operadores, casting, Scanner |
| 2 | Calificaciones y días de la semana | Fundamentos | ★☆☆☆☆ | if / else if, switch como expresión, operador ternario |
| 3 | Tablas, cifras y números primos | Fundamentos | ★☆☆☆☆ | for, while, do-while, bucles anidados, break, continue, args del main |
| 4 | Biblioteca de utilidades | Métodos | ★★☆☆☆ | Métodos static, parámetros y retorno, sobrecarga, varargs, recursividad, paso por valor |
| 5 | Temperaturas de la semana | Arrays | ★★☆☆☆ | Arrays unidimensionales, recorridos, Arrays.sort, Arrays.copyOf, Arrays.toString |
| 6 | Operaciones con matrices | Arrays | ★★☆☆☆ | Arrays bidimensionales, bucles anidados, for-each |
| 7 | Análisis de una frase | Cadenas | ★★☆☆☆ | String: length, charAt, substring, indexOf, contains, replace, toUpperCase, equals frente a == |
| 8 | Ticket de la cafetería | Cadenas | ★★☆☆☆ | StringBuilder, String.format, repeat, bloques de texto |
| 9 | Procesar un fichero CSV | Cadenas | ★★★☆☆ | split, trim, parseInt, parseDouble, validación, salida de errores, código de salida |
| 10 | Excepciones bajo control | Excepciones | ★★★☆☆ | try/catch/finally, multi-catch, throw, throws, excepciones propias |
| 11 | Cuenta bancaria | Programación orientada a objetos | ★★★☆☆ | Clases, atributos privados, constructores, this, getters, validación, toString |
| 12 | Tickets de soporte | Programación orientada a objetos | ★★★☆☆ | Atributos y métodos static, constantes, clases de utilidad |
| 13 | Plantilla de empleados | Herencia | ★★★☆☆ | extends, super, @Override, protected, polimorfismo, instanceof con patrón |
| 14 | Figuras geométricas | Herencia | ★★★★☆ | Clases abstractas, interfaces, métodos default, Comparable |
| 15 | Gestión de alumnos | Colecciones | ★★★☆☆ | ArrayList, add, size, get, sort con Comparator, Iterator, búsqueda |
| 16 | Frecuencia de palabras | Colecciones | ★★★★☆ | HashMap, TreeMap, merge, HashSet, TreeSet, entrySet |
| 17 | Catálogo con streams | Programación funcional | ★★★★☆ | Lambdas, Predicate, Runnable, referencias a métodos, streams, Collectors, Optional |
| 18 | Estado de los pedidos | Tipos modernos | ★★★☆☆ | enum con atributos y métodos, switch sobre enum, record, constructor compacto |
| 19 | Notas en un fichero | Ficheros | ★★★★☆ | java.nio.file: Path, Files, BufferedReader, BufferedWriter, try-with-resources, IOException |
| 20 | Integrador: calculadora filtro | Integrador | ★★★★★ | Entrada estándar, BufferedReader, enum, record, excepciones, Map, streams, System.err, System.exit |
Ejercicio 1 · Conversor de temperaturas¶
Fundamentos · ★☆☆☆☆ · Variables, tipos primitivos, operadores, casting, Scanner
Repasa cómo guarda y opera Java los números. Muchos errores de los programas que lanzan procesos vienen de convertir mal un texto en número.
Qué tienes que hacer
- Pide al usuario una temperatura en grados Celsius y conviértela a Fahrenheit (F = C · 9/5 + 32) y a Kelvin (K = C + 273,15). Muestra el resultado con dos decimales usando printf.
- Acepta también la coma como separador decimal: el usuario puede escribir 21,5.
- Muestra el resultado de 7 / 2, 7 / 2.0, 7 % 2 y (double) 7 / 2, y explica en un comentario por qué no dan lo mismo.
- Suma 1 a Integer.MAX_VALUE y muestra lo que ocurre. Repite la operación con long.
- Muestra el resultado de (int) 9.99 y de Math.round(9.5).
Datos de prueba
25
Pistas
- Scanner sc = new Scanner(System.in); y sc.nextLine() para leer una línea completa.
- Double.parseDouble(texto.replace(',', '.')) convierte el texto en double.
Clase: Conversor.java
Ejercicio 2 · Calificaciones y días de la semana¶
Fundamentos · ★☆☆☆☆ · if / else if, switch como expresión, operador ternario
Practica las estructuras de decisión, incluido el switch moderno de Java 14 o superior.
Qué tienes que hacer
- Escribe un método calificacion(double nota) que devuelva «Insuficiente» (< 5), «Suficiente» (< 6), «Bien» (< 7), «Notable» (< 9) o «Sobresaliente». Si la nota no está entre 0 y 10, devuelve «Nota no válida».
- Escribe un método diaSemana(int n) que, con un switch como expresión (case 1, 2, 3, 4, 5 ->), devuelva «laborable», «fin de semana» o «día no válido».
- En el main, pide una nota y un día y muestra los resultados.
- Muestra «¡Enhorabuena!» o «Ánimo para la recuperación» usando el operador ternario.
Datos de prueba
7.8 y después 6
Clase: Calificaciones.java
Ejercicio 3 · Tablas, cifras y números primos¶
Fundamentos · ★☆☆☆☆ · for, while, do-while, bucles anidados, break, continue, args del main
Los bucles aparecerán en todo el curso: leer la salida de un proceso línea a línea, repetir un menú, esperar a varios hilos…
Qué tienes que hacer
- Muestra la tabla de multiplicar de un número. El número llega como primer argumento del main (args[0]); si no hay argumentos, usa el 7.
- Calcula con un while la suma de las cifras de 98765.
- Muestra los números primos hasta 50 con dos bucles anidados. Usa break para dejar de buscar divisores cuando encuentres uno, y continue para saltar los que no son primos.
- Escribe un do-while que se ejecute tres veces y explica en qué se diferencia de un while.
Pistas
- Para pasar argumentos: java Bucles 9. Desde IntelliJ: Run → Edit Configurations → Program arguments.
- Para comprobar si x es primo basta con probar divisores mientras d · d ≤ x.
Clase: Bucles.java
Ejercicio 4 · Biblioteca de utilidades¶
Métodos · ★★☆☆☆ · Métodos static, parámetros y retorno, sobrecarga, varargs, recursividad, paso por valor
Dividir un programa en métodos pequeños es lo que permite después ejecutarlos en otro proceso o en otro hilo.
Qué tienes que hacer
- Escribe factorial(int n) de forma iterativa y factorialRec(int n) de forma recursiva, y comprueba que 10! da lo mismo con los dos.
- Escribe mcd(int a, int b) con el algoritmo de Euclides, de forma recursiva.
- Escribe esPrimo(int n).
- Sobrecarga el método maximo: una versión para dos int, otra para dos double y otra con número variable de argumentos (int... numeros).
- Escribe un método incrementar(int x) que haga x++ y comprueba que la variable original del main no cambia. Explica por qué.
Clase: Utilidades.java
Ejercicio 5 · Temperaturas de la semana¶
Arrays · ★★☆☆☆ · Arrays unidimensionales, recorridos, Arrays.sort, Arrays.copyOf, Arrays.toString
Trabaja con arrays paralelos: uno con los días y otro con las temperaturas.
Qué tienes que hacer
- Crea un array con los días (lun … dom) y otro con siete temperaturas.
- Calcula la media, la máxima y la mínima, indicando qué día se produjo cada una.
- Muestra los días cuya temperatura supera la media.
- Muestra las temperaturas ordenadas sin modificar el array original y comprueba que el original sigue igual.
Clase: EstadisticasArray.java
Ejercicio 6 · Operaciones con matrices¶
Arrays · ★★☆☆☆ · Arrays bidimensionales, bucles anidados, for-each
Una matriz es un array de arrays. Practica sus recorridos por filas y por columnas.
Qué tienes que hacer
- Declara la matriz de 3 × 4 con los números del 1 al 12 y muéstrala alineada con printf.
- Calcula y muestra la suma de cada fila y la de cada columna.
- Crea su traspuesta (4 × 3) y muéstrala.
- Escribe un método mostrar(int[][] m) que sirva para las dos matrices.
Clase: Matrices.java
Ejercicio 7 · Análisis de una frase¶
Cadenas · ★★☆☆☆ · String: length, charAt, substring, indexOf, contains, replace, toUpperCase, equals frente a ==
Las cadenas aparecen en todos los temas: comandos de ProcessBuilder, mensajes por sockets, contraseñas…
Qué tienes que hacer
- Con la frase «Dábale arroz a la zorra el abad», muestra su longitud, la frase en mayúsculas y el número de vocales (contando también las vocales con tilde).
- Escribe un método invertir(String s) que recorra la cadena con charAt.
- Escribe esPalindromo(String s) que ignore mayúsculas, espacios y tildes.
- Muestra la primera palabra con substring e indexOf, comprueba si contiene «zorra» y reemplázala por «gata».
- Compara "java" con new String("java") usando == y equals. Explica la diferencia.
Pistas
- Para quitar tildes: Normalizer.normalize(s, Normalizer.Form.NFD).replaceAll("\p{M}", "").
Clase: Cadenas.java
Ejercicio 8 · Ticket de la cafetería¶
Cadenas · ★★☆☆☆ · StringBuilder, String.format, repeat, bloques de texto
Construir textos con formato es útil para generar informes, logs o mensajes que se envían a otros procesos.
Qué tienes que hacer
- Con tres arrays (productos, cantidades y precios), genera un ticket con columnas alineadas: nombre del producto, unidades e importe.
- Calcula el total y el IVA incluido (10 %).
- Construye todo el ticket con un StringBuilder y muéstralo con un único println.
- Añade un pie de dos líneas usando un bloque de texto (""" … """).
Pistas
- %-22s alinea un texto a la izquierda en 22 caracteres; %10.2f, un número a la derecha con dos decimales.
- "=".repeat(40) repite un carácter.
Clase: Ticket.java
Ejercicio 9 · Procesar un fichero CSV¶
Cadenas · ★★★☆☆ · split, trim, parseInt, parseDouble, validación, salida de errores, código de salida
Leer datos con un formato y descartar los que están mal es exactamente lo que hará un proceso padre al leer la salida de un hijo.
Qué tienes que hacer
- Parte del array de líneas que tienes debajo. La primera es la cabecera.
- Separa cada línea por «;», quita los espacios con trim y convierte la edad y la nota en números. La nota puede venir con coma.
- Las líneas con un número de campos incorrecto o con números no válidos se informan por la salida de errores (System.err) y se cuentan como error.
- Muestra «APTO» o «NO APTO» según un umbral que llega como argumento (por defecto 5). Al final, muestra el resumen y la media.
- Termina el programa con System.exit(0) si no hay errores y con System.exit(1) si los hay. Compruébalo con echo $? (Linux y macOS) o echo %errorlevel% (Windows).
Datos de prueba
String[] lineas = {
"nombre;edad;nota",
"Ana;19;8.5",
"Luis;20;6,75",
"Marta;veinte;9",
"Pablo;21",
" Sara ; 22 ; 4.9 "
};
Clase: ProcesarCSV.java
Ejercicio 10 · Excepciones bajo control¶
Excepciones · ★★★☆☆ · try/catch/finally, multi-catch, throw, throws, excepciones propias
En PSP casi todas las operaciones pueden fallar: lanzar un proceso, esperar a un hilo, conectar con un servidor. Hay que saber capturar las excepciones.
Qué tienes que hacer
- Pide un número entero y repite la pregunta hasta que el usuario escriba uno válido (captura NumberFormatException).
- Escribe dividir(int a, int b), que lance una ArithmeticException con un mensaje propio si b es 0. Captúrala y añade un bloque finally que muestre un mensaje.
- Crea la excepción comprobada EdadInvalidaException (extends Exception) y un método validarEdad(int edad) throws EdadInvalidaException que la lance si la edad no está entre 0 y 120.
- Provoca un error de índice al acceder a args o a un array y captura en un único catch ArrayIndexOutOfBoundsException | NumberFormatException.
Datos de prueba
hola y después 0
Clase: Excepciones.java
Ejercicio 11 · Cuenta bancaria¶
Programación orientada a objetos · ★★★☆☆ · Clases, atributos privados, constructores, this, getters, validación, toString
La encapsulación protege los datos de un objeto: nadie puede dejar un saldo negativo desde fuera.
Qué tienes que hacer
- Crea la clase CuentaBancaria con los atributos privados iban, titular y saldo. El IBAN y el titular no pueden cambiar (final).
- Escribe dos constructores: uno con saldo inicial y otro que empiece con 0 y llame al primero con this(...). El saldo inicial no puede ser negativo.
- Añade los métodos ingresar, retirar (devuelve false si no hay saldo suficiente) y transferir(CuentaBancaria destino, double cantidad).
- Sobrescribe toString para mostrar «Titular (IBAN): saldo €».
- En el main, crea dos cuentas, haz varias operaciones y comprueba que un ingreso negativo lanza IllegalArgumentException.
Clase: CuentaBancaria.java
Ejercicio 12 · Tickets de soporte¶
Programación orientada a objetos · ★★★☆☆ · Atributos y métodos static, constantes, clases de utilidad
Distingue entre lo que pertenece a cada objeto y lo que comparte toda la clase.
Qué tienes que hacer
- Crea la clase Ticket con un id propio y una descripción. El id se asigna automáticamente con un contador static (1, 2, 3…).
- Añade un método static creados() que devuelva cuántos tickets se han creado.
- Crea una clase de utilidad MathUtil con una constante IVA = 0.21, un constructor privado y un método static conIva(double precio).
- Crea tres tickets, muéstralos y muestra cuántos hay. Calcula 100 € con IVA.
Clase: Static.java
Ejercicio 13 · Plantilla de empleados¶
Herencia · ★★★☆☆ · extends, super, @Override, protected, polimorfismo, instanceof con patrón
La herencia permite reutilizar código y tratar de la misma forma objetos distintos.
Qué tienes que hacer
- Crea la clase Empleado con nombre, salarioBase y un método salario() que devuelva el salario base.
- Crea Desarrollador, que añade horasExtra y cobra 25 € por cada una.
- Crea Gerente, que añade un bonus y cobra el salario del padre más un 10 %, más el bonus. Reutiliza el cálculo con super.salario().
- Guarda un empleado de cada tipo en una List
, recórrela, muestra el salario de cada uno y el total de nóminas. - Usa instanceof Gerente g para acceder al bonus solo cuando el empleado sea un gerente.
Clase: Empleados.java
Ejercicio 14 · Figuras geométricas¶
Herencia · ★★★★☆ · Clases abstractas, interfaces, métodos default, Comparable
Las interfaces son la base de los hilos: Runnable y Callable son interfaces que implementarás en el Tema 2.
Qué tienes que hacer
- Crea la clase abstracta Figura con los métodos abstractos area() y perimetro(), y un toString que los muestre.
- Crea Circulo, Rectangulo y Triangulo (con la fórmula de Herón).
- Crea la interfaz Dibujable con el método dibujar() y un método default dibujarConMarco(). Haz que solo el círculo y el rectángulo la implementen.
- Haz que Figura implemente Comparable
para ordenar por área y ordena una lista con Collections.sort. - Recorre la lista y dibuja con marco solo las figuras que sean Dibujable.
Clase: Figuras.java
Ejercicio 15 · Gestión de alumnos¶
Colecciones · ★★★☆☆ · ArrayList, add, size, get, sort con Comparator, Iterator, búsqueda
Las listas sustituyen a los arrays cuando no sabemos cuántos elementos habrá. En el Tema 1 guardarás en una lista los procesos lanzados.
Qué tienes que hacer
- Crea la clase Alumno (nombre, grupo, nota) y una lista con cinco alumnos.
- Ordena la lista por nota de mayor a menor con Comparator.comparing(...).reversed() y muéstrala.
- Ordénala después por grupo y, dentro de cada grupo, por nombre (thenComparing).
- Escribe un método buscar(lista, nombre) que no distinga mayúsculas y devuelva el alumno o null.
- Elimina los suspensos recorriendo la lista con un Iterator.
Clase: GestionAlumnos.java
Ejercicio 16 · Frecuencia de palabras¶
Colecciones · ★★★★☆ · HashMap, TreeMap, merge, HashSet, TreeSet, entrySet
Los mapas asocian una clave con un valor: PID → proceso, usuario → conexión… Los usarás en todos los temas.
Qué tienes que hacer
- Parte de un texto de varias líneas (puedes usar un bloque de texto) y sepáralo en palabras en minúsculas.
- Cuenta cuántas veces aparece cada palabra en un HashMap
usando merge. - Muestra las frecuencias ordenadas alfabéticamente con un TreeMap.
- Muestra las tres palabras más repetidas.
- Guarda las palabras distintas en un Set, muestra cuántas hay, comprueba si contiene «pid» y qué devuelve add de una palabra repetida.
Clase: FrecuenciaPalabras.java
Ejercicio 17 · Catálogo con streams¶
Programación funcional · ★★★★☆ · Lambdas, Predicate, Runnable, referencias a métodos, streams, Collectors, Optional
Las lambdas son imprescindibles en Java moderno: con ellas se crean hilos, se reacciona cuando termina un proceso (onExit) y se procesan listas.
Qué tienes que hacer
- Define un record Producto(nombre, categoria, precio, stock) y una lista con seis productos.
- Guarda en una variable un Predicate
que indique si hay stock. - Con un stream, obtén los nombres de los productos con stock y precio menor de 100 €, ordenados alfabéticamente.
- Calcula el valor total del almacén (precio · stock), cuenta los productos de cada categoría con groupingBy y busca el más caro con max (devuelve un Optional).
- Lista los productos agotados usando negate() del predicado.
- Crea un Runnable con una lambda que muestre un mensaje y ejecútalo con run().
Clase: Streams.java
Ejercicio 18 · Estado de los pedidos¶
Tipos modernos · ★★★☆☆ · enum con atributos y métodos, switch sobre enum, record, constructor compacto
Los enum representan un conjunto cerrado de valores, como los estados de un proceso o de un hilo. Los record son clases de datos inmutables.
Qué tienes que hacer
- Crea el enum Estado con PENDIENTE, PAGADO, ENVIADO, ENTREGADO y CANCELADO. Cada valor guarda un texto descriptivo.
- Añade el método siguiente(), que con un switch devuelva el estado siguiente. ENTREGADO y CANCELADO se quedan como están.
- Crea record Pedido(int id, String cliente, double importe, Estado estado). Valida en el constructor compacto que el importe sea positivo y que el cliente no esté vacío.
- Añade avanzar(), que devuelva un pedido nuevo con el estado siguiente, ya que los record son inmutables.
- Avanza el estado de tres pedidos, recorre Estado.values() y comprueba que dos record con los mismos datos son equals.
Clase: Pedidos.java
Ejercicio 19 · Notas en un fichero¶
Ficheros · ★★★★☆ · java.nio.file: Path, Files, BufferedReader, BufferedWriter, try-with-resources, IOException
Los ficheros son el mecanismo más sencillo para que dos procesos compartan información.
Qué tienes que hacer
- Escribe un fichero notas.txt con cuatro líneas «nombre;nota» usando Files.write.
- Léelo línea a línea con un BufferedReader en un try-with-resources y calcula la media y la mejor nota.
- Escribe un informe.txt con un BufferedWriter y muéstralo después con Files.readAllLines.
- Intenta leer un fichero que no existe y captura la excepción mostrando su tipo.
Clase: FicherosNotas.java
Ejercicio 20 · Integrador: calculadora filtro¶
Integrador · ★★★★★ · Entrada estándar, BufferedReader, enum, record, excepciones, Map, streams, System.err, System.exit
Este programa junta lo repasado y es el puente directo con el Tema 1: un programa «filtro» que lee de su entrada y escribe en su salida puede lanzarse como proceso hijo y comunicarse con el padre por tuberías.
Qué tienes que hacer
- Lee líneas de System.in con un BufferedReader hasta el final de la entrada (readLine() devuelve null). Ignora las líneas vacías y las que empiezan por #.
- Cada línea tiene el formato «número operador número», por ejemplo 3 + 4. Crea un enum Operador (+, -, *, /) con un método aplicar(a, b) y un record Operacion con un método static parsear(String linea).
- Escribe cada resultado en la salida estándar y cada error en la salida de errores, indicando el número de línea: formato incorrecto, operador desconocido, número no válido o división entre cero.
- Al final, muestra cuántas operaciones han ido bien, cuántos errores ha habido, la suma de los resultados y cuántas veces se ha usado cada operador (Map).
- Termina con código 0 si no ha habido errores y con 1 si los ha habido.
- Pruébalo redirigiendo un fichero: java CalculadoraFiltro < operaciones.txt. Prueba también: java CalculadoraFiltro < operaciones.txt 2> errores.txt.
Datos de prueba
Clase: CalculadoraFiltro.java