sábado, 9 de enero de 2016

El flujo de un programa - 2 de 2



3.7 Bifurcaciones

Las bifurcaciones se corresponden con lo que en los diagramas de flujo se han llamado Chequeos. El flujo de datos del programa seguirá un camino u otro del diagrama según se cumpla o no la condición representada en el chequeo. La manera más habitual de encontrar las bifurcaciones es en forma de sentencias if, sentencias if ... else, o sentencias if ... else múltiples.

3.7.1 Sentencia if

Esta sentencia de control permite ejecutar o no una sentencia simple o compuesta según se cumpla o no una determinada condición. Tiene la siguiente forma general:


Explicación: Se evalúa la ’Condicion’. Si el resultado es true, se ejecutan las sentencias; si el resultado es false, se saltan las sentencias y el programa prosigue.


3.7.2 Sentencia if ... else

Esta sentencia permite realizar una bifurcación, ejecutando una parte u otra del programa según se cumpla o no una cierta condición. La forma general es la siguiente:


Explicación: Se evalúa Condición. Si el resultado es true, se ejecuta sentencia1 y se prosigue en la línea siguiente a sentencia2; si el resultado es false, se salta sentencia1, se ejecuta sentencia2 y se prosigue en la línea siguiente.


3.7.3 Sentencia if elseif... else múltiple

Esta sentencia permite realizar una ramificación múltiple (en realidad son bifurcaciones sucesivas), ejecutando una entre varias partes del programa según se cumpla una entre n condiciones. La forma general es la siguiente:


Explicación: Se evalúa condición1. Si el resultado es true, se ejecuta sentencia1. Si el resultado es false, se salta sentencia1 y se evalúa condición2. Si el resultado es true se ejecuta sentencia2, mientras que si es false se evalúa condición3 y así sucesivamente. Si ninguna de las condiciones o condiciones es true se ejecuta condiciónn que es la opción por defecto (puede ser la sentencia vacía, y en ese caso podría eliminarse junto con la palabra else).

El efecto conseguido con una bifurcación if-elseif-else puede conseguirse con una sucesión de bifurcaciones if. La ventaja de utilizar la estructura if-elseif-else está en que es más eficiente y más clara. Observa el siguiente ejemplo en el que surge la casuística planteada. Ambos programas sacan por pantalla la calificación que se corresponde (desde suspenso hasta sobresaliente) a una determinada nota (desde 0 hasta el 10).

El caso se plantea una sucesión de bifurcaciones IF, mientras que en el segundo se plantea una estructura IF-ELSEIF-ELSE.


En el ejemplo presentado arriba, el esquema que se ha seguido es chequear el intervalo en el que se encuentra la nota haciéndose las siguientes preguntas:

1º ¿Es inferior a 5?
2º ¿Está entre el 5 y el 7?
3º ¿Está entre el 7 y el 9?
4º ¿Es superior a 9?

Para realizar este chequeo se han introducido cuatro bifurcaciones IF consecutivas. Cada vez que se ejecuta el programa se hacen las 4 comprobaciones. Sin embargo, sabemos que una y sólo una de las cuatro comprobaciones se va a cumplir. 
Además, si la respuesta a la primera pregunta es NO, sería interesante poder utilizar esa información y no tener que chequear si la nota es mayor o igual a 5, ya que si la respuesta anterior ha sido NO, la nota es necesariamente mayor o igual a 5. Por último, si resulta que la nota es, por ejemplo, un 4, el resultado del primer chequeo es SI y no tiene sentido seguir realizando más comprobaciones, ya que podemos estar seguros que las otras tres comprobaciones restantes no se van a cumplir. 

He aquí el interés de las estructuras IF-ELSEIF-ELSE. Hay muchas bifurcaciones en las que si se cumple una condición, el resto de condiciones no se van a cumplir, como el ejemplo propuesto. Así que el programa podría haberse concretado de la siguiente manera:


Observa las líneas del flujo del programa. Al ser una estructura IF-ELSEIF-ELSE, al cumplirse alguna de las condiciones, se determina la nota y directamente se pasa al final del programa; esto es, no se continúa realizando comprobaciones.

Solamente si la nota es mayor o igual a 9 se realizarán todas las comprobaciones. 
Aún así, el chequeo de estas comprobaciones está más depurado que en el caso de la secuencia de bifurcaciones IF, ya que se aprovecha la información extraída de los anteriores chequeos.

De forma que ambos programas funcionarán correctamente, pero es el segundo programa quien presenta una eficiencia superior. Cuando se trabaja con programas cortos, la eficiencia es un factor de poca importancia, pero cuando se programa cosas más complicadas la eficiencia es un factor de gran importancia.


3.8 Bucles

La otra gran herramienta en los lenguajes de programación para controlar el flujo de un programa son los bucles. Éstos permiten repetir la ejecución de líneas de código, es decir, permiten que el flujo del programa vuelva de nuevo hacia atrás. Esta repetición se realiza, bien un número determinado de veces, bien hasta que se cumpla una determinada condición de tipo lógico o aritmético. Aunque cada lenguaje de programación tiene sus propias construcciones, y su manera de utilizarlas, las dos construcciones más habituales para realizar bucles son el while y el for.


3.8.1 Bucle While

Este bucle ejecuta repetidamente una sentencia o bloque de sentencias mientras se cumpla una determinada condición. Los bucles WHILE se utilizan cuando queremos que se repita una serie de instrucciones mientras que se cumpla una determinada condición que no sabemos cuándo dejará de cumplirse.

La forma general es como sigue:


Explicación: Se evalúa ExpresionDeControl y si el resultado es false se salta la sentencia y se prosigue la ejecución. Si el resultado es true se ejecuta sentencia y se vuelve a evaluar ExpresionDeControl (evidentemente alguna variable de las que intervienen en ExpresionDeControl habrá tenido que ser modificada, pues si no el bucle continuaría indefinidamente). La ejecución de sentencia prosigue hasta que ExpresionDeControl se hace false, en cuyo caso la ejecución continúa en la línea siguiente a sentencia. En otras palabras, sentencia se ejecuta repetidamente mientras ExpresionDeControl sea true, y se deja de ejecutar cuando ExpresionDeControl se hace false. Obsérvese que en este caso el control para decidir si se sale o no del bucle está antes de sentencia, por lo que es posible que sentencia no se llegue a ejecutar ni una sola vez.

En el ejemplo propuesto en publicaciones pasadas, se estableció el siguiente vector:

>> a=[3,5,9,17]

Supongamos ahora que sabemos que dentro de este vector se encuentra el número 9, pero no sabemos qué posición ocupa. Si quisiéramos encontrar la posición que ocupa el número 9 dentro del vector a, tenemos que mirar, elemento a elemento, los valores del vector, hasta que localicemos el elemento que contiene el número 9. Este es un caso en el que se utiliza un bucle WHILE, ya que queremos buscar un elemento y no sabemos cuántas celdas vamos a tener que mirar. 
Para resolverlo, se inicializa un contador a 1 (llamémosle i) y se registran todos los elementos de a mientras que resulte que el contador no coincida con la posición del número 9 dentro de a, esto es:

WHILE a(i)~=9

La sentencia que ha de ejecutarse dentro del bucle es simplemente incrementar en una unidad el valor del contador, para que en el siguiente paso del bucle, se mire la siguiente celda del vector.



3.8.2 Bucle For

For es de los bucles mas versátiles y utilizados. Los bucles FOR se utilizan cuando queremos que se repita una serie de instrucciones un número determinado de veces.
Así como los bucles WHILE se repiten mientras que se cumpla una determinada condición, los bucles FOR se repiten mientras que una variable no adquiera un determinado valor. Así que, cada bucle FOR contiene una variable a la que llamaremos VARIABLE DEL BUCLE FOR.

Cuando se programa un bucle FOR, se escribe una primera instrucción con la que se dan los tres parámetros fundamentales del bucle FOR.

1º El VALOR INICIAL de la variable del bucle. Este será el valor que tendrá la variable la primera vez que ejecutan las instrucciones que se encuentran dentro del bucle.

2º El VALOR FINAL de la variable del bucle. Esta es la "condición de chequeo particular" de los bucles FOR. Mientras que la variable del bucle FOR sea MENOR O IGUAL al valor final, se ejecutarán las instrucciones que se encuentran dentro del bucle.

3º El PASO del bucle. Esta es una herramienta fundamental dentro del bucle FOR y que hace que sea muy diferente a un bucle WHILE. Y es que la variable del bucle MODIFICA SU VALOR AUTOMÁTICAMENTE POR CADA PASO DEL BUCLE. Y ¿cómo lo modifica? Pues lo modifica valiéndose del PASO, de forma que, por cada vez que se ejecutan las instrucciones que se encuentran dentro del bucle FOR, se incrementa AUTOMÁTICAMENTE la variable del bucle FOR un valor igual al PASO.

La expresión general en MATLAB de un bucle FOR es la siguiente: 

for Variable del bucle=Valor Incial : PASO : Valor Final
Sentencia;
end

Supongamos queremos ejecutar una serie de instrucciones 10 veces. Si llamamos I a la variable del bucle FOR, la manera más ortodoxa de programar el bucle es la siguiente:

for I=1 : 1 : 10
instrucciones;
end

No obstante, se consigue el mismo efecto con las siguientes expresiones:


En todos los casos se consigue que la secuencia instrucciones se repita 10 veces. 
Sin embargo en muchas ocasiones interesa utilizar la variable I. Por ejemplo, cuando se quieren recorrer los elementos de un vector o de una matriz. O cuando se quiere utilizar un número durante una serie de veces y que el valor del número cambie con un determinado paso (como cuando sucede al calcular el factorial de un número). En todos estos casos, se establece un bucle FOR y se utiliza la propia variable del bucle.
Un ejemplo típico en el que interesa utilizar la variable del bucle FOR puede ser el producto escalar de dos vectores a y b de dimensión n:

pe=0
for i=1:1:n
pe = pe + a(i)*b(i);
end

Primero se inicializa la variable pe a cero y la variable i a 1; el ciclo se repetirá mientras que i sea menor o igual que n, y al final de cada ciclo el valor de i se incrementará en una unidad. En total, el bucle se repetirá n veces. La ventaja de la construcción for sobre la construcción while equivalente está en que en la cabecera de la construcción for se tiene toda la información sobre como se inicializan, controlan y actualizan las variables del bucle.


3.8.3 Anidamiento de bucles

Los bucles pueden anidarse unos dentro de otros. Esta estrategia se utiliza muy a menudo. Un ejemplo claro se encuentra a la hora de recorrer los elementos de una matriz. Supongamos que interesa sumar todos los elementos de una matriz de nombre A. Para ello vamos a inicializar una variable S a cero y, sobre esa variable, iremos sumando todos lo elementos de la matriz A. Para acceder a todos los elementos de A vamos a utilizar dos variables auxiliares (F y C) que serán dos números enteros que servirán para referirnos a la fila y columna de A. Si A es una matriz de 10 filas y 23 columnas, la manera más lógica de sumar todos sus elementos es anidando dos bucles FOR para controlar la fila y la columna a la que nos referimos, según el siguiente ejemplo:

S=0;
for F=1:1:10
for C=1:1:23
S=S+A(F,C);
end
end

Espero haber ayudado en algo. Hasta la próxima oportunidad!










  

No hay comentarios:

Publicar un comentario en la entrada