3.a.1 - Escribir y probar código que haga uso de estructuras de selección

Objetivo

Escribir y probar código que haga uso de estructuras de selección para controlar el flujo de ejecución de un programa.

1. Contenidos

1.1 Introducción a las estructuras de selección

Las estructuras de selección (también llamadas condicionales o de decisión) permiten que un programa ejecute diferentes bloques de código según se cumpla o no una determinada condición. Son fundamentales para dotar de "inteligencia" a nuestros programas, permitiéndoles tomar decisiones y reaccionar ante diferentes situaciones.

En esencia, una estructura de selección evalúa una expresión booleana (que solo puede ser verdadero o falso) y, basándose en ese resultado, ejecuta un bloque de instrucciones u otro.

Analogía: Las estructuras de selección son como los semáforos en la vida real. Si el semáforo está en verde (condición verdadera), entonces cruzas la calle. Si está en rojo (condición falsa), te quedas esperando.

1.2 Estructura if-then (if simple)

La estructura if-then (si-entonces) es la estructura condicional más básica. Permite ejecutar un bloque de código solo si la condición se cumple (es verdadera). Si la condición es falsa, el bloque se omite y el programa continúa con la siguiente instrucción después del if.

Sintaxis:

  • PSeInt: Si condicion Entonces ... FinSi
  • Java: if (condicion) { ... }

Ejemplo en PSeInt:


Algoritmo IfSimple
    Definir edad Como Entero
    edad <- 18
    
    Si edad >= 18 Entonces
        Escribir "Eres mayor de edad. Puedes votar."
    FinSi
    
    Escribir "Fin del programa"
FinAlgoritmo
                

Diagrama de Flujo

Ejemplo en Java:


public class IfSimple {
    public static void main(String[] args) {
        Integer edad = 18;
        
        if (edad >= 18) {
            System.out.println("Eres mayor de edad. Puedes votar.");
        }
        
        System.out.println("Fin del programa");
    }
}
                

En este ejemplo, si edad es 18 o más, se muestra el mensaje. Si es menor, el mensaje se omite y solo se muestra "Fin del programa".

1.3 Estructura if-then-else (if-else)

La estructura if-then-else (si-entonces-sino) permite ejecutar un bloque de código cuando la condición es verdadera y otro bloque diferente cuando la condición es falsa. Es una bifurcación de dos caminos mutuamente excluyentes.

Sintaxis:

  • PSeInt: Si condicion Entonces ... Sino ... FinSi
  • Java: if (condicion) { ... } else { ... }

Ejemplo en PSeInt:


Algoritmo IfElse
    Definir nota Como Entero
    nota <- 7
    
    Si nota >= 5 Entonces
        Escribir "Aprobado"
    Sino
        Escribir "Suspenso"
    FinSi
FinAlgoritmo
                

Ejemplo en Java:


public class IfElse {
    public static void main(String[] args) {
        Integer nota = 7;
        
        if (nota >= 5) {
            System.out.println("Aprobado");
        } else {
            System.out.println("Suspenso");
        }
    }
}
                

Diagrama de Flujo

En este ejemplo, si nota >= 5 se muestra "Aprobado"; en caso contrario, se muestra "Suspenso". Solo uno de los dos mensajes se ejecutará.

1.4 Decisiones en cadena (else-if)

Cuando necesitamos evaluar múltiples condiciones en secuencia, utilizamos la estructura de decisión en cadena (también llamada if-else-if). Permite probar varias condiciones una tras otra, ejecutando el bloque correspondiente a la primera condición que sea verdadera.

Sintaxis:

  • PSeInt: Si cond1 Entonces ... SiNo Si cond2 Entonces ... SiNo Si cond3 Entonces ... Sino ... FinSi
  • Java: if (cond1) { ... } else if (cond2) { ... } else if (cond3) { ... } else { ... }

Ejemplo en PSeInt:


Algoritmo DecisionCadena
    Definir calificacion Como Entero
    calificacion <- 85
    
    Si calificacion >= 90 Entonces
        Escribir "Sobresaliente"
    SiNo Si calificacion >= 70 Entonces
	    Escribir "Notable"
         SiNo Si calificacion >= 60 Entonces
                    Escribir "Bien"
              SiNo Si calificacion >= 50 Entonces
                        Escribir "Suficiente"
                   Sino
                        Escribir "Insuficiente"
                   FinSi
              FinSi
        FinSi
    FinSi
FinAlgoritmo
                

Diagrama de Flujo

Ejemplo en Java:


public class DecisionCadena {
    public static void main(String[] args) {
        Integer calificacion = 85;
        
        if (calificacion >= 90) {
            System.out.println("Sobresaliente");
        } else if (calificacion >= 70) {
            System.out.println("Notable");
        } else if (calificacion >= 60) {
            System.out.println("Bien");
        } else if (calificacion >= 50) {
            System.out.println("Suficiente");
        } else {
            System.out.println("Insuficiente");
        }
    }
}
                

Importante: El orden de las condiciones es crucial. Se evalúan de arriba abajo, y al encontrar la primera verdadera, se ejecuta su bloque y se sale de toda la estructura. Por eso, normalmente colocamos las condiciones más restrictivas primero.

1.5 Decisiones anidadas (if dentro de if)

Las decisiones anidadas ocurren cuando colocamos una estructura condicional dentro de otra. Esto permite evaluar condiciones con mayor granularidad, donde la segunda condición solo se evalúa si la primera se cumple.

Sintaxis:

  • PSeInt: Si cond1 Entonces ... Si cond2 Entonces ... FinSi ... FinSi
  • Java: if (cond1) { if (cond2) { ... } }

Ejemplo en PSeInt:


Algoritmo DecisionAnidada
    Definir temperatura Como Real
    Definir lloviendo, hayParaguas Como Lógico
    temperatura <- 15
    lloviendo <- Verdadero
    hayParaguas <- Verdadero
    
    Si temperatura < 20 Entonces
        Escribir "Hace frío."
        Si lloviendo = Verdadero Entonces
            Si hayParaguas = Verdadero Entonces
                Escribir "Lleva paraguas porque llueve y hace frío."
            Sino
                Escribir "Llueve y hace frío, ¡pero no tienes paraguas!"
            FinSi
        Sino
            Escribir "No llueve, pero hace frío. Abrígate."
        FinSi
    Sino
        Escribir "Hace calor o templado."
    FinSi
FinAlgoritmo
                

Diagrama de Flujo

Ejemplo en Java:


public class DecisionAnidada {
    public static void main(String[] args) {
        Integer temperatura = 15;
        Boolean lloviendo = true;
        Boolean hayParaguas = true;
        
        if (temperatura < 20) {
            System.out.println("Hace frío.");
            if (lloviendo) {
                if (hayParaguas) {
                    System.out.println("Lleva paraguas porque llueve y hace frío.");
                } else {
                    System.out.println("Llueve y hace frío, ¡pero no tienes paraguas!");
                }
            } else {
                System.out.println("No llueve, pero hace frío. Abrígate.");
            }
        } else {
            System.out.println("Hace calor o templado.");
        }
    }
}
                

Recomendación: Aunque las decisiones anidadas son útiles, un exceso de anidamiento (más de 3 o 4 niveles) puede hacer el código difícil de leer. En esos casos, considera usar decisiones en cadena o reestructurar la lógica.

1.6 Estructura switch-case-default

La estructura switch-case-default es una alternativa a las decisiones en cadena cuando la condición se basa en el valor exacto de una variable (entera, carácter o String a partir de Java 7). Permite seleccionar un bloque de código entre múltiples opciones basándose en el valor de una expresión.

Sintaxis:

  • PSeInt: Segun variable Hacer ... valor1: ... valor2: ... De Otro Modo: ... FinSegun
  • Java: switch (variable) { case valor1: ... break; case valor2: ... break; default: ... }

Ejemplo en PSeInt:


Algoritmo SwitchExample
    Definir diaSemana Como Cadena
    diaSemana <- "martes"
    
    Segun diaSemana Hacer
        "lunes":
            Escribir "Inicio de semana. Ánimo!"
        "martes":
        "miercoles":
            Escribir "Mitad de semana. A seguir!"
        "jueves":
            Escribir "Casi es viernes!"
        "viernes":
            Escribir "Por fin viernes!"
        "sabado":
        "domingo":
            Escribir "Fin de semana. A descansar!"
        De Otro Modo:
            Escribir "Día no válido"
    FinSegun
FinAlgoritmo
                

Diagrama de Flujo

Ejemplo en Java:


public class SwitchExample {
    public static void main(String[] args) {
        String diaSemana = "martes";
        
        switch (diaSemana) {
            case "lunes":
                System.out.println("Inicio de semana. Ánimo!");
                break;
            case "martes":
            case "miercoles":
                System.out.println("Mitad de semana. A seguir!");
                break;
            case "jueves":
                System.out.println("Casi es viernes!");
                break;
            case "viernes":
                System.out.println("Por fin viernes!");
                break;
            case "sabado":
            case "domingo":
                System.out.println("Fin de semana. A descansar!");
                break;
            default:
                System.out.println("Día no válido");
        }
    }
}
                

Switch con tipos numéricos (ejemplo):


public class SwitchNumerico {
    public static void main(String[] args) {
        Integer mes = 7;
        String nombreMes;
        
        switch (mes) {
            case 1:
                nombreMes = "Enero";
                break;
            case 2:
                nombreMes = "Febrero";
                break;
            case 3:
                nombreMes = "Marzo";
                break;
            case 4:
                nombreMes = "Abril";
                break;
            case 5:
                nombreMes = "Mayo";
                break;
            case 6:
                nombreMes = "Junio";
                break;
            case 7:
                nombreMes = "Julio";
                break;
            case 8:
                nombreMes = "Agosto";
                break;
            case 9:
                nombreMes = "Septiembre";
                break;
            case 10:
                nombreMes = "Octubre";
                break;
            case 11:
                nombreMes = "Noviembre";
                break;
            case 12:
                nombreMes = "Diciembre";
                break;
            default:
                nombreMes = "Mes inválido";
        }
        System.out.println("El mes " + mes + " es " + nombreMes);
    }
}
                

Importante sobre break: En Java, si no se incluye la sentencia break al final de un caso, la ejecución continúa con el siguiente caso (efecto "fall-through"). Esto puede ser útil intencionalmente (como en los ejemplos donde varios casos comparten el mismo código), pero olvidarlo es un error común.

Switch en Java moderno: Desde Java 14, existe una sintaxis más moderna usando flechas (->) que no necesita break y permite usar expresiones. Por simplicidad, aquí usamos la sintaxis clásica que es más compatible con entornos educativos.

2. Ejercicios

2.1 Clasificador de números (Nivel básico)

Crea un programa en Java llamado ClasificadorNumeros que:

  1. Declara una variable de tipo entero.
  2. Asígnale un valor a tu elección o solicítaselo al usuario (usa String entrada = System.console().readLine();).
  3. Determina si el número es positivo, negativo o cero usando una estructura if-then-else-if.
  4. Si es positivo, indica también si es par o impar (usa el operador módulo %).
  5. Si es negativo, muestra un mensaje advirtiendo que el número es negativo.
  6. Si es cero, muestra "El número es neutro (cero)".

Ejemplo de ejecución:


Introduce un número entero: 7
El número 7 es positivo y es impar.
                

2.2 Calculadora de IMC y asesoría de salud (Nivel intermedio)

Crea un programa en Java llamado CalculadoraIMC que:

  1. Crea las variable peso (en kg) y su altura (en metros).
  2. Asígnales valores o pídeselos al usuario.
  3. Calcule el Índice de Masa Corporal (IMC) con la fórmula: IMC = peso / (altura * altura).
  4. Utilizando una estructura de decisión en cadena (if-else-if), clasifique el resultado según la siguiente tabla:
    • IMC < 18.5 → "Bajo peso"
    • IMC 18.5 - 24.9 → "Peso normal"
    • IMC 25.0 - 29.9 → "Sobrepeso"
    • IMC ≥ 30.0 → "Obesidad"
  5. Además, usando una estructura switch-case sobre la clasificación (como String), muestre un consejo personalizado:
    • "Bajo peso" → "Consulta a un nutricionista para ganar peso saludablemente."
    • "Peso normal" → "¡Felicidades! Mantén tus hábitos saludables."
    • "Sobrepeso" → "Recomendamos aumentar la actividad física y revisar la alimentación."
    • "Obesidad" → "Es importante buscar ayuda profesional para mejorar tu salud."
  6. Muestre el IMC con dos decimales usando System.out.printf().

Ejemplo de ejecución:


Introduce tu peso (kg): 70
Introduce tu altura (m): 1.75
Tu IMC es: 22.86
Clasificación: Peso normal
Consejo: ¡Felicidades! Mantén tus hábitos saludables.
                

Pista: Para el switch-case, puedes usar la variable String que contiene la clasificación. En Java, los switch con String están disponibles desde Java 7.

3. Bibliografía