Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sentencia switch.
Importancia de break.
Importancia de default.
Sentencia switch.
En las secciones anteriores se ha estudiado un tipo de flujo de control limitado a las
posibilidades ofrecidas por las sentencias alternativas (if-else) y repetititivas (for,
while). Las sentencias alternativas permiten especificar la reacción del programa en
distintas circunstancias; si la lógica del algoritmo empleado se ajusta a un comportamiento
más o menos dicotómico, es posible construir un árbol de sentencias if() anidadas que
generen el comportamiento necesario. Sin embargo, es frecuente hallar grupos de
situaciones (y por tanto de respuestas de programa) que se reducen a una lista de
posibilidades mutuamente excluyentes. Ciertamente, se puede implementar un algoritmo de
este tipo mediante múltiples sentencias
if()-else anidadas, pero esta solución
resulta farragosa y poco eficiente, porque
el código tiene que ir comprobando una
por una todas las posibilidades (todas las
condiciones if()) hasta encontrar la
correcta.
El lenguaje C ofrece otra posibilidad:
construir una expresión ordinal
(posiblemente basada en un tipo
enumerado) que tipifique las posibles
situaciones y ejecutar el código
correspondiente a cada valor de esta
expresión sin necesidad de examinar los
demás. La sentencia switch es un
selector multivía, que admite como
argumento el valor de una expresión
ordinal, y desencadena la ejecución del
código correspondiente, identificado
mediante uno o más valores constantes
del mismo tipo ordinal que la expresión.
La sintaxis de esta sentencia es como
sigue:
switch( expresión_ordinal )
{
case constante_1 : Bloque_1;
break;
case constante_2 : Bloque_2;
break;
case constante_3 :
case constante_4 :
case constante_5 : Bloque_3;
break;
...
default : Bloque_4;
break;
}
No me ha dado argumentos.
Argumento[0] = ./a.out
[cauldron:~/coti>]> ./a.out 1
Me ha dado un argumento.
Argumento[0] = ./a.out
Argumento[1] = 1
[cauldron:~/coti>]> ./a.out 1 2 3
Me ha dado 2, 3 o 4 argumentos.
Argumento[0] = ./a.out
Argumento[1] = 1
Argumento[2] = 2
Argumento[3] = 3
[cauldron:~/coti>]> ./a.out 1 2 3 4 5 6 7
Argumento[0] = ./a.out
Argumento[1] = 1
Argumento[2] = 2
Argumento[3] = 3
Argumento[4] = 4
Argumento[5] = 5
Argumento[6] = 6
Argumento[7] = 7
[cauldron:~/coti>]>
Importancia de break
Cuando el control del programa llega a una sentencia switch y se evalúa la expresión de
control de la misma, el programa comienza a ejecutar las sentencias presentes en el bloque
correspondiente a alguna cláusula case, o quizá a la claúsula default. ¿Qué sucede después
de ejecutar la última sentencia del bloque? Si el bloque es el último, el programa ejecuta la
sentencia inmediatamente siguiente al switch. Pero si no es el último, el programa ejecuta la
primera sentencia inmediatamente siguiente al bloque. Y luego la siguiente, y la siguente,
etc. La sentencia break, sirve para hacer que el programa abandone la sentencia switch. Si
no se encuentra un break, se ejecuta el siguiente bloque de código, y así hasta hallar un
break o salir de la sentencia switch.
Dicho de otro modo, las cláusulas case son puntos de entrada al conjunto de líneas de
código que hay en el interior del switch. Las sentencias break son puntos de salida, y
debemos organizar cuidadosamente ambas cosas para evitar errores que no podrá detectar
el compilador.
La estructura switch se utiliza con mucha frecuencia; véase el Ejercicio 1.
Importancia de default.
La sentencia switchestá especialmente indicada para construir menús: en efecto, se ofrece
al usuario una colección de opciones, y este indica su preferencia pulsando una tecla o
haciendo clic con el ratón en algún lugar. Esta elección del usuario es fácilmente
transformable en números enteros, y una sentencia switch permite fácilmente asignar
acciones a esos números. De hecho, la sentencia switch se va a utilizar para construir
algunas esqueletos de programa, aun cuando prescindiremos de ella en cuanto dispongamos
del interesante concepto de puntero de función.
Ejercicio 1.- Construir un programa que resuelva ecuaciones de segundo grado empleando
sentencias switch.
/*
Este programa sirve para resolver ecuaciones cuadráticas.
Es un ejemplo de utilización de la sentencia switch.
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
printf ("Ecuaciones cuadráticas");
printf("\n\nEscriba los coeficientes a, b y c : ");
scanf("%f %f %f", &a, &b, &c);
d = b*b - 4.0*a*c;
/*
Basado en nucleosp.pas
*/
#include<stdio.h>
void main(void)
{
int fin; /* control de iteración del programa */
char instruccion; /* dada por el usuario */
char menu[80]; /* que muestra el programa */
char opcionesvalidas[80]; /* que admite el programa */
/* Iniciaciones generales */
do {
do {
printf("%s ", menu);
scanf("%c%*c",&instruccion);/* Se descarta el \n del usuario */
instruccion=toupper(instruccion);
} while (!strchr(opcionesvalidas,instruccion));
/* "dispatcher" */
switch(instruccion)
{
case 'S': {
fin = 1;
puts("Nos vamos!\n");
}
break;
case 'O': {
puts("Estamos operando.\n");
}
break;
default : {
puts("Instrucción incorrecta.\n");
}
break;
}
}
while (!fin);