UNIDAD V PROGRAMACIÓN ESTRUCTURADA


        Teorema del programa estructurado


Es un resultado en la teoría de lenguajes de programación. Establece que toda función computable puede ser implementada en un lenguaje de programación que combine sólo tres estructuras lógicas. Esas tres formas (también llamadas estructuras de control) específicamente son:

Secuencia: ejecución de una instrucción tras otra.

Selección: ejecución de una de dos instrucciones (o conjuntos), según el valor de una variable booleana.

Iteración: ejecución de una instrucción (o conjunto) mientras una variable booleana sea 'verdadera'. Esta estructura lógica también se conoce como ciclo o bucle.


Estructuras de Control

Las estructuras de control tienen una finalidad bastante definida: señalar orden en que tienen que sucederse los pasos de un algoritmo. Si un programa muestra un mensaje en la pantalla que pregunta al usuario”¿Desea seguir adelante?”, obviamente, de la respuesta del usuario dependerá la siguiente acción del programa.

El programador debe escribir el código para las dos posibilidades (sí y no), aunque cuando el programa este funcionando, solo se elegirá una.

Selectivas

Las estructuras selectivas se utilizan para tomar decisiones (por eso también se llaman estructuras de decisión o alternativas). El mecanismo de acción evalúa una condición, y, a continuación, en función del resultado, se lleva a cabo una opción u otra. Es importante asentar esta idea: el programa esta diseñado para evaluar una condición, y actuar en consecuencia, según que la condición sea verdadera o falsa.


Selección Simple ”Si ... entonces ...”

Se evalúa una condición y si esta resulta verdadera entonces se ejecuta una o varias instrucciones.

La sintaxis básica es:

SI (condición) entonces

instrucciones

FINSI

Es importante cerrar el SI (FINSI), ya que, si no se cumple la condición, el programa continua en la instrucción que sigue a FINSI.


Condicional Si-Entonces
La secuencia de instrucciones ejecutadas por la instrucción Si-Entonces-Sino depende del valor de una condición lógica.
Si <condición> Entonces
<instrucciones>
Sino
<instrucciones>
FinSi

Al ejecutarse esta instrucción, se evalúa la condición y se ejecutan las instrucciones que correspondan: las instrucciones que le siguen al Entonces si la condición es verdadera, o las instrucciones que le siguen al Sino si la condición es falsa. La condición debe ser una expresión lógica, que al ser evaluada retorna Verdadero o Falso.

La cláusula Entonces debe aparecer siempre, pero la cláusula Sino puede no estar. En ese caso, si la condición es falsa no se ejecuta ninguna instrucción y la ejecución del programa continúa con la instrucción siguiente.

Ejemplo Se desea calcular la raíz cuadrada de un número, de forma que tras leer el numero introducido por el usuario, es necesario validarlo, -esto es, verificar que cumple las hipótesis-. En nuestro caso, hay que verificar que el número sea no negativo.


INICIO

LEER ( numero )

SI (numero >= 0) entonces

raız = √( numero)

FINSI

ESCRIBIR (raiz)

FIN

Selección Doble. ”Si... entonces... sino...”.

Lo más frecuente es encontrar situaciones donde si una condición se cumple se ejecuta un grupo de instrucciones, pero si no se cumple, deben ejecutarse otras.

La instrucción “Si... entonces... Sino...” facilita este tipo de programación. La estructura o sintaxis que le corresponde es:

SI (condición) entonces

Instrucciones 1

SINO

Instrucciones 2

FINSI


Con esta estructura puede mejorarse el algoritmo del ejemplo anterior, señalando ”error” si el usuario ingresa valores negativos.

Ejemplo Se desea calcular la raíz cuadrada de un numero...

INICIO

LEER ( numero )

SI (numero >= 0) entonces

raíz = √(numero)

SINO

ESCRIBIR (”Error. ¡Debe ingresar valores positivos!”)
FINSI

ESCRIBIR (raız)

FIN



Selección Múltiple

También hay programas que nos llevan a considerar alternativas con varias opciones posibles.

Hay dos formas de escribir esto en pseudocódigo. La primera de ellas modifica la estructura de selección doble:

SI (condicion1) entonces

Instrucciones 1

SI (condicion2) entonces

Instrucciones 2
...

SI (condición k) entonces

Instrucciones k

FINSI


La segunda: OPCION es particularmente útil cuando se elabora un menú. La OPCIÓN toma distintos valores y según la respuesta del usuario ejecuta las acciones bajo dicha opción.

LEER (opción)
OPCION

(Valor 1):

Instrucciones 1

(Valor 2):

Instrucciones 2
:

(Valor k):

Instrucciones k {las acciones que toque}

En otro caso

Instrucciones k + 1

FINOPCION

La opción”en otro caso” no es más que una alternativa en caso que el usuario seleccione alguna opción no contemplada entre las que se ofrece.

Esta instrucción permite ejecutar opcionalmente varias acciones posibles, dependiendo del valor almacenado en una variable de tipo numérico. Al ejecutarse, se evalúa el contenido de la variable y se ejecuta la secuencia de instrucciones asociada con dicho valor.

Cada opción está formada por uno o más números separados por comas, dos puntos y una secuencia de instrucciones. Si una opción incluye varios números, la secuencia de instrucciones asociada se debe ejecutar cuando el valor de la variable es uno de esos números.

Opcionalmente, se puede agregar una opción final, denominada De Otro Modo, cuya secuencia de instrucciones asociada se ejecutará sólo si el valor almacenado en la variable no coincide con ninguna de las opciones anteriores.

Ejemplo El usuario ingresa dos valores y se desea elaborar un menú cuyas opciones sean calcular multiplicación, división de ambos números y salir del programa. Asuma que el segundo número siempre es distinto de cero.


Inicio

ESCRIBIR (Ingrese dos numeros: )
LEER (x; y)

ESCRIBIR (Menu de opciones.)

ESCRIBIR (1. Multiplicacion.)

ESCRIBIR (2. Division.)

ESCRIBIR (3. Salir del programa.)

LEER(opcion)
OPCION
1:
mult = x * y
ESCRIBIR (mult)

2:
div = x/y
ESCRIBIR (div)
3:
SALIR

en otro caso:

ESCRIBIR (Debe escoger una opcion entre 1 y 3)
FIN OPCION

Repetitivas

Las estructuras repetitivas, que también reciben el nombre de bucle (loop, en ingles) controlan un conjunto de instrucciones que deben repetirse cierto número de veces, mientras se cumple una condición que ha de ser claramente especificada. La condición podrá ser verdadera o falsa, y se comprobara en cada paso o iteración del bucle.

Todo bucle consta de tres partes básicas, a saber:

Decisión: donde se evalúa la condición y, en caso de ser cierta, se ejecuta el cuerpo del bucle.

Cuerpo del bucle: son las instrucciones que se ejecutaran repetidamente, un numero determinado de veces, cuando la decisión es verdadera.

Salida del bucle: es la condición que indica cuando terminan las iteraciones.

Básicamente, existen tres tipos de estructuras repetitivas:

1. ”Mientras...” (while),

2. ”Repetir... hasta...” (do... until)

3. ”Desde” (for).

Una forma de controlar un bucle es mediante una variable llamada contador cuyo valor se incrementa o decremento en una cantidad constante en cada repetición que se produzca.

También, los bucles suelen utilizar otro tipo de variables llamadas acumulador, cuya misión es almacenar una cantidad variable resultante de operaciones sucesivas y repetidas. Es como un contador, con la diferencia que el incremento/decremento es variable.

MIENTRAS (while)

En este tipo de estructura, el cuerpo del bucle se repite MIENTRAS se cumple una determinada condición.

Al ejecutarse esta instrucción, la condición es evaluada. Si la condición resulta verdadera, se ejecuta una vez la secuencia de instrucciones que forman el cuerpo del ciclo. Al finalizar la ejecución del cuerpo del ciclo se vuelve a evaluar la condición y, si es verdadera, la ejecución se repite. Estos pasos se repiten mientras la condición sea verdadera.

Note que las instrucciones del cuerpo del ciclo pueden no ejecutarse nunca, si al evaluar por primera vez la condición resulta ser falsa.

Si la condición siempre es verdadera, al ejecutar esta instrucción se produce un ciclo infinito. A fin de evitarlo, las instrucciones del cuerpo del ciclo deben contener alguna instrucción que modifique la o las variables involucradas en la condición, de modo que ésta sea falsificada en algún momento y así finalice la ejecución del ciclo.

La sintaxis básica es:

MIENTRAS (condición - expresión lógica) hacer

Instrucciones

FINMIENTRAS


Ejemplo Dado un numero entero N calcular la suma de todos los números entre 1 y N..

INICIO

LEER(N)

I 1;
SUMA0

MIENTRAS (I <= N)

SUMA ← SUMA + I;
I ← I + 1;

FINMIENTRAS

FIN

Frecuentemente se utiliza el bucle while para validar los datos de entrada de un programa. Veamos el siguiente:

Ejemplo Solicitar al usuario un valor positivo y validarlo.

INICIO

LEER(x)
Cont0;

MIENTRAS (x < 0) hacer

LEER(x)
Cont ← Cont + 1

FINMIENTRAS
FIN

En los ejemplos las la variable I y Cont son contadores y la variable SUMA es un acumulador. ¿Que cree Ud. que pasaría si se omitiera la línea I ← I + 1 en del cuerpo del bucle?

Repetir (repeat)
La instrucción Repetir-Hasta Que ejecuta una secuencia de instrucciones hasta que la condición sea verdadera.
Repetir
<instrucciones>
Hasta Que <condición>

Al ejecutarse esta instrucción, la secuencia de instrucciones que forma el cuerpo del ciclo se ejecuta una vez y luego se evalúa la condición. Si la condición es falsa, el cuerpo del ciclo se ejecuta nuevamente y se vuelve a evaluar la condición. Esto se repite hasta que la condición sea verdadera.

Note que, dado que la condición se evalúa al final, las instrucciones del cuerpo del ciclo serán ejecutadas al menos una vez.

Además, a fin de evitar ciclos infinitos, el cuerpo del ciclo debe contener alguna instrucción que modifique la o las variables involucradas en la condición de modo que en algún momento la condición sea verdadera y se finalice la ejecución del ciclo.


DESDE (for)

El bucle for permite repetir un conjunto de instrucciones un número determinado de veces, con la peculiaridad que la instrucción incrementa (o decremento), automáticamente y de uno en uno, la variable que se utiliza como contador.

Al ingresar al bloque, la variable <variable> recibe el valor <inicial> y se ejecuta la secuencia de instrucciones que forma el cuerpo del ciclo. Luego se incrementa la variable <variable> en <paso> unidades y se evalúa si el valor almacenado en <variable> superó al valor <final>. Si esto es falso se repite hasta que <variable> supere a <final>. Si se omite la cláusula Con Paso <paso>, la variable <variable> se incrementará en 1.

Si se habilita la sintaxis flexible en la configuración del lenguaje se pueden utilizar dos alternativas. La primera variante consiste en reemplazar el operador de asignación por la palabra clave Desde:

Para <variable> Desde <inicial> Hasta <final> Con Paso <paso> Hacer...

De esta forma, la lectura de la sentencia resulta más obvia. Además, con sintaxis flexible, si no se especifica el paso pero el valor final es menor al inicial, el bucle recorrerá los valores en orden inverso como si el paso fuera -1. La segunda variante solo sirve para recorrer arreglos de una o más dimensiones. Se introduce con la construcción Para Cada seguida de un identificador, la palabra clave De y otro identificador:

Para Cada <elemento> De <Arreglo> Hacer...

El segundo identificador debe corresponder a un arreglo. El primero será el que irá variando en cada iteración. El ciclo realizará tantas iteraciones como elementos contenga el arreglo y en cada uno el primer identificador servirá para referirse al elemento del arreglo en cuestión.

La sintaxis básica es:

DESDE < valor inicio > : < valor final > HACER

Instrucciones

FINDESDE

DESDE < valor inicio > : < decremento > : < valor final > HACER

Instrucciones

FINDESDE

El incremento es opcional. Si no se coloca, el bucle aumenta de uno en uno -de forma automática el valor del contador. Si se desea decrementar la variable es necesario colocar el valor del decremento (-1).

Retomando el ejemplo:

INICIO

LEER(N)
SUMA Ã0

DESDE I = 1 : N
SUMA ← SUMA + I;

FINDESDE

FIN

Observaciones:
El contador siempre se inicializa automáticamente en el valor inicial indicado en la estructura.

No hay comentarios:

Publicar un comentario