Sintaxis de Java — 3 programas reales para perderle el miedo al punto y coma
En el artículo de teoría viste la estructura de Java — clase, método main, System.out.println y los puntos y coma. Ahora toca escribir programas reales desde cero. El objetivo de esta práctica es uno: que la estructura salga automática sin tener que pensar en ella, y que el punto y coma deje de costarte compilaciones fallidas.
Abre VS Code, crea una carpeta practica_sintaxis y un fichero .java para cada programa. Recuerda: el nombre del fichero debe coincidir exactamente con el nombre de la clase.
Tabla de Contenidos
Sintaxis Java práctica — Programa 1: Calculadora básica con Scanner
Este programa pide dos números al usuario y muestra el resultado de las cuatro operaciones. Es el primer contacto real con Scanner y con el ciclo escribir → compilar → ejecutar que usarás en todos los laboratorios de FP2.
import java.util.Scanner;
public class Calculadora {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("=== CALCULADORA BÁSICA ===");
System.out.println();
System.out.print("Primer número: ");
double a = sc.nextDouble();
System.out.print("Segundo número: ");
double b = sc.nextDouble();
System.out.println();
System.out.println("--- Resultados ---");
System.out.printf("%.2f + %.2f = %.2f%n", a, b, a + b);
System.out.printf("%.2f - %.2f = %.2f%n", a, b, a - b);
System.out.printf("%.2f × %.2f = %.2f%n", a, b, a * b);
if (b != 0) {
System.out.printf("%.2f / %.2f = %.2f%n", a, b, a / b);
} else {
System.out.println("División: no se puede dividir entre cero");
}
// División entera y resto — solo con enteros
int ia = (int) a;
int ib = (int) b;
if (ib != 0) {
System.out.printf("%d // %d = %d (división entera)%n", ia, ib, ia / ib);
System.out.printf("%d %% %d = %d (resto)%n", ia, ib, ia % ib);
}
System.out.println();
System.out.printf("Potencia: %.2f ^ 2 = %.2f%n", a, a * a);
System.out.printf("Valor absoluto de %.2f = %.2f%n", a, Math.abs(a));
sc.close();
}
}
Compila y ejecuta:
javac Calculadora.java java Calculadora
Salida con 7 y 3:
=== CALCULADORA BÁSICA === Primer número: 7 Segundo número: 3 --- Resultados --- 7,00 + 3,00 = 10,00 7,00 - 3,00 = 4,00 7,00 × 3,00 = 21,00 7,00 / 3,00 = 2,33 7 // 3 = 2 (división entera) 7 % 3 = 1 (resto) Potencia: 7,00 ^ 2 = 49,00 Valor absoluto de 7,00 = 7,00
Dos cosas a las que prestar atención. %% dentro de printf produce un % literal — un solo % lo interpretaría como inicio de especificador de formato y daría error. Y Math.abs() es la primera función de la librería matemática de Java — no necesitas importarla, Math está disponible siempre.
El error que más va a aparecer en este programa
System.out.printf("%.2f + %.2f = %.2f%n", a, b, a + b) // ERROR — falta ;
System.out.printf("%.2f + %.2f = %.2f%n", a, b, a + b); // CORRECTO
El compilador te dirá exactamente en qué línea falta el punto y coma. Lee el mensaje de error — siempre apunta a la línea del problema o a la línea siguiente.
Sintaxis Java práctica — Programa 2: Perfil de estudiante
Este programa recoge los datos de un estudiante y genera un informe formateado. Muestra cómo combinar nextLine(), nextInt(), nextDouble() y printf en un programa real, y introduce el truco del nextLine() después de nextInt().
import java.util.Scanner;
public class PerfilEstudiante {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("=== REGISTRO DE ESTUDIANTE ===");
System.out.println();
// Datos personales
System.out.print("Nombre completo: ");
String nombre = sc.nextLine();
System.out.print("Edad: ");
int edad = sc.nextInt();
sc.nextLine(); // consumir el salto de línea sobrante
System.out.print("Grado: ");
String grado = sc.nextLine();
System.out.print("Nota media (0-10): ");
double nota = sc.nextDouble();
// Cálculos
int anyoNacimiento = 2025 - edad;
double notaSobre100 = nota * 10;
String estado = (nota >= 5.0) ? "Aprobado" : "Suspenso";
// Clasificación
String clasificacion;
if (nota >= 9.0) clasificacion = "Sobresaliente";
else if (nota >= 7.0) clasificacion = "Notable";
else if (nota >= 5.0) clasificacion = "Aprobado";
else clasificacion = "Suspenso";
// Mostrar perfil formateado
System.out.println();
System.out.println("================================");
System.out.println(" PERFIL DE ESTUDIANTE ");
System.out.println("================================");
System.out.printf("Nombre: %s%n", nombre);
System.out.printf("Edad: %d años (nacido en %d)%n", edad, anyoNacimiento);
System.out.printf("Grado: %s%n", grado);
System.out.println("--------------------------------");
System.out.printf("Nota: %.2f / 10,00%n", nota);
System.out.printf("Sobre 100: %.1f%%%n", notaSobre100);
System.out.printf("Clasificación:%s%n", clasificacion);
System.out.printf("Estado: %s%n", estado);
System.out.println("================================");
// Longitud del nombre
System.out.printf("%nEl nombre tiene %d caracteres%n", nombre.length());
System.out.printf("Primera letra: %c%n", nombre.charAt(0));
System.out.printf("En mayúsculas: %s%n", nombre.toUpperCase());
sc.close();
}
}
Salida con «Sergio Medina», 20, «GCID», 7.85:
================================
PERFIL DE ESTUDIANTE
================================
Nombre: Sergio Medina
Edad: 20 años (nacido en 2005)
Grado: GCID
--------------------------------
Nota: 7,85 / 10,00
Sobre 100: 78,5%
Clasificación:Notable
Estado: Aprobado
================================
El nombre tiene 13 caracteres
Primera letra: S
En mayúsculas: SERGIO MEDINA
El sc.nextLine() solitario después de sc.nextInt() es el truco más importante de este programa. Sin él, el siguiente sc.nextLine() leería el salto de línea que dejó el nextInt() y grado aparecería vacío. Ponlo siempre después de nextInt(), nextDouble() o cualquier método que no sea nextLine().
Sintaxis Java práctica — Programa 3: Patrones de texto y arte ASCII
Los patrones con bucles son un clásico de los primeros laboratorios de FP2. Este programa genera varios con printf y el operador de concatenación, mostrando cómo controlar exactamente lo que se imprime carácter a carácter.
import java.util.Scanner;
public class Patrones {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("=== PATRONES DE TEXTO ===");
System.out.println();
System.out.print("Tamaño (3-10): ");
int n = sc.nextInt();
// Patrón 1 — Triángulo de asteriscos
System.out.println("\n--- Triángulo ---");
for (int i = 1; i <= n; i++) {
for (int j = 0; j < i; j++) {
System.out.print("* ");
}
System.out.println();
}
// Patrón 2 — Cuadrado con borde
System.out.println("\n--- Cuadrado con borde ---");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || i == n-1 || j == 0 || j == n-1) {
System.out.print("# ");
} else {
System.out.print(" ");
}
}
System.out.println();
}
// Patrón 3 — Tabla de multiplicar formateada
System.out.println("\n--- Tabla de multiplicar (1 a " + n + ") ---");
System.out.print(" ");
for (int j = 1; j <= n; j++) {
System.out.printf("%4d", j);
}
System.out.println();
System.out.print(" ");
System.out.println("----".repeat(n));
for (int i = 1; i <= n; i++) {
System.out.printf("%2d |", i);
for (int j = 1; j <= n; j++) {
System.out.printf("%4d", i * j);
}
System.out.println();
}
// Patrón 4 — Pirámide de números
System.out.println("\n--- Pirámide ---");
for (int i = 1; i <= n; i++) {
// Espacios iniciales para centrar
for (int s = 0; s < n - i; s++) {
System.out.print(" ");
}
// Números ascendentes
for (int j = 1; j <= i; j++) {
System.out.printf("%2d", j);
}
// Números descendentes
for (int j = i - 1; j >= 1; j--) {
System.out.printf("%2d", j);
}
System.out.println();
}
// Arte ASCII — letras con asteriscos
System.out.println("\n--- La letra J en ASCII ---");
System.out.println(" * * * *");
System.out.println(" * ");
System.out.println(" * ");
System.out.println("* * ");
System.out.println("* * * * ");
sc.close();
}
}
Salida con n=4:
--- Triángulo ---
*
* *
* * *
* * * *
--- Cuadrado con borde ---
# # # #
# #
# #
# # # #
--- Tabla de multiplicar (1 a 4) ---
1 2 3 4
----------------
1 | 1 2 3 4
2 | 2 4 6 8
3 | 3 6 9 12
4 | 4 8 12 16
--- Pirámide ---
1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
--- La letra J en ASCII ---
* * * *
*
*
* *
* * * *
Los patrones anidados son el primer sitio donde el punto y coma hace daño de verdad si va en el sitio equivocado. Fíjate en este error clásico:
for (int j = 0; j < i; j++); // ERROR — ; termina el for aquí
{ // este bloque solo se ejecuta una vez
System.out.print("* ");
}
El compilador no avisa — el programa compila y ejecuta, pero el resultado es incorrecto. Si un bucle no parece funcionar, comprueba que no tiene un punto y coma después del paréntesis de cierre.
Visualízalo con Python Tutor
Selecciona Java en el desplegable y pega in pythontutor.com:
public class Demo {
public static void main(String[] args) {
String nombre = "Sergio";
int edad = 20;
double nota = 7.85;
System.out.printf("Nombre: %s%n", nombre);
System.out.printf("Edad: %d%n", edad);
System.out.printf("Nota: %.2f%n", nota);
for (int i = 1; i <= 4; i++) {
for (int j = 0; j < i; j++) {
System.out.print("* ");
}
System.out.println();
}
}
}
Ejecuta paso a paso y observa tres cosas. Cada variable declarada aparece en el marco de main con su tipo y valor. El printf con %s, %d y %.2f sustituye cada especificador por el valor correspondiente en orden. En el bucle anidado, el contador interno j se crea y destruye en cada iteración del externo i — Python Tutor muestra exactamente cuándo aparece y desaparece cada variable.
Resumen y siguiente paso
En esta práctica escribiste tres programas desde cero con la estructura completa de Java. El punto y coma ya no debería sorprenderte — aparece al final de cada instrucción, nunca después del paréntesis de for o if. En el siguiente artículo encontrarás ejercicios propuestos para resolver por tu cuenta.

2 comentarios