Introducción a la Informática 2009 Tema
Estructuras de control. Secuencial y selectiva
Programación estructurada
La programación estructurada es una forma de escribir programas de computadora de
forma clara, utilizando únicamente tres estructuras: secuencia, selección e iteración; siendo
innecesario y no permitiéndose el uso de la instrucción o instrucciones de transferencia
incondicional (Por ejemplo GOTO).
La programación estructurada surge a finales de los años 1960 con el objetivo de realizar
programas confiables y eficientes, y que además fueran escritos de manera de facilitar su
comprensión posterior.
Hoy en día las aplicaciones informáticas son mucho más ambiciosas que las necesidades de
aquellos años, por lo que se desarrollaron nuevas técnicas, tales como la programación
orientada a objetos y el desarrollo de entornos de programación que facilitan la
programación de grandes aplicaciones.
De todas formas, el paradigma estructurado tiene vigencia en muchos ámbitos de desarrollo
de programas y constituye una buena forma de iniciarse en la programación de
computadoras, por lo que en este capitulo y en el siguiente se verán las características de
las estructuras que lo componen.
El teorema del programa estructurado, de Böhm-Jacopini, demuestra que todo programa
puede escribirse utilizando únicamente las tres instrucciones de control siguientes:
Secuencia
Instrucción condicional.
Iteración (bucle de instrucciones) con condición al principio.
Solamente con estas tres estructuras o “patrones lógicos” se pueden escribir todos los
programas y aplicaciones posibles. Si bien los lenguajes de programación tienen un mayor
repertorio de estructuras de control, éstas pueden ser construidas mediante las tres
básicas.
El flujo de control de un programa
La expresión flujo de control hace referencia al orden en el que se ejecutarán las
instrucciones de un programa, desde su comienzo hasta que finaliza. El flujo normal de
ejecución es el secuencial. Si no se especifica lo contrario, la ejecución de un programa
empezaría por la primera instrucción e iría procesando una a una en el orden en que
aparecen, hasta llegar a la última.
Algunos programas muy simples pueden escribirse sólo con este flujo unidireccional. No
obstante, la mayor eficacia y utilidad de cualquier lenguaje de programación se deriva de la
posibilidad de cambiar el orden de ejecución según la necesidad de elegir uno de entre
varios caminos en función de ciertas condiciones, o de ejecutar algo repetidas veces, sin
tener que escribir el código para cada vez.
Con frecuencia, el programador necesita que el programa no se comporte sólo de modo
secuencial. Por ejemplo, si no se puede abrir un archivo y la función del programa es
modificar ese fichero, el programa no debería realizar ninguna operación, más que indicar
el error detectado. Otro ejemplo, sería calcular una bonificación sólo para los empleados con
más de 10 años de antigüedad.
También puede ocurrir que interese que un grupo de instrucciones se ejecute repetidamente
hasta que se le indique que se detenga. Por ejemplo, calcular el promedio de notas para
cada uno de los alumnos de un curso, o realizar algún cálculo con cada uno de los
elementos de un vector.
Para las dos situaciones planteadas existen dos soluciones: las sentencias de control
selectivas y las repetitivas. Éstas permiten que el flujo secuencial del programa sea
modificado. También cumplen con este objetivo las sentencias denominadas de invocación
o salto.
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 1
Introducción a la Informática 2009 Tema
5
Las sentencias alternativas también son conocidas como sentencias selectivas porque
permiten seleccionar uno de entre varios caminos por donde seguirá la ejecución del
programa. En algunos casos esta selección viene determinada por la evaluación de una
expresión lógica. Este tipo de sentencias se clasifican en tres:
• simples: SI (IF)
• dobles: SI-SINO (IF-ELSE)
• múltiples: SEGÚN-SEA (SWITCH, CASE)
A las sentencias repetitivas se les conoce también como sentencias iterativas ya que
permiten realizar algo varias veces (repetir, iterar). Dentro de ellas se distinguen:
• DESDE (FOR)
• MIENTRAS (WHILE)
• REPETIR-HASTA-QUE (REPEAT UNTIL)
Las sentencias de salto o invocación permiten realizar saltos en el flujo de control de
un programa, es decir, permiten transferir el control del programa, alterando bruscamente
el flujo de control del mismo. En programación estructurada se considera una mala práctica
el uso de las condiciones de salto, ya que, entre otras cosas, restan legibilidad al código. Sin
embargo, si bien se debe evitar su uso, la mayoría de los lenguajes las incluyen.
Las sentencias de salto o invocación son:
• ROMPER (BREAK)
• CONTINUAR (CONTINUE)
• IR-A (GO TO)
• VOLVER (RETURN)
• LANZAR (THROW)
Estructura secuencial
La estructura secuencial es aquella en que las acciones (instrucciones) se ejecutan
sucesivamente, una a continuación de otra, sin posibilidad de omitir ninguna y sin
bifurcaciones. Es decir que la acción k no se inicia hasta haber terminado la acción k-1.
Acción 1 Acción 2 Acción 3 ...
La representación mediante diagrama de flujo es la siguiente:
El pseudocódigo de una estructura secuencial es la siguiente:
INICIO
< acción 1 >
< acción 2 >
< acción 3 >
FIN
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 2
Introducción a la Informática 2009 Tema
5
Ejemplo: Dado el radio de una circunferencia, se desea obtener su longitud y el área del
círculo que determina.
Inicio
ALGORITMO LongitudArea
VARIABLES
REAL: area =0 // inicializa variables: area y longitud radio
REAL: longitud = 0
INICIO
area = 3.141592 * radio**2
LEER radio
area = 3.141592 * radio **2
longitud = 2 * (3.141592) * radio
ESCRIBIR radio, area, longitud Longitud = 2 * 3.141592 * radio
FIN
radio, area, longitud
Fin
Estructuras selectivas
Frecuentemente en el diseño de un algoritmo es necesario realizar una acción de acuerdo a
si se cumple determinada condición. Las estructuras selectivas posibilitan, como resultado
de la evaluación de una condición, seleccionar la o las siguientes instrucciones a ejecutar,
de entre varias posibilidades o alternativas. También pueden ser útiles para evitar la
ejecución de un conjunto de sentencias. Por ejemplo, si un empleado no cumple con ciertos
requisitos, no se le asigna una bonificación.
Por esta razón las estructuras selectivas reciben también el nombre de estructuras
alternativas o de decisión.
Las estructuras selectivas o alternativas pueden ser:
• simples: SI (IF)
• dobles: SI-SINO (IF-ELSE)
• múltiples: SEGÚN-SEA (SWITCH, CASE)
La base de este tipo de estructuras es la condición. Por esta razón es necesario saber cómo
se le indica al ordenador que debe evaluar una condición. Las expresiones que lo permiten
reciben el nombre de expresiones condicionales, lógicas o booleanas. Estas expresiones sólo
pueden tomar dos valores: VERDADERO (TRUE) o FALSO (FALSE).
Como hemos visto el tema 4, tal como en las expresiones aritméticas, en las expresiones
condicionales se pueden comparar variables entre sí o variables con constantes. También es
posible comparar constantes entre sí, sin embargo esto no es muy útil puesto que si se
conocen los dos valores, ya es sabida la relación que existe entre ambas constantes.
Alternativa Simple
La estructura alternativa simple de la forma SI-ENTONCES (IF-THEN) ejecuta una acción
o conjunto de acciones cuando se cumple una determinada condición. Como resultado de
evaluar la condición, pueden ocurrir dos cosas:
• que la condición sea verdadera: en cuyo caso se ejecuta la acción preestablecida
• que la condición sea falsa: ante esta situación no se hace nada
La representación mediante diagrama de flujo es la siguiente:
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 3
Introducción a la Informática 2009 Tema
5
El pseudocódigo de una estructura selectiva simple es la siguiente:
SI <expresión_lógica> ENTONCES IF <expresión_lógica> THEN
< acción 1 > < acción 1 >
< acción 2 > < acción 2
< ... > < ... >
< acción n > < acción n >
FIN-SI END-IF
Formato Pascal:
IF (<expresión_lógica> ) THEN
BEGIN
< bloque_de_instrucciones_1 >
END;
Cabe resaltar la alineación en esta estructura. Nótese que las líneas correspondientes a las
acciones se encuentran indentadas o sangradas respecto a las palabras reservadas SI y
FIN-SI. Es importante tenerlo en cuenta, dado que facilita la legibilidad del código.
Ejemplo: Dado el radio de una circunferencia, se Inicio
desea obtener su longitud y el área del círculo que
determina, siempre que el radio sea mayor a 3.
radio
ALGORITMO LongitudArea
VARIABLES
radio > 3 SI
REAL: area = 0 // inicializa
REAL: longitud = 0
INICIO
area = 3.141592 * radio**2
LEER radio
SI radio > 3 ENTONCES
area = 3.141592 * radio * radio NO
longitud = 2 * (3.141592) * radio Longitud = 2 * 3.141592 * radio
ESCRIBIR radio, area, longitud
FIN-SI
FIN Fin
radio, area, longitud
Obsérvese que los cálculos correspondientes (conjunto de instrucciones), sólo se ejecutan si
se cumple la condición, representada por la expresión lógica que incluye un operador
matemático.
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 4
Introducción a la Informática 2009 Tema
5
Alternativa Doble
La estructura condicional doble permite elegir entre dos opciones o alternativas posibles en
función del cumplimiento o no de una determinada condición. Se representa de la siguiente
forma:
Diagrama de Flujo:
NO Condición SI
Tarea a realizar si Tarea a realizar si
la condición es la condición es
falsa verdadera
Pseudocódigo:
SI <expresión_lógica> ENTONCES IF <expresión_lógica> THEN
< bloque_de_instrucciones_1 > < bloque_de_instrucciones_1 >
SINO ELSE
< bloque_de_instrucciones_2 > < bloque_de_instrucciones_2 >
FIN-SI END-IF
Formato Pascal:
IF (<expresión_lógica> ) THEN
BEGIN
< bloque_de_instrucciones_1 >
END
ELSE
BEGIN
< bloque_de_instrucciones_2 >
END;
A la <expresión_lógica> de una instrucción alternativa doble también se le denomina
condición.
Para que se ejecute el Inicio
<bloque_de_instrucciones_1>, la condición
tiene que ser verdadera. Por el contrario, si
la condición es falsa, se ejecutará el
radio
<bloque_de_instrucciones_2>.
En resumen, una instrucción alternativa
doble (o simplemente alternativa doble)
permite seleccionar, por medio de una
radio > 3 SI
condición, el siguiente bloque de
instrucciones a ejecutar, de entre dos
NO
posibles.
area = 3.141592 * radio**2
Nótese que, como en el caso de la estructura
alternativa simple, los bloques de
instrucciones se encuentran indentados “Fuera de rango”
Longitud = 2 * 3.141592 * radio
respecto a las palabras reservadas, dando
mayor claridad al código.
Ejemplo: Dado el radio de una Fin
radio, area, longitud
circunferencia, se desea obtener su longitud
y el área del círculo que determina, siempre
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 5
Introducción a la Informática 2009 Tema
5
que el radio sea mayor a 3. Caso contrario, muestre en pantalla el mensaje “Fuera de
rango”.
ALGORITMO LongitudArea
VARIABLES
REAL: area =0
REAL: longitud = 0
INICIO
LEER radio
SI radio > 3 ENTONCES
area = 3.141592 * radio * radio
longitud = 2 * (3.141592) * radio
ESCRIBIR radio, area, longitud
SINO
ESCRIBIR “Fuera de rango”
FIN-SI
FIN
Alternativa Múltiple
Con frecuencia al diseñar un algoritmo ocurre que se necesitan más de dos alternativas. Si
bien esta situación puede resolverse con estructuras alternativas anidadas, como se verá
más adelante, esto resta legibilidad al código cuando las alternativas son numerosas,
además de ofrecer mayor posibilidad de cometer errores en la codificación.
La estructura alternativa múltiple es una toma de decisión especializada que permite
evaluar una expresión con n posibles resultados, y en base al resultado seleccionar el
siguiente bloque de instrucciones a ejecutar, de entre varios posibles.
Las palabras reservadas expresión
(SWITCH, CASE, etc) utilizadas
para esta estructura, varía según
el lenguaje de programación. La
<lista de valores-1> <lista de valores-2> SI-NO
representación es la siguiente:
Diagrama de Flujo:
bloque de bloque de bloque de
instrucciones-1 instrucciones-2 instrucciones-n+1
Pseudocódigo:
SEGUN-SEA <expresión>
<lista_de_valores_1> : <bloque_de_instrucciones_1>
<lista_de_valores_2> : <bloque_de_instrucciones_2>
...
<lista_de_valores_n> : <bloque_de_instrucciones_n>
[ SINO : <bloque_de_instrucciones_n+1> ]
FIN-SEGUN-SEA
Formato Pascal:
CASE selector OF
<constante1> : <sentencia1>;
<constante2> : <sentencia2>;
…
<constanteN> : <sentenciaN>
else <sentenciaElse>
END;
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 6
Introducción a la Informática 2009 Tema
5
Dependiendo del valor obtenido al evaluar la expresión, se ejecutará un bloque de
instrucciones u otro. En las listas de valores se deben escribir los valores que determinan el
bloque de instrucciones a ejecutar, teniendo en cuenta que un valor sólo puede aparecer en
una lista de valores.
Opcionalmente, se puede escribir un <bloque_de_instrucciones_n+1> después de SINO:.
Este bloque de instrucciones se ejecutará en el caso de que el valor obtenido al evaluar la
expresión, no se encuentre en ninguna de las listas de valores especificadas.
Funciona de la siguiente manera:
• Se busca el valor de la expresión (también conocida como selector) en alguna de las
listas de valores
• Si aparece, entonces se ejecuta la sentencia correspondiente
• Si no aparece y hay una cláusula ELSE entonces se ejecuta la sentencia que le sigue
• Si no aparece y no hay ELSE entonces no se hace nada
Ejemplo 1: Se quiere diseñar el algoritmo de un programa que pida por teclado el número
(dato entero) de un día de la semana, y luego muestre por pantalla el nombre (dato
cadena) correspondiente a dicho día.
Nota: Si el número de día introducido es menor que 1 ó mayor que 7, se mostrará el
mensaje: "ERROR: Día incorrecto".
En pantalla debe aparecer:
Algoritmo propuesto:
Inicio
Dia
Dia?
1 2 3 SINO
“Error: Día
“Lunes” “Martes” “Miércoles”
... Incorrecto”
Fin
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 7
Introducción a la Informática 2009 Tema
5
ALGORITMO DiaDeLaSemana
VARIABLES
ENTERO: dia
INICIO
ESCRIBIR "Introduzca día de la semana: "
LEER dia
SEGUN_SEA dia
1 : ESCRIBIR "Lunes"
2 : ESCRIBIR "Martes"
3 : ESCRIBIR "Miércoles"
4 : ESCRIBIR "Jueves"
5 : ESCRIBIR "Viernes"
6 : ESCRIBIR "Sábado"
7 : ESCRIBIR "Domingo"
SINO : ESCRIBIR "ERROR: Día incorrecto"
FIN-SEGUN-SEA
FIN
Estructuras de decisión anidadas
Según lo expresado, las estructuras de decisión simple y doble permiten seleccionar entre
dos alternativas posibles. Sin embargo, la instrucción SI-ENTONCES puede ser utilizada
también en casos de selección de más de dos alternativas. Esto es posible anidando estas
instrucciones. Es decir, una estructura SI-ENTONCES puede contener a otra, y esta a su vez
a otra. La representación en pseudocódigo es la siguiente:
SI <condición_1> ENTONCES IF <condición_1> THEN
< sentencias_1 > < sentencias_1 >
SINO ELSE
SI <condición_2> ENTONCES IF <condición_2> THEN
< sentencias_2 > < sentencias_2 >
SINO ELSE
SI <condición_3> ENTONCES IF <condición_3> THEN
< sentencias_3 > < sentencias_3 >
SINO ELSE
. .
. .
FIN-SI END-IF
FIN-SI END-IF
FIN-SI END-IF
Como se puede observar, el anidamiento de instrucciones alternativas permite ir
descartando valores hasta llegar al bloque de instrucciones que se debe ejecutar.
En las instrucciones IF anidadas, las instrucciones ELSE y END-IF se aplican
automáticamente a la instrucción IF anterior más próxima.
A fin de que las estructuras anidadas sean más fáciles de leer, es práctica habitual aplicar
sangría al cuerpo de cada una.
Ejemplo: Un sensor toma (lee) la temperatura ambiente y de acuerdo al rango en que se
encuentre, debe emitir un mensaje. La escala es la siguiente:
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 8
Introducción a la Informática 2009 Tema
5
Mayor que 100 “Temperatura muy alta – Mal
Inicio
funcionamiento”
Entre 91 y 100 “Rango normal”
Entre 51 y 90 “Bajo el rango normal”
Menor que 50 “Muy frío – Apague el equipo” Temperatura
ALGORITMO Sensor
INICIO
“Temperatura muy
LEER temperatura alta-Mal
Temperatura>100 SI
funcionamiento”
SI temperatura > 100 ENTONCES
ESCRIBIR “Temperatura muy alta – Mal
funcionamiento” NO
SINO
“Rango normal”
SI temperatura > 90 ENTONCES Temperatura>90 SI
ESCRIBIR “Rango normal”
SINO NO
SI temperatura > 50 ENTONCES
ESCRIBIR “Bajo el rango normal” “Bajo el rango normal”
Temperatura>50 SI
SINO
ESCRIBIR “Muy frío – Apague equipo” NO
FIN-SI
“Muy frío – apague el
FIN-SI equipo”
FIN-SI
FIN
Fin
La sentencia IR-A (go to)
La sentencia GO TO pertenece a un grupo de sentencias conocidas como sentencias de
salto (jump). La característica de este grupo es hacer que el flujo de control salte a otra
parte del programa. Otras sentencias de este grupo son interrumpir o romper (BREAK),
continuar (CONTINUE), volver (RETURN), lanzar (THROW). Las dos primeras se utilizan
generalmente con sentencias de alternativa múltiple. Para retornar de la ejecución de
funciones o métodos se usa RETURN. La sentencia THROW se utiliza en los lenguajes de
programación que poseen mecanismos de manipulación de excepciones, como Java, C++ y
C#.
La sentencia GO TO se utilizaba mucho en los primeros lenguajes de programación porque
era la única manera de saltar de una instrucción del programa a otra.
Esta instrucción consta de una sentencia IR_A y una sentencia asociada con una etiqueta.
Cuando se ejecuta esta instrucción, se transfiere el control del programa a la etiqueta
asociada.
La representación en pseudocódigo es la siguiente:
INICIO BEGIN
. .
. .
IR_A etiqueta_1 GOTO etiqueta_1
. .
. .
FIN END
etiqueta_1: etiqueta_1:
. // El flujo salta aquí . // El flujo salta aquí
. .
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 9
Introducción a la Informática 2009 Tema
5
El efecto de esta instrucción es transferir sin condiciones el control del programa a la
etiqueta especificada. Es una de las operaciones más primitivas para traspasar el control de
una parte del programa a otra. Sin embargo, su uso produce código inconsistente,
incompleto o complicado de mantener. Justamente por ello en los años 60 y 70, cuando
surgió la programación estructurada, la comunidad informática se expresó a favor de otras
sentencias de control (IF ó bucles FOR y DO-WHILE) en lugar del GOTO.
Tal creencia está tan arraigada que el GOTO es muy criticado y desaconsejado por todos los
que se dedican a la enseñanza de la programación. Una crítica famosa a la sentencia en
cuestión es una carta redactada por Edsger Dijkstra1 llamada "Go To Statement Considered
Harmful" (Sentencia Go To Considerada Dañina). En ella Dijkstra argumenta que el uso
irrestricto del GOTO debería ser prohibido en lenguajes de alto nivel ya que dificultan el
análisis y la verificación de la corrección de los programas.
Si bien la instrucción GOTO puede parecer útil y muy flexible, es precisamente en esa
flexibilidad donde radica su peligro y los motivos de su obsolescencia. Si se piensa que
cualquier programa minimamente complejo tendrá miles y miles de líneas de código fuente,
con millones de flujos de programa posibles diferentes. Si se altera dicho flujo con la
sentencia GOTO de un modo incontrolado, el código se volverá totalmente caótico, y por
tanto muy difícil de controlar, depurar, mejorar o entender, lo que llevará, inevitablemente,
a programas de escasa calidad.
1
Reconocido investigador de la Burroughs Corporation a principios de los años ‘70. Entre sus
contribuciones a la informática está el algoritmo de caminos mínimos; también conocido como
Algoritmo de Dijkstra. Recibió el Premio Turing en 1972. Era conocido por su baja opinión de la
sentencia GOTO en programación. Su principal interés fue la verificación formal de los programas.
Licenciatura en Sistemas de Información –FACENA-UNNE Pág. 10