Índex

 
Capítol05.zip Exercicis05.zip
Capítol 5

Les estructurtes condicionals i alternatives

  1. Les estructures condicional i alternativa. La sentència if.
    1. Estructura condicional.
    2. Estructura alternativa.
    3. Estructura alternativa amb condicions més complexes.
    4. Estructura condicional amb una acció composta.
    5. Estructura alternativa amb accions compostes.
    6. Estructures alternatives niades.
  2. L'estructura alternativa múltiple. La sentència switch.
    1. La sentència break.
    2. Ruptura de control dins d'un cicle for.
    3. Ruptura de control dins d'un cicle while.
    4. La sentència continue
  3. Com no utilitzar break i continue
    1. Estalviem-nos la sentència break
    2. Estalviem-nos la sentència break.
    3. Estalviem-nos la sentència continue
  4. La sentència goto.
  5. Exercicics

 

5.1. Les estructures condicional i alternativa. La sentència if.

Té un dels dos formats següents
Estructura condicional Estructura alternativa
if <condició> 
   acció 1;
if <condició> 
   acció 1;
else
   acció 2;

Les accions 1 i 2 poden ser simples o compostes. 

5.1.1. Exemple: Estructura condicional.

En aquest primer exemple veiem com s'utilitza la instrucció condicional, en un programa que demana si vol que escrigui a la pantalla un palíndrom. Si es prem la tecla s escriu el palíndrom i sinó no.
#include <stdio.h>
#include <conio.h> 

void main(void)
{
    char tecla; 

    clrscr();

    printf("¨Quieres que ponga un palíndromo en la pantalla (s/n) ");
    tecla=getchar();
    if (tecla == 's')
       printf("\ndabale arroz a la zorra el abad\n");
    printf("Adios\n");
}

5.1.2. Exemple: Estructura alternativa.

Aquí veiem un exemple d'utilització de l'estructura alternativa. Aquest programa ens diu si un número entrat des de teclat és par o senar:
#include <stdio.h>
#include <conio.h> 

void main(void)
{
    int num = 0; 

    clrscr(); 

    printf("\nEscriu un número sencer ");
    scanf("%d",&num);
    if (num % 2 == 0 )
          printf("\nEl número %d és parell\n",num);
    else
          printf("\nEl número %d és senar\n",num);
}

5.1.3. Exemple: Estructura alternativa amb condicions més complexes.

Aquest programa ens ajudarà a triar el que volem fer avui segons sigui abans o després de dinar i faci bon o mal temps segons el quadre adjunt:
Abans de dinar Després de dinar
Bon temps Ves a la platja Fes un passeig amb els amics
Mal temps Llegeix un llibre a casa Fes la migdiada
#include <stdio.h>
void main(void)
{
    char hora,temps; 

    printf("Fa bo o mal temps (b/m) ");
    fflush(stdin);
    temps = getchar(); 

    printf("Ja has dinat? (s/n) ");
    fflush(stdin);
    hora=getchar(); 

    if ((temps == 'b') && (hora == 'n'))
          printf("\nVes a la platja\n"); 

    if ((temps == 'b') && (hora == 's'))
          printf("\nFes un paseig amb els amics\n"); 

    if ((temps == 'm') && (hora == 'n')) 
          printf("\nLlegeis un llibre a casa\n"); 

    if ((temps == 'm') && (hora == 's')) 
          printf("\nFes la migdiada\n");

5.1.4.- Exemple: Estructura condicional amb una acció composta.

 
#include <stdio.h>
void main(void)
{
    int tecla; 
    printf("Vols que escrigui algunes coses de l'ordinador? (s/n)");
    tecla=getchar(); 

    if ((tecla=='s' )|| (tecla=='S'))
    {
          printf("L'ordinador es composa de Hardware i Software.\n");
          printf("El hardware està controlat pel software\n");
          printf("En aquest moments nosaltres estem aprenent a fer software i\n");
          printf("fem un programa en llenguatge C amb una instrucció condicional\n");
    }; 

    printf("\nAdéu\n");

5.1.5. Exemple: Estructura alternativa amb accions compostes.

Aquest programa demana un número sencer i ens contesta de diferent manera segons es contesti amb un número parell o senar.
#include <stdio.h> 

int main(void)
{
    int num; 
    printf("Escriu un número sencer");
    scanf("%d",&num); 

    if (num % 2 == 0)
    {
       printf("Has escrit un número parell.");
       printf("M'agraden els parells.");
    }
    else
    {
       printf("Has escrit un número senar.");
       printf("No m'agraden els números senars.");
    }

5.1.6. Exemple: Estructures alternatives niades.

Aquest programa distingeix si un número escrit des de teclat pertany a un dels intervals [0,2], [3,5] i [6,9].
#include <stdio.h> 

int main(void)
{
    char tecla =' '; 
    printf("Prem un dígit''\n");
    tecla = getchar(); 

    if ((tecla >= '0') && (tecla < '3'))
           printf("Has pres un número de l'interval [0,2]";
    else if ((tecla > '2') && (tecla < '6'))
            printf("Has pres un número de l'interval [3,5]";
    else if ((tecla > '5') && (tecla <= '9'))
           printf("Has pres un número de l'interval [6,9]"; 

    return 0;

Encara que es poden fer aquests tipus d'estructures i fer-les tant llargues com voldrem, no és convenient abusar, car el codi es fa il·legible i es perd la facilitat per trobar errades. 

5.2. L'estructura alternativa múltiple. La sentència switch.

Observa el següent programa. El que fa és posar en pantalla les opcions d'un menú i permetre que l'usuari triï l'opció. Segons la opció que triï es realitzar una de les quatre opcions alternatives possibles. Si l'usuari no tria s'executa l'opció per defecte:
#include <stdio.h>
void main(void)
{
    char opcio = ' '; 

    int i; 

    printf("\nAquest és mi primer menú\n\n");
    printf("0.-Adeu\n");
    printf("1.-Salutacions\n");
    printf("2.-Multiples de dos menors que 100\n");
    printf("3.-La vaca s'escriu amb v\n");
    fflush(stdin);
    opcio=getchar(); 

    switch (opcio) 
    {
       case '1':
          printf("Molt de gust d'estar amb tu\n");
          break;
       case '2':
          for (i=1;i<=100;i++)
             printf("%4d",i*2);
          break;
       case '3':
          for(i=1;i<11;i++)
             printf("%2d.-La vaca s'escriu amb v\n",i);
          break;
       case '0':
          printf("Ha estat divertit, no?\n");
          break;
       default:
          printf("No has triat bé\n");
    }

5.3 RUPTURES DE CONTROL

5.3.1 La sentència break.

Ja hem vist que s'utilitza aquesta sentència a la instrucció switch en la forma següent:
switch (<expressió>)
{
        case expressió constant1:
                instruccions;
                break;
        case expressió constant2:
                instruccions;
                break;
        case expressió constant3:
                instruccions;
                break;
        default:
                instruccions;
}
De manera que tenim un bloc complet d'instruccions que comença amb la primera clau { i acaba en la segona clau }. Si el programa es troba amb la sentència break dins del bloc salta totes les instruccions posteriors al break del bloc i continua a la primera instrucció posterior al bloc. En general la sentència break inclosa dins d'una estructura de control de flux del programa actua de la mateixa manera. 

5.3.2. Exemple: Ruptura de control dins d'un cicle for.

El següent programa genera una sèrie de 20 números enters aleatoris i els emmagatzema en una matriu de nom numero. Desprès els impremeix i diu el lloc on es troba el 5 si és que hi és entre ells.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

void main(void) 
{
    int numero[20]; 

    int i;
    time_t t;
    char trobat = 0;
    srand((unsigned)time(&t));

    for (i=1;i<21;i++)  numero[i]=1+(rand()%20);
    for (i=1;i<21;i++)  printf("%3d",numero[i]);

    for (i=1;i<21;i++)
    {
       if (numero[i]==5) 
       {
           trobat=1;
           break;
      }
    }

    if (trobat) printf("\nEl primer numero 5 es troba a la posició %d \n",i);
    else printf("\nEl numero 5 no ha sortit en el sorteig\n");

5.3.3. Exemple: Ruptura de control dins d'un cicle while.

En el següent programa es controla la sortida d'un bucle mitjançant un break. Només es pot sortir del bucle si l'usuari prem la tecla *.
#include <stdio.h>
#include <conio.h> 

void main(void) 
{
    char tecla, fer=1; 

    int tecles=0;
    printf("Aquest programa es trenca només quan es prem *\n");
    while (fer) 
    {
       printf("Prem una tecla ");
       tecla =getche( );
       if (tecla=='*') break;
       tecles++;
       printf("\nNo has premut l'arterisc\n");
    }
    printf("\nTotal tecles: %d\n",tecles);
}

5.3.4. La sentència continue

És la sentència contraria a la sentència break. Quan es posa una sentència continue dins d'una estructura iterativa, si s'executa, fa que el control retorni al principi del cicle.
#include <stdio.h>
#include <conio.h>
#include <ctype.h>

void main(void) 
{
    char confirmacio='S'; 

    float mitjana, num, suma=0;
    int comptador=0;
    printf("Aquest programa calcula la mitjana aritmètica de números positiurs\n");
    while(confirmacio=='S') 
    {
           printf("Entra el numero %d: ",comptador+1);
           fflush(stdin);
           scanf("%f",&num);
           if (num<0 ) 
          {
              printf("Numero negatiu\n");
              continue;
          }
          suma +=num;
          comptador++;
          printf("Més números (s/n)");
          confirmació=toupper(getche( )); printf("\n");
    }
    mitjana=suma/comptador;
    printf("La mitjana és %f\n ",mitjana);

5.4. Com no utilitzar break i continue

5.4.1. Exemple: Estalviem-nos la sentència break

 
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>

void main(void) 
{
    int numero[20]; 

    int i;
    time_t t;

    srand((unsigned) time(&t));
    for(i=1; i< 21; i++)   numero[i]=1 + (rand() % 20);
    for(i=1; i< 21; i++)   printf("%3d",numero[i]);

    for(i=1; (i<21)&& (numero[i] != 5); i++);

    if (numero[i] == 5) printf("\nEl primer numero 5 es troba a la posició %d\n",i);
    else printf("\nEl numero 5 no ha sortit en el sorteig\n");
}

5.4.2. Exemple: Estalviem-nos la sentència break.

 
#include <stdio.h>
#include <conio.h>

void main(void) 
{
    char tecla; 

    int tecles = 0;
    printf("El programa finalitza quan es prem *\n");
    printf("Prem una tecla ");
    tecla = getche( );
    while (tecla != '*') 
    {
       tecles++;
       printf("\nNo has premut l'asterisc\n");
       printf("Prem una tecla ");
       tecla = getche();
    }
    printf("\nTotal tecles: %d\n",tecles);

5.4.3. Exemple: Estalviem-nos la sentència continue

 
#include <stdio.h>
#include <conio.h>

void main(void) 
{
    char confirmacio='S'; 

    float mitjana, num, suma = 0;
    int comptador=0;

    printf("Càlcul de la mitja aritmètica de números positius\n");
    while (confirmacio=='S') 
    {
       printf("Entra el numero %d: ",comptador+1);
       fflush(stdin);
       scanf("%f", &num);
       while (num < 0) 
      {
          printf("Numero negatiu\n");
          printf("Entra el numero %d: ",comptador+1);
          fflush(stdin);
          scanf("%f", &num);
      }
      suma += num;
      comptador++;
      printf("Més números (s/n) ");
      confirmacio=toupper(getche()); printf("\n");
    }
    mitjana = suma / comptador;
    printf("La mitjana ‚s %f\n",mitjana);

5.5. La sentència goto.

La sentència goto, maldita en Basic i Fortran, existeix també en el llenguatge C, però en C es pot prescindir d'ella gairebé sempre. Kernighan i Ritchie diuen d'ella una galanteria: "utilitzar-la és abusar d'ella ". El que fa es donar salts a una etiqueta declarada prèviament. Els bons programadors permeten l'ús d'aquesta sentència només en cas de trobar-se amb un "lio tremendo", com el de l'exemple.
...
while (opcio)   
{
  for( i=1; i<=100; i++)        
  {
        for( j=1; j<=100; j++)
        {
          moltes línies de programa;
          if (tremendo problema)
                  goto socors;
          més línies de programa;
         }
         més sentències;
   }
   encara més sentències;
}
i encara més sentències;
socors: arranjar el problema o anar-se dignament.

5.6. Exercicics

  1. Un programa demana un número. Si és parell el multiplica per dos i li suma tres. Si és senar el multiplica per tres i li resta 4. Evidentment informa de que ha fet i informa del resultat.
  2. Un programa demana que es premi una tecla. Mentre no es premi la tecla 'F' el programa no finalitza. Cada vegada que es prem una tecla contesta dient si has premut una vocal o no.
  3. Un programa demana tecles igual que en el problema 2, però ara el programa ens diu si és majúscula o minúscula.
  4. Un programa demana que nota ens han posat en llengua. Es pot contestar I, S, B, N, E. Segons el cas el programa executarà la funció que faràs en els problemes 5, 6, 7, 8 i 9 respectivament.
  5. El programa demana que es premi una tecla. Si és vocal el programa diu "Les vocals son el primer que has d'aprendre". Si és majúscula i no vocal diu "Les consonants majúscules son BCDFGHJKLMNPQRSTUVWXYZ". Si és minúscula i no vocal diu "Les consonants minúscules son bcdfghjklmnpqrstuvwxyz".
  6. El programa demana tres vocals. Si efectivament ho son el programa confirma que tens un Suficient si no diu que no havies d'haver aprovat.
  7. El programa posa a la pantalla les següents opcions:
  8. 1) a
    2) x
    3) g
    4) z
    5) u
    Tria la primera lletra de l'abecedari
    Tria la darrera lletra de l'abecedari
    Si ho fa bé contesta dient que molt bé i que el Bé és efectivament bé. Si no li rebaixa la nota a Suficient.
  9. El programa sorteja 10 lletres de l'abecedari i demana de cadascuna si és vocal o consonant cadascuna. Ha de contestar 7 vegades bé per que el programa confirmi el notable.
  10. El programa posa a la pantalla primer les lletres "a c" i demana la del mig. Després la "b d" i demana la del mig. I així successivament. Ha d'haver un 80% de contestacions correctes per confirmar l'excel·lent.