Alternativa

Última modificació per editor1 el 2018/09/16 20:58

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ó).

diagrama_if.v2.jpg

taula1.jpg

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ó:

exemple1.jpg

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:

exemple2.jpg

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:

exemple3.jpg

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.

PartsCodificació 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 Falsaelse

           bloc d’instruccions
  Marca de finalització d’estructura alternativaend 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

#include <stdio.h>

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

#include <stdio.h>

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íniaCodi
  1if t < 21 then
  2      switchOnHeating();
  3else
  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

#include <stdio.h>

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íniaCodi
  1if t < 18 then
  2      switchOnHeating();
  3else 
  4    if t > 26 then
  5           switchOnAirConditioning();
  6    else
  7           switchOffHeating();
  8           switchOffAirConditioning();
  9    end if
  10end 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

#include <stdio.h>

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.

Etiquetes:
Creat per editor1 el 2018/09/16 20:57