[C con Clase] sentencia switch

Steven Davidson srd4121 en njit.edu
Mie Jul 29 19:34:41 CEST 2009


Hola Pablo,

Pablo Coletto wrote:
> Hola recien estoy empezando con el curso de programacion y no logro
> entender las sentencias switch. como es su sintaxis y algunos
> ejemplos para entender su funcionamiento.

La sentencia 'switch/case' sirve para seleccionar una o varias 
sentencias a ejecutar. Básicamente, saltamos a una sentencia para 
continuar con la ejecución a partir de ella. sólo realizamos un salto 
adentro, si el valor del 'switch' se puede emparejar con otro en algún 
'case'. Sin embargo, realizamos un solo salto; no saltamos adentro y 
luego saltamos fuera del 'switch/case'. Esto implica que tenemos que 
tener cuidado de no seguir la ejecución en otro 'case' si no queremos. 
Para esto, el convenio es usar 'break' en esta situación. Por ejemplo,

int num = 10;
float a;

switch( num )
{
   case 0:
     a = 5;
   break;

   case 1:
     a = 3.54;
   break;

   case 2:
   case 5:
   case 7:
   case 9:
     a = -9.201;
   break;

   case 3:
   case 4:
   case 6:
   case 8:
     a = .4352;
   break;

   case 10:
     a = -6.399307;
   break;

   default:
     a = 0;
}

int b = a + 5;


En este ejemplo, como 'num' es 10, la sentencia 'switch/case' salta a la 
sentencia con la etiqueta 'case 10'. Seguimos ejecutando sentencias a 
partir de ésta. Después de la asignación a la variable 'a', ejecutamos 
la siguiente sentencia, que es 'break'. Esta sentencia nos hace salir de 
inmediato de la sentencia 'switch/case' para seguir ejecutando el 
programa. La siguiente sentencia es la definición e inicialización de la 
variable 'b'.

Te pongo otro ejemplo en el que no usamos 'break':

int nivel = 0;
...
while( bNoPasaNadaGrave )
{
   switch( nivel )
   {
     case 0:
       IniciarMemoria();
       nivel = 1;

     case 1:
       IniciarDispositivos();
       nivel = 2;

     case 2:
       IniciarUsuarios();
       nivel = 3;

     case 3:
       IniciarSesiones();
       nivel = -1;
   }
   ...
}

Aquí, al principio, 'nivel' es 0, por lo que saltaremos al caso 0 para 
ejecutar la siguiente secuencia:

IniciarMemoria();
nivel = 1;
IniciarDispositivos();
nivel = 2;
IniciarUsuarios();
nivel = 3;
IniciarSesiones();
nivel = -1;

La idea es que es posible que suceda algo grave que interrumpa nuestra 
secuencia y tengamos que repetirla. Sin embargo, en lugar de repetir 
toda la secuencia, sólo tenemos que continuar por donde íbamos. Para 
esto, la variable 'nivel' nos indica qué paso hicimos para así continuar 
con el siguiente en nuestra secuencia.

Puedes ver claramente que no nos interesa usar 'break' para saltarnos 
cada caso, ya que queremos ejecutar todas las sentencias, pero no 
necesariamente desde el principio.

Tengo que reconocer que rara vez usaremos 'switch/case' para tal caso y 
normalmente verás el uso de 'switch/case' con 'break'. Esta forma de 
usar 'switch/case' es muy similar a un uso particular de la sentencia 
'if/else'. Volviendo al primer ejemplo, podemos reescribirlo así:

int num = 10;
float a;

if( 0 == num )
{
   a = 5;
}
else if( 1 == num )
{
   a = 3.54;
}
else if( 2 == num )
{
   a = -9.201;
}
else if( 5 == num )
{
   a = -9.201;
}
else if( 7 == num )
{
   a = -9.201;
}
else if( 9 == num )
{
   a = -9.201;
}
else if( 3 == num )
{
   a = .4352;
}
else if( 4 == num )
{
   a = .4352;
}
else if( 6 == num )
{
   a = .4352;
}
else if( 8 == num )
{
   a = .4352;
}
else if( 10 == num )
{
   a = -6.399307;
}
else  // default
{
   a = 0;
}

int b = a + 5;


Como puedes observar, esto es algo engorroso de escribir. Por eso, la 
opción de 'switch/case' es recomendable en estos casos por la claridad 
del programa.

> Desde ya gracias y perdon por mi ignorancia

No hay nada que perdonar. Creamos esta lista para aclarar las dudas.


Espero haber aclarado el tema.

Steven




Más información sobre la lista de distribución Cconclase