23 octubre, 2018

Estructura de Selección Múltiple switch


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.





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


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
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.

¡Quiero esto!
¡Qué pases un buen día!

No hay comentarios, ¡cuéntame algo!

Me gustaría saber tu opinión. ¡Saludos!