3.1.10. switch
Si queremos ver varios posibles valores, sería muy pesado tener que hacerlo con muchos "if" seguidos o encadenados. La alternativa es la orden "switch", cuya sintaxis es
switch (expresión) { case valor1: sentencia1; break; case valor2: sentencia2; sentencia2b; break; ... case valorN: sentenciaN; break; default: otraSentencia; break; };
Es decir, se escribe tras "switch" la expresión a analizar, entre paréntesis. Después, tras varias órdenes "case" se indica cada uno de los valores posibles. Los pasos (porque pueden ser varios) que se deben dar si se trata de ese valor se indican a continuación, terminando con "break". Si hay que hacer algo en caso de que no se cumpla ninguna de las condiciones, se detalla tras "default". Si dos casos tienen que hacer lo mismo, se añade "goto case" a uno de ellos para indicarlo.
Vamos con un ejemplo, que diga si la tecla que pulsa el usuario es una cifra numérica, un espacio u otro símbolo:
/*---------------------------*/ /* Ejemplo en C# nº 20: */ /* ejemplo20.cs */ /* */ /* La orden "switch" (1) */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo20 { public static void Main() { char letra; Console.WriteLine("Introduce una letra"); letra = Convert.ToChar(Console.ReadLine()); switch (letra) { case ' ': Console.WriteLine("Espacio."); break; case '1': goto case '0'; case '2': goto case '0'; case '3': goto case '0'; case '4': goto case '0'; case '5': goto case '0'; case '6': goto case '0'; case '7': goto case '0'; case '8': goto case '0'; case '9': goto case '0'; case '0': Console.WriteLine("Dígito."); break; default: Console.WriteLine("Ni espacio ni dígito."); break; } } }
Cuidado quien venga del lenguaje C: en C se puede dejar que un caso sea manejado por el siguiente, lo que se consigue si no se usa "break", mientras que C# siempre obliga a usar "break" o "goto" en cada caso, para evitar errores difíciles de detectar. El fragmento anterior en C habría sido:
switch (tecla) { case ' ': printf("Espacio.\n"); break; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': printf("Dígito.\n"); break; default: printf("Ni espacio ni dígito.\n"); }
En el lenguaje C, que es más antiguo, sólo se podía usar "switch" para comprobar valores de variables "simples" (numéricas y caracteres); en C#, que es un lenguaje más evolucionado, se puede usar también para comprobar valores de "strings". Por ejemplo, un programa que nos salude de forma personalizada si somos "Juan" o "Pedro" podría ser:
/*---------------------------*/ /* Ejemplo en C# nº 21: */ /* ejemplo21.cs */ /* */ /* La orden "switch" (2) */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class Ejemplo21 { public static void Main() { string nombre; Console.WriteLine("Introduce tu nombre"); nombre = Console.ReadLine(); switch (nombre) { case "Juan": Console.WriteLine("Bienvenido, Juan."); break; case "Pedro": Console.WriteLine("Que tal estas, Pedro."); break; default: Console.WriteLine("Procede con cautela, desconocido."); break; } } }
Ejercicios propuestos:
- Crear un programa que lea una letra tecleada por el usuario y diga si se trata de una vocal, una cifra numérica o una consonante.
- Crear un programa que lea una letra tecleada por el usuario y diga si se trata de un signo de puntuación, una cifra numérica o algún otro carácter.