Hoy vamos a hablar de las estructuras selectivas o condicionales (SI/SINO – EN CASO/SEA (IF/ELSE – SWITCH/CASE)), una herramienta que nos permite cambiar la secuencia del código en base a una condición.
En el artículo anterior dimos los primeros pasos, creamos algoritmos secuenciales. En este, voy a hablarte de la estructuras de control selectivas o condicionales que nos va a permitir cambiar la secuencia en base a una condición.
El código es el que decide qué bloque o sentencias ejecutar, qué camino seguir.
Dentro de las estructuras selectivas, tenemos la estructura si – sino o también llamada estructura if – else se escribe:

Si la condición es verdadera, va a ejecutar las instrucciones 1, 2 y 3. Sino (si la condición no es verdadera), va por las instrucciones A, B y C.
Notemos que los bloques van dentro de sentencias de inicio/fin, para saber dónde comienza y dónde termina cada bloque.
Tenemos dos variables numéricas, A y B, ambas cargadas con sus respectivos valores, y supongamos que queremos “determinar si A es mayor a B”:

Esto se puede leer asi:
“Si A es mayor a B, entonces imprimo ‘el mayor es A’, sino imprimo ‘A no es mayor que B'”
Cuando A sea mayor a B (por ejemplo A = 5 y B = 3, va a mostrar en pantalla “el mayor es A”). :
Cuando A sea menor o igual a B (por ejemplo A=5 y B=5, va a mostrar en pantalla “A no es mayor que B”)
Hacemos un párrafo aparte, ya que las condiciones son usadas por las estructuras selectivas, pero existen por sí mismas.
Las condiciones se arman usando operadores relacionales o de comparación.
Son símbolos que se usan para comparar dos valores, y eso genera una expresión que tiene un valor de verdad (verdadero o falso).
Si el resultado de la comparación es correcto (o verdadero) la expresión es verdadera, en caso contrario es falsa.

Vamos a ver algunos ejemplos tomados de Python



Las estructuras si también se pueden anidar

Si la variable numero1 es mayor a la variable numero2 entonces imprimo “el mayor es el número 1″ sino (empiezo otro bloque) si número2 es mayor a número1 entonces imprimo “el mayor es el número 2”. Sino (ambos son iguales) entonces imprimo “los números son iguales”.
Se pueden conectar expresiones mediante operadores lógicos: “Y”(and) – “O”(or).
Cada expresión tiene su propio valor de verdad, al conectar dos o más expresiones, lo que se conectan son esos valores de verdad.
expresion1: 5 > 2 : true
expresion2: 5 > 3 : true
Si tenemos:
expresion1 Y expresion2 : true Y true : true
La conexión de dos expresiones mediante el conector Y (AND), cada una con valor true, devuelve el resultado true.


Vimos que los valores de una expresión unida por conectores depende del valor de verdad de cada expresión.
Hay tablas en los que podemos ver los valores para los conectores AND y OR, en este caso tenemos las expresiones “A Y B” y “A O B”:

A O B (Para el conector O): si A y B son falsas, la O es falsa. En todos los otros casos es verdadera, por ejemplo:

A Y B (Para el conector Y): si A y B son verdaderas, la expresión completa es verdadera. En todo otro caso es falsa, por ejemplo:

También tenemos el operador de negación, “NO A”, “niega A”, invierte el valor de verdad de la expresión A:

Si A es verdadero el resultado de “NO A” es falso. Si A es falso el resultado de “NO A” es verdadero.
La estructura sí responde al valor de verdad de la expresión que está evaluando.

Vamos a analizar el problema, tenemos:
El problema nos pide que digamos si el alumno aprobó, si recupera, o si recursa.
Esto lo vamos a determinar con el promedio del alumno, con las tres notas que ingrese.
Estas tres notas son variables y van a ser de tipo decimal, por lo que primero vamos a tener que:

Si el promedio da entre 0 y 3 el alumno recursa. Si el promedio da entre 4 y 6 el alumno recupera. Y si el promedio da entre 7 y 10 el alumno aprueba la materia.
Con esto planteamos las condiciones del promedio:

Definimos las variables de tipo decimal: nota1, nota2 y nota3. También creo la variable promedio para almacenar el resultado.
Imprimimos un mensaje pidiendo que “Ingrese la nota1” y leemos la nota1 (cargamos el valor que ingresa el usuario en la variable nota1). Hacemos lo mismos con las otras variables nota2 y nota3.
Calculamos el promedio sumando las notas y dividiéndolas por tres, y eso lo asignamos a la variable promedio.
Acá empieza lo interesante los bloques de condición: si el valor de la variable promedio es menor igual a 3 imprimimos el alumno “recursa”, sino, abrimos un nuevo bloque, acá hay dos posibilidades; si el promedio es mayor o igual a 4 y menor o igual a 6 imprimimos el alumno “recupera”, y sino, queda una sola alternativa (promedio es mayor o igual a 7, no hay otra posibilidad matemática) imprimimos el alumno “aprueba”.

Usando una variable de tipo palabra estadoAlumno, en vez de usar la primitiva imprimir en cada parte del código, asignamos el valor del estado a esa variable según el bloque al que ingrese, y al finalizar la parte condicional, imprimimos “el alumno” más la variable estadoAlumno.
Con esto nuestro algoritmo se vuelve más legible.
Otra herramienta que tenemos es la estructura En caso/Sea o Switch/Case.
Funciona de la misma manera que la estructura si pero se escribe de otra manera:

En caso de que el valor de MiVariable sea “valor1”, se ejecuta instruccion1, en caso que tenga el valor “valor2”, ejecuta instruccion2 y así para todos los casos indicados.
La última opción, “Otro caso” sirve para cualquier otro valor, si no se cumple ninguna de los valores anteriores, entra por acá y ejecuta instruccionDefault.
Es similar al si, pero a veces es más fácil escribirlo de esta forma, puede resultar más legible según el caso.
Suele ser muy útil cuando tenemos pocas alternativas y muy específicas.

El ejercicio pide ingresar un día de la semana.
A veces hay que hacer suposiciones, como no aclara, podemos suponer que el día lo va a ingresar como un texto, y en minúscula, como por ejemplo:
lunes, martes, miércoles
“LUNES” (en mayúscula) no es lo mismo que “lunes” (en minúscula).
Incluso “Lunes” también es diferente a “lunes”.
Si quisiéramos que sean considerados igual, tenemos que usar una primitiva o una función que lo transforme, de mayúsculas a minúsculas.
Vamos a usar la variable diaSemana para cargar el valor del día, y cómo va a ser un texto debe ser de tipo palabra.
El color va a ser un texto: “azul, celeste, blanco”, podemos usar una variable para guardar el resultado, la podemos llamar variable color y también va a ser de tipo palabra.
La condición va a depender del valor de la variable diaSemana, un color diferente día, podemos usar tanto la estructura si/sino como la estructura en caso/sea. En este caso se ajusta mejor esta última, va a quedar más simple de entender el algoritmo.

¿ Lo podríamos saber hecho con la estructura si ? ¡claro! casi siempre hay más de una alternativa para hacer las cosas. Queda en nosotros elegir lo que consideremos mejor.
Aquí vimos las estructuras selectivas, con sus dos variantes de implementación (si/sino – en caso/sea), lo que nos permite cambiar el rumbo de ejecución.
Pero antes, como la única manera de aprender es practicando, aca te dejo unos ejercicios para que practiques y puedas poner en práctica lo que viste:
VARIABLES
ENTERO numero1
ENTERO numero2
ENTERO mayor
INICIO
IMPRIMIR 'Ingrese el primer número'
LEER numero1
IMPRIMIR 'Ingrese el segundo número'
LEER numero2
SI (numero1 >= numero2) ENTONCES
INICIO
mayor = numero1
FIN
SINO
INICIO
mayor = numero2
FIN
IMPRIMIR 'El mayor valor es: ' + mayor
FIN
//Aclaración: Cómo debajo de cada SI hay UNA SOLA línea de ejecución, se pueden evitar los INICIO/FIN,
//por lo que se puede escribir así, quedando el bloque más legible:
SI (numero1 >= numero2) ENTONCES
mayor = numero1
SINO
mayor = numero2
VARIABLES
ENTERO votosCandidato1, votosCandidato2, votosCandidato3
INICIO
// Cargo los votos de cada candidato
IMPRIMIR "Ingrese los votos del candidato 1"
LEER votosCandidato1
IMPRIMIR "Ingrese los votos del candidato 2"
LEER votosCandidato2
IMPRIMIR "Ingrese los votos del candidato 3"
LEER votosCandidato3
// Casos posibles: gana1, gana2, gana3, empate entre los 3,
// empate 1 y 2 (el 3 perdió), empate 1 y 3 (el 2 perdió), empate 2 y 3 (el 1 perdió)
SI (votosCandidato1 > votosCandidato2 Y votosCandidato1 > votosCandidato3) ENTONCES
IMPRIMIR "El ganador es el candidato 1"
SINO SI (votosCandidato2 > votosCandidato1 Y votosCandidato2 > votosCandidato3) ENTONCES
IMPRIMIR "El ganador es el candidato 2"
SINO SI (votosCandidato3 > votosCandidato1 Y votosCandidato3 > votosCandidato2) ENTONCES
IMPRIMIR "El ganador es el candidato 3"
SINO SI (votosCandidato1 == votosCandidato2 Y votosCandidato1 == votosCandidato3) ENTONCES
IMPRIMIR "Empate entre los tres candidatos"
SINO SI (votosCandidato1 == votosCandidato2) ENTONCES
IMPRIMIR "Empate entre el candidato 1 y el candidato 2"
SINO SI (votosCandidato2 == votosCandidato3) ENTONCES
IMPRIMIR "Empate entre el candidato 2 y el candidato 3"
SINO SI (votosCandidato1 == votosCandidato3) ENTONCES
IMPRIMIR "Empate entre el candidato 1 y el candidato 3"
FIN
VARIABLES
ENTERO valor1, valor2, valor3
ENTERO mayor, menor
INICIO
IMPRIMIR "Ingrese el primer valor"
LEER valor1
IMPRIMIR "Ingrese el segundo valor"
LEER valor2
IMPRIMIR "Ingrese el tercer valor"
LEER valor3
// Determinamos el mayor valor
SI (valor1 >= valor2 Y valor1 >= valor3) ENTONCES
mayor = valor1
SINO SI (valor2 >= valor1 Y valor2 >= valor3) ENTONCES
mayor = valor2
SINO
mayor = valor3
// Determinamos el menor valor
SI (valor1 <= valor2 Y valor1 <= valor3) ENTONCES
menor = valor1
SINO SI (valor2 <= valor1 Y valor2 <= valor3) ENTONCES
menor = valor2
SINO
menor = valor3
// Imprimir resultados
IMPRIMIR "El mayor valor es: " + mayor
IMPRIMIR "El menor valor es: " + menor
FIN
VARIABLES
ENTERO numero
INICIO
IMPRIMIR "Ingrese un número entero"
LEER numero
// Si el resto de la división por 2 es cero -> es par, si es 1 es impar
SI (numero % 2 == 0) ENTONCES
IMPRIMIR "El número " + numero + " es par"
SINO
IMPRIMIR "El número " + numero + " es impar"
FIN
VARIABLES
ENTERO numero
PALABRA numeroRomano
INICIO
IMPRIMIR "Ingrese un número entero entre 1 y 10"
LEER numero
EN CASO (numero) SEA
INICIO
CASO 1: numeroRomano = "I"
CASO 2: numeroRomano = "II"
CASO 3: numeroRomano = "III"
CASO 4: numeroRomano = "IV"
CASO 5: numeroRomano = "V"
CASO 6: numeroRomano = "VI"
CASO 7: numeroRomano = "VII"
CASO 8: numeroRomano = "VIII"
CASO 9: numeroRomano = "IX"
CASO 10: numeroRomano = "X"
FIN
IMPRIMIR "El número romano correspondiente es: " + numeroRomano
En el siguiente artículo veremos la estructura repetitiva o cíclica, que nos permite repetir la ejecución de un bloque de instrucciones.