Enrere Mòdul 3
Fonaments de Programació. Llenguatge C/C++---
Pràctica  Resum teòric Exercicis
Pràctica d'ampliació

 
Menú d'entrada

Freqüentment es fa servir la sentència switch per processar ordres del teclat com un menú. En aquesta pràctica presentarem un exemple d'aquest tipus d'ús.

 

Desenvolupament de la pràctica

Creeu un nou arxiu del tipus C anomenat m3p06.c i escriviu el següent codi:

//m3p06.c - menú d'entrada -

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

void opcio1();
void opcio2();
void opcio3();
void opcio4();

int main(){
   char sel;

 

   system("clear");
   printf("Exemple de menú\n\n\n");
   printf("1. Descripció selecció 1\n\n");
   printf("2. Descripció selecció 2\n\n");
   printf("3. Descripció selecció 3\n\n");
   printf("4. Descripció selecció 4\n\n");
   printf("esc. sortir\n\n");

   printf("\n\n Seleccioneu una opció...");

   do{
       sel=getc(stdin);
   }while((sel<'1' || sel>'4')&&sel!=27); //esc=ASCII 27

   switch(sel){
       case '1':
            opcio1();
            break;

       case '2':
            opcio2();
            break;

       case '3':
            opcio3();
            break;

       case '4':
            opcio4();
            break;

       case 27:
            //sortida
            break;

       default:;
       //en aquest cas no hi ha possibilitat d'un altre cas
       //ja que la senténcia do...while comprova que l'entrada
       //es trobi entre 1 i 4.

    }
return 0;
}

void opcio1(){
    printf("Ha seleccionat la primera opció\n");
}

void opcio2(){
    printf("Ha seleccionat la segona opció\n");
}

void opcio3(){
    printf("Ha seleccionat la tercera opció\n");
}

void opcio4(){
    printf("Ha seleccionat la quarta opció\n");
}

 

Captura de l'execució del programa.

 

 

Explicació del programa

En primer lloc s'escriu a la pantalla la descripció de les opcions que l'usuari ha de seleccionar:

 

    printf("Exemple de menú\n\n\n");
    printf("1. Descripció selecció 1\n\n");
    printf("2. Descripció selecció 2\n\n");
    printf("3. Descripció selecció 3\n\n");
    printf("4. Descripció selecció 4\n\n");
    printf("esc. sortir\n\n");

    printf("\n\n Seleccioneu una opció...");

També demana a l'usuari que seleccioni una de les opcions abans impreses.

L'opció seleccionada es comprova amb el següent bucle:

 

    do{
        sel=getc(stdin);
    }while((sel<'1' || sel>'4')&&sel!=27); //esc=ASCII 27
 

Aquest bucle va llegint caràcters fins que el caràcter entrat sigui una de les opcions vàlides: un número entre 1 i 4 o el caràcter ASCII 27 que correspon a la tecla ESC (reflexioneu per què s'escriu '1' i '4' entre cometes i 27 sense cometes).

Quan el programa ha sortit d'aquest bucle, el contingut de la variable sel és una  opció vàlida del menú. La sentència switch comprova el valor d'aquesta variable i envia el control de l'execució a la sentència que hi ha a continuació de l'etiqueta case corresponent. Per exemple, si s'ha entrat un 3, la sentència que s'executa és una crida a la funció opcio3(). Una vegada completada la funció opcio3(), el control de l'execució torna al mateix lloc on es va cridar la funció i es troba una sentència break que fa un salt incondicional al final de la sentència switch que, en aquest cas, coincideix amb el final del programa.

En aquesta pràctica s'ha mostrat el lloc on s'ha de posar l'etiqueta default, encara que, tal i com s'explica al comentari, no és necessari en aquest cas, ja que es fan comprovacions suficients per garantir que el programa mai passarà per aquí.