jueves, 26 de abril de 2012

Estructuras de Control en C: La instrucción switch

Supongamos de nuevo que tenemos una lista con las calificaciones de un grupo de alumnos. Las calificaciones son números enteros entre 0 y 10. Usted necesita recibir las calificaciones e imprimirlas en la pantalla. Para esto puede usar la sentencia if.Sin embargo, el lenguaje C proporciona una instrucción más adecuada para éste tipo de casos en los cuales las opciones no se limitan a dos casos excluyentes: la instrucción switch. Para familiarizarse con ella es útil el siguiente programa. Es necesario escribirlo y ejecutarlo.

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                    *
 *    ESTE PROGRAMA RECIBE UN NUMERO DEL USUARIO Y    *
 *    DECIDE E IMPRIME SI ES 0, 1, 2,.....10          *
 * +++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                                        *
 *                                ALGORITMO:                              *
 * Pedir un numero al usuario                                             *
 * Recibir el numero                                                      *
 *                                                                        *
 * Si el numero es 0:                                                     *
 *     Imprime 'El numero es 0'                                           *
 * Si el numero es 1:                                                     *
 *     Imprime 'El numero es 1'                                           *
 * Si el numero es 2:                                                     *
 *     Imprime 'El numero es 2'                                           *
 * .............................                                          *
 * .............................                                          *
 * .............................                                          *
 * Si el numero es 10:                                                    *
 *     Imprime 'El numero es 10'                                          *
 *                                                                        *
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
 #include <stdio.h>
 
 int main()
 {        /* Abre main */

 int calificacion;
 printf("\nPor favor introduzca la calificacion del alumno: ");
 scanf("%d", &calificacion);
 
 switch(calificacion)
 {    /*Abre switch */
 case 0: 
 printf("\nLa calificacion es 0.\n");
 break;

 case 1:
 printf("\nLa calificacion es 1.\n");
 break;

 case 2: 
 printf("\nLa calificacion es 2.\n");
 break;

 case 3: 
 printf("\nLa calificacion es 3.\n");
 break;
 
 case 4: 
 printf("\nLa calificacion es 4.\n");
 break;
 
 case 5: 
 printf("\nLa calificacion es 5.\n");
 break;
 
 case 6: 
 printf("\nLa calificacion es 6.\n");
 break;
 
 case 7: 
 printf("\nLa calificacion es 7.\n");
 break;

 case 8: 
 printf("\nLa calificacion es 8.\n");
 break;

 case 9: 
 printf("\nLa calificacion es 9.\n");
 break;

 case 10: 
 printf("\nLa calificacion es 10.\n");
 break;

 default:
 printf("\nLa calificacion no es valida.\n");
 break;
 }    /* Cierra switch */

 return 3; //Main retorna un entero
 }        /*Cierra main */

--------------------------------------------------------------------------------------------------------------------------------
Ahora hagamos un análisis del programa línea por línea para revisar cada instrucción.


/*+++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                    *
 *    ESTE PROGRAMA RECIBE UN NUMERO DEL USUARIO Y    *
 *    DECIDE E IMPRIME SI ES 0, 1, 2,.....10          *
 * +++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 *                                                                        *
 *                                ALGORITMO:                              *
 * Pedir un numero al usuario                                             *
 * Recibir el numero                                                      *
 *                                                                        *
 * Si el numero es 0:                                                     *
 *     Imprime 'El numero es 0'                                           *
 * Si el numero es 1:                                                     *
 *     Imprime 'El numero es 1'                                           *
 * Si el numero es 2:                                                     *
 *     Imprime 'El numero es 2'                                           *
 * .............................                                          *
 * .............................                                          *
 * .............................                                          *
 * Si el numero es 10:                                                    *
 *     Imprime 'El numero es 10'                                          *
 *                                                                        *
 *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

Estas líneas son un par de comentarios. Los comentarios vienen encerrados dentro de /* y */. El segundo comentario es el algoritmo en seudocódigo del programa.

#include <stdio.h>

¿Y si no incluímos esta línea? Incluso es posible que no pase nada. Mi compilador (cc) envía el siguiente mensaje cuando la omito:

Switch.c: In function ‘main’:
Switch.c:33:2: warning: incompatible implicit declaration of built-in function ‘printf’
Switch.c:34:2: warning: incompatible implicit declaration of built-in function ‘scanf’

El mensaje es una advertencia, pero el ejecutable se crea a pesar de todo.
Muchos compiladores optimizados tratan de corregirle la plana a los programadores. Colocan variables muy frecuentemente usadas en el programa en registros para mejorar el desempeño, envían mensajes de advertencia cuando la notación es obsoleta e incluyen automáticamente el encabezado <stdio.h> Sin embargo no todos los compiladores pueden hacer estas tareas, y por lo demás podrían no estar obligados, así que siempre será mejor escribir un buen código desde el principio. Además el compilador no puede tomarse tantas libertades porque podría ser que el programador realmente quiera hacer exactamente lo que el programa dice.

int main()
 {        /* Abre main */

La primera línea indica que se abre la función main, la cual retorna un entero (int) y además no recibe nada. La forma de los encabezados de función es la siguiente:

<tipo de retorno> Nombre_DeFunción(<tipo que recibe>)

Si la función no recibe ningún tipo de datos, entonces el paréntesis puede quedar en blanco.

int calificacion;
printf("\nPor favor introduzca la calificacion del alumno: ");
scanf("%d", &calificacion);
 

Lo que hacen estas tres líneas ya es conocido: printf imprime un mensaje que pide un número al usuario, scanf recibe ese número y lo asígna a la variable calificacion. Antes de usar la variable calificación tuvimos que declararla; se hizo en la línea de arriba. int es el tipo de datos, calificacion es el nombre de la variable.

switch(calificacion)

Por primera vez aparece la instrucción switch. La forma general de esa estructura de control es la siguiente:

switch( entero )
{           
  case numero1:
   instrución 1
   instrución 2
   .......... .
   .......... .
   instrución n
   break;
   
  case numero2:
   instrución 1
   instrución 2
   .......... .
   .......... .
   instrución n
   break;
   
  .............
  .............
  .............
  .............
  
  case numeroN:
   instrución 1
   instrución 2
   ............
   ............
   break;
   
  default:
   instrución 1
   instrución 2
   .......... .
   .......... .
   instrución 3
  break;
 
}

entre paréntesis () debe aparecer una variable de tipo entero, la cual se va a evaluar. En nuestro caso es la variable calificacion.

{    /*Abre calificacion */

El cuerpo de la instrucción switch debe estar limitado por corchetes {} Conforme escribe instrucciones anidadas sus códigos tendrán cada vez más corchetes, esta es la razón por la cual es conveniente anotar, mediante un comentario, a qué cuerpo de instrucciones corresponde cada uno de ellos.

case 0: 
printf("\nLa calificacion es 0.\n");
break;

La instrucción switch contiene varias etiquetas llamadas case que analizan cada uno de los valores posibles de la variable califiación. El primero de los valores que analiza es el 0, sin embargo esto es totalmente arbitrario, se puede poner cualquier número con la única condición de que sea entero. Más adelante también veremos cómo trabajar con variables tipo char. En un condicional if, la condición se evalúa como 'verdadero' o 'falso', se dice que la condición toma un valor booleano. La instrucción switch, en cambio, evalúa un entero. Una etiqueta case n inicia el cuerpo de instrucciones que habrán de realizarse en el caso de que el número evaluado sea igual a n.
La primera etiqueta es case 0: Después del número, siempre van2 puntos (:) Esos dos puntos indican el inicio del cuerpo de instrucciones. Para este caso, el cuerpo solamente incluye a la función printf. Sólo se imprime el mensaje "La calificación es 0" y se coloca el cursor en la siguiente línea.
La siguiente instrucción es la palabra reservada break. El lenguaje de programación C se reserva el uso de algunas palabras como identificadores internos, por lo cual no podrán ser usadas por el usuario como nombres de variables. A lo largo del curso las iremos revisando. Por lo pronto puede ver la entrada Palabras reservadas del lenguaje C para familiarizarse con ellas. break indica el final del cuerpo de instrucciones para la etiqueta case 0.

case 1:
printf("\nLa calificacion es 1.\n");
break;

La estructura de esta, y las siguientes líneas es idéntica a la analizada arriba para el caso 0. Sólo se usa la etiqueta case con los argumentos 1, 2, 3,...10.
La instrucción break altera el control del programa. Si se suprime en alguna de las etiquetas case, y la condición de esa etiqueta se cumple, se ejecuta no sólo el cuerpo de esa etiqueta, sino el de la(s) subsecuente(s) hasta la aparición de una instrucción break. Por ejemplo, si se omite el break correspondiente a case 4: y el número analizado es efectivamente 4, el programa imprime los mensajes "La califiación es 4" y "La calificación es 5", que es la que se encuentra justo antes del siguiente break. Para evitar errores es necesario crearse la buena costumbre de escribir un break cada que se escribe una etiqueta case antes de escribir las instrucciones. Mas adelante volveremos sobre esta instrucción de control.

default:
printf("\nLa calificacion no es valida.\n");
break;

switch también incluye una etiqueta llamada default. Como su nombre lo indica, la etiqueta default reune todos los casos que no se hayan analizado en las instrucciones case. Por ejemplo, en nuestro programa, estamos suponiendo que el usuario introducirá números entre 0 y 10, sin embargo, si se intoduce un número entero fuera de ese rango, el programa imprime el mensaje después de default: "La calificacion no es valida". default puede colocarse dentro de switch en cualquier lugar, y siempre realiza la tarea de evaluar los casos no contenidos en las etiquetas case, sin embargo, por claridad debería incluirse sólo al final; la istrucción también incluye un break, si bien no es estrictamente necesario, ya que el control del programa se termina con el final de switch, sin embargo, por simetría, es bueno incluir siempre también una instrucción break. Si usted coloca default antes del final, y no coloca el break correspondiente, se ejecutarán las instrucciones que siguen en orden de aparición hasta el la siguiente instrucción break. No complique los programas. Recuerde que un programa bien escrito es más fácil de depurar y modificar que uno mal escrito.

}    /* Cierra switch */

Esta llave derecha cierra el cuerpo de switch y así lo indica el comentario correspondiente.

return 3; //Main retorna un entero

Esto no es un error. La función main retorna un entero, esto es lo que dice el encabezado, sin embargo no se especifica qué entero. Por convención siempre se retorna 0, pero ese número puede sustituirse por cualquier otro. Cuando revisemos las funciones quedará más claro este punto. Por lo pronto siga retornando 0 en la función main.

}        /*Cierra main */

Finalmente, esta llave derecha cierra el cuerpo de main y con ello termina el programa. Así lo indica el comentario final.

______________________________________________________________________________
Lo que aprendió:
La estructura de control switch
El uso de las etiquetas case
El uso de la etiqueta default
El uso de la instrucción break
______________________________________________________________________________
Esta página forma parte del Curso de C Con Programas Explicados Línea Por Línea
Índice
Entrada Anterior
Entrada Siguiente

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...