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.