Una
instrucción
alternativa múltiple (o simplemente alternativa múltiple)
permite seleccionar, por medio de una expresión, el
siguiente
bloque de instrucciones a ejecutar de entre varios posibles. En
lenguaje C, para escribir una alternativa múltiple se
utiliza la sintaxis:
switch
( <expresión> )
{
case
<expresión_1> : [
<bloque_de_instrucciones_1> ]
[ break; ]
case
<expresión_2> : [
<bloque_de_instrucciones_2> ]
[ break; ]
...
case
<expresión_n> : [
<bloque_de_instrucciones_n> ]
[ break; ]
[ default :
<bloque_de_instrucciones_n+1> ]
}
|
El resultado de evaluar la <expresión>
debe ser un valor perteneciente a un tipo de dato finito y ordenado, es
decir, entero, lógico, carácter, enumerado o
subrango.
Dependiendo del valor obtenido al evaluar la <expresión>,
se ejecutará un bloque de instrucciones u otro.
Opcionalmente, se puede escribir un <bloque_de_instrucciones_n+1>
después de default
:. Este bloque de instrucciones se ejecutará en
el caso de que el valor obtenido al evaluar la <expresión>,
no se encuentre en ninguna de las expresiones después de
cada case.
Ejemplo
1: Se quiere escribir
un programa
que:
1º)
Pida por teclado el número (dato entero) de un
día de la semana.
2º) Muestre por
pantalla el nombre (dato cadena) correspondiente a dicho día.
Nota:
Si el número de día introducido es menor que 1
ó
mayor que 7, se mostrará el mensaje: "ERROR: Día
incorrecto.".
En pantalla:
Introduzca dia de la semana: 2
Martes
|
Introduzca dia de la semana: 9
ERROR: Dia incorrecto.
|
Solución
propuesta:
|
#include
<stdio.h>
int
main()
{
int
dia;
printf( "\n
Introduzca dia de la semana: " );
scanf( "%d",
&dia );
switch
( dia )
{
case 1
: printf( "\n
Lunes" );
break;
case 2
: printf( "\n
Martes" );
break;
case 3
: printf( "\n
Miercoles" );
break;
case 4
: printf( "\n
Jueves" );
break;
case 5
: printf( "\n
Viernes" );
break;
case 6
: printf( "\n
Sabado" );
break;
case 7
: printf( "\n
Domingo" );
break;
default
: printf( "\n
ERROR: Dia incorrecto." );
}
return 0;
}
|
En la sintaxis de una instrucción alternativa
múltiple,
obsérvese que, después de cada bloque de
instrucciones se
puede escribir, opcionalmente, la instrucción break.
Dicha instrucción no se va a estudiar con
detenimiento en
este apartado, ya que, de momento, basta con saber que en una
instrucción switch,
la escribiremos, casi siempre, después de cada bloque de
instrucciones, a excepción del último. Para
comprender su
funcionamiento, pruebe a ver que ocurre si omite
algún break
en el código del programa del ejemplo 1.
Estúdiese
también el siguiente ejemplo.
Ejemplo
2: En la siguiente tabla se
muestran las categorías a las que pertenecen los signos del
zodíaco:
Se quiere escribir un programa que:
1º)
Muestre el listado de los signos del zodíaco, con sus
números asociados.
2º) Pida por
teclado un número (dato entero) asociado a un signo del
zodíaco.
3º) Muestre la
categoría a la que pertenece el signo del zodíaco
seleccionado.
Nota: Si el
número introducido por el usuario,
no está asociado a ningún signo del
zodíaco, se
mostrará el mensaje: "ERROR:
<número> no
está asociado a ningún signo.".
En pantalla:
Listado de signos del zodiaco:
1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10.
Capricornio
12. Acuario
13. Piscis
Introduzca
numero de signo: 7
Es un signo
de Aire.
|
Listado de signos del zodiaco:
1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10.
Capricornio
12. Acuario
13. Piscis
Introduzca
numero de signo: 15
ERROR: 15 no
esta asociado a ningun signo.
|
Una posible solución es:
|
#include
<stdio.h>
int
main()
{
int
numero;
printf( "\n
Listado de signos del zodiaco:" );
printf( "\n\n
1. Aries" );
printf( "\n
2. Tauro" );
printf( "\n
3. Geminis" );
printf( "\n
4. Cancer" );
printf( "\n
5. Leo" );
printf( "\n
6. Virgo" );
printf( "\n
7. Libra" );
printf( "\n
8. Escorpio" );
printf( "\n
9. Sagitario" );
printf( "\n
10. Capricornio" );
printf( "\n
11. Acuario" );
printf( "\n
12. Piscis" );
printf( "\n\n
Introduzca numero de signo: " );
scanf( "%d",
&numero );
switch
( numero )
{
case 1
:
case 5
:
case 9
: printf( "\n
Es un signo de Fuego." );
break;
case 2
:
case 6
:
case 10
: printf( "\n
Es un signo de Tierra." );
break;
case 3
:
case 7
:
case 11
: printf( "\n
Es un signo de Aire." );
break;
case 4
:
case 8
:
case 12
: printf( "\n
Es un signo de Agua." );
break;
default
: printf( "\n
ERROR: %d no esta asociado a ningun signo.",
numero );
}
return 0;
}
|
Otra solución es:
|
#include
<stdio.h>
#include
<string.h>
int
main()
{
int
numero;
char
categoria[7];
printf( "\n
Listado de signos del zodiaco:" );
printf( "\n\n
1. Aries" );
printf( "\n
2. Tauro" );
printf( "\n
3. Geminis" );
printf( "\n
4. Cancer" );
printf( "\n
5. Leo" );
printf( "\n
6. Virgo" );
printf( "\n
7. Libra" );
printf( "\n
8. Escorpio" );
printf( "\n
9. Sagitario" );
printf( "\n
10. Capricornio" );
printf( "\n
11. Acuario" );
printf( "\n
12. Piscis" );
printf( "\n\n
Introduzca numero de signo: " );
scanf( "%d",
&numero );
switch
( numero % 4
)
{
case 1
: strcpy( categoria, "Fuego"
);
break;
case 2
: strcpy( categoria, "Tierra"
);
break;
case 3
: strcpy( categoria, "Aire"
);
break;
case 0
: strcpy( categoria, "Agua"
);
}
if
( numero >= 1
&& numero <= 12 )
printf( "\n
Es un signo de %s.", categoria );
else
printf( "\n
ERROR: %d no esta asociado a ningun signo.",
numero );
return 0;
}
|
En esta
segunda solución existen las siguientes diferencias
importantes con respecto a la solución anterior:
- En el
código
se utiliza una alternativa doble (if),
además de una alternativa
múltiple (switch).
- En la
alternativa múltiple no se escribe el <bloque_de_instrucciones_n+1>.
- La <expresión>
de la alternativa múltiple es diferente.
- La
expresión "\n
Es
un signo de " sólo se escribe una vez.
- Se ha utilizado
una variable más (un array de caracteres): categoria
- Se ha empleado
la función strcpy,
que, como ya vimos en el apartado 1.8 Operadores y
expresiones, está disponible en la biblioteca
estándar de C.
|