Saltar al contenido principal

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 a y z.

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ú.