Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Estructuras de decisión
ST0242 2020 1 033-035-036-037-038-039
DIS
15 de febrero de 2020
Entrega: 18 de febrero - 23:59
1. Preliminares
Este taller cuenta con problemas y ejercicios; ambos son objetos de aprendiza-
je, solamente los primeros serán evaluados y se entregarán utilizando el repositorio
entregado en la primera clase.
1
Figura 1: BlueJ abierto
2. Introducción
Hemos conocido cuatro elementos fundamentales dentro de la programación
estructurada: las variables, la asignación, las expresiones y secuenciación.
Una variable sirve para almacenar el valor de algún tipo, primitivo u objeto.
Las asignaciones permite cambiar el valor de una variable, los valores de las varia-
2
Figura 3: Bluej proyecto Taller03 abierto
bles son perdidos cada vez que una asignación cambie su valor. Una expresión en
caso más simple es un valor o son dos expresiones y un operador correspondiente
al tipo de las expresiones, por ejemplos las expresiones aritméticas.
Las asignaciones son consideradas instrucciones, una instrucción es una orden
para el computador y finalmente el operador de secuenciación permite que una
instrucción se ejecute una tras otra.
Estos elementos de la programación estructurada (variables, asigaciones, ex-
presiones y secuenciación) permite crear una buena cantidad de programas, pero
no es suficiente a la hora de crear programas más profesionales. Y es allı́ don-
de aparecen las estructuras de decisión que permite que los programas puedan
ejecutar una serie de instrucciones dependiendo de los valores de una o más ex-
presiones.
3. Estructuras de Si-Entonces
La estructura básica de decisión es la estructura Si-Entonces. Esta permite
evaluar una condición y dado el valor de la condición aplicar una operación (o
varias) si el problema ası́ lo requiere.
El seudo-código se representa de la siguiente forma:
Si condicion Entonces
3
Figura 4: Compartir proyecto Taller03
CuerpoEstructura
Fin Si
4
Figura 5: Proyecto Taller03 compartido
3.1. Condiciones
Una condición en la forma más simple bajo el lenguaje Java es un valor boo-
leano (ver 3.2), estos valores representan valores de Verdadero o Falso. La for-
ma más simple de hacer una condición es la siguiente:
Inicio
valor ← Verdadero
Si valor entonces
Escribir "Es verdadero"
Fin Si
Fin
Inicio
valor ← Falso
5
Si valor entonces
Escribir "Es verdadero"
Fin Si
Fin
Inicio
Leer ingresos
Si ingresos > 300000000 entonces
impuesto ← ingresos * 0.01
Escribir impuesto
Fin Si
Fin
6
5 Scanner scan ;
6 s c a n = new S c a n n e r ( System . i n ) ;
7 System . o u t . p r i n t ( ” I n g r e s a r i n g r e s o s a n u a l e s : ” ) ;
8 double i n g r e s o s ;
9 i n g r e s o s = scan . nextDouble ( ) ;
10 i f ( ingresos > 30000000.0) {
11 double impuestos = i n g r e s o s ∗ 0.01;
12 System . o u t . p r i n t l n ( ” E l pago de s u s i n g r e s o s e s : ” +
impuestos ) ;
13 }
14 }
15 }
3.2. Booleanos
Un tipo de dato booleano es un tipo de dato que solo puede tener dos valores
posibles: Verdadero o Falso. En Java un tipo de dato booleano debe ser decla-
rado antes de ser utilizado.
1 b o o l e a n cond1 , cond2 ;
2 cond1 = t r u e ;
3 cond2 = 10 > 2 0 ;
7
El anterior código en Java define dos variables booleanas: cond1 y cond2, en
la lı́nea 2 se inicializa con uno de los posibles valores para booleanos (true o
false). En la lı́nea 3 se observa cómo se puede inicializar utilizando una expre-
sión de comparación cuyo resultado es un valor booleano en este caso false.
Problema 1. [Mayor] Escriba un programa que lea dos valores y que imprima
Mayor si el segundo número es mayor al primero.
Expresión Resultado
true == true
true ! = true
false == false
false ! = false
true == false
true ! = false
4. Estructura de Si-Entonces-Sino
En muchas circunstancias en una decisión el programa no solo debe hacer una
operación sino que puede tener dos acciones posibles. Es aquı́ donde las estructu-
ras Si-Entonces-Sino juegan un rol muy importante para permitir realizar las
dos acciones posibles.
En seudo-código la estructura Si-Entonces-Sino tiene la siguiente forma:
8
Figura 6: REPL de BlueJ
Inicio
Si condicion Entonces
CuerpoEntonces
Sino
CuerpoSino
Fin Si
Fin
Se puede observar que la condicion es verdadera se ejecutan las instruccio-
nes que se encuentra en el CuerpoEntonces, si la condición es falsa se ejecuta
las instrucciones que se encuentra en el CuerpoSino.
El código en Java se observa en las siguientes instrucción:
1 i f ( condicion )
2 InstEnt ;
3 else
4 InstElse ;
9
persona ganó en caso contrario la persona perdió.
El seudo-código del programa es el siguiente:
Inicio
Leer nota
Si nota >= 2.95 Entonces
Escribir "Pasa la materia"
Sino
Escribir "No pasa la materia"
Fin Si
Fin
3 p u b l i c c l a s s EvalNota
4 {
5 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
6 S c a n n e r s c a n = new S c a n n e r ( System . i n ) ;
7 System . o u t . p r i n t ( ” E n t r a r n o t a : ” ) ;
8 f l o a t nota ;
9 nota = scan . n e x t F l o a t ( ) ;
10 i f ( n o t a >= 2 . 9 5 )
11 System . o u t . p r i n t l n ( ” P a s a l a m a t e r i a ” ) ;
12 else
13 System . o u t . p r i n t l n ( ”No p a s a l a m a t e r i a ” ) ;
14 }
15 }
10
Problema 3. [Impuestos2] Escriba un programa que lee el ingreso anual y
verifique si el ingreso es mayor o igual 90 millones, se cobrará un impuesto del
1,1 %, en caso contrario se cobrará 0,9 %.
5. Estructura anidadas
Cada estructura vista corresponde a situaciones especı́ficas: si hay una elec-
ción utilizamos la estructura Si-Entonces, si hay dos elecciones utilizamos la
estructura Si-Entonces-Sino, pero: ¿qué pasa si hay más de tres elecciones?
Para verificar las otras opciones, estas se deben anidar dentro de una estructura de
selección.
Si se debe verificar una tercera opción esta se debe verificar dentro de estruc-
tura Si-Entonces-Sino en una de los dos posibles cuerpos. Dentro del cuerpo
del Entonces:
Inicio
Si condicion1 Entonces
Si condicion2 Entonces
CuerpoOpcion1
Sino
CuerpoOpcion2
Fin Si
Sino
CuerpoOpcion3
Fin
11
Inicio
Si condicion1 Entonces
CuerpoOpcion1
Sino
Si condicion2 Entonces
CuerpoOpcion2
Sino
CuerpoOpcion3
Fin Si
Fin Si
Fin
Inicio
Leer diferencia
Si diferencia > 0 Entonces
Escribir "Avanza"
Sino
Si diferencia < 0 Entonces
Escribir "Retrocede"
Sino
Escribir "Detenido"
Fin Si
Fin Si
Fin
12
Problema 6. [DetectorMovimiento] Escribir un programa en Java que im-
plemente la solución escrita en seudo-código del punto anterior.
a b a∧b
Falso Falso Falso
Falso Verdadero Falso
Verdadero Falso Falso
Verdadero Verdadero Verdadero
Cuadro 1: Tabla de verdad de la conjunción (∧)
a b a∨b
Falso Falso Falso
Falso Verdadero Verdadero
Verdadero Falso Verdadero
Verdadero Verdadero Verdadero
Cuadro 2: Tabla de verdad de la disyunción
a ¬a
Falso Verdadero
Verdadero Falso
Cuadro 3: Tabla de verdad de la negación
13
En Java los operadores booleanos no se escribe de la forma matemática. Se
deben utilizar unos caracteres que muchas veces resultan extraños.
La siguiente es la tabla de los otros operadores booleanos, su sintaxis y prece-
dencia.
Nombre Sı́mbolo Java Prioridad
Conjunción ∧ && 4
Disyunción ∨ ||4 3
Negación ¬ ! 13
Inicio
Leer nota
Si nota ≥ 60 Entonces
Si nota ≤ 80 Entonces
Escribir "Suspendio"
Fin Si
Fin Si
Inicio
Leer nota
Si nota ≥ 60 ∧ nota ≤ 80
Escribir "Suspendido"
Fin Si
Fin
14
Problema 9. [Suspencion2] Implementar el seudo-código anterior en Java
utilizando el seudo-código sin estructuras anidadas.
6. Estructura En-Caso-De
6.1. Introducción
Si hay muchas opciones, el nivel de anidamiento puede llegar a ser muy com-
plicado. Para darnos cuenta miremos el siguiente ejemplo.
# Este es un comentario
Leer dia, salario
error ← Falso
Si dia = 1 Entonces
salario ← salario * 1.455
Sino
Si dia = 2 ∨ dia = 3 Entonces
# ignorar
Sino
Si dia = 4 Entonces
salario ← salario * 1.10
Sino
5
Progresistas por el descanso.
15
Si dia = 5 Entonces
salario ← salario * 1.295
Sino
Si dia = 6 Entonces
salario ← salario * 1.559
Sino
Si dia = 7 Entonces
salario ← salario * 1.75
Sino
error ← Verdadero
Fin Si
Fin Si
Fin Si
Fin Si
Fin Si
Fin Si
Si ¬ error Entonces
Escribir "Salario: ", salario
Sino
Escribir "Error codigo dia equivocado"
Fin Si
Aunque la regla de identación es útil para saber bien el control de flujo, pode-
mos agradecer que los parlamentarios no hicieron uso de los meses del año para
dar también incremento.
16
Ejemplo 6. Solicionar Usando Si-Entonces-SinoSi-Entonces para solu-
cionar el ejemplo anterior.
# Este es un comentario
Leer dia, salario
error ← Falso
Si dia = 1 Entonces
salario ← salario * 1.455
SinoSi dia = 2 ∨ dia = 3 Entonces
# ignorar
SinoSi dia = 4 Entonces
salario ← salario * 1.10
SinoSi dia = 5 Entonces
salario ← salario * 1.295
SinoSi dia = 6 Entonces
salario ← salario * 1.559
SinoSi dia = 7 Entonces
salario ← salario * 1.75
Sino
error ← Verdadero
Fin Si
Si ¬ error Entonces
Escribir "Salario: ", salario
Sino
Escribir "Error codigo dia equivocado"
Fin Si
Como se dijo al principio de la sección son mucho los lenguajes de progra-
mación tiene un estructura similar, por ejemplo: Ruby, el constructor se llaman
elsif para representar esta estructura, en python es elif. Lastimosamente Java
no tiene dicho constructor, pero se puede lograr algo cercano a través de un patrón
de como escribir los else if anidados y la idea es la siguiente:
1 i f cond1
2 Instruccion1
3 else
4 i f cond2
5 Instruccion2
6 else
17
7 i f cond3
8 Instruccion3
9 else . . .
En Caso variable
De valor1
Instrucciones1
De valor2, valor3, valor4
Instrucciones2
De valor5
6
Según Wikipedia: “Una variable discreta es una variable que puede tomar algunos valores
dentro de un mı́nimo conjunto enumerable, quiere decir, no acepta cualquier valor, unicamente
aquellos que pertenecen al conjunto. . . .”
18
Instrucciones3
De valor6,valor7
Instrucciones4
...
Por omision
Instrucciones5
Fin En
La variable variable puede tomar varios valores, y nos interesa realizar cier-
tas instrucciones con alguno de estos valores. Por ejemplo cuando variable tiene
del valor de valor1 va a realizar las instrucciones Instrucciones1. En el caso
de7 variable tenga alguno de los valores valor1, valor2, valor3 realizará las
instrucciones a Instrucciones2. Similar en resto de los casos.
19
De Falso
Escribir "Salario: ", salario
De Verdadero
Escribir "Error codigo dia equivocado"
Fin En
...
De 2-3
# ignorar
...
El lenguaje Java tiene la tradición heredada del lenguaje de programación C y
C++, este cuenta con un estructura similar a la En-Caso-De llamada switch-case,
esta estructura tiene el siguiente formato.
1 switch ( variable ) {
2 case valor1 :
3 Instrucciones1 ;
4 break ;
5 case valor2 :
6 case valor3 :
7 case valor4 :
8 Instrucciones2 ;
9 break ;
10 case valor5 :
11 Instrucciones3 ;
12 break ;
13 case valor6 :
14 case valor7 :
20
15 Instrucciones ;
16 break ;
17 ...
18 default :
19 Instrucciones5 ;
20 break ;
21 }
21
es iniciado con un valor mayor a valorActual. Las instancias de esta clase de
contar hasta el lı́mite y regresar a cero cuando el lı́mite es alcanzado.
Pero que pasa con respecto al estado interno del cada instancia valorActual.
Miremos ahora el siguiente cuadro 5 y recuerde que valorActual inicio con 0.
Es claro el comportamiento es esa variable se incrementa antes de alcanzar el
lı́mite y luego en sentido inverso un vez alcanzado la cota superior y vuelve y
cambia después de alcanzar cota inferior.
obtActual() obtActual() obtActual() obtActual() obtActual() obtActual() obtActual()
retorno 0 1 2 3 2 1 0
valorActual 1 2 3 2 1 0 1
22
obtActual() obtActual() obtActual() obtActual() obtActual() obtActual() obtActual()
retorno 0 1 2 3 2 1 0
valorActual 1 2 3 2 1 0 1
diff 1 1 1 -1 -1 -1 1
En primer lugar observe que la diferencia es el valor que se utiliza para incre-
mentar en cada iteracción. Y observemos en dos partes importantes antes de que
la diferencia cambia de valor. Cuando el valor valorActual es igual al limite y
el valor de la diferencia (incr) es 1, el incremento (incr) en la siguiente iteración
debe cambiar. El otro punto de inflexión es cuando el valorActual es igual a 0
y el incremento (incr) es igual a −1. Entonces tenemos dos condiciones que son
mutuamente excluyentes:
23
Una última consideración en la implementación del método obtActual es
claro que entre las lı́neas 11 y 14, esta definido el cuerpo de la condición que se
encarga de manejar el cambio en la forma de contar, pero observe en la lı́nea 15
que se utiliza una variable auxiliar (local) que nos permite recordar temporalmente
el valor de valorActual antes que que se aplique el incremento en la lı́nea 16.
0
1
2
1
0
1
2
0
1
2
3
4
24
3
2
1
0
2
25