Skip to content

5. Estructuras de Control

Las estructuras de control son fundamentales en cualquier lenguaje de programación, ya que permiten controlar el flujo de ejecución de un programa. En Java, estas estructuras se dividen principalmente en tres categorías: sentencias condicionales, bucles y control de flujo.

3.1 Sentencias condicionales (if, else, switch)

Section titled “3.1 Sentencias condicionales (if, else, switch)”

Las sentencias condicionales permiten ejecutar diferentes bloques de código dependiendo de si una condición se cumple o no.

La sentencia if-else es la estructura condicional más básica en Java. Permite ejecutar un bloque de código si una condición es verdadera, y opcionalmente otro bloque si la condición es falsa.

if (condicion) {
// Código a ejecutar si la condición es verdadera
} else {
// Código a ejecutar si la condición es falsa
}
int edad = 18;
if (edad >= 18) {
System.out.println("Eres mayor de edad");
} else {
System.out.println("Eres menor de edad");
}

Para evaluar múltiples condiciones en secuencia, se utiliza la estructura if-else-if:

int calificacion = 85;
if (calificacion >= 90) {
System.out.println("Sobresaliente");
} else if (calificacion >= 80) {
System.out.println("Notable");
} else if (calificacion >= 70) {
System.out.println("Bien");
} else if (calificacion >= 60) {
System.out.println("Suficiente");
} else {
System.out.println("Insuficiente");
}

El operador ternario es una forma abreviada de escribir una sentencia if-else simple:

// Sintaxis: condicion ? valorSiVerdadero : valorSiFalso
int edad = 20;
String mensaje = (edad >= 18) ? "Mayor de edad" : "Menor de edad";
System.out.println(mensaje); // Imprime: Mayor de edad

La sentencia switch es útil cuando se necesita comparar una variable con múltiples valores posibles. Es una alternativa más clara a una larga cadena de if-else-if cuando todas las comparaciones se hacen sobre la misma variable.

switch (expresion) {
case valor1:
// Código a ejecutar si expresion == valor1
break;
case valor2:
// Código a ejecutar si expresion == valor2
break;
// Más casos...
default:
// Código a ejecutar si ninguno de los casos anteriores coincide
}
int diaSemana = 3;
String nombreDia;
switch (diaSemana) {
case 1:
nombreDia = "Lunes";
break;
case 2:
nombreDia = "Martes";
break;
case 3:
nombreDia = "Miércoles";
break;
case 4:
nombreDia = "Jueves";
break;
case 5:
nombreDia = "Viernes";
break;
case 6:
nombreDia = "Sábado";
break;
case 7:
nombreDia = "Domingo";
break;
default:
nombreDia = "Día inválido";
}
System.out.println("Hoy es " + nombreDia); // Imprime: Hoy es Miércoles

Desde Java 7, la sentencia switch también puede trabajar con cadenas de texto:

String fruta = "manzana";
switch (fruta.toLowerCase()) {
case "manzana":
System.out.println("Las manzanas son rojas o verdes");
break;
case "plátano":
System.out.println("Los plátanos son amarillos");
break;
case "naranja":
System.out.println("Las naranjas son anaranjadas");
break;
default:
System.out.println("No conozco ese tipo de fruta");
}

Desde Java 12, se introdujo el switch con expresiones, que permite un estilo más conciso:

// Java 12+
int diaSemana = 3;
String tipoDia = switch (diaSemana) {
case 1, 2, 3, 4, 5 -> "Día laborable";
case 6, 7 -> "Fin de semana";
default -> "Día inválido";
};
System.out.println(tipoDia); // Imprime: Día laborable

Desde Java 13, se puede usar yield para devolver valores en bloques de código más complejos:

// Java 13+
int mes = 4;
String estacion = switch (mes) {
case 12, 1, 2 -> {
System.out.println("Hace frío");
yield "Invierno";
}
case 3, 4, 5 -> {
System.out.println("Las flores florecen");
yield "Primavera";
}
case 6, 7, 8 -> {
System.out.println("Hace calor");
yield "Verano";
}
case 9, 10, 11 -> {
System.out.println("Las hojas caen");
yield "Otoño";
}
default -> {
System.out.println("Mes inválido");
yield "Desconocido";
}
};
System.out.println("Estamos en " + estacion); // Imprime: Las flores florecen
// Imprime: Estamos en Primavera

Los bucles permiten ejecutar un bloque de código repetidamente mientras se cumpla una condición. Java ofrece varios tipos de bucles para diferentes situaciones.

El bucle for es ideal cuando se conoce de antemano el número de iteraciones que se desean realizar.

for (inicializacion; condicion; incremento) {
// Código a ejecutar en cada iteración
}
// Imprimir números del 1 al 5
for (int i = 1; i <= 5; i++) {
System.out.println("Número: " + i);
}
// Contar hacia adelante y hacia atrás simultáneamente
for (int i = 1, j = 10; i <= 5; i++, j--) {
System.out.println("i = " + i + ", j = " + j);
}

El bucle for-each, introducido en Java 5, simplifica la iteración sobre arrays y colecciones.

for (tipo elemento : coleccion) {
// Código a ejecutar para cada elemento
}
String[] frutas = {"Manzana", "Banana", "Naranja", "Fresa"};
for (String fruta : frutas) {
System.out.println("Me gusta la " + fruta);
}

El bucle while ejecuta un bloque de código mientras una condición sea verdadera. Es útil cuando no se sabe de antemano cuántas iteraciones se necesitarán.

while (condicion) {
// Código a ejecutar mientras la condición sea verdadera
}
int contador = 1;
while (contador <= 5) {
System.out.println("Contador: " + contador);
contador++;
}
import java.util.Scanner;
public class EjemploWhile {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String entrada = "";
while (!entrada.equalsIgnoreCase("salir")) {
System.out.print("Escribe algo (o 'salir' para terminar): ");
entrada = scanner.nextLine();
if (!entrada.equalsIgnoreCase("salir")) {
System.out.println("Has escrito: " + entrada);
}
}
System.out.println("Programa finalizado");
scanner.close();
}
}

El bucle do-while es similar al bucle while, pero garantiza que el bloque de código se ejecute al menos una vez, ya que la condición se evalúa al final de cada iteración.

do {
// Código a ejecutar al menos una vez
} while (condicion);
int contador = 1;
do {
System.out.println("Contador: " + contador);
contador++;
} while (contador <= 5);
import java.util.Scanner;
public class ValidacionEntrada {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int numero;
do {
System.out.print("Ingresa un número positivo: ");
numero = scanner.nextInt();
if (numero <= 0) {
System.out.println("Error: El número debe ser positivo.");
}
} while (numero <= 0);
System.out.println("Has ingresado el número positivo: " + numero);
scanner.close();
}
}
Tipo de bucleCuándo usarloCaracterísticas
for
Cuando se conoce el número de iteracionesInicialización, condición e incremento en una línea
for-each
Para recorrer colecciones o arrays completosMás simple y legible, sin acceso al índice
while
Cuando la condición de terminación no es predecibleEvalúa la condición antes de cada iteración
do-while
Cuando el bloque debe ejecutarse al menos una vezEvalúa la condición después de cada iteración

3.3 Control de flujo (break, continue, return)

Section titled “3.3 Control de flujo (break, continue, return)”

Las sentencias de control de flujo permiten alterar la ejecución normal de los bucles y métodos.

La sentencia break se utiliza para salir inmediatamente de un bucle o un switch.

// Salir del bucle cuando i es 3
for (int i = 1; i <= 5; i++) {
if (i == 3) {
System.out.println("Encontrado el número 3, saliendo del bucle");
break;
}
System.out.println("Número: " + i);
}
System.out.println("Fuera del bucle");

Java permite etiquetar bucles y usar break con una etiqueta para salir de bucles anidados:

bucleExterno: for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
System.out.println("i = " + i + ", j = " + j);
if (i == 2 && j == 2) {
System.out.println("Saliendo de ambos bucles");
break bucleExterno;
}
}
}
System.out.println("Fuera de todos los bucles");

La sentencia continue salta a la siguiente iteración del bucle, omitiendo el resto del código en la iteración actual.

// Imprimir solo números impares
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue; // Salta los números pares
}
System.out.println("Número impar: " + i);
}

Al igual que break, continue también puede usarse con etiquetas en bucles anidados:

bucleExterno: for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
System.out.println("Saltando a la siguiente iteración del bucle externo");
continue bucleExterno;
}
System.out.println("i = " + i + ", j = " + j);
}
}

La sentencia return se utiliza para salir de un método y, opcionalmente, devolver un valor.

public int sumar(int a, int b) {
return a + b; // Devuelve la suma y sale del método
}
public String verificarEdad(int edad) {
if (edad < 0) {
return "Edad inválida"; // Retorno anticipado para casos de error
}
if (edad >= 18) {
return "Mayor de edad";
} else {
return "Menor de edad";
}
}

Uso de return para salir de un método void

Section titled “Uso de return para salir de un método void”
public void procesarDatos(int[] datos) {
if (datos == null || datos.length == 0) {
System.out.println("No hay datos para procesar");
return; // Sale del método sin devolver valor
}
// Procesar los datos...
for (int dato : datos) {
System.out.println("Procesando: " + dato);
}
}

El siguiente ejemplo muestra cómo se pueden combinar diferentes estructuras de control:

import java.util.Scanner;
public class ControlFlujoCompleto {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("=== Calculadora Simple ===
");
while (true) {
System.out.println("
Opciones:");
System.out.println("1. Sumar");
System.out.println("2. Restar");
System.out.println("3. Multiplicar");
System.out.println("4. Dividir");
System.out.println("5. Salir");
System.out.print("
Selecciona una opción (1-5): ");
int opcion = scanner.nextInt();
if (opcion == 5) {
System.out.println("
¡Gracias por usar la calculadora!");
break; // Sale del bucle while
}
if (opcion < 1 || opcion > 4) {
System.out.println("Opción inválida. Inténtalo de nuevo.");
continue; // Salta a la siguiente iteración
}
// Solicitar números
System.out.print("Ingresa el primer número: ");
double num1 = scanner.nextDouble();
System.out.print("Ingresa el segundo número: ");
double num2 = scanner.nextDouble();
// Realizar operación según la opción seleccionada
switch (opcion) {
case 1:
System.out.printf("%.2f + %.2f = %.2f
", num1, num2, num1 + num2);
break;
case 2:
System.out.printf("%.2f - %.2f = %.2f
", num1, num2, num1 - num2);
break;
case 3:
System.out.printf("%.2f * %.2f = %.2f
", num1, num2, num1 * num2);
break;
case 4:
if (num2 == 0) {
System.out.println("Error: No se puede dividir por cero.");
} else {
System.out.printf("%.2f / %.2f = %.2f
", num1, num2, num1 / num2);
}
break;
}
}
scanner.close();
}
}
🐝