Sintaxis de Java ejercicios — el conversor, el informe de notas y el tique del cajero, alineados al milímetro (con soluciones y chuletario)
En una práctica de laboratorio, un compañero entregó un informe que decía, muy serio: Créditos totales: 666. Tenía tres asignaturas de 6 créditos. No era una broma: había escrito "Créditos totales: " + 6 + 6 + 6 y Java, leyendo de izquierda a derecha, pegó los tres seises como texto. Lo tienes en el fragmento 2 de «¿Qué falla aquí?», con la salida real.
Ya has visto la teoría y has escrito tres programas en la práctica. Ahora te toca a ti con tres ejercicios en tres niveles, todos con lo que sabemos hasta ahora: estructura, println, printf con anchos, concatenación y secuencias de escape. Sin variables, sin if y sin bucles (llegan en los temas siguientes), así que los datos van escritos en el código. Lo difícil aquí es que la salida cuadre exactamente, carácter a carácter. Todas las salidas son reales, con Java 21 y el ordenador en español.
Cómo usar este artículo: intenta cada ejercicio por tu cuenta; si llevas más de diez minutos atascado, abre la pista; antes de mirar las soluciones, haz «¿Qué falla aquí?». Al final tienes el cuestionario tipo examen y el chuletario.
Tabla de Contenidos
Sintaxis Java ejercicios: nivel básico
Ejercicio 1: conversor de unidades
Escribe un programa completo, Conversor.java, que convierta 5,5 km a metros, centímetros, millas y pies, con los resultados alineados: todas las etiquetas ocupan lo mismo y los números van a la derecha en 10 columnas con 2 decimales.
Fórmulas: metros = km × 1000; centímetros = km × 100 000; millas = km / 1,60934; pies = km × 3280,84.
Salida esperada:
=== CONVERSOR DE DISTANCIAS === Distancia: 5.5 km --- Conversiones --- Kilómetros: 5,50 km Metros: 5500,00 m Centímetros: 550000,00 cm Millas: 3,42 mi Pies: 18044,62 ft
%10.2f reserva 10 columnas con 2 decimales y pega el número a la derecha. Para que las etiquetas queden en columna, escríbelas con los espacios necesarios para que todas midan lo mismo («Centímetros: » es la más larga, 13 caracteres). Las cuentas pueden ir dentro del propio printf.
Sintaxis Java ejercicios: nivel intermedio
Ejercicio 2: informe de notas
Escribe InformeNotas.java, que imprima el informe de Laura con sus cinco notas en dos columnas (asignatura y nota), la media, la media sobre 100 con el símbolo % y una línea final con el número de asignaturas y los créditos (5 asignaturas de 6 créditos), calculados con +.
Notas: FP2 8,5; IC2 7,0; Álgebra 4,5; Estadística 6,0; Bases de datos 9,0.
Salida esperada:
========================= INFORME: Laura Santana ========================= FP2 8,50 IC2 7,00 Álgebra 4,50 Estadística 6,00 Bases de datos 9,00 ------------------------- Media 7,00 Sobre 100 70,0% Asignaturas: 5 | Créditos: 30 =========================
El mismo formato para todas las filas, %-15s %5.2f%n, también para «Media». Para el porcentaje, %%. La media es (8,5 + 7,0 + 4,5 + 6,0 + 9,0) / 5, con paréntesis. Y cuidado con la última línea: 5 * 6 sin paréntesis sí funciona, pero piensa por qué.
Sintaxis Java ejercicios: desafío final
Ejercicio 3: el tique del cajero automático
Escribe Cajero.java, que imprima el tique de un cajero con un saldo inicial de 1000 €, un ingreso de 250 €, una retirada de 400 € y una comisión de 1,50 €. Dentro de la caja, los conceptos a la izquierda en 18 columnas y los importes a la derecha en 10, con signo en los movimientos. La caja tiene que cerrar perfecta por la derecha, y la última línea lleva una referencia entre comillas.
Salida esperada:
+---------------------------------+ | CAJERO DE LA FACULTAD | +---------------------------------+ | Saldo inicial 1000,00 € | | Ingreso +250,00 € | | Retirada -400,00 € | | Comisión -1,50 € | +---------------------------------+ | Saldo final 848,50 € | +---------------------------------+ Operaciones: 3 | Ref. "FP2-2026"
El hueco %+10.2f pone siempre el signo (+250,00, -400,00). Cuenta lo que mide una fila: «| » (2) + 18 + « » (1) + 10 + « € |» (4). Los bordes tienen que medir lo mismo. Las comillas dentro del texto se escriben \".
¿Qué falla aquí?
Tres fragmentos con un fallo de los que se ven en los laboratorios. Predice qué imprime cada uno antes de leer la explicación.
Fragmento 1: el hueco equivocado
public class FormatoMal {
public static void main(String[] args) {
System.out.printf("Créditos: %d%n", 6);
System.out.printf("Nota: %d%n", 7.5);
System.out.println("Fin del informe");
}
}
Salida:
Créditos: 6 Nota: Exception in thread "main" java.util.IllegalFormatConversionException: d != java.lang.Double at java.base/java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4515) at java.base/java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:3066) at java.base/java.util.Formatter$FormatSpecifier.print(Formatter.java:3021) at java.base/java.util.Formatter.format(Formatter.java:2791) at java.base/java.io.PrintStream.implFormat(PrintStream.java:1367) at java.base/java.io.PrintStream.format(PrintStream.java:1346) at java.base/java.io.PrintStream.printf(PrintStream.java:1245) at FormatoMal.main(FormatoMal.java:4)
Qué pasa: compila sin problemas, porque a javac le da igual qué hay dentro del texto de printf. Pero al ejecutar, %d (entero) recibe 7.5 (decimal) y Java lanza IllegalFormatConversionException: d != java.lang.Double: «el hueco d no sirve para un Double». Fíjate en que «Nota: » sí llegó a imprimirse: printf escribe hasta el hueco que falla. Y «Fin del informe» no sale nunca: la excepción para el programa. La línea útil del rastro es la última, at FormatoMal.main(FormatoMal.java:4): el fallo está en la línea 4 de tu archivo.
Arreglo: %.1f (o %.2f) para decimales; %d solo para enteros.
Fragmento 2: los 666 créditos
public class SumaTexto {
public static void main(String[] args) {
System.out.println("Créditos totales: " + 6 + 6 + 6);
}
}
Salida:
Créditos totales: 666
Qué pasa: "Créditos totales: " + 6 es un texto, y texto + 6 sigue siendo texto: los tres seises se pegan. Es la anécdota del principio.
Arreglo: "Créditos totales: " + (6 + 6 + 6), o un printf("Créditos totales: %d%n", 6 + 6 + 6).
Fragmento 3: la ruta de Windows
public class Ruta {
public static void main(String[] args) {
System.out.println("Guardado en C:\nuevo\temas");
}
}
Salida:
Guardado en C: uevo emas
Qué pasa: dentro de un texto, \n es un salto de línea y \t una tabulación. La ruta C:\nuevo\temas tiene justo esas dos parejas, así que Java imprime «C:», salta de línea, escribe «uevo», tabula y escribe «emas». Si la ruta tuviera \d o \p, que no son secuencias válidas, ni siquiera compilaría (illegal escape character).
Arreglo: doblar las barras: "C:\\nuevo\\temas".
Soluciones comentadas
Solución ejercicio 1
/** Ejercicio 1: conversor de 5,5 km a otras unidades, alineado con printf. */
public class Conversor {
public static void main(String[] args) {
System.out.println("=== CONVERSOR DE DISTANCIAS ===");
System.out.println("Distancia: 5.5 km");
System.out.println();
System.out.println("--- Conversiones ---");
System.out.printf("Kilómetros: %10.2f km%n", 5.5);
System.out.printf("Metros: %10.2f m%n", 5.5 * 1000); // 1 km = 1000 m
System.out.printf("Centímetros: %10.2f cm%n", 5.5 * 100000); // 1 km = 100 000 cm
System.out.printf("Millas: %10.2f mi%n", 5.5 / 1.60934); // 1 milla = 1,60934 km
System.out.printf("Pies: %10.2f ft%n", 5.5 * 3280.84); // 1 km = 3280,84 pies
}
}
Comprobación a mano: 5,5 × 1000 = 5500; × 100 000 = 550 000; 5,5 / 1,60934 = 3,4176… → 3,42; 5,5 × 3280,84 = 18 044,62. Todas las etiquetas miden 13 caracteres («Kilómetros: » con dos espacios, «Pies: » con ocho), así que los huecos %10.2f empiezan en la misma columna y los números acaban alineados por la derecha.
¿Por qué 5.5 y no 5,5 en el código? Porque en Java los decimales se escriben siempre con punto; la coma solo aparece en la salida, por el idioma. Y fíjate en que la línea «Distancia: 5.5 km» sale con punto: es un texto, no pasa por printf.
¿Ves el 5,5 repetido cinco veces? Si mañana el dato fuera 8 km, habría que cambiarlo en cinco sitios. Eso es justo lo que resuelven las variables, el siguiente tema.
Solución ejercicio 2
/** Ejercicio 2: informe de notas con columnas alineadas y la media calculada en el printf. */
public class InformeNotas {
public static void main(String[] args) {
System.out.println("=========================");
System.out.printf("INFORME: %s%n", "Laura Santana");
System.out.println("=========================");
System.out.printf("%-15s %5.2f%n", "FP2", 8.5);
System.out.printf("%-15s %5.2f%n", "IC2", 7.0);
System.out.printf("%-15s %5.2f%n", "Álgebra", 4.5);
System.out.printf("%-15s %5.2f%n", "Estadística", 6.0);
System.out.printf("%-15s %5.2f%n", "Bases de datos", 9.0);
System.out.println("-------------------------");
System.out.printf("%-15s %5.2f%n", "Media", (8.5 + 7.0 + 4.5 + 6.0 + 9.0) / 5);
System.out.printf("%-15s %5.1f%%%n", "Sobre 100", (8.5 + 7.0 + 4.5 + 6.0 + 9.0) / 5 * 10);
System.out.println("Asignaturas: " + 5 + " | Créditos: " + 5 * 6);
System.out.println("=========================");
}
}
Las decisiones:
- Un solo formato para todas las filas (
%-15s %5.2f%n), también para «Media»: así la media queda debajo de las notas. - «Bases de datos» tiene 14 letras y cabe en 15. Con
%-10sempujaría su nota cuatro columnas a la derecha. - La media entre paréntesis: (8,5 + 7,0 + 4,5 + 6,0 + 9,0) / 5 = 35,0 / 5 = 7,00. Sin paréntesis, solo el 9,0 se dividiría entre 5.
- El porcentaje: 7,0 × 10 = 70,0 con
%5.1f(un decimal) y%%para el símbolo. - La última línea:
"Créditos: " + 5 * 6da30y no56porque*va antes que+, igual que en matemáticas: primero se multiplica (30) y después se pega. Con una suma,+ 5 + 6, sí habría salido56.
Solución ejercicio 3
/** Desafío: el tique de un cajero automático, con importes fijos (sin if ni bucles). */
public class Cajero {
public static void main(String[] args) {
System.out.println("+---------------------------------+");
System.out.println("| CAJERO DE LA FACULTAD |");
System.out.println("+---------------------------------+");
System.out.printf("| %-18s %10.2f € |%n", "Saldo inicial", 1000.0);
System.out.printf("| %-18s %+10.2f € |%n", "Ingreso", 250.0); // %+ pone siempre el signo
System.out.printf("| %-18s %+10.2f € |%n", "Retirada", -400.0);
System.out.printf("| %-18s %+10.2f € |%n", "Comisión", -1.5);
System.out.println("+---------------------------------+");
System.out.printf("| %-18s %10.2f € |%n", "Saldo final", 1000.0 + 250.0 - 400.0 - 1.5);
System.out.println("+---------------------------------+");
System.out.println("Operaciones: " + 3 + " | Ref. \"FP2-" + 2026 + "\"");
}
}
Las decisiones:
- Las medidas. Cada fila mide 2 + 18 + 1 + 10 + 4 = 35 caracteres, así que los bordes tienen un
+, 33 guiones y otro+. El título también ocupa 35: seis espacios, «CAJERO DE LA FACULTAD» (21), seis espacios y las barras. %+10.2fen los movimientos y%10.2f(sin+) en los saldos: un saldo no es un movimiento, no lleva signo.- El saldo final se calcula en el propio
printf: 1000,0 + 250,0 − 400,0 − 1,5 = 848,50. - Las comillas de la referencia se escriben
\"dentro del texto, y2026se pega como número sin paréntesis porque va detrás de un texto. - El
€está fuera del hueco: el ancho 10 es solo para el número.
Para comprobar una caja de texto, copia la salida en un editor con fuente monoespaciada (todas las letras del mismo ancho) y mira si los | de la derecha caen en la misma columna. En la web, los bloques de salida ya usan ese tipo de fuente.
Cuestionario tipo examen
Ahora ponte a prueba como en el examen. El cuestionario de Java de FP2 es así: 15 preguntas en 15 minutos sobre todo el temario de Java, de respuesta única, múltiple (los fallos restan), verdadero o falso, huecos, relacionar, respuesta corta y «¿qué imprime este código?». Aquí tienes 11 preguntas originales sobre la sintaxis básica de Java. Contesta sin ejecutar nada, pulsa Comprobar y lee la explicación de cada una. Estas preguntas son también el banco del simulacro de teoría de FP2, que las mezclará con las de los demás temas de Java.
Completa lo mínimo que necesita un programa de Java para arrancar:
Todo el código vive dentro de una ____. La JVM empieza a ejecutar por el método public ____ void ____(String[] args). Cada bloque (de la clase, de un método, de un if) se abre y se cierra con ____.
Palabras:
- final
- main
- clase
- tabuladores
- static
- corchetes
- llaves
- función
Solución
Todo el código vive dentro de una clase. La JVM empieza a ejecutar por el método public static void main(String[] args). Cada bloque (de la clase, de un método, de un if) se abre y se cierra con llaves.
En Java no hay código suelto: hasta el «Hola, mundo» va dentro de una clase. La JVM busca exactamente public static void main(String[] args): static porque todavía no existe ningún objeto cuando arranca el programa. Y los bloques los marcan las llaves { }, no la sangría como en Python.
¿Qué imprime este fragmento (dentro de main)? Escribe la salida exacta.
System.out.print("Hola");
System.out.print(" ");
System.out.println("mundo" + 1 + 2);Solución
Respuesta: Hola mundo12
print no salta de línea, así que «Hola», el espacio y lo que viene después salen seguidos. En "mundo" + 1 + 2 el + se evalúa de izquierda a derecha: "mundo" + 1 ya es el texto "mundo1", y al sumarle 2 se pega otra vez como texto: mundo12, no mundo3.
Indica si es verdadero o falso:
- Java distingue mayúsculas y minúsculas:
system.out.printlnno compila. - Si una clase es
public, el archivo tiene que llamarse igual que ella, con la extensión.java. - Como en Python, la sangría es lo que decide qué líneas van dentro de un bloque.
//comenta hasta el final de la línea y/* … */puede ocupar varias líneas.- La orden
javac Hola.javaejecuta el programa y muestra su salida.
Solución
- V — Java distingue mayúsculas y minúsculas:
system.out.printlnno compila. - V — Si una clase es
public, el archivo tiene que llamarse igual que ella, con la extensión.java. - F — Como en Python, la sangría es lo que decide qué líneas van dentro de un bloque.
- V —
//comenta hasta el final de la línea y/* … */puede ocupar varias líneas. - F — La orden
javac Hola.javaejecuta el programa y muestra su salida.
En Java la sangría solo sirve para leer mejor: los bloques los marcan las llaves. javac compila (traduce el .java a bytecode en un .class) y java Hola ejecuta. Y una clase public Hola tiene que estar en Hola.java, o javac protesta.
Ordena lo que pasa desde que escribes el programa hasta que ves la salida:
- La JVM llama a
mainy aparece la salida - Escribes el código en
Hola.java - Compilas con
javac Hola.java - Se genera
Hola.classcon el bytecode - Ejecutas con
java Hola
Solución
Orden correcto:
- Escribes el código en
Hola.java - Compilas con
javac Hola.java - Se genera
Hola.classcon el bytecode - Ejecutas con
java Hola - La JVM llama a
mainy aparece la salida
Java se compila primero a bytecode (.class), que no depende del sistema operativo, y después la JVM lo ejecuta. Por eso se dice «escríbelo una vez, ejecútalo en cualquier sitio». Fíjate en que a java se le pasa el nombre de la clase, sin .class.
¿Cuál de estas cabeceras sirve para que la JVM arranque el programa?
public static void main(String[] args)public static int main(String[] args)public static void Main(String[] args)public static void main(String args)
Solución
Respuesta: public static void main(String[] args)
La JVM busca el método por su nombre y su firma exactos. Cambiar el tipo de retorno, una mayúscula o el tipo del parámetro hace que el programa compile, pero al ejecutarlo salga «no se encuentra el método main». El nombre del parámetro (args, arg…) sí puede ser cualquiera.
¿Qué imprime esta línea?
System.out.println(1 + 2 + "3" + 4 + 5);
Solución
Respuesta: 3345
Se evalúa de izquierda a derecha. 1 + 2 son dos números: 3. Después 3 + "3" mezcla número y texto, así que se concatena: "33". A partir de ahí todo es texto: "334" y "3345". Si quisieras sumar el 4 y el 5, tendrías que poner paréntesis: (4 + 5).
¿Cuáles de estas líneas compilan dentro de main?
System.out.println("Hola");int x = 3; // comentario/* comentario */ System.out.println(5);System.out.println('Hola');print("Hola");System.Out.println("x");
Solución
Respuesta: System.out.println("Hola"); · int x = 3; // comentario · /* comentario */ System.out.println(5);
Los comentarios pueden ir al final de una línea (//) o en medio (/* */). Las trampas típicas al venir de Python: las comillas simples (en Java solo valen para un char), olvidar System.out. y las mayúsculas.
Relaciona cada palabra de la cabecera de main con lo que significa:
public | |
static | |
void | |
String[] args |
Definiciones:
- Se puede llamar desde fuera de la clase
- Termina la ejecución del programa
- El método no devuelve nada
- El método no se puede redefinir
- Pertenece a la clase y no necesita un objeto
- Los argumentos de la línea de órdenes
Solución
public→ Se puede llamar desde fuera de la clasestatic→ Pertenece a la clase y no necesita un objetovoid→ El método no devuelve nadaString[] args→ Los argumentos de la línea de órdenes
La JVM llama a main desde fuera (public), antes de que exista ningún objeto (static), no espera ningún resultado (void) y le pasa lo que escribas después de java Programa en un array de texto (args). Lo que impide redefinir un método es final, que no aparece aquí.
¿Qué pasa al compilar este programa?
public class Saludo {
public static void main(String[] args) {
System.out.println("Hola")
}
}- No compila:
javacavisa de que falta un; - Compila e imprime
Hola - Compila, pero falla al ejecutarlo
- Imprime
Holasin salto de línea
Solución
Respuesta: No compila: javac avisa de que falta un ;
En Java el punto y coma no es opcional: marca dónde acaba cada sentencia. javac da el error ';' expected y señala la línea. Es de los primeros errores que se ven al pasar de Python, donde el final de línea basta.
En Python escribes if x > 0: print("pos"). ¿Cuál es la versión correcta en Java?
if (x > 0) { System.out.println("pos"); }if x > 0 { System.out.println("pos"); }if (x > 0): System.out.println("pos");if (x > 0) then System.out.println("pos");
Solución
Respuesta: if (x > 0) { System.out.println("pos"); }
Las tres diferencias que hay que recordar: la condición va entre paréntesis, no hay dos puntos y el bloque va entre llaves (si solo hay una sentencia se pueden omitir, pero es mejor ponerlas siempre).
¿Qué extensión tiene el archivo de bytecode que genera javac?
Solución
Respuesta: .class
javac Hola.java genera Hola.class (un archivo por cada clase del código). Ese bytecode es lo que ejecuta la JVM con java Hola.
Míralo paso a paso en Python Tutor
Entra en Python Tutor, elige Java y pega esta versión corta del tique:
public class Tutor {
public static void main(String[] args) {
System.out.println("+-------------------------+");
System.out.printf("| %-10s %10.2f € |%n", "Inicial", 1000.0);
System.out.printf("| %-10s %+10.2f € |%n", "Ingreso", 250.0);
System.out.printf("| %-10s %+10.2f € |%n", "Retirada", -400.0);
System.out.println("+-------------------------+");
System.out.printf("| %-10s %10.2f € |%n", "Final", 1000.0 + 250.0 - 400.0);
System.out.println("Ref. \"FP2-" + 2026 + "\"");
}
}
Salida:
+-------------------------+ | Inicial 1000,00 € | | Ingreso +250,00 € | | Retirada -400,00 € | +-------------------------+ | Final 850,00 € | Ref. "FP2-2026"
Qué observar paso a paso:
- La ejecución empieza en
mainy va línea a línea: cadaprintfañade una fila al panel de salida. - En el primer
printf,%-10srellena «Inicial» con tres espacios hasta 10 columnas. - Compara la fila del ingreso con la del saldo inicial: la única diferencia del formato es el
+, y el resultado es el signo delante del 250. - La cuenta 1000 + 250 − 400 se hace antes de entrar en el hueco:
printfrecibe ya 850. - Prueba a quitar las barras de
\"FP2-y vuelve a ejecutar: Python Tutor te enseñará el error de compilación.
Chuletario: sintaxis básica de Java
Lo esencial en 30 segundos: todo va dentro de public class Nombre, en Nombre.java. El programa empieza en public static void main(String[] args). Cada instrucción acaba en ; y cada bloque va entre { }. Para imprimir, println (salta), print (no salta) y printf (con huecos y %n). + pega de izquierda a derecha. Se compila con javac Nombre.java y se ejecuta con java Nombre.
| Quiero… | Código | Resultado |
|---|---|---|
| Imprimir y saltar | System.out.println("Hola"); | Hola |
| Imprimir sin saltar | System.out.print("Hola "); | Hola (sigue en la misma línea) |
| Línea vacía | System.out.println(); | |
| Texto en un hueco | printf("%s%n", "Laura") | Laura |
| Entero | printf("%d%n", 6) | 6 |
| Decimal con 2 cifras | printf("%.2f%n", 7.456) | 7,46 (en español) |
| Ancho a la derecha / izquierda | %10.2f / %-15s | Columnas alineadas |
| Signo siempre | %+10.2f | +250,00 |
| Ceros delante | %05d | 00042 |
Un % | %% | % |
| Punto decimal forzado | printf(java.util.Locale.US, "%.2f", 8.75) | 8.75 |
| Sumar dentro de un texto | "Total: " + (6 + 6) | Total: 12 |
| Comillas, barra, salto, tabulación | \", \\, \n, \t |
Plantillas de los ejercicios:
| Ejercicio | Patrón | Resultado | ||||
|---|---|---|---|---|---|---|
| Conversor | Etiquetas del mismo largo + %10.2f | Metros: 5500,00 m | ||||
| Informe | %-15s %5.2f%n en todas las filas | Media 7,00 | ||||
| Tique | `» | %-18s %+10.2f € | %n»` y bordes de 35 | ` | Ingreso +250,00 € | ` |
| Síntoma | Causa probable |
|---|---|
';' expected | Falta un punto y coma (en esa línea o en la de arriba) |
class X is public, should be declared in a file named X.java | El archivo no se llama como la clase |
reached end of file while parsing | Falta una llave de cierre |
cannot find symbol | Un nombre mal escrito (printn, Sytem) |
unclosed string literal | Unas comillas sin cerrar |
IllegalFormatConversionException al ejecutar | Un hueco que no casa con el tipo (%d con un decimal) |
Sale 66 en lugar de 12 | Una suma dentro de un texto sin paréntesis |
| La tabla se tuerce | Anchos distintos entre filas o tabulaciones con palabras largas |
Sale C: y en otra línea uevo | \n dentro de una ruta: dobla las barras |
Antes de entregar, pregúntate:
- ¿El archivo se llama exactamente como la clase pública?
- ¿Cada instrucción termina en
;y cada llave tiene su pareja? - ¿Cada hueco de
printfcasa con su valor (%denteros,%fdecimales,%stextos) y la línea termina en%n? - ¿Las sumas que van dentro de un texto llevan paréntesis?
El siguiente paso son las variables en Java: tipos, declaración y por qué Java te obliga a decir qué guarda cada una.
Sigue aprendiendoTodos los artículos de Java¿Te ha servido este artículo? Así puedes apoyar SergioLearns →




Simulacro del examen práctico de IC2 — diagrama de flujo, fork e hilos en C (y las capturas que no pueden faltar)