Algoritmos 2: Estructuras Selectivas

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.

La Estructura SI/SINO (IF/ELSE)

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:

estructuras selectivas

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.

Ejemplo

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”:

estructuras selectivas

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”)

¿Cómo se arman las condiciones?

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.

Símbolos de comparación

estructuras selectivas

Vamos a ver algunos ejemplos tomados de Python

Igual

estructuras selectivas

Distinto

estructuras selectivas

Mayor y Menor

estructuras selectivas

Estructuras Selectivas "Si" Anidadas

Las estructuras si también se pueden anidar

estructuras selectivas

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”.

Conectores Lógicos

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.

Ejemplo OR

estructuras selectivas

Ejemplo AND

estructuras selectivas

Tablas de Valor de Verdad

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”:

estructuras selectivas

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:

  • 4 mayor a 2 o 4 menor a 5; la expresión total es verdadera
  • 4 mayor a 2 o 4 menor a 3; es verdadera porque una de las dos es verdadera
  • 4 mayor a 5 o 4 menor a 2; es falsa porque las dos son falsas
estructuras selectivas

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:

  • 4 mayor a 2 y 4 menor a 5; la expresión total es verdadera
  • 4 mayor a 2 y 4 menor a 3 es falsa; porque una de las dos es falsa
  • 4 mayor a 5 y 4 menor a 2 es falsa; porque las dos son falsas
estructuras selectivas

Operador de Negación

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

estructuras selectivas

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.

Ejemplo

estructuras selectivas

Vamos a analizar el problema, tenemos:

  • notas
  • promedio
  • y estado del alumno (aprobado/desaprobado)

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:

  1. leer esas tres notas del alumno
  2. calcular el promedio y según lo que dé vamos a decidir qué texto mostrar
  3. podemos usar una variable más de tipo decimal para guardar el promedio
estructuras selectivas

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:

  • Si promedio < 4, recursa
  • si promedio > = 4 y < 7, recupera
  • si promedio >= 7, aprueba

El algoritmo

estructuras selectivas

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”.

Mejorando el algoritmo

estructuras selectivas

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.

En Caso/Sea (Switch/Case)

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:

estructuras selectivas

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.

Ejemplo En Caso/Sea

estructuras selectivas

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.

estructuras selectivas

¿ 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.

Recursos utilizados