6 Estructuras de Control
Como mencionamos anteriormente, un algoritmo está compuesto por una sucesión ordenada de comandos que se ejecutan uno detrás de otro. Sin embargo, con frecuencia es necesario recurrir a comandos especiales que alteran o controlan el flujo de las acciones. Por lo tanto, decimos que existen distintas estructuras de control que organizan a los algoritmos y que pueden clasificarse en secuenciales, condicionales e iterativas.
6.1 Estructuras de control secuenciales
Las estructuras secuenciales están compuestas por un número definido de acciones que se ubican en un orden específico y se suceden una tras otra. Los ejemplos que hemos discutido anteriormente están conformados por este tipo de estructura.
6.2 Estructuras de control condicionales
El curso de acción depende del resultado de la comparación una variable con un valor, que puede ser una constante u otra variable. Existen tres tipos de estructuras condicionales: simples, dobles y múltiples.
6.2.1 Estructuras condicionales simples
Representan una toma de decisión y se describen con la siguiente sintaxis:
SI <condición> ENTONCES
Acción/es
FIN SI
La palabra SI
indica el comando de comparación, <condición>
indica la condición a evaluar y Acción/es
son las instrucciones que se realizarán sólo si se cumple la condición. Si la condición no se verifica, no se ejecuta ninguna acción y el algoritmo sigue su estructura secuencial a continuación del FIN SI
.
En el siguiente ejemplo utilizaremos esta estructura para determinar si una persona es mayor de edad o no.
ALGORITMO: "Determinar mayoría de edad"
COMENZAR
VARIABLE numérica edad
LEER edad
SI edad >= 18 ENTONCES
ESCRIBIR "Es mayor de edad"
FIN SI
FIN
En IML. Usamos la estructura if ... then ...;
:
/* PROGRAMA: Determinar mayoría de edad */
proc iml;
edad = 19;
if edad >= 18 then print "Es mayor de edad";
quit;
Si necesitamos ejecutar más de una acción al cumplirse la condición evaluada, debemos encerrarlas dentro de un bloque do
, que siempre termina con un end
:
/* PROGRAMA: Determinar mayoría de edad */
proc iml;
edad = 19;
if edad >= 18 then do;
print "Es mayor de edad";
print "Su edad es " edad " años";
end;
quit;
6.2.2 Estructuras condicionales dobles
Este tipo de estructura añade una acción a ejecutarse en el caso de que la condición evaluada no se verifique. La sintaxis es:
SI <condición>
ENTONCES
Acción/es
SI NO
Acción/es
FIN SI
La palabra ENTONCES
antecede a las acciones que se realizan si se cumple la condición y SI NO
a las que se realizan si no se verifica la misma. Podemos ampliar el ejemplo anterior para que el algorimo indique también si la persona es menor de edad:
ALGORITMO: "Determinar mayoría de edad"
COMENZAR
VARIABLE numérica edad
LEER edad
SI edad >= 18
ENTONCES
ESCRIBIR "Es mayor de edad"
SI NO
ESCRIBIR "Es menor de edad"
FIN SI
FIN
En IML.
proc iml;
edad = 17;
if edad >= 18 then print "Es mayor de edad";
else print "Es menor de edad";
quit;
Nuevamente, si necesitamos ejecutar múltiples acciones debemos encerrarlas dentro de un bloque do
:
proc iml;
edad = 19;
if edad >= 18 then do;
print "Es mayor de edad";
print "Su edad es " edad " años";
end;
else do;
print "Es menor de edad";
print "Requerir ingreso acompañado";
end;
quit;
6.2.3 Estructuras condicionales múltiples o anidadas
Permiten combinar varias estructuras condicionales para establecer controles más complejos sobre el flujo de las acciones, representando una toma de decisión múltiple. Podemos ejemplificar la sintaxis de la siguiente forma:
SI <condición>
ENTONCES
Acción/es
SI NO
SI <condición>
ENTONCES
Acción/es
SI NO
Acción/es
FIN SI
FIN SI
Imaginemos que el ejemplo anterior de la mayoría de edad se da en el contexto de la entrada a una exhibición, donde los mayores de edad pueden ingresar pero los menores sólo pueden hacerlo si tienen la autorización de un adulto a cargo. Podemos plantear el siguiente algoritmo para determinar si una persona puede ingresar o no:
ALGORITMO: "Determinar ingreso"
COMENZAR
VARIABLE numérica edad
VARIABLE caracter autorizacion
LEER edad
SI edad >= 18
ENTONCES
ESCRIBIR "Permitir ingreso"
SI NO
LEER autorizacion
SI autorizacion = "OK"
ENTONCES
ESCRIBIR "Permitir ingreso"
SI NO
ESCRIBIR "Denegar ingreso"
FIN SI
FIN SI
FIN
/* PROGRAMA: Determinar ingreso */
proc iml;
edad = 16;
autorizacion = "OK";
if edad >= 18 then print "Permitir ingreso";
else do;
if autorizacion = "OK" then print "Permitir ingreso";
else print "Denegar ingreso";
end;
quit;
6.3 Estructuras de control iterativas
Las estructuras de control iterativas son útiles cuando la solución de un problema requiere que se ejecute repetidamente un determinado conjunto de acciones. El número de veces que se debe repetir dicha secuencia de acciones puede ser fijo o variable dependiendo de algún dato en el algoritmo.
6.3.1 Estructuras de control iterativas con un número fijo de iteraciones
Se aplican cuando se conoce de antemano el número exacto de veces que se debe repetir una secuencia de acciones. Por ejemplo, si deseamos mostrar en pantalla la tabla de multiplicar del número 8 completa podríamos hacer:
ALGORIMO: "Mostrar tabla del 8"
COMENZAR
VARIABLE numérica resultado
resultado <- 8 * 1
ESCRIBIR "8 x 1 = ", resultado
resultado <- 8 * 2
ESCRIBIR "8 x 2 = ", resultado
resultado <- 8 * 3
ESCRIBIR "8 x 3 = ", resultado
...
resultado <- 8 * 10
ESCRIBIR "8 x 10 = ", resultado
FIN
Es evidente que hay dos acciones que se repiten a través de todo el algorimo con una leve variación en el número por el cual se está multiplicando al 8. Esto puede resumirse así:
ALGORIMO: "Mostrar tabla del 8"
COMENZAR
VARIABLE numérica resultado
PARA i DESDE 1 HASTA 10 HACER
resultado <- 8 * i
ESCRIBIR "8 x " i " = " resultado
FIN PARA
FIN
De manera general, la sintaxis para este tipo de estructuras es:
PARA <variable> DESDE <valor1> HASTA <valor2> CON PASO <valor3> HACER
Acción/es
FIN PARA
Dado un valor inicial <valor1>
asignado a la <variable>
, esta se irá aumentando o disminuyendo según el paso <valor3>
hasta llegar a tomar el valor <valor3>
. Si no se indica el paso se asume que la variable aumenta de uno en uno.
En IML.
/* PROGRAMA: Mostrar tabla del 8 */
proc iml;
do i = 1 to 10;
resultado = 8 * i;
print "8 x " i " = " resultado;
end;
quit;
6.3.2 Estructuras de control iterativas con un número indeterminado de iteraciones
En otras circunstancias se puede necesitar repetir un bloque de acciones sin conocer con exactitud cuántas veces, si no que esto depende de algún otro aspecto del ALGORITMO. Las iteraciones pueden continuar mientras que o hasta que se verifique alguna condición, dando lugar a dos tipos de estructuras.
6.3.2.1 Mientras que
El conjunto de sentencias se repite mientras que se siga evaluando como VERDADERO
una condición declarada al inicio del bloque. Cuando la condición ya no se cumple, el proceso deja de ejecutarse. La sintaxis es:
MIENTRAS QUE <condición> HACER
Acción/es
FIN MIENTRAS
El siguiente ejemplo describe el algoritmo para escribir los múltiplos de 8 menores a 150 utilizando este tipo de estructura:
ALGORITMO: "Múltiplos de 8 menores a 150"
COMENZAR
VARIABLE numérica multiplo
multiplo <- 8
MIENTRAS QUE multiplo < 150 HACER
ESCRIBIR multiplo
multiplo <- multiplo + 8
FIN MIENTRAS
FIN
Observaciones:
- La evaluación de la condición se lleva a cabo antes de cada iteración, incluyendo la primera. Si la condición es
FALSO
inicialmente, entonces las acciones en el cuerpo de la estructura no se ejecutan nunca. - La evaluación de la condición sólo se lleva a cabo al inicio de cada iteración. Si la condición se vuelve
FALSO
en algún punto durante la ejecución de un bloque, el programa no lo nota hasta que se termine de ejecutar el bloque y la condición sea evaluada antes de comenzar la próxima iteración.
En IML.
/* PROGRAMA: Múltiplos de 8 menores a 150 */
proc iml;
multiplo = 8;
do while (multiplo < 150);
print multiplo;
multiplo = multiplo + 8;
end;
quit;
6.3.2.2 Hasta que
A diferencia de la estructura mientras que, la estructura hasta que repite el bloque de acciones hasta que se cumpla una condición, es decir, se ejecuta mientras que dicha condición sea evaluada como FALSA
. La sintaxis es:
REPETIR
Acción/es
HASTA QUE <condición>
El algoritmo del ejemplo anterior puede ser re escrito con este tipo de estructura:
ALGORITMO: "Múltiplos de 8 menores a 150"
COMENZAR
VARIABLE numérica multiplo
multiplo <- 8
REPETIR
ESCRIBIR multiplo
multiplo <- multiplo + 8
HASTA QUE multiplo >= 150
FIN
Observación: en la estructura mientras que podría ser que el conjunto de sentencias nunca llegue a ejecutarse si desde partida la condición evaluada ya es falsa. Por el contrario, en la estructura hasta que el proceso se realiza al menos una vez, dado que la condición se evalúa al final.
En IML.
/* PROGRAMA: Múltiplos de 8 menores a 150 */
proc iml;
multiplo = 8;
do until (multiplo >= 150);
print multiplo;
multiplo = multiplo + 8;
end;
quit;