Sintaxis de Java — ejercicios para escribir código que funciona a la primera
Ya escribiste tres programas en la práctica. Ahora toca resolver por tu cuenta. Tres ejercicios en tres niveles — todos con su enunciado, sus pistas y su solución comentada al final. El hilo conductor es el mismo en los tres: la estructura sale sola, los puntos y coma van donde tienen que ir, y printf formatea exactamente lo que quieres.
Como siempre: intenta resolverlo, usa la pista si llevas más de 10 minutos atascado, y compara con la solución comentada.
Tabla de Contenidos
Sintaxis Java ejercicios — Nivel básico
Ejercicio 1 — Conversor de unidades
Escribe un programa completo en Java que pida al usuario una distancia en kilómetros y la convierta a metros, centímetros, millas y pies. Usa printf para mostrar todos los resultados alineados.
Salida esperada con 5.5 km:
=== CONVERSOR DE DISTANCIAS === Distancia en km: 5.5 --- Conversiones --- Kilómetros: 5,50 km Metros: 5500,00 m Centímetros: 550000,00 cm Millas: 3,42 mi Pies: 18044,62 ft
Fórmulas:
metros = km × 1000 centímetros = km × 100000 millas = km / 1.60934 pies = km × 3280.84
💡 Pistas:
- Usa
%10.2fpara alinear los números a la derecha con 10 caracteres de ancho Scanner sc = new Scanner(System.in)— importajava.util.Scanneral principio- El fichero debe llamarse
Conversor.javay la claseConversor
Sintaxis Java ejercicios — Nivel intermedio
Ejercicio 2 — Informe de notas
Escribe un programa que pida el nombre de un estudiante y sus notas en cinco asignaturas. El programa debe calcular la media, mostrar un informe formateado con todas las notas, e indicar cuántas asignaturas ha aprobado y cuántas ha suspendido.
Salida esperada:
=== INFORME DE NOTAS === Nombre del estudiante: Sergio Medina Asignatura 1: FP2 Nota: 8.5 Asignatura 2: IC2 Nota: 7.0 Asignatura 3: Matemáticas Nota: 4.5 Asignatura 4: Estadística Nota: 6.0 Asignatura 5: Bases de Datos Nota: 9.0 ============================== INFORME: Sergio Medina ============================== FP2 8,50 Notable IC2 7,00 Notable Matemáticas 4,50 Suspenso Estadística 6,00 Aprobado Bases de Datos 9,00 Sobresaliente ------------------------------ Media: 7,00 Aprobadas: 4 / 5 Suspensos: 1 / 5 Estado: APROBADO ==============================
💡 Pistas:
- Pide cada asignatura con
sc.nextLine()y cada nota consc.nextDouble()+sc.nextLine()de limpieza - Para la clasificación usa
if/else ifen cadena:>= 9Sobresaliente,>= 7Notable,>= 5Aprobado, resto Suspenso %-15senprintfalinea texto a la izquierda con 15 caracteres de ancho- Cuenta aprobados con un contador que incrementas dentro del bucle de notas
Sintaxis Java ejercicios — Desafío final
Ejercicio 3 — Cajero automático
Escribe un programa que simule las operaciones básicas de un cajero automático. El usuario empieza con un saldo inicial que introduce él mismo, y puede realizar depósitos y retiradas. El programa muestra el saldo actualizado después de cada operación y un resumen final.
Salida esperada:
=== CAJERO AUTOMÁTICO === Saldo inicial (€): 1000 --- Operación 1 --- Tipo (D=depósito / R=retirada): D Cantidad (€): 250 ✓ Depósito realizado Saldo actual: 1250,00 € --- Operación 2 --- Tipo (D=depósito / R=retirada): R Cantidad (€): 400 ✓ Retirada realizada Saldo actual: 850,00 € --- Operación 3 --- Tipo (D=depósito / R=retirada): R Cantidad (€): 2000 ✗ Saldo insuficiente (disponible: 850,00 €) Saldo actual: 850,00 € ============================== RESUMEN DE OPERACIONES ============================== Saldo inicial: 1000,00 € Total depositado: 250,00 € Total retirado: 400,00 € Saldo final: 850,00 € Operaciones: 3 ==============================
El programa realiza exactamente 3 operaciones (bucle for de 1 a 3). Si el tipo introducido no es D ni R, muestra un mensaje de error y no cuenta la operación como válida.
💡 Pistas:
- Lee el tipo con
sc.next().toUpperCase()para aceptar tantodcomoD - Usa
switchpara distinguir entre"D","R"y el caso por defecto (error) - Acumula
totalDepositadoytotalRetiradoen variables separadas - Si la retirada supera el saldo: muestra el mensaje de error sin modificar el saldo
Soluciones comentadas
Solución Ejercicio 1
import java.util.Scanner;
public class Conversor {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("=== CONVERSOR DE DISTANCIAS ===");
System.out.println();
System.out.print("Distancia en km: ");
double km = sc.nextDouble();
double metros = km * 1000;
double centimetros = km * 100000;
double millas = km / 1.60934;
double pies = km * 3280.84;
System.out.println();
System.out.println("--- Conversiones ---");
System.out.printf("Kilómetros: %10.2f km%n", km);
System.out.printf("Metros: %10.2f m%n", metros);
System.out.printf("Centímetros: %10.2f cm%n", centimetros);
System.out.printf("Millas: %10.2f mi%n", millas);
System.out.printf("Pies: %10.2f ft%n", pies);
sc.close();
}
}
El especificador %10.2f le dice a printf que reserve 10 caracteres de ancho y muestre 2 decimales — los números quedan alineados a la derecha automáticamente. Si el número es más corto que 10 caracteres, printf añade espacios por la izquierda. Si quisieras alineación a la izquierda usarías %-10.2f.
Solución Ejercicio 2
import java.util.Scanner;
public class InformeNotas {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("=== INFORME DE NOTAS ===");
System.out.println();
System.out.print("Nombre del estudiante: ");
String nombre = sc.nextLine();
System.out.println();
int numAsignaturas = 5;
String[] asignaturas = new String[numAsignaturas];
double[] notas = new double[numAsignaturas];
// Recoger datos
for (int i = 0; i < numAsignaturas; i++) {
System.out.printf("Asignatura %d: ", i + 1);
asignaturas[i] = sc.nextLine();
System.out.print("Nota: ");
notas[i] = sc.nextDouble();
sc.nextLine(); // limpiar salto de línea
System.out.println();
}
// Calcular estadísticas
double suma = 0;
int aprobadas = 0;
for (int i = 0; i < numAsignaturas; i++) {
suma += notas[i];
if (notas[i] >= 5.0) aprobadas++;
}
double media = suma / numAsignaturas;
int suspensos = numAsignaturas - aprobadas;
// Mostrar informe
System.out.println("==============================");
System.out.printf("INFORME: %s%n", nombre);
System.out.println("==============================");
for (int i = 0; i < numAsignaturas; i++) {
String clasificacion;
if (notas[i] >= 9.0) clasificacion = "Sobresaliente";
else if (notas[i] >= 7.0) clasificacion = "Notable";
else if (notas[i] >= 5.0) clasificacion = "Aprobado";
else clasificacion = "Suspenso";
System.out.printf("%-15s %5.2f %s%n",
asignaturas[i], notas[i], clasificacion);
}
System.out.println("------------------------------");
System.out.printf("Media: %5.2f%n", media);
System.out.printf("Aprobadas: %d / %d%n", aprobadas, numAsignaturas);
System.out.printf("Suspensos: %d / %d%n", suspensos, numAsignaturas);
System.out.printf("Estado: %s%n",
(media >= 5.0) ? "APROBADO" : "SUSPENSO");
System.out.println("==============================");
sc.close();
}
}
Este ejercicio usa arrays por primera vez — String[] y double[]. No te preocupes si la sintaxis de arrays te suena nueva: en el artículo de arrays de Java lo cubrimos en detalle. Lo importante aquí es el patrón: primero un bucle para recoger los datos, luego otro para calcular, luego otro para mostrar.
Solución Ejercicio 3
import java.util.Scanner;
public class Cajero {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("=== CAJERO AUTOMÁTICO ===");
System.out.println();
System.out.print("Saldo inicial (€): ");
double saldo = sc.nextDouble();
sc.nextLine();
double saldoInicial = saldo;
double totalDepositado = 0;
double totalRetirado = 0;
int operaciones = 3;
for (int i = 1; i <= operaciones; i++) {
System.out.printf("%n--- Operación %d ---%n", i);
System.out.print("Tipo (D=depósito / R=retirada): ");
String tipo = sc.next().toUpperCase();
sc.nextLine();
switch (tipo) {
case "D":
System.out.print("Cantidad (€): ");
double deposito = sc.nextDouble();
sc.nextLine();
saldo += deposito;
totalDepositado += deposito;
System.out.println("✓ Depósito realizado");
break;
case "R":
System.out.print("Cantidad (€): ");
double retirada = sc.nextDouble();
sc.nextLine();
if (retirada > saldo) {
System.out.printf(
"✗ Saldo insuficiente (disponible: %.2f €)%n", saldo);
} else {
saldo -= retirada;
totalRetirado += retirada;
System.out.println("✓ Retirada realizada");
}
break;
default:
System.out.println("✗ Tipo no reconocido — use D o R");
i--; // no contar esta operación
}
System.out.printf("Saldo actual: %.2f €%n", saldo);
}
// Resumen final
System.out.println();
System.out.println("==============================");
System.out.println("RESUMEN DE OPERACIONES");
System.out.println("==============================");
System.out.printf("Saldo inicial: %8.2f €%n", saldoInicial);
System.out.printf("Total depositado: %8.2f €%n", totalDepositado);
System.out.printf("Total retirado: %8.2f €%n", totalRetirado);
System.out.printf("Saldo final: %8.2f €%n", saldo);
System.out.printf("Operaciones: %d%n", operaciones);
System.out.println("==============================");
sc.close();
}
}
El i-- dentro del default es el truco que hace que una operación inválida no cuente — el bucle decrementa i antes de que el for lo incremente, efectivamente repitiendo esa iteración. En un programa real usarías un bucle while con validación, pero con la sintaxis que conoces hasta ahora este es el camino más directo.
Visualízalo con Python Tutor
Selecciona Java en el desplegable y pega en pythontutor.com:
public class Cajero {
public static void main(String[] args) {
double saldo = 1000;
double totalDepositado = 0;
double totalRetirado = 0;
// Simulamos las operaciones sin Scanner
// Operación 1: depósito de 250
double deposito = 250;
saldo += deposito;
totalDepositado += deposito;
// Operación 2: retirada de 400
double retirada = 400;
if (retirada <= saldo) {
saldo -= retirada;
totalRetirado += retirada;
}
// Operación 3: retirada fallida de 2000
double retirada2 = 2000;
if (retirada2 <= saldo) {
saldo -= retirada2;
totalRetirado += retirada2;
} else {
System.out.println("Saldo insuficiente");
}
System.out.printf("Saldo final: %.2f€%n", saldo);
System.out.printf("Depositado: %.2f€%n", totalDepositado);
System.out.printf("Retirado: %.2f€%n", totalRetirado);
}
}
Ejecuta paso a paso y observa cómo saldo, totalDepositado y totalRetirado cambian en el marco de main con cada operación. En la tercera operación la condición retirada2 <= saldo falla — 2000 <= 850 es false — y el bloque else se ejecuta sin modificar saldo. Al final del programa las tres variables reflejan exactamente el estado del cajero.
Chuletario — sintaxis básica de Java
// ============================================
// CHULETARIO — Sintaxis básica Java
// Sergio Learns · sergiolearns.com
// ============================================
// ESTRUCTURA MÍNIMA — siempre esta forma
public class NombreClase { // nombre = nombre del fichero .java
public static void main(String[] args) {
// tu código aquí
} // cierre del main
} // cierre de la clase
// PALABRAS CLAVE EN main
// public → accesible desde fuera
// static → pertenece a la clase, no a un objeto
// void → no devuelve nada
// main → punto de entrada — nombre exacto obligatorio
// String[] args → argumentos de línea de comandos (requerido)
// SALIDA POR CONSOLA
System.out.println("texto"); // imprime + salto de línea
System.out.print("texto"); // imprime sin salto
System.out.printf("formato%n", val); // formato estilo C
// ESPECIFICADORES DE FORMATO (printf)
%d → int
%f → double (%.2f = 2 decimales)
%s → String
%c → char
%b → boolean
%n → salto de línea (mejor que \n en printf)
%% → % literal
%10d → alineado a la derecha, 10 chars
%-10d → alineado a la izquierda, 10 chars
// SECUENCIAS DE ESCAPE
\n → nueva línea \t → tabulador
\" → comilla doble \\ → barra invertida
// COMENTARIOS
// una línea
/* varias
líneas */
/** javadoc — documenta clases y métodos */
// SCANNER — entrada del usuario
import java.util.Scanner; // al principio del fichero
Scanner sc = new Scanner(System.in); // crear el scanner
sc.nextLine() // lee línea completa (String)
sc.nextInt() // lee entero
sc.nextDouble() // lee decimal
sc.next() // lee una palabra
sc.next().charAt(0) // lee un carácter
sc.next().toUpperCase()// lee y convierte a mayúsculas
sc.close() // cerrar al terminar
// TRAMPA DEL nextLine() DESPUÉS DE nextInt()
int edad = sc.nextInt();
sc.nextLine(); // ← SIEMPRE — consume el \n sobrante
String nombre = sc.nextLine(); // ahora funciona correctamente
// REGLAS DE SINTAXIS
// 1. Cada instrucción termina en ;
// 2. { } delimitan bloques — la indentación es decorativa
// 3. Java distingue mayúsculas: String ≠ string, System ≠ system
// 4. El nombre del fichero debe coincidir con el nombre de la clase
// 5. Nunca ; después del paréntesis de for o if → bucle vacío
// ERRORES MÁS COMUNES
// Error: ';' expected → falta punto y coma
// Error: cannot find symbol → nombre mal escrito o tipo incorrecto
// Error: class X public → fichero no se llama igual que la clase
// Error: reached end of file → falta una llave de cierre }
// Resultado incorrecto sin error → ; después del for/if
// COMPILAR Y EJECUTAR (terminal)
// javac NombreClase.java → genera NombreClase.class
// java NombreClase → ejecuta el programa
// (en VS Code: botón ▶ encima del main)
Sigue aprendiendoTodos los artículos de Java
Un comentario