Ejercicio 1 de 7
⚔️ Reto: Tarjeta de perfil
¡Hora de poner a prueba lo que sabes! Usa todo lo que has aprendido hasta ahora.
Crea variables para una tarjeta de perfil e imprímelas así:
Nombre: Java-Dev
Edad: 20
Lenguaje: Java
Las variables ya están. Solo tienes que añadir las tres líneas con println.
Código inicial
void main() {
String nombre = "Java-Dev";
int edad = 20;
String lenguaje = "Java";
// Imprime estas tres líneas:
// Nombre: Java-Dev
// Edad: 20
// Lenguaje: Java
}
Contexto
¿Por qué retos?
A programar no se aprende leyendo: se aprende resolviendo problemas tú mismo. Los retos combinan varios conceptos, igual que las tareas de programación reales.
En la vida real nunca vas a crear una sola variable y ya. Vas a combinar variables con salida, cálculos y condiciones. Estos retos te preparan para eso.
Ejercicio 2 de 7
⚔️ Reto: Secuencia de números
¡Combina bucles con condiciones!
Imprime los números del 1 al 20, pero sáltate todos los que sean divisibles entre 3.
Salida esperada:
1 2 4 5 7 8 10 11 13 14 16 17 19 20
Pista: usa continue;, que se salta el resto de la vuelta actual del bucle.
Código inicial
void main() {
for (int i = 1; i <= 20; i++) {
// Sáltate los números divisibles entre 3
IO.print(i + " ");
}
}
Contexto
break y continue
break; sale del bucle entero. continue; solo se salta la vuelta actual y pasa a la siguiente.
En bucles anidados, ambos afectan solo al bucle más interno. Con etiquetas también puedes apuntar a bucles exteriores: exterior: for (...) { ... break exterior; }
Ejercicio 3 de 7
⚔️ Reto: Minicalculadora
Escribe un método calcular que reciba dos números y un operador y devuelva el resultado.
Operadores soportados: +, -, *
Salida esperada:
15
3
54
Código inicial
int calcular(int a, int b, char op) {
// Devuelve a+b, a-b o a*b
// según op ('+', '-' o '*')
return 0;
}
void main() {
IO.println(calcular(10, 5, '+'));
IO.println(calcular(10, 7, '-'));
IO.println(calcular(6, 9, '*'));
}
Contexto
char — el tipo carácter
char guarda un solo carácter en 2 bytes (para ser exactos, una unidad de código UTF-16 — algunos caracteres, como los emojis, necesitan dos). Los chars van entre comillas simples: 'A'. Las cadenas van entre comillas dobles: "A".
Como char es un tipo primitivo, aquí sí puedes usar == para comparar. ¡Con cadenas eso no funciona!
Ejercicio 4 de 7
⚔️ Reto: Boletín de notas
Crea una clase Estudiante con:
- el atributo
nombre (String)
- el atributo
nota (int, al estilo alemán: 1 = la mejor, 6 = la peor)
- un constructor que asigne ambos
- un método
resultado() que devuelva "aprobado" si la nota es ≤ 4 y, si no, "no aprobado"
Salida esperada:
Ana: aprobado
Luis: no aprobado
Código inicial
void main() {
Estudiante a = new Estudiante("Ana", 2);
Estudiante b = new Estudiante("Luis", 5);
IO.println(a.nombre + ": " + a.resultado());
IO.println(b.nombre + ": " + b.resultado());
}
class Estudiante {
String nombre;
int nota;
// Constructor
// Método resultado() -> "aprobado" o "no aprobado"
}
Contexto
Encapsulamiento
En código Java real, los atributos serían private y solo se podría acceder a ellos mediante getters/setters. Eso se llama encapsulamiento: tú controlas cómo accede el mundo exterior a tus datos.
Ejemplo: un setter para nota podría comprobar que el valor esté entre 1 y 6. Sin encapsulamiento, cualquiera podría escribir e.nota = -5;.
Ejercicio 5 de 7
ArrayList
Los arrays tienen un tamaño fijo. Un ArrayList puede crecer:
ArrayList<String> lista = new ArrayList<>();
lista.add("Hola");
lista.add("Mundo");
lista.size(); // 2
Añade el número 30 a la lista para que su tamaño sea 3.
Código inicial
import java.util.ArrayList;
void main() {
ArrayList<Integer> numeros = new ArrayList<>();
numeros.add(10);
numeros.add(20);
// Añade 30
IO.println(numeros.size());
}
Contexto
Generics y clases envoltorio
ArrayList<Integer>: el <Integer> es un generic. Fija qué tipo guarda la lista. Los generics evitan que metas por accidente un tipo equivocado.
¿Por qué Integer y no int? Los generics solo funcionan con tipos de objeto. Integer es la clase envoltorio (wrapper class) de int. Java convierte entre los dos automáticamente (autoboxing/unboxing).
Ejercicio 6 de 7
Try-Catch
A veces algo sale mal, por ejemplo cuando intentas convertir "abc" en un número.
Con try-catch atrapas el error en vez de dejar que tu programa se estrelle:
try {
// Código que podría fallar
} catch (Exception e) {
// Qué hacer si falla
}
Envuelve la línea que falla en un try-catch e imprime ¡Error! si algo sale mal.
Código inicial
void main() {
String texto = "abc";
// Envuelve la siguiente línea en try-catch
// Si hay error: imprime "¡Error!"
int numero = Integer.parseInt(texto);
IO.println(numero);
}
Contexto
Excepciones checked vs. unchecked
Java tiene dos tipos: las checked exceptions (p. ej. IOException) hay que atraparlas o declararlas de forma explícita. Las unchecked exceptions (p. ej. NumberFormatException, NullPointerException) no.
En la práctica, muchos frameworks usan solo excepciones unchecked. La regla de Java sobre las checked exceptions es polémica: otros lenguajes (Kotlin, C#) directamente no la tienen.
Ejercicio 7 de 7
FizzBuzz
El ejercicio de entrevista de trabajo más famoso de todos los tiempos.
Imprime los números del 1 al 15, pero:
- Divisible entre 3 →
Fizz
- Divisible entre 5 →
Buzz
- Divisible entre 3 y 5 →
FizzBuzz
- Si no → el número
Consejo: ¡Comprueba primero el caso FizzBuzz (divisible entre 15)!
Consejo 2: % te da el resto. 15 % 3 == 0 significa "15 es divisible entre 3".
Código inicial
void main() {
for (int i = 1; i <= 15; i++) {
// Aquí va tu cadena de if-else
IO.println(i);
}
}
Contexto
FizzBuzz: más que un ejercicio
FizzBuzz es famoso porque en las entrevistas de trabajo muestra si alguien domina los conceptos básicos de programación. La solución necesita bucles, condiciones y módulo, y el orden correcto de las comprobaciones.
Dato curioso: hay cientos de soluciones creativas, con streams, pattern matching o incluso sin if/else. Busca "FizzBuzz Enterprise Edition" en Google para ver la versión exageradamente sobrediseñada.