La estructura condicional se utiliza para tomar decisiones sobre la misma variable. El uso mas común es como un despachador o conmutador para implementar menús de opciones. Por ejemplo en un cajero automático se pregunta (switch) ¿cuál es la tecla presionada? y dependiendo de cada una de las opciones (case) se ejecuta un retiro, depósito, pago, compra de tiempo aire, etcétera. En caso de no atenderse ninguna de las opciones anteriores la opción por default se ejecuta.
Diagrama de flujo
La sentencia switch, tiene el siguiente diagrama de flujo, el valor resultante de una «expresión» (normalmente una variable), se evalúa para cada una de las sentencias case (en caso de). En el primer bloque se evalúa en caso de que la Expresión==A, en el segundo que la Expresión==B y así sucesivamente hasta el último case; si no se cumple ninguno de los valores se ejecuta el bloque default.
Si se omite la sentencia break al final del bloque se continuará con la ejecución del siguiente bloque case de instrucciones, aunque no es muy común implementarlo de esta forma el lenguaje de programación lo permite.
Normalmente, la estructura switch se implementa de la siguiente forma, incluyendo siempre un break al final de cada bloque de las sentencias case, y se omite el break correspondiente al default, porque ya no tiene caso escribirlo por ser la última sentencia.
Diagrama sintáctico
La sentencia condicional múltiple inicia con la palabra switch, entre paréntesis una expresión booleana y un bloque (llaves) adelante. Después viene una serie (opcional) de sentencias case donde se evalúa valor por valor seguido de dos puntos; en cada bloque case se pueden colocar cero, una o más sentencias (de forma opcional) y al final (de manera opcional) la sentencia break. Puede haber todas las sentencias case que sean necesarias. Si ninguno de estos valores, (opcionalmente) se puede incluir una sentencia default seguida de dos puntos donde se ejecutarán las sentencias si la expresión original no fue igual a ninguno de los valores previos indicados en cada sentencia case:
Codificación en Java
switch( expresión ) {
case valorA: // expresión = valorA
sentencia;
// …
sentencia;
break;
case valorB: // expresión = valorA
sentencia;
// …
sentencia;
break;
case valorC: // expresión = valorA
sentencia;
// …
sentencia;
break;
// … más sentencias case
default: // expresión no fue igual a ningún valor de los case anteriores
sentencia;
sentencia;
}
Ejemplo
Un sistema de localización GPS intenta obtener la mejor ruta para viajar del plantel Azcapotzalco al plantel Vallejo, para visitar a un amigo. Normalmente se muestran tres alternativas indicando cual es la que se considera como la mejor opción. Dependiendo de la elección del usuario se otorgarán las instrucciones correspondientes a cada opción.
Ejemplo de diagramas sintácticos
Se creó un juego de PingPong con dos raquetas y una pelota, el programa recupera la tecla presionada con el método e.getKeyCode(). El jugador de la izquierda mueve la raqueta presionando las teclas A (KeyEvent.VK_A) y Z (KeyEvent.VK_Z) para despazarse arriba y abajo, respectivamente; el jugador de la derecha se mueve presionando las teclas de las flechas del cursor arriba (KeyEvent.VK_UP) y abajo (KeyEvent.VK_DOWN). Los métodos de los jugadores jugadorIzquierda y jugadorDerecha son moverArriba() y moverAbajo().
Implemente una condicional múltiple para el despachador de las teclas presionadas.
Diagrama sintáctico
switch( e.getKeyCode() ) {
:jugadorIzquierda.moverArriba();
break;
:jugadorIzquierda.moverAbajo();
break;
:jugadorDerecha.moverArriba();
break;
:jugadorDerecha.moverAbajo();
break;
:beep();
break;
}
switch
switch( e.getKeyCode() ) {
:jugadorIzquierda.moverArriba();
break;
:jugadorIzquierda.moverAbajo();
break;
:jugadorDerecha.moverArriba();
break;
:jugadorDerecha.moverAbajo();
break;
:beep();
break;
}
case - Primer case
switch( e.getKeyCode() ) {
:jugadorIzquierda.moverArriba();
break;
:jugadorIzquierda.moverAbajo();
break;
:jugadorDerecha.moverArriba();
break;
:jugadorDerecha.moverAbajo();
break;
:beep();
break;
}
case - Segundo case
switch( e.getKeyCode() ) {
:jugadorIzquierda.moverArriba();
break;
:jugadorIzquierda.moverAbajo();
break;
:jugadorDerecha.moverArriba();
break;
:jugadorDerecha.moverAbajo();
break;
:beep();
break;
}
case - Tercer case
switch( e.getKeyCode() ) {
:jugadorIzquierda.moverArriba();
break;
:jugadorIzquierda.moverAbajo();
break;
:jugadorDerecha.moverArriba();
break;
:jugadorDerecha.moverAbajo();
break;
:beep();
break;
}
case - Cuarto case
switch( e.getKeyCode() ) {
:jugadorIzquierda.moverArriba();
break;
:jugadorIzquierda.moverAbajo();
break;
:jugadorDerecha.moverArriba();
break;
:jugadorDerecha.moverAbajo();
break;
:beep();
break;
}
default
switch( e.getKeyCode() ) {
:jugadorIzquierda.moverArriba();
break;
:jugadorIzquierda.moverAbajo();
break;
:jugadorDerecha.moverArriba();
break;
:jugadorDerecha.moverAbajo();
break;
:beep();
break;
}
A partir de los siguientes ejercicios, asociarás los diagramas de flujo con su codificación en Java.
Instrucciones para el alumno: Observa el ejemplo y completa los ejercicios.
Se creó un juego de PingPong con dos raquetas y una pelota, el programa recupera la tecla presionada con el método e.getKeyCode(). El jugador de la izquierda mueve la raqueta presionando las teclas A (KeyEvent.VK_A) y Z (KeyEvent.VK_Z) para desplazarse arriba y abajo, respectivamente; el jugador de la derecha se mueve presionando las teclas de las flechas del cursor arriba (KeyEvent.VK_UP) y abajo (KeyEvent.VK_DOWN). Los métodos de los jugadores jugadorIzquierda y jugadorDerecha son moverArriba() y moverAbajo().
Implemente una condicional múltiple para el despachador de las teclas presionadas.
Una operación común de la estructura switch es la de implementar la ejecución de una opción de un menú, normalmente se le asocia un identificador a cada una de las opciones y se evalúan en un “despachador” o “conmutador” la opción correcta.
Suponga que aparece en pantalla la siguiente interfaz:
Programa de calculadora, seleccione la opción que desea realizar:
Tecla Operación
S Suma
R Resta
M Multiplicación
D División
otra Terminar
Completa los espacios en blanco arrastrando los elementos para que el siguiente diagrama de flujo corresponda con la codificación en Java.
El siguiente algoritmo continuará a la realización de estas operaciones:
Escribe el código en Java que corresponde al siguiente diagrama de flujo:
Para saber más
Un caso curioso
Estrictamente, a partir del diagrama sintántico, la estructura switch tiene un comportamiento al siguiente diagrama de flujo:
Si se omite la sentencia break al finalizar cada bloque de sentencias case, se incluiría la ejecución de las sentencias del siguiente valos indicado en case o default.
Por ejemplo:
int numero = 1;
switch( numero ) {
case 1: System.out.println( numero + "es igual a 1." );
default: System.out.println( "No se que más decir." );
}
Al omitir las sentencias break, se estarían ejecutando todas las dos sentencias println, tanto del case 1 como de default.
switch como if-else anidado
La estructura switch puede implementarse como un if-else anidado, sin embargo probablemente no ocurra lo mismo a la inversa, ya que se requiere que las comparaciones en el if sean sobre la misma variable y con igualdades.
switch( variable ) {
case 1: sentencia1;
break;
case 2:
sentencia2;
break;
case 3: sentencia3;
break;
default: sentenciaDefault;
}
if( variable==1 ) // case 1
sentencia1;
else if( variable==2 ) { // case 2
sentencia1;
else if( variable==3 ) { // case 3
sentencia1;
else // default
sentenciaDefault;