Está en la página 1de 25

Taller 3

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.1. Crear un proyecto y compartirlo


En primer lugar abra BlueJ como se muestra en la figura 1.
Una vez abierto cree un proyecto seleccionando el menú Proyectos (Projects),
luego seleccione Proyecto Nuevo (New Project). En la ventana que aparece 2
En el Nombre (Name) escribir Taller03. Lo que hará aparecer la pantalla 3.
Ahora lo que se va hacer es compartir el taller al repositorio1 , entonces selec-
cione el menú:
Herramientas→Equipos→Compartir este proyecto
(Tools→Teams→Share this project)
Antes de compartir aparece esta pantalla 42 . Llene los campos de la pantalla
se forma correspondiente, verifique que el repositorio esta bien conectado presio-
1
El que se creó en el taller pasado.
2
Recuerde que lo que aparece en es mi versión de mi repositorio, el suyo debe tener los datos
correspondientes que se proporcionan en Riouxsvn.

1
Figura 1: BlueJ abierto

Figura 2: BlueJ proyecto nuevo

nando el botón Probar conexión (Test Conection), y luego de probar que


está bien seleccione Aceptar (Accept). En este momento tendrá este proyecto
compartido en su repositorio. En este momento en la pantalla de BlueJ se muestra
como se ve en la figura 5.

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

La sintaxis equivalente de un programa en Java para una condición es la si-


guiente:
1 i f ( condicion )
2 Instruccion ;

En ella se puede observar que el cuerpo de la función requiere únicamente


una sola instrucción, esta instrucción se debe identar. Pero que pasa si son varias
las instrucciones que se tiene que hacer en una estructura de decisión entonces
las instrucciones deben estar dentro de un bloque. Los bloques de instrucciones
inician con abre llaves y con cierras llaves.
1 i f ( condicion ) {
2 Instruccion1 ;
3 Instruccion2 ;
4 ...
5 InstruccionN ;
6 }

4
Figura 5: Proyecto Taller03 compartido

El anterior código en Java una estructura de condición con varias instruccio-


nes. Observe que todas las instrucciones son identadas.

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

Este programa siempre escribirá Es verdadero. Si la variable de la condición


se inicia Falso.

Inicio
valor ← Falso

5
Si valor entonces
Escribir "Es verdadero"
Fin Si
Fin

El anterior programa nunca va escribir ningún mensaje.


Otra forma de condición es utilizar los operadores de comparación.

Seudo-código Java Precedencia Asociatividad Significado


< < 9 No asociativo Menor que
> > 9 No asociativo Mayor que
≤ <= 9 No asociativo Menor o igual que
≥ >= 9 No asociativo Mayor o igual que
= == 8 Izquierda a derecha Igual que
, != 8 Izquierda a derecha Diferente que

Los operadores de comparación puede ser utilizados para comparar valores


del mismo tipo fundamental o primitivo en Java. Los operadores

Ejemplo 1. Se procesa el ingreso anual de una persona y si este ingreso es


mayor 30 millones debe pagar un impuesto de 1 % y mostrar únicamente el valor
a pagar del dicho impuesto.
El seudo-código es el siguiente:

Inicio
Leer ingresos
Si ingresos > 300000000 entonces
impuesto ← ingresos * 0.01
Escribir impuesto
Fin Si
Fin

Ahora vamos a escribir un programa en Java completo para realizar el cálculo


de los impuestos.
1 import java . u t i l . Scanner ;
2
3 public c l a s s Impuestos {
4 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
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 }

Ejercicio 1. [Impuestos] Escriba el anterior programa utilizando BlueJ y ejecúte-


lo. Pruébelo con diferentes valores. 

Ejercicio 2. [Impuestos] Modifique el programa para que este incluya en los


valores a pagar impuestos desde 30 millones. 

Ejercicio 3. [Impuestos] El literal de 30 millones en double es 30000000.0.


Existe otra forma y es utilizar el formato de punto flotante. Escribir el valor y el
número de ceros que lleva a la derecha ası́: 3.0e7. Reescriba el programa utili-
zando. Ejecútelo y pruébelo con valores diferentes probando también valores de
punto flotante. 

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. 

Ejercicio 4. Modifique el programa anterior, de tal forma que en vez de hacer


la comparación en el condición la guarde en una variable cond y utilice dicha
variable en el condicional. 

3.2.1. Operadores condicionales


Como todo tipo de dato los booleanos también tiene operadores. En primer
lugar están los operadores de comparación de igualdad y diferencia.

Ejercicio 5. Utilizando el REPL de BlueJ (En la figura 6 se observa el REPL


en la parte inferior derecha de la ventana) llenar la siguiente tabla:

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 ;

Este código refleja el seudo-código

Ejemplo 2. Suponga que usted esta realizando un programa que indique si la


persona ganó una materia determinada. Si la nota es mayor o igual a 2.95 la

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

El código del programa en Java es:


1 import java . u t i l . Scanner ;
2

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 }

Ejercicio 6. [EvalNota] Escriba el anterior programa en BlueJ. 

Problema 2. [ImparPar] Escriba un programa que lea un valor entero y veri-


fique si el valor par o impar. Tenga en cuenta que para obtener si un valor es par o
impar se debe utilizar el operador % (residuo)3 
3
Realiza prueba con el REPL del BlueJ.

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

Problema 4. [CalidadAire] Escriba un programa que lea dos valores el lı́mite


permitido de partı́culas PM2.5 y la lectura actual y que informe si el valor leı́do
supera el lı́mite se imprima Emergencia en caso contrario Normal.

Problema 5. [ValorAbsoluto] Escriba un programa que lea un valor numéri-


co y retorne el valor absoluto de dicho valor, es decir que si el valor es positivo
retorne el mismo valor, si es negativo retorne el valor positivo.

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

La anterior recibe el nombre de estructura Si-Entonces-Si. Dentro del cuerpo


del Sino

11
Inicio
Si condicion1 Entonces
CuerpoOpcion1
Sino
Si condicion2 Entonces
CuerpoOpcion2
Sino
CuerpoOpcion3
Fin Si
Fin Si
Fin

La anterior recibe el nombre de estructura Si-Entonces-Sino-Si.

Ejemplo 3. Se esta diseñando un robot para exploración a la luna, uno de los


sistemas que se diseña es un sistema de movimiento lineal, que detecta el mo-
vimiento de un robot con respecto a una lı́nea determinada. El sistema recibe la
diferencia de los movimientos anteriores y determina si el robot, esta avanzado,
detenido o retrocediendo. Se sabe que si la diferencia es positiva el robot esta
avanzando, si es negativa el robot está retrocediendo y de otra forma se encuentra
detenido.
El seudo-código para resolver el problema podrı́a ser el siguiente:

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. 

Problema 7. [DetectorMovimiento2] Cambie la primera condición del seudo-


código anterior y verifique lo siguiente diferencia ≥ 0. Escribir un programa en
Java que implemente la detección de movimiento.

5.1. Otros operadores booleanos


Ya habı́amos hablado de los operadores de comparación, el tipo booleano tam-
bién tiene otros operadores, como es el operador de conjunción (∧) (ver cuadro 1),
disyunción (∨) (ver cuadro 2) y negación (¬).

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 (∧)

Estos operadores sirve para establecer condiciones más complejas y en cierta


circunstancias evitar el anidamiento de estructuras de selecció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

Ejemplo 4. . En algunas Universidades del mundo la nota se da por un criterio


distinto a un valor numérico, se dice que un estudiante perdió si su nota esta por
debajo de un lı́mite mı́nimo, una persona ganó si paso un lı́mite superior, o la
persona se encuentra en suspenso (no perdió, ni ganó, pero debe presentar de
nuevo la prueba). Suponga que el lı́mite mı́nimo es 60 puntos y lı́mite máximo es
80 puntos. Escriba un programa que indique si una persona suspendió la materia.
El siguiente es el seudo-código del programa.

Inicio
Leer nota
Si nota ≥ 60 Entonces
Si nota ≤ 80 Entonces
Escribir "Suspendio"
Fin Si
Fin Si

Este código se puede reescribir de la siguiente forma:

Inicio
Leer nota
Si nota ≥ 60 ∧ nota ≤ 80
Escribir "Suspendido"
Fin Si
Fin

Problema 8. [Suspencion] Implementar el seudo-código anterior en Java uti-


lizando el seudo-código que tiene estructuras de selección anidadas. 

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.

Ejemplo 5. Hace mucho tiempo el estado ha entendido que no es lo mismo


trabajar el dı́a de semana y los fines de semana, es por eso que las horas en los
festivos tienen un recargo extra, los domingo se puede llegar a pagar a los trabaja-
dores con salario mı́nimo con un recarga del 75 %. Un grupo de parlamentarios5
ha entendido que existe jornadas que tiene también otros niveles de dureza, por
ejemplo es de todos sabido que los lunes es muy duro volver a trabajar, los jueves
y viernes son casi un fin de semana, etc. Entonces teniendo los parlamentarios pro-
ponen las siguiente recargas: lunes: 45,5 %, martes y miércoles: normal, jueves:
10 %, viernes: 29,5 %, sábado: 55,9 %, domingo: normal. Implemente un progra-
ma que lea dos valores, el dı́a de la semana (1 . . . 7) donde 1 es lunes y ası́, y el
salario básico del dı́a. El programa debe calcular lo pagado al trabajador según y
el dı́a y los recargos.
El seudo-código queda de la siguiente manera:

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


Problema 10. [SalarioDia] Implemente el problema anterior utilizando el an-


terior nivel de identación en su programa en Java. 

6.2. Estructura Si-Entonces-SinoSi-Entonces


Algunos lenguajes de programación suministran una alternativa para evitar
niveles de anidamiento tan altos como lo que tuvimos con el problema anterior.
Esta alternativa de la estructura Si-Entonces-SinoSi-Entonces esto permite
resolver el problema anterior de una forma más compacta y sin exceder en el uso
de identación.

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

Se puede convertir en la siguiente patrón de identación llamado Si-Entonces-SinoSi-Entonces


1 i f cond1
2 Instruccion1
3 e l s e i f cond2
4 Instruccion2
5 e l s e i f cond3
6 Instruccion3
7 else . . .

Problema 11. [SalarioDia2] Copiando el problema [SalarioDia] como [SalarioDia2]


reescriba el programa de tal forma que organicen la identación para seguir el
patrón Si-Entonces-SinoSi-Entonces. 

6.3. Estructura En-Caso-De


Una forma de manejar opciones múltiples que se relaciona a una única variable
es a través de la estructura En-Caso-De. La estructura esta ligada a una variable
que debe tener un conjunto de valores discretos6 . En esto los casos que estructuras
anidadas de Si Entonces-SiNo-Si-Entonces utilicen la misma variable y ve-
rifique varios valores que puede tener dicha variable. El formato de la estructura
En-Caso-De tiene la siguiente forma:

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.

Ejemplo 7. Continuando con los ejemplos 5 y 6, la solución del problema uti-


lizando la estructura En-Caso-De es:

Leer dia, salario


error ← Falso
En Caso dia
De 1
salario ← salario * 1.455
De 2, 3
# ignorar
De 4
salario ← salario * 1.10
De 5
salario ← salario * 1.295
De 6
salario ← salario * 1.559
De 7
salario ← salario * 1.75
Por omision
error ← Verdadero
Fin En
En Caso error
7
De allı́ el nombre

19
De Falso
Escribir "Salario: ", salario
De Verdadero
Escribir "Error codigo dia equivocado"
Fin En

Algunas consideraciones con la estructura En-Caso-De, los valores no requie-


ren estar ordenados, aunque es una buena práctica. Los valores que se ignoran
debe ser ubicados dentro de la estructura, por que sin irı́an directamente a la sec-
ción Por omision. Aunque el ejemplo tiene cada opción una sola instrucción se
puede poner varias instrucciones con identación. Se puede utilizar la estructura
En-Caso-De con cualquier tipo de valor discreto como en ejemplo anterior que
se utilizaron con un valor boolean, teniendo en cuenta que este puede tener so-
lamente dos valores posibles, no es necesario la parte Por omision. En algunos
casos cuando una parte De tiene varios valores, si estos están forma un rango se
pueden juntar.

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

La estructura switch-case tiene en la parte del switch la variable que tiene


varios valores posibles. En el primer case examina el valor valor1, si esta varia-
ble variable tiene dicho valor ejecuta las instrucciones Instrucciones1, que
pueden ser una o varias instrucciones, pero es muy importante que esas instruccio-
nes termine con la instrucción break8 , que hace que el termine esas instrucciones
y continúe en la instrucción siguiente a la estructura switch-case. Si la varia-
ble variable tiene el valor valor2, una vez encuentra el caso correspondiente
case valor2: ejecuta las instrucciones que están directamente debajo de ella,
es decir Instrucciones2 hasta que encuentra una instrucción break. ¿Qué pasa
si una estructura switch-case dentro de las instrucciones de un case no hay
una instrucción break? Este buscará el siguiente break dentro de la estructura
switch-case que se encuentra ubicado, si no lo encuentra terminará al final de
la estructura switch-case.

Problema 12. [SalarioDia3] Utilizando el seudo-código del ejemplo 7 y la


estructura switch-case implementar una solución en java que resuelva dicho
ejemplo. 

7. Condiciones dentro de objetos


Vamos a mostrar como utilizar las condiciones dentro de los objetos para crear
comportamientos especiales.

Ejemplo 8. En este ejemplo vamos a implementar una clase especial llamada


ContadorLimiteRegreso, como se observa en la figura 7. Las instancias de
esta clase mantienen tres valores: incr que pronto hablaremos de como funciona;
valorActual, que siempre es iniciado en 0; y limite que suponga que siempre
8
Literalmente romper el flujo.

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.

Figura 7: Diagrama de UML de la clase ContadorLimiteRegreso

En el cuadro 4 se observa un iteración con una clase inicializado con lı́mite 3 y


el valor retornado en cada iteracción con la invocación del método obtActual().
Con esta iteracción nos queda claro como funciona la instancias ContadorLimiteRegreso,
comienza a contar en cero, y cuando alcanza el lı́mite comienza a decrementar
hasta que nuevamente llega al valor de cero y de allı́ vuelve a incrementar.
obtActual() obtActual() obtActual() obtActual() obtActual() obtActual() obtActual()
0 1 2 3 2 1 0

Cuadro 4: Iteración de la clase ContadorLimiteRegreso

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

Cuadro 5: Iteración de la clase ContadorLimiteRegreso atributo valorActual

Si añadimos una fila más con la diferencia entre valorActual y el retorno


se obtiene el cuadro 6.

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

Cuadro 6: Iteración de la clase ContadorLimiteRegreso con diferencia

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:

Si valorActual = limite ∧ incr = 1 Entonces


incr = -1
Sino Si valorActual = 0 ∧ incr = -1 Entonces
incr = 1
FinSi

Entonces ya podemos implementar nuestra clase ContadorLimiteRegreso


en Java.
1 public c l a s s ContadorLimiteRegreso {
2 private int valorActual ;
3 private int limite ;
4 private int incr ;
5 p u b l i c ContadorLimiteRegreso ( i n t lim ) {
6 valorActual = 0;
7 l i m i t e = lim ;
8 incr = 1;
9 }
10 public int obtActual () {
11 i f ( v a l o r A c t u a l == 0 && i n c r == −1)
12 incr = 1;
13 e l s e i f ( v a l o r A c t u a l == l i m i t e && i n c r == 1 )
14 i n c r = −1;
15 int ret = valorActual ;
16 v a l o r A c t u a l += i n c r ;
17 return ret ;
18 }
19 }

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.


Problema 13. [ContadorLimiteRegreso] Escriba una implementación en Ja-


va de la clase ContadorLimiteRegreso. 

Problema 14. [UsoContadorLimiteRegreso] Escriba una clase que cree una


instancia de la clase ContadorLimiteRegreso con un lı́mite de 2 y sin utilizar
ciclos invoque e imprima el resultado de dicha invocación hasta 7 veces.
La salida deberı́a ser:

0
1
2
1
0
1
2

Problema 15. [UsoContadorLimiteRegreso2] Escriba una clase que cree


una instancia de la clase ContadorLimiteRegreso con un lı́mite de 4 y sin uti-
lizar ciclos invoque e imprima el resultado de dicha invocación hasta 10 veces.
La salida deberı́a ser:

0
1
2
3
4

24
3
2
1
0
2

Problema 16. [ContadorLimiteIdaRegreso] En la figura 8 se ve el diagra-


ma UML de la clase ContadorLimiteIdeRegreso, este contador recibe dos
parámetros en su constructor lim1 y lim2, la asignación de los lı́mites iniciales
dependerán de cual es el mayor para el lı́mite superior limiteSup y el otro para
el lı́mite inferior limiteInf. Del lı́miteInferior parte el contador que será comen-
zara su conteo de forma ascendente. Cuando llegué la limite Superior limiteSup
volverá a decrementar.

Figura 8: Diagrama UML de la clase ContadorLimiteIdaRegreso

Problema 17. [UsoContadorLimiteIdaRegreso] (Sin utilizar ciclos) Imple-


mente un clase que lea dos números que van a ser los lı́mites de una instan-
cia de ContadorLimiteIdaRegreso y que invoque una 20 veces el método
obtActual() de la instancia creada mostrado en cada ejecución únicamente el
valor retornado por dicha función. 

25

También podría gustarte