12. Test de repaso
UD3 — Control de Flujo y Depuración · RA3 — Escribe y depura código, analizando y utilizando las estructuras de control del lenguaje
IES Thiar — Pilar de la Horadada (Alicante) · Curso 2026-2027
| Aspecto |
Valor |
| Resultado de aprendizaje |
RA: 3 — Escribe y depura código, analizando y utilizando las estructuras de control del lenguaje. |
| Criterios de evaluación |
CE 3.1 · CE 3.2 · CE 3.3 · CE 3.4 · CE 3.5 · CE 3.6 · CE 3.7 · CE 3.8 · CE 3.9 (repaso global). |
| Marco normativo |
RD 405/2023 · RD 450/2010 · RD 659/2023 |
| Tecnología base |
Java 25 LTS (OpenJDK Temurin 25) — IntelliJ IDEA Community Edition |
| Horas estimadas |
~2 h (de las 30 h de la UD3). |
Requisitos previos: todas las secciones de UD3, de la 1 a la 11. Este test es un repaso global. Responde sin mirar las soluciones; al final de cada bloque encontrarás las respuestas.
Cómo usar este test: cada bloque cubre una sección de UD3. Hay preguntas de selección única, selección múltiple, rellenar huecos, comprensión de código y búsqueda de errores. Si fallas más de 2 preguntas de un bloque, repasa esa sección antes de seguir.
Bloque 1: Control de flujo — conceptos y diagrama (sección 1)
Pregunta 1
¿Cuántos tipos de estructuras de control existen en programación estructurada?
Pregunta 2
Según las leyes de De Morgan, !(A && B) equivale a:
Pregunta 3
¿Qué valor tendrá resultado después de ejecutar este código?
| int a = 5, b = 3;
boolean resultado = (a > b) && (b > 0) || (a == 5);
|
Pregunta 4
Una de estas condiciones NO compila en Java. ¿Cuál?
Soluciones del Bloque 1
| Pregunta |
Respuesta |
Justificación |
| 1.1 |
b — Tres |
Selección, iteración y salto (Böhm y Jacopini, 1966). |
| 1.2 |
b — !A \|\| !B |
De Morgan: la negación de "y" es "o no". |
| 1.3 |
b — true |
(a > b) = true, (b > 0) = true, true && true = true. |
| 1.4 |
c — if (18 <= edad <= 65) |
Java no admite rangos encadenados. Hay que descomponer. |
| 1.5 |
selección, iteración, salto |
Los tres pilares de la programación estructurada. |
| 1.6 |
\|\|, && |
De Morgan: !(A && B) = !A \|\| !B; !(A || B) = !A && !B. |
Bloque 2: Selección — if / else if / else (sección 2)
Pregunta 7
¿Qué pasa si ejecutas el siguiente código?
| int x = 5;
if (x = 10) {
IO.println("Es diez");
}
|
= es asignación, no comparación. En Java, la asignación devuelve int, no boolean, así que no compila en la condición del if. Usa ==.
Pregunta 8
¿Qué es el dangling else?
Sin llaves, el else se asocia al if más cercano. Con llaves, la asociación es inequívoca.
Pregunta 9
¿Qué imprime el siguiente código?
| int nota = 7;
if (nota >= 9) {
IO.println("Sobresaliente");
} else if (nota >= 7) {
IO.println("Notable");
} else if (nota >= 5) {
IO.println("Aprobado");
} else {
IO.println("Suspenso");
}
|
nota = 7. La primera condición 7 >= 9 es false. La segunda 7 >= 7 es true → "Notable".
Pregunta 10
El siguiente código tiene un bug. ¿Cuál es?
| if (edad >= 18)
IO.println("Mayor de edad");
IO.println("Puedes votar");
|
Sin llaves, solo la primera sentencia pertenece al if. La segunda se ejecuta siempre. Siempre llaves.
Soluciones del Bloque 2
| Pregunta |
Respuesta |
Justificación |
| 2.1 |
c |
= es asignación. En Java no devuelve boolean. |
| 2.2 |
b |
Ambigüedad de asociación del else sin llaves. |
| 2.3 |
b — "Notable" |
7 >= 9 es false, 7 >= 7 es true. |
| 2.4 |
b |
Sin llaves, solo la primera línea pertenece al if. |
| 2.5 |
.equals(), .equalsIgnoreCase(), identidad |
== compara referencias; .equals() compara contenido. |
Bloque 3: Selección — switch expression (sección 3)
Pregunta 12
¿Qué es el fall-through en el switch clásico?
Sin break, Java ejecuta el case actual y todos los siguientes hasta encontrar break o el final del switch.
Pregunta 13
En el switch moderno con flecha (->), ¿es necesario poner break?
La sintaxis con flecha -> elimina el fall-through. No hay break.
Pregunta 14
¿Qué imprime el siguiente código?
| int dia = 6;
String tipo = switch (dia) {
case 1, 2, 3, 4, 5 -> "Laborable";
case 6, 7 -> "Fin de semana";
default -> "Desconocido";
};
IO.println(tipo);
|
Pregunta 15
El siguiente switch expression NO compila. ¿Por qué?
| String nombre = switch (dia) {
case 1 -> "Lunes";
case 2 -> "Martes";
case 3 -> "Miércoles";
case 4 -> "Jueves";
case 5 -> "Viernes";
case 6 -> "Sábado";
case 7 -> "Domingo";
};
|
Un switch expression debe ser exhaustivo. Con int y sin default, el compilador no sabe qué devolver para otros valores.
Soluciones del Bloque 3
| Pregunta |
Respuesta |
Justificación |
| 3.1 |
b |
Fall-through: sin break, se ejecutan varios case seguidos. |
| 3.2 |
b |
La flecha -> elimina el fall-through. No hay break. |
| 3.3 |
b — "Fin de semana" |
dia = 6 coincide con case 6, 7. |
| 3.4 |
c |
Falta default. El switch expression debe ser exhaustivo. |
| 3.5 |
yield |
Devuelve el valor dentro de un bloque del switch expression. |
Bloque 4: Iteración — while y do-while (sección 4)
Pregunta 17
¿Cuál es la diferencia fundamental entre while y do-while?
Pregunta 18
¿Qué produce el siguiente código?
| int i = 0;
while (i > 5) {
IO.println(i);
i++;
}
|
i = 0, 0 > 5 es false. El cuerpo no se ejecuta ni una vez. El while es precondición.
Pregunta 19
¿Qué produce el siguiente código?
| int i = 0;
do {
IO.println(i);
i++;
} while (i > 5);
|
El do-while ejecuta el cuerpo antes de comprobar. Imprime 0, incrementa a 1, comprueba 1 > 5 → false, sale.
Pregunta 20
El siguiente bucle es infinito. ¿Por qué?
| int i = 0;
while (i < 10) {
if (i % 2 == 0) {
continue;
}
IO.println(i);
i++;
}
|
En i = 0, 0 % 2 == 0 es true, continue salta el i++. i sigue en 0. Bucle infinito. Solución: mover i++ antes del continue.
Soluciones del Bloque 4
| Pregunta |
Respuesta |
Justificación |
| 4.1 |
b |
while = precondición; do-while = poscondición. |
| 4.2 |
c |
0 > 5 es false desde el principio. El while no entra. |
| 4.3 |
b |
do-while ejecuta antes de comprobar. Imprime 0, sale. |
| 4.4 |
b |
continue salta el i++ cuando i es par. i nunca cambia. |
| 4.5 |
while, do-while |
Precondición y poscondición. |
Bloque 5: Arrays unidimensionales (sección 5)
Pregunta 22
¿Cuál es el rango de índices válidos de un array de 7 elementos?
Pregunta 23
¿Cuál es el valor por defecto de los elementos de new String[5]?
Pregunta 24
¿Qué imprime el siguiente código?
| int[] numeros = {10, 20, 30};
IO.println(numeros.length);
|
Pregunta 25
El siguiente código tiene un bug. ¿Cuál es?
| int[] arr = new int[3];
for (int i = 0; i <= arr.length; i++) {
IO.println(arr[i]);
}
|
Soluciones del Bloque 5
| Pregunta |
Respuesta |
Justificación |
| 5.1 |
c — 0 a 6 |
Índices de 0 a length - 1. |
| 5.2 |
b — null |
Los arrays de objetos se inicializan a null. |
| 5.3 |
a — 3 |
.length sin paréntesis devuelve el número de elementos. |
| 5.4 |
b |
<= en vez de <. La trampa nº 1 con arrays. |
| 5.5 |
toCharArray(), índice, length, length() |
toCharArray() convierte a char[]; length (campo) vs length() (método). |
Bloque 6: Iteración — for clásico (sección 6)
Pregunta 27
¿Qué imprime el siguiente código?
| for (int i = 0; i < 5; i++) {
IO.print(i + " ");
}
|
Pregunta 28
¿Qué imprime el siguiente código?
| for (int i = 0; i < 10; i += 3) {
IO.print(i + " ");
}
|
Pregunta 29
¿Qué imprime el siguiente código?
| for (int i = 5; i > 0; i--) {
IO.print(i + " ");
}
|
Pregunta 30
El siguiente código debería sumar los elementos de un array pero tiene dos bugs. ¿Cuáles son?
| int[] nums = {1, 2, 3, 4, 5};
int suma = 0;
for (int i = 1; i <= nums.length; i++) {
suma += nums[i];
}
|
Bug 1: i = 1 salta nums[0]. Bug 2: i <= nums.length accede a nums[5] que no existe.
Soluciones del Bloque 6
| Pregunta |
Respuesta |
Justificación |
| 6.1 |
b — 0 1 2 3 4 |
i va de 0 a 4 (i < 5). |
| 6.2 |
b — 0 3 6 9 |
i va de 3 en 3: 0, 3, 6, 9. |
| 6.3 |
b — 5 4 3 2 1 |
i decrementa mientras i > 0. |
| 6.4 |
b |
Dos bugs: i = 1 salta el primero; <= causa excepción. |
| 6.5 |
inicialización, condición, actualización |
Las tres partes del for. |
Bloque 7: Iteración — for-each (sección 7)
Pregunta 32
¿Cuál es la sintaxis del for-each?
Pregunta 33
¿Qué imprime el siguiente código?
| int[] numeros = {10, 20, 30};
for (int n : numeros) {
IO.print(n + " ");
}
|
Pregunta 34
El siguiente código intenta duplicar todos los elementos del array pero no funciona. ¿Por qué?
| int[] nums = {1, 2, 3};
for (int n : nums) {
n = n * 2;
}
|
n es una copia. Para modificar el array, usa for clásico con nums[i] = nums[i] * 2.
Pregunta 35
¿Cuál es la regla de oro para elegir entre for-each y for clásico?
Soluciones del Bloque 7
| Pregunta |
Respuesta |
Justificación |
| 7.1 |
b |
for (Tipo elemento : array) — sin índice. |
| 7.2 |
b — 10 20 30 |
Recorre los valores, no los índices. |
| 7.3 |
b |
n es una copia. Modificar n no cambia el array. |
| 7.4 |
b |
for-each lee; for clásico escribe. |
| 7.5 |
toCharArray(), Iterable |
String no es Iterable; hay que convertirlo. |
Bloque 8: Bucles anidados, matrices y sentencias de salto (sección 8)
Pregunta 37
¿Qué hace break dentro de un bucle?
Pregunta 38
¿Qué hace continue dentro de un bucle?
Pregunta 39
En bucles anidados, ¿de qué bucle sale break?
| for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) break;
IO.println(i + "," + j);
}
}
|
Pregunta 40
¿Cuántas iteraciones totales hace un bucle anidado 5 × 7?
Soluciones del Bloque 8
| Pregunta |
Respuesta |
Justificación |
| 8.1 |
b |
break sale del bucle más cercano. |
| 8.2 |
b |
continue salta a la siguiente iteración. |
| 8.3 |
b |
Solo sale del bucle interno (j). |
| 8.4 |
b — 35 |
5 × 7 = 35. |
| 8.5 |
filas, columnas, etiqueta |
m.length = filas; m[i].length = columnas; labeled break para bucles anidados. |
Bloque 9: Gestión de excepciones — try-catch-finally (sección 9)
Pregunta 42
¿Cuál es la diferencia entre checked y unchecked?
Pregunta 43
¿Es NumberFormatException checked o unchecked?
Pregunta 44
¿Qué excepción lanza Integer.parseInt("abc")?
Pregunta 45
El siguiente código tiene un error de compilación. ¿Cuál?
| try {
int n = Integer.parseInt(entrada);
} catch (Exception e) {
IO.println("Error general");
} catch (NumberFormatException e) {
IO.println("No es un número");
}
|
El específico debe ir antes que el general. Si pones Exception primero, captura todo y el NumberFormatException nunca se ejecuta.
Soluciones del Bloque 9
| Pregunta |
Respuesta |
Justificación |
| 9.1 |
b |
Checked: compilador obliga. Unchecked: opcional. |
| 9.2 |
b — Unchecked |
Hereda de RuntimeException. |
| 9.3 |
b |
parseInt("abc") lanza NumberFormatException. |
| 9.4 |
b |
El orden debe ser específico → general. |
| 9.5 |
finally, throw, throws |
finally siempre se ejecuta; throw lanza; throws declara. |
Bloque 10: Depuración en IntelliJ IDEA (sección 10)
Pregunta 47
¿Qué atajo ejecuta el programa en modo depuración?
Shift+F9 = Debug. Shift+F10 = Run (sin depuración).
Pregunta 48
¿Qué hace Step Over (F8)?
Pregunta 49
¿Cuándo debes usar Step Into (F7)?
Pregunta 50
Tienes un bucle for que recorre 1000 elementos y el bug está en la iteración 523. ¿Cómo lo depuras de forma eficiente?
El breakpoint condicional detiene el programa solo cuando i == 523, ahorrando 522 pulsaciones de F8.
Soluciones del Bloque 10
| Pregunta |
Respuesta |
Justificación |
| 10.1 |
b — Shift+F9 |
Debug. Shift+F10 = Run. |
| 10.2 |
b |
Step Over ejecuta sin entrar en métodos. |
| 10.3 |
b |
Step Into solo para tus métodos. |
| 10.4 |
a — Breakpoint condicional |
Condición i == 523. |
| 10.5 |
Evaluate Expression, Variables, Watches |
Herramientas del depurador. |
Bloque 11: assert y aserciones (sección 11)
Pregunta 52
¿Qué lanza Java cuando una aserción falla?
Pregunta 53
¿Está assert activado por defecto en Java?
Pregunta 54
¿Cuál es la diferencia entre assert y throw new Excepcion?
Pregunta 55
El siguiente código usa assert para validar entrada del usuario. ¿Por qué es incorrecto?
| int edad = Integer.parseInt(IO.readln().trim());
assert edad >= 0 && edad <= 120 : "Edad fuera de rango";
|
assert es para contratos internos del programador. La entrada del usuario se valida con if (siempre se ejecuta, con o sin -ea).
Soluciones del Bloque 11
| Pregunta |
Respuesta |
Justificación |
| 11.1 |
b — AssertionError |
Hereda de Error, no de Exception. |
| 11.2 |
b — No |
Hay que poner -ea en VM options. |
| 11.3 |
b |
assert = bugs del programador; excepciones = errores del usuario. |
| 11.4 |
b |
Sin -ea, assert se ignora. La entrada se valida con if. |
| 11.5 |
precondición, postcondición, -ea |
Pre/post-condiciones y activación. |
Bloque 12: Repaso global — preguntas de razonamiento
Pregunta 57
El siguiente código debería sumar solo los números positivos de un array. ¿Es correcto? Si no, corrígelo.
| int[] datos = {5, -3, 8, -2, 7};
int suma = 0;
for (int i = 0; i < datos.length; i++) {
if (datos[i] > 0) {
suma += datos[i];
}
}
|
Pregunta 58
El siguiente código debería imprimir los números del 1 al 10, pero imprime del 0 al 9. ¿Dónde está el bug?
| for (int i = 0; i < 10; i++) {
IO.println("Número " + i);
}
|
Pregunta 59
¿Qué imprime el siguiente código?
| int[] nums = {1, 2, 3, 4, 5};
int suma = 0;
for (int n : nums) {
suma += n;
}
IO.println("Suma: " + suma + ", Media: " + (suma / nums.length));
|
Pregunta 60
El siguiente código tiene un bug de lógica. ¿Cuál es?
| int[] numeros = {-5, -8, -3, -9, -2};
int max = 0;
for (int i = 0; i < numeros.length; i++) {
if (numeros[i] > max) {
max = numeros[i];
}
}
IO.println("Máximo: " + max);
|