La sentencia switch da una alternativa mucho más refinada a la necesidad de utilizar o implementar múltiples sentencias condicionales if cuando deseamos que una determinada variable tome diferentes valores para cada condición.
Generalmente, la sentencia switch se implementa cuando es necesarario la utilización de un menú de opciones ya que el usuario deberá escoger una de las opciones, a esto me refiero cuando comento que la variable puede tomar diferentes valores.
En primer lugar, decir que en inglés switch significa algo así como conmutar, cambiar. Esta instrucción tiene la estructura que se muestra a continuación:
- switch(/* Variable a comprobar */) {
- }
La variable a comprobar será la variable que queramos testear si contiene un resultado. Dichos testeos los haremos usando dentro de los corchetes la palabra reservada case, junto a unos paréntesis y dos puntos. Para indicar que hemos acabado el bloque de instrucciones usaremos la palabra reservada break; seguida de un punto y coma. Entendamos mejor esto con el siguiente ejemplo:
- Console.WriteLine("Seleccione una opción:");
- Console.WriteLine("1. Sumar");
- Console.WriteLine("2. Restar");
- int opcionSeleccionada = Convert.ToInt32(Console.ReadLine());
- switch(opcionSeleccionada) {
- case (1):
- Console.WriteLine("Seleccionada opción 1");
- break;
- case (2):
- Console.WriteLine("Seleccionada opción 2");
- break;
- case (0):
- Console.WriteLine("Opción incorrecta");
- break;
- }
En este caso, vemos como la variable que testeamos es la variable opcionSeleccionada (Línea 8), que justamente acaba de introducir el usuario para seleccionar una opción de un menú. Si la variable contiene el valor 1 (Línea 9), entonces se mostrará el mensaje “Seleccionada la opción 1” para luego salirse del switch con la instrucción break;
Si seleccionamos la opción 2, veremos “Seleccionada la opción 2“, saliendose del switch después, y lo mismo ocurre con la opción 0, que muestra “Opción incorrecta” y luego abandona el swich.
Break, saliendo del switch
Para salir del switch, como ya hemos visto, usamos la palabra break, cuya función es dar por terminada la función switch y continuar inmediatamente después de esta. Una de las cosas que podemos hacer es apliar varias instrucciones antes de una instrucción break para que ambas ejecuten las mismas líneas:
- Console.WriteLine("Seleccione una opción:");
- Console.WriteLine("1. Sumar");
- Console.WriteLine("2. Restar");
- Console.WriteLine("0. Salir");
- int opcionSeleccionada = Convert.ToInt32(Console.ReadLine());
- switch(opcionSeleccionada) {
- case (1):
- case (2):
- Console.WriteLine("Seleccionadas opción 1 o 2");
- break;
- case (3):
- Console.WriteLine("Seleccionada opción 3");
- break;
- case (0):
- Console.WriteLine("Opción incorrecta");
- break;
- }
Así, al haber apliado case (1): y case (2): uno encima del otro, y al no haber un break entre ellos, tanto si tecleamos 1 como si 2 se ejecutará la línea que escribe “Seleccionadas opción 1 o 2”, saliendo del swich después de hacerlo por el break;. Podemos apliar tantos case() como queramos.
Advertencia de programación
Toda instrucción case debe terminar en una instrucción break, esté apilada o no. No hacerlo es un error de compilación.
Default, qué hacer en cualquier otro caso
Cuándo necesitemos hacer algo en cualquier otro caso a los diferentes cases, usaremos la instrucción default: seguida de dos puntos. Las líneas dentro de esta etiqueta se ejecutarán si el valor no coincide con el valor de las otras etiquetas case, hasta, nuevamente, salir de la instrucción switch con un break.
Advertencia de programación
La instrucción default también debe terminar en una instrucción break. No hacerlo es un error de compilación.
- Console.WriteLine("Seleccione una opción:");
- Console.WriteLine("1. Sumar");
- Console.WriteLine("2. Restar");
- int opcionSeleccionada = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("introduzca el primer número:");
- int num1 = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("introduzca el segundo número:");
- int num2 = Convert.ToInt32(Console.ReadLine());
- switch(opcionSeleccionada) {
- case (1):
- int suma = num1 + num2;
- Console.WriteLine("Resultado de la suma: " + suma);
- break;
- case (2):
- int resta = num1 - num2;
- Console.WriteLine("Resultado de la resta: " + resta);
- break;
- default:
- Console.WriteLine("Opción incorrecta");
- Console.ReadKey();
- return; // Return sale del método main y por lo tanto cierra el programa en aplicaciones de consola
- break;
- }
En este caso, hemos creado una aplicación práctica, una pequeña calculadora, que nos permite sumar o restar según el número que introduzcamos. Si introducimos el número 1, que quedará guardado en la variable opcionSeleccionada, al llegar al switch/case, se sumarán los valores y se imprimirá el resultado de la suma. Si introducimos el número 2, entonces se restarán, y si introducimos cualquier otra cosa entonces aparecerá el mensaje “Opción incorrecta” y la aplicación esperará a que presionemos una tecla y luego se cerrará.
Uso con tipos de datos
Sin ningún problema, podemos usar switch/case con diferentes tipos de datos, como por ejemplo float, double o string. Cada uno de estos tipos de datos debe ir con sus correspondientes valores explícitos, como por ejemplo, “a” para un string o 4.0 para un double, Así, por ejemplo, podemos hacer el ejemplo anterior de la siguiente manera:
- Console.WriteLine("Seleccione una opción:");
- Console.WriteLine("S: Sumar");
- Console.WriteLine("R: Restar");
- string opcionSeleccionada = Console.ReadLine();
- Console.WriteLine("introduzca el primer número:");
- int num1 = Convert.ToInt32(Console.ReadLine());
- Console.WriteLine("introduzca el segundo número:");
- int num2 = Convert.ToInt32(Console.ReadLine());
- switch(opcionSeleccionada) {
- case ("S"):
- case ("s"):
- int suma = num1 + num2;
- Console.WriteLine("Resultado de la suma: " + suma);
- break;
- case ("R"):
- case ("r"):
- int resta = num1 - num2;
- Console.WriteLine("Resultado de la resta: " + resta);
- break;
- default:
- Console.WriteLine("Opción incorrecta");
- Console.ReadKey();
- return; // Return sale del método main y por lo tanto cierra el programa en aplicaciones de consola
- break;
- }
Nótese cómo en este caso, el string se testea la letra S para sumar y la letra R para restar. También hay que destacar que se ejecuta el mismo código si la letra es mayúscula o minúscula, porque hemos apilado diferentes cases.
Igual que las instrucciones if
Si nos damos cuenta, una instrucción switch/case es equivalente a varias instrucciones if con comparaciones respecto a los mismos valores. Por ejemplo, el siguiente código con switch/case:
- int numero = 3;
- switch(numero) {
- case(1):
- Console.WriteLine("Numero es 1");
- break;
- case(2):
- Console.WriteLine("Numero es 2");
- break;
- case(3):
- Console.WriteLine("Numero es 3");
- break;
- default:
- Console.WriteLine("Numero no es ni 1 ni 2 ni 3");
- break;
- }
tiene exactamente el mismo comportamiento que lo siguiente, escrito con ifs:
- int numero = 3;
- if(numero == 1)
- {
- Console.WriteLine("Numero es 1");
- }
- else if(numero == 2)
- {
- Console.WriteLine("Numero es 2");
- }
- else if(numero == 3)
- {
- Console.WriteLine("Numero es 3");
- }
- else
- {
- Console.WriteLine("Numero no es ni 1 ni 2 ni 3");
- }
y ambos producirán la misma salida. Es elección del programador elegir cuándo usar uno u otro, en función de cual haga más cómoda la lectura o cual resulte más sencillo de escribir, ya que son análogos.
Un ejemplo es:
#include<stdio.h>
main() {char ch;printf("Introduzca una vocal: ");
ch=getchar();
switch(ch) {case 'a': puts("Se ha pulsado una a.");
case 'e': puts("Se ha pulsado una a.");
case 'i': puts("Se ha pulsado una a.");
case 'o': puts("Se ha pulsado una a.");
case 'u': puts("Se ha pulsado una a.");
default: puts("Error");
}
}