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.

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.

Siguiente paso: ejerciciosSintaxis de Java — ejercicios para escribir código que funciona a la primera

Sigue aprendiendo

2 comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *