Control de Flujo en Java

Introducción a las Estructuras de Control en Java

El control de flujo es un pilar fundamental en la programación, permitiendo a los desarrolladores dictar el orden en que se ejecutan las instrucciones de un programa. En Java, esto se logra principalmente a través de estructuras secuenciales, de selección y de repetición.

Captura de Entrada del Usuario con Scanner

Para crear programas interactivos, es esencial poder recibir datos del usuario. La clase java.util.Scanner facilita esta tarea, permitiendo leer datos de la consola, archivos u otras fuentes. Para utilizarla, primero se instancia un objeto Scanner, generalmente asociado al flujo de entrada estándar (System.in).

import java.util.Scanner; // Importar la clase Scanner

public class GestorEntrada {
    public static void main(String[] args) {
        Scanner lectorConsola = new Scanner(System.in); // Crear una instancia de Scanner
        // ... el código para procesar la entrada del usuario
    }
}

Los métodos más comunes para leer cadenas de texto son next() y nextLine(), a menudo precedidos por hasNext() o hasNextLine() para verificar si hay más datos disponibles.

  • next(): Lee el siguiente token (palabra) de la entrada. Los espacios en blanco (espacios, tabuladores, saltos de línea) actúan como delimitadores. No puede leer cadenas con espacios.
  • nextLine(): Lee la línea completa hasta el siguiente salto de línea (tecla Enter). Incluye los espacios en blanco dentro de la línea.

Es crucial entender sus diferencias para evitar comportamientos inesperados, especialmetne cuando se mezclan lecturas de números con nextLine().

import java.util.Scanner;

public class MuestraUsoScanner {
    public static void main(String[] args) {
        Scanner entradaUsuario = new Scanner(System.in);

        System.out.print("Por favor, ingrese una palabra: ");
        if (entradaUsuario.hasNext()) {
            String palabraUnica = entradaUsuario.next();
            System.out.println("next() leyó: '" + palabraUnica + "'");
        }

        entradaUsuario.nextLine(); // Consume el resto de la línea, incluyendo el salto de línea, después de next()

        System.out.print("Ahora, ingrese una frase (con espacios): ");
        if (entradaUsuario.hasNextLine()) {
            String fraseCompleta = entradaUsuario.nextLine();
            System.out.println("nextLine() leyó: '" + fraseCompleta + "'");
        }

        entradaUsuario.close(); // Siempre es buena práctica cerrar el Scanner
    }
}

Estructura Secuencial

La estructura secuencial es el tipo de flujo más básico, donde las instrucciones se ejecutan una tras otra en el orden en que aparecen en el código, de arriba hacia abajo. Es la base de cualquier programa y se utiliza para operaciones directas sin condiciones ni repeticiones.

Estructuras de Selección (Condicionales)

Las estructuras de selección permiten que el programa tome decisiones y ejecute diferentes bloques de código basándose en el resultado de una expresión booleana (verdadera o falsa).

La Sentencia if

La sentencia if es la condicional más versátil.

  • if simple: Ejecuta un bloque de código solo si la condición es verdadera.
int edadConductor = 19;
if (edadConductor >= 18) {
    System.out.println("El conductor es mayor de edad.");
}

  • if-else: Ofrece dos caminos de ejecución: uno si la condición es verdadera y otro si es falsa.
double saldoCuenta = 500.75;
if (saldoCuenta < 0) {
    System.out.println("Advertencia: saldo negativo.");
} else {
    System.out.println("Saldo positivo o cero.");
}

  • if-else if-else (múltiples condiciones): Permite evaluar varias condiciones en secuencia. El primer bloque cuya condición sea verdadera se ejecutará, y el resto se omitirá. Si ninguna es verdadera, se ejecuta el bloque else (si existe).
int calificacionEstudiante = 78;
if (calificacionEstudiante >= 90) {
    System.out.println("Nota: A (Sobresaliente)");
} else if (calificacionEstudiante >= 80) {
    System.out.println("Nota: B (Notable)");
} else if (calificacionEstudiante >= 70) {
    System.out.println("Nota: C (Aprobado)");
} else {
    System.out.println("Nota: D (Reprobado)");
}

Para comparar cadenas de texto, siempre use el método equals() en lugar del operador ==, ya que este último compara referencias de objeto.

  • if anidado: Un if dentro de otro if, útil para condiciones más complejas que dependen de la verdad de una condición externa.
boolean tieneLicencia = true;
boolean tieneVehiculo = true;

if (tieneLicencia) {
    if (tieneVehiculo) {
        System.out.println("Puede conducir su propio vehículo.");
    } else {
        System.out.println("Puede conducir, pero no tiene vehículo.");
    }
} else {
    System.out.println("No puede conducir sin licencia.");
}

La Sentencia switch

La sentencia switch es una alternativa al if-else if cuando se necesita comparar una variable con múltiples valores constantes discretos. Mejora la legibilidad en ciertos escenarios.

Las expresiones evaluadas por switch pueden ser de tipo byte, short, char, int. Desde Java 7, también soporta String y tipos enumerados (enum).

String opcionMenu = "Abrir";
String mensajeAccion;

switch (opcionMenu) {
    case "Nuevo":
        mensajeAccion = "Creando un nuevo documento...";
        break;
    case "Abrir":
        mensajeAccion = "Abriendo un documento existente...";
        break;
    case "Guardar":
        mensajeAccion = "Guardando el documento actual...";
        break;
    case "Cerrar":
        mensajeAccion = "Cerrando la aplicación...";
        break;
    default:
        mensajeAccion = "Opción de menú no reconocida.";
}
System.out.println(mensajeAccion);

El uso de break; es crucial para salir del bloque switch después de que una coincidencia sea encontrada. Sin break, la ejecución "caerá" a los siguientes case hasta encontrar un break o el final del switch (comportamiento conocido como fall-through).

Estructuras de Repetición (Bucles)

Los bucles permiten ejecutar un bloque de código repetidamente mientras se cumpla una condición o un número predefinido de veces.

El Bucle while

El bucle while repite un bloque de código mientras una expresión booleana permanezca verdadera. La condición se evalúa antes de cada iteración.

int cuentaRegresiva = 5;
while (cuentaRegresiva > 0) {
    System.out.println("Lanzamiento en: " + cuentaRegresiva);
    cuentaRegresiva--; // Decrementar el contador es esencial para la terminación
}
System.out.println("¡Despegue!");

Es vital asegurarse de que la condición del bucle eventualmente se convierta en falsa para evitar bucles infinitos, lo que causaría que el programa se congele o se comporte de manera impredecible.

El Bucle do-while

Similar al while, pero la condición se evalúa después de ejecutar el bloque de código al menos una vez. Esto garantiza que el cuerpo del bucle se ejecute al menos una vez, independientemente de la condición inicial.

import java.util.Scanner;

public class AutenticacionSimple {
    public static void main(String[] args) {
        Scanner entrada = new Scanner(System.in);
        String contrasenaCorrecta = "programacion";
        String intentoContrasena;
        int maxIntentos = 3;
        int intentosRealizados = 0;

        do {
            System.out.print("Ingrese la contraseña (" + (maxIntentos - intentosRealizados) + " intentos restantes): ");
            intentoContrasena = entrada.nextLine();
            intentosRealizados++;
        } while (!intentoContrasena.equals(contrasenaCorrecta) && intentosRealizados < maxIntentos);

        if (intentoContrasena.equals(contrasenaCorrecta)) {
            System.out.println("¡Contraseña correcta! Acceso concedido.");
        } else {
            System.out.println("Contraseña incorrecta. Se agotaron los intentos.");
        }
        entrada.close();
    }
}

El Bucle for

El bucle for es ideal para situaciones donde se conoce de antemano el número de iteraciones o cuando se necesita un control explícito sobre la inicialización, la condición de terminación y la actualización de un conatdor.

for (int indice = 0; indice < 7; indice++) {
    System.out.println("Índice actual: " + indice);
}

Ejemplo práctico: Generar una tabla de multiplicar.

System.out.println("Tabla de multiplicar del 7:");
for (int factor = 1; factor <= 10; factor++) {
    int producto = 7 * factor;
    System.out.println("7 x " + factor + " = " + producto);
}

Sentencias break y continue

Estas sentencias ofrecen control adicional dentro de los bucles:

  • break: Finaliza inmediatamente el bucle más interno en el que se encuentra y transfiere el control a la instrucción que sigue al bucle.
  • continue: Omite el resto de la iteración actual del bucle y procede con la siguiente iteración, evaluando de nuevo la condición del bucle.
for (int numero = 1; numero <= 10; numero++) {
    if (numero % 2 != 0) { // Si el número es impar
        System.out.println("Saltando número impar: " + numero);
        continue; // Pasa a la siguiente iteración
    }
    System.out.println("Procesando número par: " + numero);
    if (numero == 8) {
        System.out.println("Número 8 alcanzado, saliendo del bucle.");
        break; // Sale completamente del bucle
    }
}
System.out.println("Fin del programa.");

Ejercicio: Dibujando un Triángulo Ascendente

Utilizando bucles anidados, se pueden generar patrones interesantes en la consola, como un triángulo ascendente con asteriscos.

int alturaDeseada = 6;

for (int filaActual = 1; filaActual <= alturaDeseada; filaActual++) {
    // Imprimir espacios para alinear el triángulo a la derecha
    for (int espacio = 1; espacio <= alturaDeseada - filaActual; espacio++) {
        System.out.print(" ");
    }
    // Imprimir los caracteres de la fila
    for (int caracter = 1; caracter <= filaActual; caracter++) {
        System.out.print("*");
    }
    System.out.println(); // Salto de línea para la siguiente fila
}

Etiquetas: java Control de flujo Scanner Sentencias condicionales bucles

Publicado el 6-4 01:51