Construcción de estructuras alternativas
La composición secuencial vista hasta ahora es un recurso insuficiente por sí solo: las instrucciones ejecutadas son siempre las mismas independientemente de los valores iniciales del algoritmo la lo que no permite resolver problemas que exijan tomar decisiones en función de éstos. Por tanto un problema tan simple como el cálculo del máximo de dos valores enteros no podría ser resuelto con las herramientas actuales.
Las estructuras condicionales o alternativas permiten tomar decisiones sobre qué conjunto de instrucciones es necesario ejecutar en un punto del programa. Toda estructura condicional se basa en la evaluación de una expresión que debe dar un resultado lógico: cierto o falso.
La condición lógica se basa, normalmente, en los valores almacenados en las variables, de modo que el resultado dependerá de la ejecución concreta. El diseño no sería correcto si una estructura alternativa diera siempre el mismo resultado: ¿qué sentido tendría?
Estructura alternativa simple
La estructura alternativa simple permite controlar el hecho de que se ejecute un conjunto de instrucciones, si y sólo si se cumple la condición lógica (o sea, condición lógica evaluada con el valor cierto).
La sintaxis de esta sentencia de control en seudocódigo es la siguiente:
si <condición> entonces
<conjunto de instrucciones>
finsi
Es necesario interpretar el funcionamiento de esta sentencia como sigue. Cuando en tiempo de ejecución el programa llega a la palabra reservada si, evalúa la condición, por lo que si el resultado es cierto, se ejecuta el conjunto de instrucciones que hay entre la palabra reservada entonces y la palabra reservada finsi. En caso de que la condición sea evaluada como falso o, después de haber ejecutado el conjunto de instrucciones, en caso de haber sido evaluada como cierto, el programa continúa la ejecución con la instrucción que hay inmediatamente después en la palabra reservada finsi.
Estructura alternativa simple en C
if (<condición>)
{
<conjunto de instrucciones a ejecutar>;
}
Se deben tener en cuenta las siguientes características:
- Es obligatorio enmarcar la condición entre paréntesis
- Si el conjunto de instrucciones a ejecutar consiste en una única instrucción, los símbolos {} se pueden ahorrar. Por tanto, si después de la condición no hay texto enmarcado entre {}, significa que el cuerpo de instrucciones a ejecutar está formado por una única instrucción.
Estructura alternativa doble
La estructura alternativa doble permite controlar el hecho de que se ejecute un conjunto de instrucciones, si y sólo si se cumple la condición , y que se ejecute otro conjunto, si y sólo si no se cumple la condición.
La sintaxis de esta sentencia de control en seudocódigo es:
si <condición> entonces
<conjunto de instrucciones a ejecutar>
sino
<conjunto de instrucciones a ejecutar>
finsi
Es necesario interpretar el funcionamiento de esta sentencia como sigue. Cuando en tiempo de ejecución el programa llega a la palabra reservada si, evalúa la condición, por lo que si el resultado es cierto, se ejecuta el conjunto de instrucciones que hay entre la palabra reservada entonces y la palabra reservada sino y en caso de que el resultado sea falso se ejecuta el conjunto de instrucciones que existe entre la palabra reservada sino y la palabra reservada finsi. En cualquier caso, posteriormente a la ejecución del bloque de instrucciones que corresponda (¡sólo uno!) el programa sigue la ejecución de las instrucciones que aparecen después de la palabra finsi
Estructura alternativa doble en C
f (<condición>)
{
<conjunto de instrucciones a ejecutar si es cierta>;
}
else
{
<conjunto de instrucciones a ejecutar si es falsa>;
}
Se deben tener en cuenta las siguientes características:
- Es obligatorio enmarcar la condición entre paréntesis
- Si el conjunto de instrucciones a ejecutar consiste en una única instrucción, los símbolos {} se pueden ahorrar. Por tanto, si después de la condición no hay texto enmarcado entre {}, significa que el cuerpo de instrucciones a ejecutar está formado por una única instrucción.
Ejemplo:
# include <stdio.h>
int main(){
float numero;
printf("Introdueix un numero del 1 al 10: ");
scanf ("%f", numero);
if (numero > 5)
printf("El numero es mes gran que 5");
else
printf("El numero es menor o igual que 5");
}
Existe finalmente una construcción alternativa conocida como if-else-if donde las condiciones se plantean de forma escalonada.
if condición1
{ Acciones1 ;}
else if condición2
{ Acciones2;}
.......
else if condición
{AccionesN}
else
{Acciones por defecto;}
Las condiciones se evalúan secuencialmente de arriba abajo hasta encontrar una que dé como a resultado VERDADERO. En este punto, se ejecuta el grupo de sentencias correspondiente a la misma condición. El resto de condiciones y sentencias se ignoran. En caso de que ninguna de las condiciones se evalúe VERDADERO, se ejecutaría el grupo de sentencias por defecto. El último else es opcional.
La condición debe ser cualquier expresión que al evaluarse dé un resultado de tipo lógico. También puede ser una variable de tipo lógico, puesto que al acceder a su valor contendrá un valor de tipo lógico.
Estructura alternativa múltiple (sentencia switch)
Esta construcción permite especificar múltiples sentencias al estilo if-les-if pero de forma más compacta, legible y elegante. Su forma es la siguiente:
switch (variable )
{
case constant1 :
Acción A1;
break;
case constant2 :
Acción A2;
break;
............
case constantn :
Acción An;
break;
default:
Acción Ad;
break;
}
Donde variable debe ser de tipo entero o carácter, al igual que todas las constantes asociadas a cada etiqueta. Debe recalcarse que no se pueden utilizar variables o expresiones en los diferentes casos, sino sólo constantes. El funcionamiento es el siguiente: en primer lugar se evalúa la variable. Seguidamente su valor es comparado secuencialmente con el de las distintas constantes.
Si el valor coincide con alguna de ellas, se ejecuta el grupo de sentencias correspondiente y el switch concluye gracias a la sentencia break. De lo contrario y si existe el caso por default (que es opcional) se ejecutan las sentencias por defecto.
A diferencia de la inmensa mayoría de estructuras alternativas múltiples en lenguajes de programación, la sentencia switch del lenguaje C tiene un comportamiento muy especial. De forma similar a todos los lenguajes, el programa evalúa la expresión e inicia la comparación con la constante de cada caso. Al encontrar un case tal que la constante coincide con el resultado, se comenta a ejecutar el conjunto de instrucciones correspondiente, y continúa con los conjuntos de instrucciones de los siguientes case hasta terminar la estructura switch.
Sólo hay una forma de abortar la ejecución de los diferentes conjuntos de instrucciones: la instrucción break, que transfiere la ejecución fuera del switch. Por eso tiene sentido que en algunos casos el conjunto de instrucciones sea optativo, ya que se ejecutará el(los) conjunto(s) de instrucciones del(s) case siguiente(s).
Ejemplo:
#include <stdio.h>
int main(){
int mes;
printf ("Introduzca el número de mes a traducir: ");
scanf ("%d",&mes);
switch (mes) {
case 1: printf ("Traducción: Enero\n"); break;
case 2: printf ("Traducción: Febrero\n"); break;
case 3: printf ("Traducción: Marzo\n"); break;
case 4: printf ("Traducción: Abril\n"); break;
case 5: printf ("Traducción: Mayo\n"); break;
case 6: printf ("Traducción: Junio\n"); break;
case 7: printf ("Traducción: Julio\n"); break;
case 8: printf ("Traducción: Agosto\n"); break;
case 9: printf ("Traducción: Septiembre\n"); break;
case 10: printf ("Traducción: Octubre\n"); break;
case 11: printf ("Traducción: Noviembre\n"); break;
case 12: printf ("Traducción: Diciembre\n"); break;
default: printf ("No existe un mes con número %u\n",mes);
}
}