Estructura de control condicional múltiple (switch)

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.

Diagrama de flujo

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 de flujo

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:

Diagrama de flujo

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 de flujo

Diagrama sintáctico

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

 break;

}

switch

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

 break;

}

case - Primer case

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

 break;

}

case - Segundo case

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

 break;

}

case - Tercer case

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

 break;

}

case - Cuarto case

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

 break;

}

default

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

 break;

}

Ejercicios de codificaciones

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.

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

 break;

}

Identificación de la estructura

Se trata de una condicional múltiple, ya que se compara una expresión igualándolos con distintos valores y múltiples flujos que avanzan por rutas distintas y se unen en un punto adelante del programa.

En este caso no necesariamente es una expresión booleana, aparece dentro de un rombo una cantidad que se comparará en cada una de las distintas ramas, se codifica dentro de los paréntesis de la condición del switch.

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

}

Primer case

En el bloque case VK_A, se compara e.getKeyCode()==KeyEvent.VK_A, si se cumple se ejecutan las sentencias hasta encontrar la sentencia break y se sale de la estructura switch.

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

}

Segundo case

En el bloque case VK_Z, se compara e.getKeyCode()==KeyEvent.VK_Z, si se cumple se ejecutan las sentencias hasta encontrar la sentencia break y se sale de la estructura switch.

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

}

Tercer case

En el bloque case VK_UP, se compara e.getKeyCode()==KeyEvent.VK_UP, si se cumple se ejecutan las sentencias hasta encontrar la sentencia break y se sale de la estructura switch.

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

}

Cuarto case

En el bloque case VK_DOWN, se compara e.getKeyCode()==KeyEvent.VK_DOWN, si se cumple se ejecutan las sentencias hasta encontrar la sentencia break y se sale de la estructura switch.

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

}

Flujo por default

Si no se cumplió ninguno de los valores previos, se ejecuta este bloque default.

Diagrama de flujo

switch( e.getKeyCode() ) {

case KeyEvent.VK_A

:jugadorIzquierda.moverArriba();

 break;

case KeyEvent.VK_Z

:jugadorIzquierda.moverAbajo();

 break;

case KeyEvent.VK_UP

:jugadorDerecha.moverArriba();

 break;

case KeyEvent.VK_DOWN

:jugadorDerecha.moverAbajo();

 break;

default

:beep();

}

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

Este ejercicio no se visualiza en algunos dispositivos

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:

Arrastrar
1
2
3
4

Escribe el código en Java que corresponde al siguiente diagrama de flujo:

// opcion es char y se leyó previamente y teclado es Scanner y se declaró previamente.

double a = teclado.nextDouble();

double b = teclado.nextDouble();

switch( opcion ) {

case '+' : System.out.println( "El resultado de la suma es" + (a+b) );

break;

case '-' : System.out.println( "El resultado de la resta es" + (a-b) );

break;

case '*' : System.out.println( "El resultado de la multiplicación es" + (a*b) );

break;

case '/' : System.out.println( "El resultado de la división es" + (a/b) );

break;

default : return;

}

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:

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;

Tip: Por cuestiones de optimización, se recomienda escribir primero las sentencias case que tienen mayor probabilidad de ser ejecutadas.