miércoles, 15 de abril de 2015

Lógica de Programación (14) - Estructuras de selección anidadas

En la lección anterior conocimos la alternativa múltiple, la cual nos permite dividir el flujo de nuestros programas en n caminos distintos. Sin embargo, esta estructura tiene una limitante muy importante: los valores que determinan el flujo que se debe seguir debe ser un valor cierto y conocido, además de pertenecer a alguno de los tipos entero, caracter o cadena únicamente. Pero, ¿qué hacemos si, para determinar el camino a seguir en nuestro algoritmo, necesitamos considerar un rango de valores en lugar de un valor en particular? Por ejemplo, tal vez necesitemos un programa que determine qué dia debe inscribirse a la escuela una persona en base a su fecha de nacimiento; si la fecha está entre el 1 y el 15 de enero se inscribirá en un día particular; si la fecha está entre el 16 y el 31 de enero, la fecha será otra y así sucesivamente. En dicho caso, necesitamos trabajar con rangos en vez de con valores fijos, y ahi es donde la alternativa múltiple falla. 



Para resolver este problema, podemos usar las alternativas simple o doble (que ya conocemos) contenidas una dentro de otra. Es decir, una estructura si-entonces puede contener otra, y esta a su vez contener otra y así sucesivamente cualquier cantidad de veces. A estas estructuras las llamamos anidadas o en cascada, y la podemos construir siguiendo este formato:

si (condición1) entonces
   <acciones>
si_no
   si (condición2) entonces
      <acciones>
   si_no
      si (condición3) entonces
         <acciones>
      si_no
         ...
         ...
      fin_si
   fin_si
fin_si


Una estructura de selección múltiple puede constar de una serie de alternativas simples o dobles, unas interiores a otras. Como esto puede volverse bastante complejo para que el algoritmo resulte claro de leer, se recomienda usar indentación (sangrías), de modo que exista una correspondencia entre las palabras reservadas si y fin_si.

En este ejemplo, leemos tres números para determinar cuál de ellos es el mayor usando estructuras de selección anidadas:

algoritmo Mayor
var
   real: A, B, C, Mayor
inicio
   leer(A,B,C)
   si (A > B) entonces
      si (A > C) entonces
         Mayor <- A
      si_no
         Mayor <- C
      fin_si
   si_no
      si (B > C) entonces
         Mayor <- B
      si_no
         Mayor <- C
      fin_si
   fin_si
   escribir("El número mayor es: " + Mayor)
fin

Estas son algunas pruebas de escritorio para demostrar el funcionamiento del algoritmo en distintos escenarios:


Y este es el programa escrito en el lenguaje de programación C# (¡incluso pueden probar cómo funciona!)




Este otro ejemplo recibe tres números y los muestra ordenados de mayor a menor:

algoritmo Ordenar
var
   real: a, b, c
inicio
   escribir("Dame 3 números: ")
   leer (a, b, c)
   si (a > b) entonces
      si (b > c) entonces
         escribir(a, b, c)
      si_no
         si (c > a) entonces
            escribir(c, a, b)
         si_no
            escribir(a, c, b)
         fin_si
      fin_si
   si_no
      si (a > c) entonces
         escribir (b, a, c)
      si_no
         si (c > b)
            escribir(c, b, a)
         si_no
            escribir(b, c, a)
         fin_si
      fin_si
   fin_si
fin

Mira las pruebas de escritorio de este algoritmo para distintos casos:



Un ejemplo más, para terminar de clarificar este asunto. Ahora tenemos un programa en el cual asignamos a un cliente un estatus y un porcentaje de descuento aplicable de acuerdo a los años de antigüedad que tiene comprando con una tienda. Si tiene hasta 1 año, su estatus será "Nuevo" y no tiene descuento; si tiene hasta 2 años, su estatus será "Regular" y accede a un 3% de descuento; si tiene hasta 4 años, su estatus será "Constante" y su descuento será del 7% y si tiene más de 4 años su estatus será "VIP" y su descuento será del 15%. Mira el algoritmo:

algoritmo Estatus_cliente
var
   real: años
   entero: descuento
   cadena: estatus
inicio
   escribir("¿Cuantos años tiene comprando el cliente?")
   leer(años)
   si (años <= 1) entonces
      estatus <- "Nuevo"
      descuento <- 0
   si_no
      si (años <= 2) entonces
         estatus <- "Regular"
         descuento <- 3
      si_no
         si (años <= 4) entonces
            estatus <- "Constante"
            descuento <- 7
         si_no
            estatus <- "VIP"
            descuento <- 15
         fin_si
      fin_si
   fin_si
   escribir("Estatus del cliente: " + estatus)
   escribir("Descuento aplicado: " + descuento)
fin

Estas son algunas pruebas para este algoritmo:



En cada uno de estos tres ejemplos usamos decisiones sucesivas para poder seleccionar las instrucciones que hemos de ejecutar. Como vemos, las estructuras anidadas nos permiten llegar donde la alternativa múltiple no, aunque el precio puede llegar a ser la legibilidad de nuestros algoritmos.

Esta es la última de las estructuras de selección que conoceremos. En la siguiente lección comenzaremos a analizar otro tipo de estructuras muy útiles: las estructuras de repetición. Pero primero, hay que practicar lo que ya hemos aprendido hasta ahora. ¡Hasta la próxima!

ACTIVIDADES DE APRENDIZAJE

  1. Reescribe el algoritmo Dia_Semana (primer ejemplo de la lección 13) para usar estructuras de decisión anidadas en lugar de la alternativa múltiple.
  2. Escribe un algoritmo que tome como datos tres números enteros y nos indique cuál de ellos es el valor central.
  3. Un ángulo se considera agudo si es menor a 90°, obtuso si es mayor a 90° y menor a 180°, recto si es igual a 90° y llano si es igual a 180°. Utilizando esta información, escribe un algoritmo que acepte la medida de un ángulo en grados y nos muestre el tipo de ángulo correspondiente.
  4. Los empleados de una fábrica trabajan en dos turnos: diurno y nocturno. Se desea calcular el salario diario de acuerdo con las siguientes condiciones:
    • el pago por cada hora diurna es de 5 dólares
    • el pago de cada hora nocturna es de 8 dólares
    • en caso de que sea domingo, el pago por hora se incrementa en 2 dólares para el turno diurno y en 3 dólares para el turno nocturno
  5. Una agencia de viajes necesita un programa que le ayude a determinar el costo de un boleto de avión de ida y vuelta para sus clientes, de acuerdo a las siguientes condiciones:
    • el precio se calcula de acuerdo a la distancia en kilómetros del destino
    • si la distancia es superior a 800 km y el viajero piensa quedarse en el destino por más de 7 días, se le aplica un descuento del 30% sobre el precio final
    • el precio por kilómetro es de 8.5 dólares




0 comentarios:

Publicar un comentario

Copyright © IsraelCapetillo.com - Un blog de tecnología, noticias geek y más Compartido por Gooyaabi Templates | Powered By Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com