jueves, 15 de noviembre de 2012

¿Por qué utilizar una sentencia switch?


Para un número pequeño de evaluaciones lógicas con una estructura if ... else if ...  es perfectamente adecuado. Por desgracia, una estructura de este tipo con muchas preguntas resulta difícil de leer y darle mantenimiento. Como un ejemplo de ello consideremos siguiente ejemplo. El programa está diseñado para evaluar enteros entre 0 y 5 introducido por teclado:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
      NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

      int valor;

      printf ("Enter a number between 0 and 5: ");

      scanf ("%i", &valor);

      if (valor == 0)
        NSLog (@"cero");
      else if (valor == 1)
        NSLog (@"un simio");
      else if (valor == 2)
        NSLog (@"dos simios");
      else if (valor == 3)
        NSLog (@"tres simios");
      else if (valor == 4)
        NSLog (@"cuatro simios");
      else if (valor == 5)
        NSLog (@"cinco simios");
      else
        NSLog (@"Valor fuera de rango");

      [pool drain];
      return 0;
}

Como se puede ver, mientras que el código no es demasiado excesivo ya está empezando a ser un poco difícil de leer y también tomó más tiempo para escribir del que debería ser necesario.
Imaginemos, sin embargo, si en vez de cinco números que teníamos que probar más.
Es evidente que una solución más fácil es la sentencia switch.

Sintaxis de la sentencia switch

La sintaxis de la sentencia switch en Objective-C es la siguiente:

 switch (expresion)

 {
     case valor1:

          sentencias

          break;

     case valor2:

          sentencias

          break;

     default:

          sentencias

          break;

 } 


Con estra estructura evaluaremos la expresión en cada uno de sus resultados o "casos". Si el caso se cumple, se ejecutarán las sentencias hasta encontrarse el comando break. Si ningún caso de cumple, se ejecutarán las sentencias debajo de la palabra reservada default.


Ejemplo de una estructura condicional switch



Siguiendo el ejemplo de las sentencias if... else if, aplicaremos la sentencia switch:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

   int valor;

   printf ("Introduce un número entre 0 y 5: ");

   scanf ("%i", &valor);

   switch (valor)
   {
      case 0:
        NSLog (@"No hay simios");
        break;
      case 1:
        NSLog (@"Un solitario simio");
        break;
      case 2:
        NSLog (@"Dos simios");
        break;
      case 3:
        NSLog (@"Tres simios");
        break;
      case 4:
        NSLog (@"Cuatro simios");
        break;
      case 5:
        NSLog (@"Cinco simios");
        break;
      default:
        NSLog (@"Número fuera de rango");
        break;
   }
        [pool drain];
        return 0;
}

Cuando el usuario teclea un número, la sentencia switch verifica si se encuentra en el rango y envía un mensaje correspondiente a la ventana de salida. Si el número, o lo que haya tecleado el usuario, no se encuentra en el rango, se ejecutará la sentencia debajo de default, indicando que el número se encuentra fuera de rango.

Combinando las intrucciones del case


Si queremos que se ejecuten varias sentencias al mismo tiempo, equivalentes a un OR en una estructura if, simplemente escribimos las sentencias case juntas, y se cumplirán todas las sentencias  hasta encontrarse con un break. En el siguiente caso se ejecutarán conjuntamente las opciones 0, 1 y 2:

   switch (valor)
   {
      case 0:
      case 1:
      case 2:
        NSLog (@"cero, uno o dos");
        break;
      case 3:
        NSLog (@"tres");
        break;
      case 4:
        NSLog (@"cuatro");
        break;
      case 5:
        NSLog (@"cinco, aqui te brinco");
        break;
      default:
        NSLog (@"Fuera de rango");
        break;
   }


No hay comentarios:

Publicar un comentario