Continuando con las estructuras algorítmicas de selección. Hoy veremos el uso de la estructura de selección múltiples switch, el cual nos va a permitir crear programas que resuelvan problemas que involucren tomas de decisiones.
Así, en el tema de hoy vamos a diseñar algoritmos en pseudocódigo y en Java que permitan resolver problemas que involucren tomas de decisión haciendo uso de la estructura de selección múltiple switch.
En los temas anteriores habíamos visto el uso de la estructura de selección simple if, la estructura de selección doble if…else y la estructura de selección doble encadenada if...else...if.
Todo esto es como una sopita donde le vamos poniendo ingredientes para que el resultado nos quede cada vez mejor.
Estos posts te servirán tanto si estás empezando de cero en el mundo de la programación, si eres estudiante de primer año y necesitas reforzar algunos temas, o si eres un curioso que le entró la duda y las ganas de aprender a programar. Sea el motivo que fuese por lo que estás aquí, te invito a seguir esta serie de publicaciones que estaré realizando, en donde aprenderás con los temas que te vaya enseñando lo básico de la programación para que puedas realizar tú mismo tus propios programas.
¡Comencemos!
¿Qué es la estructura de selección múltiple switch?
La estructura de selección múltiple switch permite seleccionar una ruta de entre varias rutas posibles en base al valor de una variable selector que se compara con una lista de constantes enteras o de carácter c1, c2, c3, ..., cn. Cuando se encuentra una correspondencia entre el valor de la variable selector y una constante, se ejecuta la acción o el grupo de acciones asociadas a dicha constante. Si el selector no coincide con ninguna constante, se efectúa la acción por defecto, si es que existe.
![]() |
Diagrama de flujo de la estructura de selección múltiple switch |
En la tabla que sigue se muestra el código y el pseudocódigo de la estructura switch.
![]() |
Código y pseudocódigo de la estructura switch |
Consideraciones:
• Las sentencias break y el caso por defecto default son opcionales.
• El caso por defecto default no tiene que ser el último de todos sino que puede ser el primero u ocupar una posición intermedia.
• Luego de efectuarse la acción o las acciones de un case o del default, se proseguirá con la ejecución de la acción o las acciones de los case que siguen hasta encontrar un break o hasta llegar al final de la estructura switch; lo que ocurra primero.
• Es un error de sintaxis tener casos duplicados.
• Las acciones pueden ser acciones simples o acciones compuestas. En el caso de acciones compuestas no es necesario colocarlas entre llaves de bloque.
Ejemplos
Problema 1
Diseñe un programa que determine la cantidad de días y el nombre de un mes conociendo los valores numéricos del mes y del año.
Algoritmo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | Inicio // Declaración de variables entero dias, mes, año cadena nombre // Entrada de datos Leer mes, año // Determina el nombre del mes según( mes ){ caso 1 : nombre = "Enero" caso 2 : nombre = "Febrero" caso 3 : nombre = "Marzo" caso 4 : nombre = "Abril" caso 5 : nombre = "Mayo" caso 6 : nombre = "Junio" caso 7 : nombre = "Julio" caso 8 : nombre = "Agosto" caso 9 : nombre = "Setiembre" caso 10: nombre = "Octubre" caso 11: nombre = "Noviembre" defecto: nombre = "Diciembre" } // Determina el número de días del mes según( mes ){ caso 1: caso 3: caso 5: caso 7: caso 8: caso 10: caso 12: dias = 31 caso 4: caso 6: caso 9: caso 11: dias = 30 defecto: // Hay que tener en cuenta que Febrero puede tener 28 o 29 días // si el año es bisiesto. Un año es bisiesto cuando es múltiplo de // 4 y no de 100 o cuando es múltiplo de 400. si((año%4 == 0) && ((año%100 != 0) || (año%400 == 0))) dias = 29 sino dias = 28 } // Salida Imprimir nombre, dias Fin |
Programa
Código Fuente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | import java.awt.event.*; import java.awt.*; import javax.swing.*; public class Problema01 extends JApplet implements ActionListener{ // Declaración de variables JButton btnProcesar, btnBorrar; JTextArea txtS; JLabel lblAño, lblMes; JTextField txtAño, txtMes; JScrollPane scpScroll; // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().setLayout( null ); txtMes = new JTextField(); txtMes.setBounds( 61 , 15 , 107 , 23 ); getContentPane().add(txtMes); txtAño = new JTextField(); txtAño.setBounds( 61 , 39 , 107 , 23 ); getContentPane().add(txtAño); btnProcesar = new JButton( "Procesar" ); btnProcesar.setBounds( 305 , 15 , 101 , 23 ); btnProcesar.addActionListener( this ); getContentPane().add(btnProcesar); btnBorrar = new JButton( "Borrar" ); btnBorrar.setBounds( 305 , 39 , 101 , 23 ); btnBorrar.addActionListener( this ); getContentPane().add(btnBorrar); lblAño = new JLabel( "Año" ); lblAño.setBounds( 15 , 39 , 42 , 23 ); getContentPane().add(lblAño); lblMes = new JLabel( "Mes" ); lblMes.setBounds( 15 , 15 , 42 , 23 ); getContentPane().add(lblMes); txtS = new JTextArea(); txtS.setFont( new Font( "monospaced" , 0 , 12 )); scpScroll = new JScrollPane(txtS); scpScroll.setBounds( 15 , 75 , 394 , 87 ); getContentPane().add(scpScroll); } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ // Si se hizo clic en Procesar if ( e.getSource() == btnProcesar ){ // Declaración de variables int dias, mes, año; String nombre; // Entrada de datos mes = Integer.parseInt(txtMes.getText()); año = Integer.parseInt(txtAño.getText()); // Determina el nombre del mes switch ( mes ){ case 1 : nombre = "Enero" ; break ; case 2 : nombre = "Febrero" ; break ; case 3 : nombre = "Marzo" ; break ; case 4 : nombre = "Abril" ; break ; case 5 : nombre = "Mayo" ; break ; case 6 : nombre = "Junio" ; break ; case 7 : nombre = "Julio" ; break ; case 8 : nombre = "Agosto" ; break ; case 9 : nombre = "Setiembre" ; break ; case 10 : nombre = "Octubre" ; break ; case 11 : nombre = "Noviembre" ; break ; default : nombre = "Diciembre" ; } // Determina el número de días del mes switch ( mes ){ case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : case 12 : dias = 31 ; break ; case 4 : case 6 : case 9 : case 11 : dias = 30 ; break ; default : /* * Hay que tener en cuenta que Febrero puede tener 28 o 29 días si el año es * bisiesto. Un año es bisiesto cuando es múltiplo de 4 y no de 100 o cuando es * múltiplo de 400. */ /* * Por ejemplo, el año 2000 por las dos primeras condiciones no sería bisiesto, * pero sí lo es porque es múltiplo de 400; el año 2100 no es bisiesto porque * aunque sea múltiplo de 4, también lo es de 100 y no es múltiplo de 400. */ if ((año% 4 == 0 ) && ((año% 100 != 0 ) || (año% 400 == 0 ))) dias = 29 ; else dias = 28 ; } // Salida de resultados txtS.setText( "Nombre del mes : " + nombre + "\n" ); txtS.append ( "Número de días : " + dias); } // Si se hizo clic en Borrar if ( e.getSource() == btnBorrar ){ txtS.setText( "" ); txtMes.setText( "" ); txtAño.setText( "" ); txtMes.requestFocus(); } } } |
Problema 2
Dados los siguientes tipos de papel y sus respectivas dimensiones:
Se conoce como área imprimible al área que queda libre luego de descontar los márgenes superior, inferior, izquierdo y derecho. Diseñe un programa que permita obtener el área imprimible de un tamaño de papel elegido, en cm2.
Considere que:
1 pulgada = 2.54 centímetros
Algoritmo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | Inicio // Declaración de variables entero tamaño real mrgsup, mrginf, mrgder, mrgizq, ancho, alto, area // Entrada de datos Leer tamaño, mrgsup, mrginf, mrgder, mrgizq // Determina el ancho y el alto del papel en cm según(tamaño){ caso 0: ancho = 29.7 alto = 21.0 caso 1: ancho = 18.2 alto = 25.7 caso 2: ancho = 14.8 alto = 21.0 caso 3: ancho = 8.5*2.54 alto = 11*2.54 caso 4: ancho =8.5*2.54 alto = 14*2.54 caso 5: ancho =7.25*2.54 alto = 10.5*2.54 defecto: ancho =5.5*2.54 alto = 8.5*2.54 } // Calcula el area imprimible area = (ancho-mrgizq-mrgder)*(alto-mrgsup-mrginf) // Muestra al área imprimible Imprimir area Fin |
Programa
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | import java.awt.event.*; import java.awt.*; import javax.swing.*; public class Problema02 extends JApplet implements ActionListener{ // Declaración de variables JButton btnProcesar, btnBorrar; JTextArea txtS; JComboBox cboTmaño; JLabel lblMrgDer, lblMrgInf, lblMrgIzq, lblMrgSup, lblTamaño; JTextField txtMrgDer, txtMrgInf, txtMrgIzq, txtMrgSup; JScrollPane scpScroll; // Crea la interfaz gráfica de usuario GUI public void init() { getContentPane().setLayout( null ); setBackground( new Color( 214 , 211 , 206 )); txtMrgIzq = new JTextField(); txtMrgIzq.setBounds( 145 , 39 , 107 , 23 ); getContentPane().add(txtMrgIzq); txtMrgDer = new JTextField(); txtMrgDer.setBounds( 145 , 63 , 107 , 23 ); getContentPane().add(txtMrgDer); txtMrgSup = new JTextField(); txtMrgSup.setBounds( 145 , 87 , 107 , 23 ); getContentPane().add(txtMrgSup); txtMrgInf = new JTextField(); txtMrgInf.setBounds( 145 , 111 , 107 , 23 ); getContentPane().add(txtMrgInf); btnProcesar = new JButton( "Procesar" ); btnProcesar.setBounds( 307 , 15 , 101 , 23 ); btnProcesar.addActionListener( this ); getContentPane().add(btnProcesar); btnBorrar = new JButton( "Borrar" ); btnBorrar.setBounds( 307 , 39 , 101 , 23 ); btnBorrar.addActionListener( this ); getContentPane().add(btnBorrar); cboTmaño = new JComboBox(); cboTmaño.setBounds( 71 , 15 , 181 , 23 ); cboTmaño.addItem( "A4 297 x 210 mm" ); cboTmaño.addItem( "B5 182 x 257 mm" ); cboTmaño.addItem( "A5 148 x 210 mm" ); cboTmaño.addItem( "Carta 8½ x 11 pulg" ); cboTmaño.addItem( "Legal 8½ x 14 pulg" ); cboTmaño.addItem( "Ejecutivo 7¼ x 10½ pulg" ); cboTmaño.addItem( "Media carta 5½ x 8½ pulg" ); getContentPane().add(cboTmaño); lblMrgDer = new JLabel( "Margén derecho" ); lblMrgDer.setBounds( 14 , 63 , 124 , 23 ); getContentPane().add(lblMrgDer); lblMrgInf = new JLabel( "Margén inferior" ); lblMrgInf.setBounds( 14 , 111 , 124 , 23 ); getContentPane().add(lblMrgInf); lblMrgIzq = new JLabel( "Margén izquierdo" ); lblMrgIzq.setBounds( 14 , 39 , 124 , 23 ); getContentPane().add(lblMrgIzq); lblMrgSup = new JLabel( "Margén superior" ); lblMrgSup.setBounds( 14 , 87 , 124 , 23 ); getContentPane().add(lblMrgSup); lblTamaño = new JLabel( "Tamaño" ); lblTamaño.setBounds( 14 , 15 , 49 , 23 ); getContentPane().add(lblTamaño); txtS = new JTextArea(); txtS.setFont( new Font( "monospaced" , 0 , 12 )); scpScroll = new JScrollPane(txtS); scpScroll.setBounds( 14 , 147 , 394 , 69 ); getContentPane().add(scpScroll); } // Procesa eventos de tipo ActionEvent public void actionPerformed( ActionEvent e ){ // Si se hizo clic en Procesar if ( e.getSource() == btnProcesar ){ // Declaración de variables int tamaño; double mrgsup, mrginf, mrgder, mrgizq, ancho, alto, area; // Entrada ade datos tamaño = cboTmaño.getSelectedIndex(); mrgsup = Double.parseDouble(txtMrgSup.getText()); mrginf = Double.parseDouble(txtMrgInf.getText()); mrgder = Double.parseDouble(txtMrgDer.getText()); mrgizq = Double.parseDouble(txtMrgIzq.getText()); // Determina el ancho y el alto del papel en cm switch (tamaño){ case 0 : ancho = 29.7 ; alto = 21.0 ; break ; case 1 : ancho = 18.2 ; alto = 25.7 ; break ; case 2 : ancho = 14.8 ; alto = 21.0 ; break ; case 3 : ancho = 8.5 * 2.54 ; alto = 11 * 2.54 ; break ; case 4 : ancho = 8.5 * 2.54 ; alto = 14 * 2.54 ; break ; case 5 : ancho = 7.25 * 2.54 ; alto = 10.5 * 2.54 ; break ; default : ancho = 5.5 * 2.54 ; alto = 8.5 * 2.54 ; } // Calcula el area imprimible area = (ancho-mrgizq-mrgder)*(alto-mrgsup-mrginf); // Muestra al área imprimible txtS.setText( "Área imprimible : " + area + "cm²" ); } // Si se hizo clic en Borrar if ( e.getSource() == btnBorrar ){ txtMrgIzq.setText( "" ); txtMrgDer.setText( "" ); txtMrgSup.setText( "" ); txtMrgInf.setText( "" ); txtS.setText( "" ); txtMrgIzq.requestFocus(); } } } |
Problema 3
En el siguiente ejercicio, reemplace la estructura if...else...if por la estructura switch. Considere que producto es de tipo int.
Algoritmo
1 2 3 4 5 6 7 | if( producto == 0 ) precio = 25; else if( producto == 1 ) precio = 15; else if( producto == 2 ) precio = 10; else |
Algoritmo
1 2 3 4 5 6 7 8 9 10 11 12 13 | switch( producto ){ case 0: precio = 25; break; case 1: precio = 15; break; case 2: precio = 10; break; default: precio = 12; } |
Problema 4
En el siguiente ejercicio, reemplaze la estructura if...else...if por la estructura switch. Considere que z es de tipo int:
Algoritmo
1 2 3 4 5 6 7 8 | if( z == 0 ) a = 10; else if( z == 1 || z == 3 || z == 5 ) a = 2; else if( z == 2 || z == 4 ) a = 7; else a = 3; |
Algoritmo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | switch( z ){ case 0: a = 10; break; case 1: case 3: case 5: a = 2; break; case 2: case 4: a = 7; break; default: a = 3; } |
Problema 5
Diseñe un algoritmo que determine la cifra de las unidades de un número natural como palabra. Por ejemplo, si se ingresa 10, debe imprimir cero, si se ingresa 15, debe imprimir cinco, si se ingresa 123, debe imprimir tres, etc..
Algoritmo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Inicio // Declaración de variables entero numero, unidades cadena palabra // Entrada de datos Leer numero // Determine la cifra de las unidades como número unidades = numero%10 // Determine la cifra de las unidades como palabra segun( unidades ){ caso 0 : palabra = “cero” caso 1 : palabra = “uno” caso 2 : palabra = “dos” caso 3 : palabra = “tres” caso 4 : palabra = “cuatro” caso 5 : palabra = “cinco” caso 6 : palabra = “seis” caso 7 : palabra = “siete” caso 8 : palabra = “ocho” defecto: palabra = “nueve” } // Salida de resultados Imprimir palabra Fin |
Para recordar
- Si un case no tiene break, sucederá que al ejecutar las acciones de dicho case se ejecutarán, también, las acciones de los case que siguen hasta encontrar un break o hasta llegar al final del switch.
- Se puede usar la estructura switch en una toma de decisiones únicamente si las condiciones consisten en comparaciones de una misma variable con una lista de constantes enteras o de carácter.
Descargar ejercicios resueltos
Descargar archivo
Puedes completar lo aprendido asistiendo el material en video.
Clic aquí
¡Acabas de ver el tema Estructura de Selección Múltiple switch del curso de Introducción a la Algoritmia y a la programación en Java! ¡Fácil verdad!
Ir al índice
Asimismo, si deseas saber más acerca de estos temas, recuerda que puedes comprar la guía completa con todos los temas, ejercicios, evaluaciones resueltas, proyectos y más; para ello, tienes que ingresar al siguiente enlace. Y si eres seguidor de la comunidad Aprendec puedes acceder a un descuento del -%32.
Asimismo, si deseas saber más acerca de estos temas, recuerda que puedes comprar la guía completa con todos los temas, ejercicios, evaluaciones resueltas, proyectos y más; para ello, tienes que ingresar al siguiente enlace. Y si eres seguidor de la comunidad Aprendec puedes acceder a un descuento del -%32.
¡Quiero esto! |
No hay comentarios, ¡cuéntame algo!
Me gustaría saber tu opinión. ¡Saludos!