Alternativa
Objectius
- Aprendre a controlar el flux d’execució d’un programa amb estructures alternatives.
- Aprendre a construir una estructura alternativa.
- Aprendre a utilitzar una estructura alternativa.
- Conèixer diferents tipus d’estructures alternatives.
Introducció
En aquesta unitat es presenten les estructures de control de flux alternatives per a controlar dinàmicament l’execució d’un programa. Així mateix s’explica que, per a aconseguir-ho, un programa ha de decidir quin bloc d’instruccions executar depenent del resultat d’avaluar una expressió lògica.
1. Estructura alternativa
En el diagrama de flux següent es presenten les parts d’una estructura alternativa. Les fletxes indiquen el sentit del flux d’execució.
Primer es realitza la consulta sobre l’estat actual o condició (rombe verd) i depenent del resultat de l’avaluació de la condició (vertader o fals) hi ha dos camins: si l’avaluació dona vertader, s’executa el bloc d’instruccions de l’esquerra (rectangle groc). En cas contrari, si dona fals, s’executa el bloc d’instruccions de la dreta (rectangle gris).
Quan acaba l’execució del bloc d’instruccions de la dreta o de l’esquerra, el flux d’execució continua tenint un sol camí (rombe blau de finalització).
A continuació es mostren exemples d’ús d’estructures alternatives. Per a mostrar com funcionen es presenta per a cada exemple el diagrama del seu flux d’execució.
1.1. Exemple 07_01
Donat un nombre enter n, indiqueu si és parell. En cas contrari no cal fer res.
Identificant les parts de l’estructura alternativa tenim el següent diagrama de flux d’execució:
Ja que no està definit què fer quan la condició és falsa, no cal col·locar bloc d’instruccions en aquest cas i es passa directament al final de l’estructura alternativa.
1.2. Exemple 07_02
Donat un sensor de temperatura, si la temperatura t és inferior a 21 graus, s’ha d’encendre la calefacció, en cas contrari, la calefacció ha d’apagar-se.
Identificant les parts de l’estructura alternativa tenim el diagrama de flux següent:
En aquest exemple estan definits tots dos camins, per la qual cosa es col·loquen blocs d’instruccions en tots dos camins.
1.3. Exemple 07_03
Donat el sensor de temperatura de l’exemple anterior, si la temperatura t és inferior a 18 graus, s’ha d’encendre la calefacció. Si la temperatura t és superior a 26 graus, s’ha d’encendre l’aire condicionat. Si no, s’han d’apagar la calefacció i l’aire condicionat.
Identificant les parts de l’estructura alternativa, tenim el diagrama de flux següent:
En aquest exemple, quan la condició és falsa, s’obren dues alternatives possibles. Per aquest motiu es col·loca una altra vegada el rombe indicant una condició. Aquest tipus d’estructura alternativa es denomina niada.
2. Codificació d’una estructura de control alternativa
En aquest apartat es presenta la codificació d’una estructura de control alternativa quan solament hi ha instruccions a executar en un camí, quan hi ha blocs d’instruccions en tots dos camins i quan es tracta d’una estructura de control alternativa niada.
Parts | Codificació en llenguatge algorísmic |
---|---|
Consulta sobre l’estat actual o condició | if estructura condicional then |
Què fer quan la condició és Vertadera | bloc d’instruccions |
Què fer quan la condició és Falsa | else bloc d’instruccions |
Marca de finalització d’estructura alternativa | end if |
2.1. Exemple 07_04
A continuació veiem un algorisme codificat tant en llenguatge algorísmic com en llenguatge C. Es tracta d’un algorisme per a detectar nombres parells.
algorithm ex4
var
n: integer;
end var
n := readInteger();
if n mod 2 = 0 then
writeString("És parell");
end if
end algorithm
int main(int argc, char** argv) {
int n;
scanf("%d", &n);
if (n%2 == 0) {
printf("Es parell");
}
return 0;
}
Analitzem l’execució de l’estructura alternativa:
# Línia | Codi |
---|---|
1 | if n mod 2 = 0 then |
2 | writeString ("És parell"); |
3 | end if |
Cas 1: el nombre n és parell.
La línia 1 avalua Vertader, per tant s’executen les línies 2 i 3.
Cas 2: el nombre no és parell.
La línia 1 avalua a Fals, per tant la línia 2 no s’executa (se salta) i continua l’execució a partir de la línia 3.
2.2. Exemple 07_05
Suposem implementades les accions switchOnHeating() i switchOffHeating(), que s’encarreguen de fer totes les operacions necessàries per a encendre o apagar la calefacció respectivament.
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;
}
Analitzem l’execució de l’estructura alternativa:
# Línia | Codi |
---|---|
1 | if t < 21 then |
2 | switchOnHeating(); |
3 | else |
4 | switchOffHeating(); |
5 | end if |
Cas 1: la temperatura és inferior a 21 graus.
La línia 1 avalua vertader, per tant s’executa la línia 2. Les línies 3 i 4 no s’executen.
Cas 2: la temperatura és superior o igual a 21 graus.
La línia 1 avalua fals, per tant la línia 2 se salta i s’executa a partir de la línia 3.
2.3. Exemple 07_06
Suposem implementades les accions switchOnHeating(), switchOffHeating(), que s’encarreguen de fer totes les operacions necessàries per a encendre o apagar la calefacció respectivament, i suposem implementades les accions switchOnAirConditioning(), switchOffAirConditioning(), que s’encarreguen de fer totes les operacions necessàries per a encendre o apagar l’aire condicionat respectivament.
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;
}
Analitzem l’execució de l’estructura alternativa:
# Línia | Codi |
---|---|
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 |
Cas 1: la temperatura és inferior a 18 graus.
La línia 1 avalua vertader, per tant s’executa la línia 2. Les línies 3-9 no s’executen.
Cas 2: la temperatura és superior a 26 graus.
La línia 1 avalua fals, per tant la línia 2 se salta i s’executa a partir de la línia 3. La línia 4 avalua vertader, per tant s’executen les línies 5, 9 i 10.
Cas 3: la temperatura és superior o igual a 18 graus però inferior o igual a 26 graus.
La línia 1 avalua fals, per tant la línia 2 se salta i l’execució continua a partir de la línia 3. La línia 4 avalua fals, per tant la línia 5 se salta i l’execució continua a partir de la línia 6.
2.4. Exemple 07_07
Finalment, vegem un exemple per a compartir un cotxe. L’algorisme ha de dir que si una persona té menys de divuit anys no pot conduir i, per tant, no es pot compartir el cotxe. Si és major de divuit i té carnet llavors sí que pot conduir. La solució seria la següent:
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;
}
Resum
En aquesta unitat s’ha definit l’estructura alternativa. Aquest tipus d’instruccions són bàsiques per a controlar el flux d’execució d’un programa. S’han utilitzat diagrames de flux per a mostrar el funcionament d’aquesta estructura de control.
S’han presentat tres exemples d’estructura alternativa juntament amb la seva traducció al llenguatge algorísmic, considerant tots els camins possibles, tal com seria el flux d’execució en cada cas.