07. Estructura de control alternativa
Objetivos
- Aprender a controlar el flujo de ejecución de un programa con estructuras alternativas.
- Aprender a construir una estructura alternativa.
- Aprender a utilizar una estructura alternativa.
- Conocer diferentes tipos de estructuras alternativas.
Introducción
En esta unidad se presentan las estructuras de control de flujo alternativas para controlar dinámicamente la ejecución de un programa. Asimismo se explica que, para conseguirlo, un programa ha de decidir qué bloque de instrucciones ejecutar dependiendo del resultado de evaluar una expresión lógica.
1. Estructura alternativa
En el diagrama de flujo de abajo se presentan las partes de una estructura alternativa. Las flechas indican el sentido del flujo de ejecución.
Primero se realiza la consulta sobre el estado actual o condición (rombo verde) y dependiendo del resultado de la evaluación de la condición (verdadero o falso) hay dos caminos: si la evaluación da verdadero, se ejecuta el bloque de instrucciones de la izquierda (rectángulo amarillo). De lo contrario, si da falso, se ejecuta el bloque de instrucciones de la derecha (rectángulo gris).
Cuando acaba la ejecución del bloque de instrucciones de la derecha o de la izquierda, el flujo de ejecución continúa teniendo un solo camino (rombo azul de fin).
A continuación se muestran ejemplos de uso de estructuras alternativas. Para mostrar cómo funcionan se presenta para cada ejemplo el diagrama de su flujo de ejecución.
1.1. Ejemplo 07_01
Dado un número entero n, indicad si es par. En caso contrario no es necesario hacer nada.
Identificando las partes de la estructura alternativa tenemos el siguiente diagrama de flujo de ejecución:
Ya que no está definido qué hacer cuando la condición es falsa, no hace falta colocar bloque de instrucciones en este caso y se pasa directamente al final de la estructura alternativa.
1.2. Ejemplo 07_02
Dado un sensor de temperatura, si la temperatura t es inferior a 21 grados, se debe encender la calefacción, en caso contrario, la calefacción debe apagarse.
Identificando las partes de la estructura alternativa tenemos el siguiente diagrama de flujo:
En este ejemplo están definidos ambos caminos, por lo que se colocan bloques de instrucciones en ambos caminos.
1.3. Ejemplo 07_03
Dado el sensor de temperatura del ejemplo anterior, si la temperatura t es inferior a 18 grados, se tiene que encender la calefacción. Si la temperatura t es superior a 26 grados, se tiene que encender el aire acondicionado. Si no, se tienen que apagar la calefacción y el aire acondicionado.
Identificando las partes de la estructura alternativa, tenemos el siguiente diagrama de flujo:
En este ejemplo, cuando la condición es falsa, se abren dos alternativas posibles. Por este motivo se coloca otra vez el rombo indicando una condición. Este tipo de estructura alternativa se denomina anidada.
2. Codificación de una estructura de control alternativa
En este apartado se presenta la codificación de una estructura de control alternativa cuando solo hay instrucciones a ejecutar en un camino, cuando hay bloques de instrucciones en ambos caminos y cuando se trata de una estructura de control alternativa anidada.
Partes | Codificación en lenguaje algorítmico |
---|---|
Consulta sobre el estado actual o condición | if estructura condicional then |
Qué hacer cuando la condición es Verdadera | bloque de instrucciones |
Qué hacer cuando la condición es Falsa | else bloque de instrucciones |
Marca de fin de estructura alternativa | end if |
2.1. Ejemplo 07_04
A continuación vemos un algoritmo codificado tanto en lenguaje algorítmico como en lenguaje C. Se trata de un algoritmo para detectar números pares.
algorithm ex4
var
n: integer;
end var
n := readInteger();
if n mod 2 = 0 then
writeString("Es par");
end if
end algorithm
int main(int argc, char** argv) {
int n;
scanf("%d", &n);
if (n%2 == 0) {
printf("Es par");
}
return 0;
}
Analizamos la ejecución de la estructura alternativa:
# Línea | Código |
---|---|
1 | if n mod 2 = 0 then |
2 | writeString ("Es par"); |
3 | end if |
Caso 1: el número n es par.
La línea 1 evalúa a Verdadero, por lo tanto se ejecutan las líneas 2 y 3.
Caso 2: el número no es par.
La línea 1 evalúa a Falso, por lo tanto la línea 2 no se ejecuta (se salta) y continúa la ejecución a partir de la línea 3.
2.2. Ejemplo 07_05
Suponemos implementadas las acciones switchOnHeating() y switchOffHeating() que se encargan de hacer todas las operaciones necesarias para encender o apagar la calefacción respectivamente.
algorithm ex5
var
t: real;
end var
t := readReal();
if t < 21 then
switchOnHeating():
else
switchOffHeating();
end if
end algorithm
int main(int argc, char** argv) {
float t;
scanf("%f", &t);
if (t < 21) {
switchOnHeating();
} else {
switchOffHeating();
}
return 0;
}
Analizamos la ejecución de la estructura alternativa:
# Línea | Código |
---|---|
1 | if t < 21 then |
2 | switchOnHeating(); |
3 | else |
4 | switchOnHeating(); |
5 | end if |
Caso 1: la temperatura es inferior a 21 grados.
La línea 1 evalúa a verdadero, por lo tanto se ejecuta la línea 2. Las líneas 3 y 4 no se ejecutan.
Caso 2: la temperatura es superior o igual a 21 grados.
La línea 1 evalúa a falso, por lo tanto la línea 2 se salta y se ejecuta a partir de la línea 3.
2.3. Ejemplo 07_06
Suponemos implementadas las acciones switchOnHeating(), switchOffHeating() que se encargan de hacer todas las operaciones necesarias para encender o apagar la calefacción respectivamente y suponemos implementadas las acciones switchOnAirConditioning(), switchOffAirConditioning() que se encargan de hacer todas les operaciones necesarias para encender o apagar el aire acondicionado respectivamente.
algorithm ex6
var
t: real;
end var
t := readReal();
if t < 18 then
switchOnHeating():
else
if t > 26 then
switchOnAirConditioning();
else
switchOffHeating();
switchOffAirConditioning();
end if
end if
end algorithm
int main(int argc, char** argv) {
float t;
scanf("%f", &t);
if (t < 18) {
switchOnHeating();
} else {
if (t > 26) {
switchOnAirConditioning();
} else {
switchOffHeating();
switchOffAirConditioning();
}
}
return 0;
}
Analizamos la ejecución de la estructura alternativa:
# Línea | Código |
---|---|
1 | if t < 18 then |
2 | switchOnHeating(); |
3 | else |
4 | if t > 26 then |
5 | switchOnAirConditioning(); |
6 | else |
7 | switchOffHeating(); |
8 | switchOffAirConditioning(); |
9 | end if |
10 | end if |
Caso 1: la temperatura es inferior a 18 grados.
La línea 1 evalúa a verdadero, por lo tanto se ejecuta la línea 2. Las líneas 3-9 no se ejecutan.
Caso 2: la temperatura es superior a 26 grados.
La línea 1 evalúa a falso, por lo tanto la línea 2 se salta y se ejecuta a partir de la línea 3. La línea 4 evalúa a verdadero , por lo tanto se ejecutan las líneas 5, 9 y 10.
Caso 3: la temperatura es superior o igual a 18 grados pero inferior o igual 26 grados
La línea 1 evalúa a falso, por lo tanto la línea 2 se salta y la ejecución continúa a partir de la línea 3. La línea 4 evalúa a falso, por lo tanto la línea 5 se salta y la ejecución continúa a partir de la línea 6.
2.4. Ejemplo 07_07
Finalmente, veamos un ejemplo para compartir un coche. El algoritmo debe decir que si una persona tiene menos de 18 no puede conducir y, por lo tanto, no se puede compartir el coche. Si es mayor de 18 y tiene carnet entonces sí que puede conducir. La solución sería la siguiente:
algorithm carShare
var
a: integer;
l: boolean;
end var
writeString("How old are you?");
a := readInteger();
if a < 18 then
writeString("You still can not drive");
else
writeString("Do you have driving license?");
l := readBoolean();
if l then
writeString("Nice, we can share the car");
else
writeString("I do. If you want we can go with my car");
end if
end if
end algorithm
typedef enum {FALSE, TRUE} boolean;
int main(int argc, char **argv) {
int a;
boolean l;
printf("How old are you?\n");
scanf("%d", &a);
if (a < 18){
printf("You still can not drive\n");
} else {
printf("Do you have driving license?\n");
scanf("%u", &l);
if (l) {
printf("Nice, we can share the car\n");
} else {
printf("I do. If you want we can go with my car\n");
}
}
return 0;
}
Resumen
En esta unidad se ha definido la estructura alternativa. Este tipo de instrucciones son básicas para controlar el flujo de ejecución de un programa. Se han utilizado diagramas de flujo para mostrar el funcionamiento de esta estructura de control.
Se han presentado tres ejemplos de estructura alternativa junto con su traducción al lenguaje algorítmico considerando todos los caminos posibles, tal como sería el flujo de ejecución en cada caso.