AnteriorPosterior

2.1.9. switch

  Curso: Programación en C# (2015), por Nacho Cabanes

2.1.9. switch

Si queremos ver varios posibles valores, sería muy pesado tener que hacerlo con muchos "if" seguidos o encadenados. La alternativa es emplear la orden "switch", cuya sintaxis es

switch (expresión)
{
    case valor1: sentencia1;
            break;
    case valor2: sentencia2;
            sentencia2b;
            break;
    case valor3: 
            goto case valor1;
     ...
    case valorN: sentenciaN;
            break;
    default:
            otraSentencia;
            break;
}
 

Es decir:

  • Tras la palabra "switch" se escribe 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 la expresión tiene un cierto 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 después de la palabra "default".
  • Si dos casos tienen que hacer lo mismo, se añade "goto case" a uno de ellos para indicarlo.

Vamos a ver un ejemplo, que diga si el símbolo que introduce el usuario es una cifra numérica, un espacio u otro símbolo. Para ello usaremos un dato de tipo "char" (carácter), que veremos con más detalle en el próximo tema. De momento nos basta que deberemos usar Convert.ToChar si lo leemos desde teclado con ReadLine, y que le podemos dar un valor (o compararlo) usando comillas simples:

// Ejemplo_02_01_09a.cs
// La orden "switch"  (1)
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_02_01_09a
{
    public static void Main()
    {
        char letra;
 
        Console.WriteLine("Introduce una letra");
        letra = Convert.ToChar( Console.ReadLine() )#41;;
 
        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" al final de cada cada caso (para evitar errores provocados por una "break" olvidado) con la única excepción de que un caso no haga absolutamente nada excepto dejar pasar el control al siguiente caso, y en ese caso se puede dejar totalmente vacío:

// Ejemplo_02_01_09b.cs
// La orden "switch"  (variante sin break)
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_02_01_09b
{
    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':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            case '0': Console.WriteLine("Dígito.");
                      break;
            default:  Console.WriteLine("Ni espacio ni dígito.");
                      break;
        }
    }
}
 

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 cadenas de texto ("strings").

Una cadena de texto, como veremos con más detalle en el próximo tema, se declara con la palabra "string", se puede leer de teclado con ReadLine (sin necesidad de convertir) y se le puede dar un valor desde programa si se indica entre comillas dobles. Por ejemplo, un programa que nos salude de forma personalizada si somos "Juan" o "Pedro" podría ser:

// Ejemplo_02_01_09c.cs
// La orden "switch" con cadenas de texto
// Introducción a C#, por Nacho Cabanes
 
using System;
 
public class Ejemplo_02_01_09c
{
    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:

Ejercicio propuesto 2.1.9.1: Crea un programa que pida un número del 1 al 5 al usuario, y escriba el nombre de ese número, usando "switch" (por ejemplo, si introduce "1", el programa escribirá "uno").
Ejercicio propuesto 2.1.9.2: Crea 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 (del 0 al 9) o algún otro carácter, usando "switch" (pista: habrá que usar un dato de tipo "char").
Ejercicio propuesto 2.1.9.3: Crea 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, usando "switch"
Ejercicio propuesto 2.1.9.4: Repite el ejercicio 2.1.9.1, empleando "if" en lugar de "switch".
Ejercicio propuesto 2.1.9.5: Repite el ejercicio 2.1.9.2, empleando "if" en lugar de "switch" (pista: como las cfras numéricas del 0 al 9 están ordenadas, no hace falta comprobar los 10 valores, sino que se puede hacer con "if ((simbolo >= '0') && (simbolo <='9'))").
Ejercicio propuesto 2.1.9.6: Repite el ejercicio 2.1.9.3, empleando "if" en lugar de "switch".

Actualizado el: 24-10-2014 15:26

AnteriorPosterior