Ejercicios mixtos de Java 1
Estos ejercicios combinan las herramientas del curso con dificultad creciente. Antes de mirar cada solución, escribe casos de prueba, predice la salida y decide qué estado debe conservar el programa.
1. Escalera de números
Enunciado
Pide una altura entre 1 y 9 y muestra una escalera. Para altura 4:
1
12
123
1234
Puedes asumir que la entrada es un entero del rango indicado.
Solución
import java.util.Scanner;
public class EscaleraNumeros {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
System.out.print("Altura: ");
int altura = entrada.nextInt();
for (int fila = 1; fila <= altura; fila++) {
for (int numero = 1; numero <= fila; numero++) {
System.out.print(numero);
}
System.out.println();
}
entrada.close();
}
}
El bucle exterior decide cuántas filas hay. El interior empieza en 1 y termina en el número de la fila actual.
2. Menú de saldo
Enunciado
Crea un menú que empiece con saldo 0:
1. Ingresar 10
2. Gastar 5
3. Consultar saldo
0. Salir
No permitas gastar si el saldo es menor que 5. El menú debe continuar hasta elegir 0.
Solución
import java.util.Scanner;
public class MenuSaldo {
public static void main(String[] args) {
Scanner entrada = new Scanner(System.in);
int saldo = 0;
int opcion;
do {
System.out.println("1. Ingresar 10");
System.out.println("2. Gastar 5");
System.out.println("3. Consultar saldo");
System.out.println("0. Salir");
opcion = entrada.nextInt();
switch (opcion) {
case 1:
saldo += 10;
break;
case 2:
if (saldo >= 5) {
saldo -= 5;
} else {
System.out.println("Saldo insuficiente");
}
break;
case 3:
System.out.println("Saldo: " + saldo);
break;
case 0:
System.out.println("Fin");
break;
default:
System.out.println("Opción no válida");
}
} while (opcion != 0);
entrada.close();
}
}
do while muestra el menú al menos una vez. saldo se declara fuera para conservar su valor entre vueltas.
3. Precio reutilizable
Enunciado
Refactoriza un cálculo de compra en métodos. Debes calcular subtotal, descuento y total. Aplica un 10 % si el subtotal alcanza 50 y 0 % en caso contrario.
Casos: 12.5 × 4 → total 45; 10 × 3 → total 30.
Solución
public class CompraRefactorizada {
public static void main(String[] args) {
mostrarResumen(12.5, 4);
mostrarResumen(10.0, 3);
}
public static double calcularSubtotal(double precio, int unidades) {
return precio * unidades;
}
public static double calcularDescuento(double subtotal) {
if (subtotal >= 50) {
return subtotal * 0.10;
}
return 0;
}
public static void mostrarResumen(double precio, int unidades) {
double subtotal = calcularSubtotal(precio, unidades);
double descuento = calcularDescuento(subtotal);
System.out.println("Total: " + (subtotal - descuento));
}
}
Cada método responde a una pregunta. mostrarResumen compone los resultados sin duplicar las fórmulas.
4. Analizador de identificador
Enunciado
Normaliza un identificador eliminando espacios exteriores y convirtiéndolo a minúsculas. Debe considerarse válido si:
- tiene entre 5 y 12 caracteres;
- no contiene espacios;
- después de normalizarlo a minúsculas, empieza por una letra entre
ayz.
Prueba " Alumna7 " → alumna7, válido; "7 ana" → no válido.
Solución
public class Identificador {
public static void main(String[] args) {
comprobar(" Alumna7 ");
comprobar("7 ana");
}
public static void comprobar(String original) {
String texto = original.strip().toLowerCase();
boolean longitudValida = texto.length() >= 5 && texto.length() <= 12;
boolean sinEspacios = !texto.contains(" ");
boolean empiezaPorLetra = texto.length() > 0
&& texto.charAt(0) >= 'a' && texto.charAt(0) <= 'z';
System.out.println(texto + ": "
+ (longitudValida && sinEspacios && empiezaPorLetra));
}
}
Comprobamos length() > 0 antes de charAt(0). La expresión && evita evaluar el acceso si el texto está vacío.
5. Elegir la herramienta: registro de tiempos
Enunciado
Dispones de un número fijo de tiempos de carrera. Diseña el programa eligiendo entre for, while, métodos y array, sin que el enunciado indique dónde usar cada uno.
Debe:
- guardar cinco tiempos decimales;
- calcular el promedio;
- buscar la posición del menor tiempo;
- mostrar cuántos están por debajo del promedio.
Con 12.4, 11.8, 13.1, 12.0, 11.9, el menor está en la posición 1 y hay tres tiempos por debajo del promedio 12.24.
Solución
public class RegistroTiempos {
public static void main(String[] args) {
double[] tiempos = {12.4, 11.8, 13.1, 12.0, 11.9};
double promedio = calcularPromedio(tiempos);
int mejorPosicion = buscarMinimo(tiempos);
System.out.println("Promedio: " + promedio);
System.out.println("Mejor posición: " + mejorPosicion);
System.out.println("Bajo promedio: "
+ contarMenores(tiempos, promedio));
}
public static double calcularPromedio(double[] valores) {
double suma = 0;
for (double valor : valores) {
suma += valor;
}
return suma / valores.length;
}
public static int buscarMinimo(double[] valores) {
int posicionMinimo = 0;
for (int posicion = 1; posicion < valores.length; posicion++) {
if (valores[posicion] < valores[posicionMinimo]) {
posicionMinimo = posicion;
}
}
return posicionMinimo;
}
public static int contarMenores(double[] valores, double limite) {
int cantidad = 0;
for (double valor : valores) {
if (valor < limite) {
cantidad++;
}
}
return cantidad;
}
}
El array conserva el conjunto fijo, los for lo recorren y los métodos separan cálculos. while no aporta aquí porque conocemos todas las repeticiones.
6. Diagnóstico de errores
Enunciado
Este programa pretende duplicar todas las posiciones y mostrarlas, pero falla:
int[] valores = {2, 4, 6};
for (int posicion = 0; posicion <= valores.length; posicion++) {
int valor = valores[posicion];
valor *= 2;
}
for (int valor : valores) {
System.out.println(valor);
}
Identifica dos problemas y corrígelos. La salida debe ser 4, 8, 12.
Solución
public class DuplicarValores {
public static void main(String[] args) {
int[] valores = {2, 4, 6};
for (int posicion = 0; posicion < valores.length; posicion++) {
valores[posicion] *= 2;
}
for (int valor : valores) {
System.out.println(valor);
}
}
}
El índice válido termina antes de length, por eso usamos <. Para modificar el array asignamos en valores[posicion]; cambiar una copia local no altera la posición.
7. Resumen de una tabla
Enunciado
Una matriz contiene unidades vendidas por tres productos durante tres días. Muestra:
- total por producto;
- total general;
- nombre del producto con mayor total.
Pan: 8, 10, 7
Leche: 5, 6, 9
Fruta: 12, 8, 11
Los totales son 25, 20 y 31; gana Fruta; total general 76.
Solución
public class VentasProductos {
public static void main(String[] args) {
String[] productos = {"Pan", "Leche", "Fruta"};
int[][] ventas = {
{8, 10, 7},
{5, 6, 9},
{12, 8, 11}
};
int totalGeneral = 0;
int mejorFila = 0;
int mejorTotal = -1;
for (int fila = 0; fila < ventas.length; fila++) {
int totalProducto = sumarFila(ventas[fila]);
totalGeneral += totalProducto;
System.out.println(productos[fila] + ": " + totalProducto);
if (totalProducto > mejorTotal) {
mejorTotal = totalProducto;
mejorFila = fila;
}
}
System.out.println("Mejor: " + productos[mejorFila]);
System.out.println("Total general: " + totalGeneral);
}
public static int sumarFila(int[] fila) {
int suma = 0;
for (int valor : fila) {
suma += valor;
}
return suma;
}
}
Cada fila de una matriz es un array, por eso puede enviarse a sumarFila. El bucle principal conserva el total y la mejor posición.
Antes del proyecto
Ya puedes elegir estructuras en lugar de seguir una receta: bucles para repetir, métodos para separar operaciones, String para procesar texto, arrays para conjuntos fijos y matrices para tablas. El proyecto final reunirá estas decisiones en una aplicación de consola con estado y menú.