miércoles, 14 de diciembre de 2011

Estructuras básicas de programación: switch

La estructura "switch", esta hecha para propósitos similares al del "if", mas no iguales. Esta estructura se utiliza para especificar varios casos, en los cuales habrá diferentes instrucciones. Solo se ejecutarán las instrucciones del caso que se cumpla.

La estructura "switch", esta constituida por las siguientes lineas de código o sentencias:

switch(v)
{
    case 1:
    //código que se ejecuta si el valor de "v" es 1
    break; 
    case 2:
    //código que se ejecuta si el valor de "v" es 2
    break;  
    case 3:
    //código que se ejecuta si el valor de "v" es 3
    break; 
    default:
    //código que se ejecuta si el valor de "v" no es ninguno de las anteriores casos.
    break; 
}
En donde "v" puede ser cualquier variable que devuelva un valor de cualquier tipo numérico o "char" y ahora desde Java 7 también se puede agregar valores o variables de tipo "String".

Las llaves que se encuentran debajo del "switch", agrupan todos los casos.

la palabra reservada "break" se coloca para dar la orden de que se salte el resto de casos, pues de lo contrario se ejecutarían también los casos que están debajo del que se ejecuto inicialmente.

La palabra reservada "default", se utiliza para especificar lo que se ejecutará si los casos anteriores no suceden. Dicho de otra manera en "default" esta contemplado todo lo que se ejecuta con el resto de casos posibles. ejemplo:

int variable=3;
int variable2;

switch(variable)
{

    case 1:
    variable2=5;   
    break;
    case 2:
    variable2=20;
    break;
    case 3:
    variable2=30;
    break;
    case 4:
    variable2=10;
    break;
    default:
    variable2=100;
    break; 

}


Después de ejecutar el código anterior, la variable "variable2" tendrá el valor de 30.

Cabe resaltar que mientras el "if" puede ejecutar instrucciones bajo una condición que en muchos casos involucra un rango completo de valores, el "switch" especifica la ejecución de código bajo la condición de que se de un valor en concreto, y no el de un rango completo.

Lo anterior es esencial para entender cuando debemos usar el "switch" en vez de el "if".

Otro ejemplo de utilización de "switch", esta vez con una variable "char":

char variable='a';

int variable2;

switch(variable){

    case 'c':
    variable2=5;   
    break;
    case 'a':
    variable2=20;
  
    case 'v':
    variable2=30;
   
    case 'k':
    variable2=10;
    break;
    default:
    variable2=100;
    break; 

}


En el código anterior, la variable "variable2" queda con el valor de 10, y no con 20, pues se ha olvidado colocar el "break", del "caso a" y del "caso v".
Omitir el "break", puede ser beneficio, todo depente de la lógica del problema a solucionar, un ejemplo de esto puede ser el código que encontré en laurel.datsi.fi.upm.es, el cual consiste en imprimir el nombre de una vocal dada. Adecuado a Java ese código podría quedar de la siguiente manera:


String nombreVocal="";
char letra='e';

switch(letra)
{
        case 'a': 
        case 'A': 
                nombreVocal="Es la vocal a";
                break;
        case 'e': 
        case 'E': 
                nombreVocal="Es la vocal e";
                break;
        case 'i': 
        case 'I':  
                nombreVocal="Es la vocal i";
                break;
        case 'o': 
        case 'O': 
                nombreVocal="Es la vocal o";
                break;
        case 'u': 
        case 'U': 
                nombreVocal="Es la vocal u";
                break;
        default: 
               
                nombreVocal="No es ninguna vocal"; 
}


En el código anterior se ve como la ausencia del "break", le permite al "switch", colocar en la variable "nombreVocal", el correspondiente resultado, sin importar si la vocal esta en mayúscula o minúscula.

También se aprecia la ausencia del "break" después de las instrucciones de "default", algo que se puede hacer sin ningún problema, debido a que si se coloca la instrucción "break", no tendría casos para saltar u omitir.

También es posible anidar "switch", ejemplo:


String nombre="";
char letra='e';

switch(letra)
{
        case 'a': 
        case 'A': 
                nombre="Es la vocal a";
                break;
        case 'e': 
        case 'E': 
                nombre="Es la vocal e";
                break;
        case 'i': 
        case 'I':  
                nombre="Es la vocal i";
                break;
        case 'o': 
        case 'O': 
                nombre="Es la vocal o";
                break;
        case 'u': 
        case 'U': 
                nombre="Es la vocal u";
                break;
        default: 
               
                switch(letra)
                {
                 case 'a':
                         nombre="Es la consonante a";
                         break;
                 case 'b':
                         nombre="Es la consonante b";
                         break;      
                 case 'c':  
                         nombre="Es la consonante c";
                                  
                }
                 
}


En el código anterior se aprecia que aparte de poderse anidar, también se puede prescindir de "default". Otro ejemplo, ahora con un String, en donde obligatoriamente tenemos que estar trabajando con Java 7:


int variable2=0;
String palabra="casa";

switch(palabra)
{
        case "casa": 
                    variable2 = 6; 
                    break; 
        case "carro": 
                    variable2 = 5; 
                    break;        
        case "TV":
                    variable2 = 4; 
                    break; 
}


Después de ejecutar el código anterior, la variable "variable2" quedará con el valor 6.

Un ejemplo sencillo puede ser el siguiente, en donde se quiere colocar exigencias a un nombre dado, y priorizar en algunas de estas exigencias, para luego entrar a validar otras de manera segura:

String nombre="maria";

  switch(nombre.length())//obtengo la cantidad de caracteres con ayuda de el método .length()
  {
                    case 1:
                        System.out.println("debe especificar un nombre mas largo"); 
                        break;
                    case 0:
                        System.out.println("debe especificar un nombre"); 
                        break;    
                    default:
     //obtengo el caracter de la posicion especificada con ayuda de el método .charAt()
     // si se ejecuta a .charAt() sobre una cadena vacía, se generará un error, pero el primer "switch" se encarga 
     // de que eso no suceda.
                        switch(nombre.charAt(0))
                        {
                            case '#':
                            System.out.println("el nombre no puede comenzar por #");
                            break;
                            case '0':
                            System.out.println("el nombre no puede comenzar por 0");
                            break;    
                            default:
                                 switch(nombre.charAt(nombre.length()-1))
                                {
                                 case '#':
                                System.out.println("el nombre no puede terminar por #");
                                break;
                                case '&':
                                System.out.println("el nombre no puede terminar por &");
                                break;    
                                default:
                                   System.out.println("el nombre cumple con las exijencias !");   
                                }
                                
                        }
                        
                        
  }

No hay comentarios:

Publicar un comentario