Programando Estructuras de Control

21
Programando Estructuras de Control By Dr. Wayne Brown (traducción libre A. Ramírez S) Introducción Uno de los aspectos más importantes de la programación es el control en el orden de ejecución de las instrucciones. Las Estructuras de Control/Enunciados de Control permiten a un programador determinar el orden en el que se ejecutan las instrucciones de un programa. Estas estructuras de control permiten hacer dos cosas: 1) Saltarse algunas instrucciones y ejecutar otras, y 2) repetir una o más instrucciones mientras se cumpla cierta condición. Los programas de RAPTOR utilizan seis tipos de instrucciones, como se puede ver en la figura de la derecha. En lecturas previas hemos aprendido los cuatro comandos básicos, En esta lectura aprenderemos acerca de las instrucciones de Seleccion y Loop. 1) Control Secuencial del Programa Todos los ejemplos vistos en lecturas previas utilizan un control secuencial del programa. Por secuencial queremos decir “en secuencia”, uno después del otro. La lógica secuencial es más fácil de contruir y de entender. Esencialmente se coloca cada instrucción en el orden que queremos que se ejecute y el programa iniciará desde la instrucción Start hasta la instrucción End. Como puede observarse en el programa de ejemplo de la figura a la derecha, las flechas que enlazan las instrucciones indican el flujo de la ejecución. Si el programa incluye 20 1 of 21 Basic Command s Flow of Control Commands

description

Traducción de documentos sobre Raptor

Transcript of Programando Estructuras de Control

Programando Estructuras de Control

By Dr. Wayne Brown (traducción libre A. Ramírez S)

Introducción

Uno de los aspectos más importantes de la programación es el control en el orden de ejecución de las instrucciones. Las Estructuras de Control/Enunciados de Control permiten a un programador determinar el orden en el que se ejecutan las instrucciones de un programa. Estas estructuras de control permiten hacer dos cosas: 1) Saltarse algunas instrucciones y ejecutar otras, y 2) repetir una o más instrucciones mientras se cumpla cierta condición.

Los programas de RAPTOR utilizan seis tipos de instrucciones, como se puede ver en la figura de la derecha. En lecturas previas hemos aprendido los cuatro comandos básicos, En esta lectura aprenderemos acerca de las instrucciones de Seleccion y Loop.

1) Control Secuencial del Programa

Todos los ejemplos vistos en lecturas previas utilizan un control secuencial del programa. Por secuencial queremos decir “en secuencia”, uno después del otro. La lógica secuencial es más fácil de contruir y de entender. Esencialmente se coloca cada instrucción en el orden que queremos que se ejecute y el programa iniciará desde la instrucción Start hasta la instrucción End. Como puede observarse en el programa de ejemplo de la figura a la derecha, las flechas que enlazan las instrucciones indican el flujo de la ejecución. Si el programa incluye 20 comandos básicos entonces se ejecutarán 20 instrucciones en ese orden y el programa terminará.

Cuando estamos resolviendo un problema como programadores, debemos determinar las insutrcciones que son necesarias para crear una solución al problema y el orden en el que dichas insutrcciones deben ejecutarse. Por ejemplo, cuando se quiere obtener y procesar datos del usuario se emplea la instrucción GET para obtenerlos del usuario, antes de que los podamos emplear. Cambiar el orden de estas instrucciones producirá un programa no-válido.

El control secuencial es la forma de control por “default”, en el sentido de que cada instrucción automáticamente apunta a la siguiente de acuerdo al diagrama de flujo construido. No necesitamos agregar indicaciones extras para obtener el control secuencial. Sin embargo, para la

1 of 15

BasicCommands

Flow of ControlCommands

mayoría de los problemas del mundo real, el control secuencial por sí solo no permite construir soluciones, debido a que los problemas del mundo real incluyen “condiciones” que determinan el paso siguiente. Por ejemplo, la frase “Si es de noche, entonces prendes las luces de tu casa” requiere tomar una decisión de acuerdo a la hora del día. La “condición” (la hora del día) determina si la acción se debe realizar o no. Este tipo de instrucciones utilizan un “control de selección” y lo describiremos en los siguientes párrafos.

2) Control por Selección

Es común aplicar decisiones en función de los datos de un programa para determinar si se ejecuta algún instrucción. Por ejemplo, si requerimos calcular la pendiente de una recta mediante la instrucción pendiente ← dy/dx, debemos asegurarnos de que el valor de dx no sea cero (la división por cero está indefinida y produce un error de ejecución (“run time error”) . Debido a esto, se requiere plantear una decisión en términos de “es dx cero?”

Una instrucción de control por selección se basa en tomar una decisión en base a una condición establecida por los datos de tu programa entre dos posibles rutas para la “siguiente” instrucción a ejecutar. El código de RAPTOR a la derecha ilustra una instrucción de control por selección, que se muestra con un diamante en los diagramas de flujo . La decisión se establece como una pregunta con respuesta “yes/no”. Cuando se ejecuta el programa, si la respuesta a una decisión es “yes”, entonces se elige la rama izquierda del control. Si la respuesta es “no”, entonces se elige la rama derecha. En el ejemplo de la figura, se ejecutará una y solo una de las instrucciones 2a y 2b. Como observará hay dos posibles trayectorias en la ejecución del programa:

Posibilidad 1 Posibilidad 2

Instrucción 1 Instrucción 1

Instrucción 2a Instrucción 2b

Instrucción 3 Instrucción 3

2 of 15

Observa que las dos trayectorias de la instrucción de selección pueden contener cero o más instrucciones, pero sería inapropiado que ambas trayectorias estuvieran vacías o que tuvieran las mismas instrucciones, porque entonces no tendría sentido tu decisión.

Expresiones de decisiónLas instrucciones de control por selección requieren de una expresión que pueda evaluarse como “Yes/No” (o verdadero y falso). Una expresión de decisión es una combinación de valores (constantes y/o variables y operadores). Las siguientes reglas para construir expresiones de decisión son muy importantes, así que revísalas con cuidado.

Como recordarás de nuestra lectura anterior acerca de las expresiones de asignación, una computadora sólo puede realizar una operación a la vez. Cuando se evalúa una expresión de decisión, las operaciones de la expresión no se evalúan de izquierda a derecha simplemente, sino de acuerdo a reglas de “orden de precedencia” pre-establecidas. El orden en que se interpretan las operaciones puede hacer una diferencia radical en el valor final “Yes/No” que se calcule. En caso de duda del orden de precedencia, es preferible emplear paréntesis para agrupar las expresiones. Puesto que las expresiones de decisión contienen cálculos similares a los de las expresiones de asignación, el “orden de precedencia” incluye operadores de las expresiones de asignación.

El orden de precedencia para evaluar a las expresiones de decisión sigue las reglas siguientes:1. calcular todas las funciones en primer lugar2. calcular las expresiones que se encuentren entre paréntesis3. calcular las exponenciaciones (^,**), es decir, elevar un número a una potencia4. calcular multiplicaciones y divisiones, de izquierda a derecha5. calcular sumas y restas, de izquierda a derecha,6. evaluar operadores relacionales (= != /= < <= > >=), de izquierda a

derecha,7. evaluar operador lógico not, de izquierda a derecha,8. evaluar operador lógico and, de izquierda a derecha,9. evaluar operador lógico xor, de izquierda a derecha,10. evaluar operador lógico or, de izquierda a derecha,

De esta lista, en las reglas 6 a 10 encontramos operadores relacionales y lógicos, que se explican en la tabla siguiente:

Operación Descripción Ejemplo= "es igual a" 3 = 4 es No(falso)!=/=

"no es igual a" 3 != 4 es Yes(verdad)3 /= 4 es Yes(verdad)

< "es menor que" 3 < 4 es Yes(verdad)<= "es menor o igual a" 3 <= 4 es Yes(verdad)> "es mayor que" 3 > 4 es No(falso)>= "es mayor o igual a" 3 >= 4 es No(falso)

3 of 15

and Yes(verdad) si ambos son Yes (3 < 4) and (10 < 20)es Yes(verdad)

or Yes(verdad) si cualquiera es Yes

(3 < 4) or (10 > 20)es Yes(verdad)

xor Yes(verdad) si los valores "yes/no" no son iguales

Yes xor Nois Yes(verdad)

not Invierte el valorYes si No; No si Yes

not (3 < 4)is No(falso)

Los operadores relaciones (= != /= < <= > >=), comparan dos valores del mismo tipo (ya sean números, textos o valores “yes/no”). Por ejemplo, 3 = 4 or "Wayne" = "Sam" son comparaciones válidas, pero 3 = "Mike" no es válido.

Los operadores lógicos (and , or, xor), combinan dos valores Booleanos (verdad/falso) en un único valor Booleano. EL operador lógico not, convierte un valor Booleano en su valor opuesto. Algunos ejemplos se muestran líneas abajo:

Ejemplo Válido o No-Válido?(3<4) and (10<20) Válido(flaps_angle < 30) and (air_speed < 120)

Válido, suponiendo que flaps_angle y air_speed son valores numéricos

5 and (10<20) No válido – el valor del lado izquierdo "and" es un número, no un valor “Yes/No”

5 <= x <= 7 No válido, 5 <= x se evalúa como “Yes/No” y el resultado se compara mediante un operador relacional, yes/no <= 7, que es una expresión no-válida.

Ejemplos de Control por Selección

Para ayudar a clarificar las instrucciones de control por selección, revisa los ejemplos siguientes. En el primer ejemplo a la derecha, se trata de si un esudiante obtiene calificación aprobatoria, recibe un mensaje de felicitación; en caso contrario, no se despliega algún mensaje (observa que en la trayectoria del “No” está vacía)

4 of 15

En el ejemplo a la derecha, se despliega siempre un texto de acuerdo a la calificación, cuyo valor determina cual texto se muestra.

En el ejemplo siguiente, si el estudiante no aprueba, entonces se despliegan dos líneas de texto, pero solo una línea de texto si aprueba.

En el último ejemplo a la derecha, la lógica de la expresión de decisión está invertida. Esto es perfectamente aceptable si se está seguro de cubrir todos los casos posibles. Nota que la inversión de “mayor o igual” es simplemente “menor que”.

Instrucciones de Selección en Cascada

Una instrucción de control por selección toma una decisión entre dos opciones posibles. Si se necesita crear una decisión múltiple que incluya más de dos opciones, se requiere emplear varias instrucciones de control por selección simple. Por ejemplo, si estamos asignando una calificación literal (A,B,C,D, o F) basados en una calificación numérica, necesitamos seleccionar entre cinco opciones, como se muestra en la figura de abajo. Esto se le denomina como “control de selección en cascada” (por aquello de que el agua fluye sobre una serie de caídas de agua).

5 of 15

3) Control Iterativo (“Loop”)

Las instrucciones de control iterativo nos permiten repetir una o más instrucciones hasta que se cumpla alguna condición (es decir, que la condición sea verdadera/yes). Este tipo de control permite ejecutar las mismas instrucciones una y otra vez sin cansancio, y es lo que vuelve a las computadoras herramientas valiosas para tareas repetitivas.

En RAPTOR se emplean los símbolos de elipse y de rombo para representar una iteración (“loop”), El número de veces que se ejecuta la iteración depende de la expresión de decisión que se encuentra escrita en el símbolo del rombo. En la ejecución, si la expresión de decisión se evalúa como “no” la ejecución continúa desde el inicio de la iteración. Las instrucciones de la iteración se pueden colocar tanto antes como después del símbolo de rombo.

Para comprender exactamente cómo funciona una iteración, estudiemos el ejemplo en RAPTOR que se muestra a la derecha. Notamos lo siguiente:

La instrucción 1 se ejecuta exactamente una vez ya que se encuentra antes que inicie la iteración.

La instrucción 2 por encontrarse antes de la decisión, se ejecutará al menos una vez.

Si la expresión de decisión se evalúa a “yes”, entonces termina la iteración y el control pasa a la instrucción 4.

Si la expresión de decisión se evalúa a “no”, entonces el control pasa a la Instrucción 3, que se ejecuta y el control pasa al inicio de la iteración nuevamente.

Nota que la instrucción 2 siempre se ejecutará al menos una vez y que la Instrucción 3 es posible que nunca se ejecute.

Existen muchas posibilidades en la ejecución de este programa de ejemplo para listarlas todas. En la siguiente tabla se muestran algunas de ellas. Trata de visualizar el patrón de ejecución en la cuarta columna.

Possibilidad 1 Possibilidad 2 Possibilidad 3 Possibilidad 4

6 of 15

Instrucción 1Instrucción 2Decisión ("yes")Instrucción 4

Instrucción 1Instrucción 2Decisión ("no")Instrucción 3Instrucción 2Decisión ("yes")Instrucción 4

Instrucciónt 1Instrucción 2Decisión ("no")Instrucción 3Instrucción 2Decisión ("no")Instrucción 3Instrucción 2Decisión ("yes")Instrucción 4

(puedes ver el patrón de cada posibilidad?)

En el programa RAPTOR de ejemplo, “Instrucción 2” podría quitarse, con lo que la primera instrucción sería la “Decisión”. O “Instrucción 2” podría ser un bloque de instrucciones. En cualquiera de los dos casos, la iteración se ejecuta de la misma manera. Similarmente, “Instrucción 3” podría eliminarse o reemplazarse por un bloque de instrucciones. En resumen, cualquiera de las instrucciones antes o después de la “Decisión” podría ser otra instrucción de iteración! Si tenemos una iteración dentro de otra iteración, obtenemos lo que se denomina “iteraciones anidadas”.

Es posible que la instrucción de “Decisión” nunca se evalúe a “yes”. En tal caso tenemos una “iteración infinita” que nunca se detendrá. (Si llega a presentarse este caso, tendrás que detener manualmente tu programa, seleccionando el ícono de “stop” que aparece en la barra de herramientas de RAPTOR). Realmente no es deseable tener esta situación al programar por lo que una (o más) de las instrucciones dentro de la iteración debe cambiar alguna de las variables que aparezcan en la instrucción de “Decisión” para que eventualmente se evalúe a “yes”.

Iteración de validación de la Entrada

Un uso común de las iteraciones son las validaciones de la entrada del usuario. Si deseas que el usuario introduzca datos de entrada que cumplan ciertas restricciones, tal como la edad de una persona, o introducir un número entre 1 y 10, se requiere validar la entrada de datos para asegurarnos que las restricciones se cumplan antes de emplear dichos datos en tu programa. Los programas que validan la entrada de datos del usuario y realizan algún otro tipo de detección de posibles errores al ejecutarse, se les llama programas robustos.

Un error común en los programadores novatos es validar la entrada de datos utilizando una instrucción de selección. Esto puede fallar para detectar un dato no-válido porque el usuario puede ingresar otro dato no-válido al segundo intento. Lo correcto es emplear una instrucción de iteración para esto.

Los dos ejemplos siguientes muestran la validación de la entrada de datos del usuario. Felizmente puede verse un patrón en su diseño: casi cualquier iteración de validación que tú escribas, contendrá una instrucción de entrada, una decisión y un mensaje de error.

7 of 15

Los dos ejemplos siguientes muestran la validación de la entrada del usuario. Felizmente puede verse un partrón. Casi todos los ciclos de valición que escribas incluyen una instrucción de entrada, una decisión y un mensaje de error.

Iteraciones con Contador de Ciclos

Un uso comun de una iteración es ejecutar un bloque de instrucciones un número definido de veces. Este tipo de iteración es llamada “iteración con contador de ciclos” ya que requiere una variable que “cuente uno a uno” cada ciclo de ejecución. Por lo tanto, se requiere además una variable “Count” que es:

1. Inicializada antes de comenzar la iteración.

2. Modificada en su valor dentro de la iteración, y

3. Utilizada en la instrucción de decisión dentro de la iteración para detenerla.

Se recomienda emplear el acrónimo IPEM (Inicializa, Prueba, Ejecuta y Modifica) para verificar si una iteración y su variable contador se emplean de forma adecuada.

Un ejemplo de iteración con contador de 100 ciclos se muestra en la figura de la derecha. Observa los siguientes puntos importantes:

8 of 15

En el ejemplo, se usa una variable “contador” que se llama “Count”. Podemos emplear cualquier nombre para denotarla, pero se procura emplear un nombre descriptivo y comprensivo de su papel en la iteración.

Debemos asignar un valor inicial a la variable “Count” antes de comenzar la iteración. Es común darle un valor inicial de uno (1), pero podríamos darle un valor inicial de 20 y contar hasta 119. Trata de emplear un valor inicial apropiado al problema que se busca resolver.

Es preferible que la expresión de decisión que controla a la iteración sea una desigualdad como “mayor o igual a”. Esto es más seguro que un “igual a”.

La variable “Count” de la iteración se incrementa en uno en la iteración. Se puede utilizar otro valor de incremento, pero esto cambiará el número de veces que se repite la iteración.

Los siguientes programas en RAPTOR muestran errores comunes que se deben evitar cuando se emplean iteraciones. Intenta encontrar los errores en cada programa (Al final de la página se explican en caso de que no logres identificarlos). Estos tres ejemplos tienen iteraciones infinitas – es decir, que nunca terminan--.

1

2 3

1 Count nunca se modifica y seimpre es 1.

2 Count se inicializa a 1 en cada ciclo y por esto nunca es mayor o igual a 100.

3 La decisión nunca se evalúa a "yes"

9 of 15

Los siguientes seis programas de ejemplo, muestran posibles variantes de la iteración con contador de ciclos. Los seis ejemplos realizan lo mismo – ejecutan el bloque de instrucciones representados por la caja vacía un número Limit de veces. Puedes emplear la variante que tenga más sentido para tí. En cada ejemplo, pon atención a la inicialización de Count y a la expresión de Decisión.

10 of 15

Iteraciones de Entrada

Algunas veces se requerirá en un programa que el usuario introduzca varios datos para procesarlos. Hay dos técnicas para lograrlo en forma adecuada. El primer método consiste en tener un valor “especial” que indique cuando se han terminado de introducir los datos. Un segundo método es preguntar antes al usuario sobre la cantidad de datos que se van a introducir, utilizando este valor para implementar una iteración con contador de ciclos. Estos dos métodos se ejemplifican en los siguientes dos diagramas de flujo. En ambos casos, los rectángulos vacíos significan el procesamiento de los datos ingresados. Observa cómo se controla el ingreso de los datos y no nos preocupemos por la forma en que estos datos son procesados,

Iteraciones"Totalizadoras"

Otro uso común de las iteraciones es calcular la suma de una serie de valores que ingresa el usuario. Esto se llama iteración “totalizadora” o de “suma”. El programa que se muestra produce una “Suma” de una serie de valores ingresados por el usuario.

Para crear una “suma” se deben agregar dos instrucciones adicionales a la iteración:

Una instrucción para inicializar antes de la iteración, una variable “Suma” a zero (0)

11 of 15

Por ejemplo,Suma ← 0

Una instrucción de asignación dentro de la iteración que agregue cada valor ingresado a la variable “totalizadora” Suma.Por ejemplo,

Suma ← Suma + Valor

Asegúrate de comprender una asignación como Suma ← Suma + Valor, que significa calcular la expresión a la derecha de la flecha, tomando el valor actual de Suma y agregarle el nuevo Valor ingresado. El resultado de la expresión registrarlo en la variable Suma.

El nombre Suma de la variable, no es mágico. Se puede emplear cualquier otro nombre, como Total o Sumatoria.

Iteraciones ''De conteo''

Otro uso común de las iteraciones es para contar el número de veces que ocurre un evento. Por ejemplo el programa de la derecha. Nota las similitudes con el ejemplo anterior.

Estos dos últimos ejemplos nos muestran cómo el mismo patrón de instrucciones se presenta y puede emplearse para resolver problemas similares. Al estudiar y comprender estos ejemplos, se pueden tener las bases para resolver problemas más complejos..

12 of 15

Resumen

En estas notas hemos visto cómo escribir instrucciones de Selección y de Iteración en RAPTOR. Las instrucciones de Selección se emplean cuando se requiere elegir entre un dos grupos de instrucciones a ejecutar. Las instrucciones de Iteración se emplean para repetir un bloque de instrucciones. Si tienes dudas para determinar entre usar una u otra podría serte útil responder a las siguientes preguntas:

¿Necesitas decidir entre hacer algo o no hacerlo ? (Selección)¿Necesitas hacer una u otra instrucción (pero no ambas)? (Selección)¿Necesitas elegir una opción entre muchas otrass? (Selección de cascada)¿Necesitas hacer alguna cosa más de una vez? (Iteración)¿Conoces cúantas veces debes repetir algo? (Iteración con contador de ciclo)

Cuando se emplean instrucciones de Selección es útil tener en mente las siguientes preguntas:¿La expresión de decisión permite que se ejecuten las instrucciones correctas?¿La expresión de decisión permite que se “salten” las instrucciones correctas?

Cuando se emplean instrucciones de Iteración es útil tener en mente las siguientes preguntas:¿Qué instrucciones deben repetirse?¿Se han inicializado las variables adecuadas anters de comenzar la iteración?¿La expresión de decisión se evalúa a "Yes" en algún momento de la ejecución?Si se trata de una iteración con contador de ciclo, ¿se repite el número correcto de veces? (Un error común en las iteraciones con contador de ciclo, es que si debe repetirse N veces, se repita N-1 o N+1 veces)

13 of 15

What you have hopefully learned…

The ordering of programming statements is a key part of program development.

There are 3 basic types of program flow: Sequential, Selection, and Loop (Iteration).

Decision expressions, which evaluate to a "Yes"/"No" (true/false) value are used to determine the path a program takes to its "next instruction."

When to use Selection statements and/or Loop statements for a particular problem solving task.

Selection statements are used to execute or skip one or more programming statements.

Loop statements are used when one or more programming statements must be repeated.

The difference between "counter-controlled loops," "input loops," and "running total" loops.

Infinite loops are bad and special care should be used to make sure your loops always terminate.

Reading Self-Check

Which control structure would be most appropriate for the following problems:Sequential, Selection, Cascading Selection, or a Loop ____________ Printing an appropriate message for a cadet’s class year.____________ Checking for a correct input and continually re-checking if incorrect.____________ Computing the average GPA of your CS110 section.____________ Determining the volume of a sphere given a radius.____________ Initializing all of the variables at the beginning of a program.____________ Determining whether a vowel, constant or digit has been typed in. ____________ Writing out a message if an integer variable contains a negative value.____________ Writing “Odd” or “Even” depending on an integer variable’s value.____________ Writing out the squares of the numbers 1 though 100.____________ Reading in scores until a user enters a negative number.

Which of the following Decision expressions will always evaluate to "Yes", always evaluate to "No", or could possibly be either "Yes" or "No"?

____________ GR_Score > 100 or GR_Score < 90.____________ GR_Score > 100 and GR_Score < 90.____________ GR_Score < 100 or GR_Score > 90.____________ GR_Score < 100 and GR_Score > 90.

14 of 15

Write a series of RAPTOR statements that determines if X has the value 1, 2, or 3, and prints out “ONE”, “TWO”, or “THREE” accordingly.

Write a complete program that converts between degrees Fahrenheit and Celsius. The user must first enter the conversion that is desired (F to C or C to F) using any means you want and then enter the value to be converted. The formulas for conversion are:

F = 9/5 C + 32 and C = 5/9 (F – 32)

Write a complete program that plays the game of HI-LO. The program asks one user for a number between 1 and 100 and verifies that such a number has been entered. It then asks a second user for a guess and reads it in. If the guess is correct a congratulation message is written to the screen and the program ends. Otherwise the message “HI” or “LOW” is displayed (if the guess is higher or lower) and another guess is asked for and read in.

15 of 15