Estructuras de Control

Normalmente, el flujo de ejecución de un programa es secuencial, porque se ejecuta una sentencia tras otra. Las estructuras de control permiten modificar el flujo secuencial, alterando el orden de las sentencias bajo determinadas circunstancias. En los lenguajes estructurados, existen dos estructuras de control básicas: la selección y la repetición o iteración. Según el teorema de Dijkstra, estas dos estructuras, junto con la secuencia, son suficientes para escribir cualquier programa.


La estructura de selección

La estructura de selección permite determinar si una sentencia (simple o compuesta) será ejecutada o no a partir de la evaluación de una determinada condición o expresión booleana. En la mayoría de los lenguajes actuales, la selección se realiza mediante el uso de la estructura if (si). La forma más básica de esta estructura es la siguiente (en pseudocódigo):

Si (expresión booleana)
    Entonces ejecutar sentencia A
    Si no ejecutar sentencia B

La segunda parte (la del si no) es optativa y permite ejecutar una acción alternativa para cuando el resultado de la expresión lógica es falso.

En C#, la estructura de selección se escribe mediante la palabra if seguida de la expresión entre paréntesis y debajo la sentencia por ejecutar en caso de que la expresión sea verdadera. En forma opcional, puede haber un else (si no) para especificar una acción en caso de que la expresión lógica sea falsa.

//  C#
if( saldo > montoExtraccion )
RealizarExtraccion(montoExtraccion);
else
MostrarMensaje(“No tiene suficiente saldo”);

En Visual Basic .Net, la estructura de selección es muy similar, aunque con algunas diferencias: la expresión no necesita ir entre paréntesis y debe ser seguida por la palabra reservada THEN (entonces). Además, VB.Net provee la posibilidad de escribir la acción en la misma línea del if o en la línea siguiente. En caso que se escriba debajo, la estructura debe ser cerrada usando end if.

' VB.NET
If saldo > montoExtraccion Then RealizarExtraccion(montoExtraccion)
Else
MostrarMensaje(“No tiene suficiente saldo”)
End If

' Tambien podemos hacer esto:
If b > 0 Then c = a / b else c = 0

CLASIFICACIONES DE LOS TIPOS DE DATOS

Los tipos de datos pueden clasificarse en tres grupos: los ordinales, los no ordinales y los compuestos. Los tipos de datos ordinales son aquellos cuyos valores pueden ser ordenados (se establece una relación de orden entre cualquier par de valores), como por ejemplo, los números enteros o los caracteres de la tabla ASCII. Los valores de los tipos no ordinales no pueden ordenarse, como es el caso de los números decimales de gran precisión o los punteros a memoria. Los tipos de datos compuestos incluyen las cadenas de caracteres y las estructuras de datos.

En muchos lenguajes, existe otra estructura de selección alternativa, denominada comúnmente case o select case, que permite especificar varias alternativas por casos, según el valor de una variable o de una expresión. Si bien el select case puede escribirse perfectamente como una secuencia de estructuras if, en pseudocódigo, podemos escribir la selección múltiple de esta manera:

SegunEsElValorDe  expresión hacer:

C1: sentencia 1
C2: sentencia 2


Sino: sentencia n

El funcionamiento de esta estructura es así: se evalúa la expresión, y su valor se compara con la lista de constantes C1, C2, etcétera. Si el valor de la expresión está comprendido en la lista de constantes, se ejecuta la sentencia correspondiente (por ejemplo, si el valor de la expresión es C2, se ejecuta la sentencia 2). Si el valor de la expresión no está en la lista de constantes, y hay un sino, se ejecuta la sentencia asociada a éste, caso contrario, la ejecución continúa en la línea siguiente. En C#, la estructura de selección múltiple cumple la misma función, pero se denomina switch, y su sintaxis es la siguiente:

//  C#
switch(variable)
{
case 10:
HacerAlgo(); break;
case 20:
HacerOtraCosa(); break;
default:
HacerAlgoDistinto(); break;
}

En Visual Basic .Net, la misma estructura selectiva múltiple se denomina Select Case y se escribe así:

‘ VB.Net
SELECT CASE variable
CASE 10: HacerAlgo()
CASE 20: HacerOtraCosa()
CASE ELSE: HacerAlgoDistinto();
END SELECT

Las estructuras de repetición

Muy a menudo, necesitamos repetir una sentencia más de una vez para completar el objetivo del algoritmo. Las estructuras de repetición de los lenguajes estructurados permiten ejecutar una sentencia una cierta cantidad de veces o mientras se cumpla una determinada condición. Por ejemplo, si volvemos a mirar el algoritmo del Capítulo 1, podremos notar que repetimos las sentencias que hacen las restas entre las dos variables mientras que el valor de la variable A sea mayor que cero.

Como decíamos en el párrafo anterior, la mayoría de los lenguajes estructurados proveen dos tipos de estructuras de repetición: una para repetir una sentencia mientras se cumpla una condición (es decir, mientras el resultado de evaluar una expresión lógica sea verdadero), y otra para repetir una sentencia una cantidad determinada de veces. La sentencia que se ejecuta repetidas veces se denomina bucle.

La estructura de repetición condicional se denomina comúnmente while (mientras). En el lenguaje C#, simplemente se la escribe seguida de la expresión lógica entre paréntesis y debajo la sentencia a ejecutar:

// C#
While( a > 0 )
a = a - b;

En Visual Basic .Net, es muy similar, con la diferencia que se debe marcar el final de la estructura con las palabras clave End While, y no es necesario escribir la expresión booleana entre paréntesis:

‘ VB.Net
While a > 0
a = a - b
End While

En algunos lenguajes, existe una variante de esta estructura de repetición, consistente en evaluar la expresión lógica al final. La diferencia radica en que, al evaluar la condición al final, la sentencia por repetir se ejecutará por lo menos una vez, mientras que, si la evaluación se hace al comienzo, la sentencia podría no ejecutarse nunca.

Al momento de usar una estructura while, se debe prestar especial atención a la expresión lógica que determina el fin del bucle (también conocida como condición de corte), ya que escribirla mal, podría hacer que el bucle nunca finalizara (bucle infinito). Por ejemplo, si la condición de corte es que el valor de una variable llegue a cero, pero olvidamos modificarlo dentro del bucle, el valor permanecerá constante, y el ciclo nunca finalizará.

La otra estructura de control repetitiva con la que disponemos en la mayoría de los lenguajes estructurados es la que se conoce como For. Esta estructura permite especificar que se quiere repetir la sentencia una cantidad finita de veces, usando una variable como contador. A cada iteración, la variable contador se incrementa automáticamente (es decir, no necesitamos preocuparnos por actualizarla como sucede con while). En algunos lenguajes, como Pascal, no se permite modificar la variable contadora dentro del bucle para facilitar la traducción y validación del código durante la fase de compilación.

En C#, la estructura for es un poco difícil de comprender al comienzo, pero una vez que nos familiarizamos con ella, vemos que tiene una gran capacidad de expresividad y de flexibilidad para escribir repeticiones complejas. Al escribir un for en C#, debemos especificar el valor con el que comienza la variable contadora, la condición que determina que el contador ha llegado al valor final y la expresión que incrementa el contador. Esto último parece contradecir lo que mencionábamos antes acerca de que no es necesario preocuparnos por modificar el contador. Y es cierto. En ese aspecto, la estructura for de C# es parecida a la estructura while. Veámosla en un ejemplo:

// C#
for(i=0;i<10;i++)
HacerAlgo();

Como se puede ver en el ejemplo, la estructura consta de tres partes fundamentales separadas por punto y coma. La primera especifica el valor del contador con el que comienza la iteración. La segunda, la condición para finalizar. Y la última especifica la expresión que modifica el valor del contador en cada iteración. En este ejemplo, la sentencia HacerAlgo se ejecutará diez veces. El for de C# soporta algunas variantes que lo hacen más complejo y potente, pero su explicación excede el alcance de este libro.

En Visual Basic .Net, la estructura for es mucho más sencilla e intuitiva, pero también menos potente. Además, se diferencia de la versión en C# en que debe ser cerrado con la palabra reservada Next (siguiente). Continuando con el ejemplo anterior, en Visual Basic podemos escribir:

‘VB.Net
For i=1 to 10
HacerAlgo()
Next

En este ejemplo, la sentencia HacerAlgo se repetirá diez veces, y, en cada iteración, el valor de la variable i se incrementará automáticamente en 1.

CONCLUSIONES

En el momento de su aparición, la programación estructurada significó un importante avance en las formas de construir software, sobre todo por el impacto que causó en los costos de mantenimiento. La facilidad de mantenimiento se debe a que, con la programación estructurada, conseguimos programas más fáciles de entender y de depurar (por la ausencia de instrucciones GOTO), además, los bloques de código son más claros.