Post on 01-Oct-2020
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Lección 10: Estructuras de Control
Autor: José Navarro
Referencias:
C. Horstmann, “Big Java Late Objects”, Caps 3-4
C. Horstmann, “Java Concepts”, 6ta. Ed., Caps 5-6
Objetivos
Explicar la operación de diferentes estructuras de control
Diseñar programas que utilicen estructuras de control
Diseñar programas utilizando apropiadamente la estructura if
Diseñar programas utilizando apropiadamente la estructura if ... else ...
Explicar el funcionamiento de los operadores relacionales
Diseñar código que utilice apropiadamente los operadores relacionales
Listar las funciones lógicas disponibles en el lenguaje
Diseñar código que utilice apropiadamente las funciones lógicas
Indentar adecuadamente programas en Java
Diseñar programas utilizando apropiadamente la estructura while
Diseñar programas utilizando apropiadamente la estructura for
Diseñar programas utilizando apropiadamente la estructura switch
Diseñar programas utilizando apropiadamente la estructura do ... while
Bosquejo
10.0 Introducción
10.1 Estructura if
10.2 Estructura if...else
10.3 Estructura while
10.4 Estructura for
10.5 Estructura switch para Selecciones Múltiples (utilizando el comando
break)
10.6 Estructura switch para Selecciones Múltiples (sin utilizar el comando
break)
10.7 Problemas de práctica
Comentario
Antes de comenzar esta lección queremos indicar que la misma es bastante extensa. La
razón para ello es que quisimos incluir todas las estructuras de control en una sola
lección. El profesor del curso le indicará en qué fechas tiene que estudiar cuáles
secciones de la lección.
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
10.0 Introducción
En esta lección conoceremos las estructuras de control que permitirán a nuestros
programas tomar decisiones y realizar repeticiones. Estas son las características que
hacen a los programas de computadoras tan útiles, poder tomar decisiones y realizar
cantidades extraordinarias de repeticiones sin cansarse.
Las expresiones lógicas son utilizadas mayormente en la construcción de estructuras de
control. Las estructuras de control permiten alterar la secuencia de la ejecución del
programa. Un resumen de las estructuras de control se presenta en la siguiente tabla:
Tabla 1: Resumen de las Estructuras de Control
while (condicion)
{
bloque de instrucciones
}
if (condicion)
{
bloque de instrucciones
}
else
{
otro bloque de instrucciones
}
if (condicion)
{
bloque de instrucciones
}
Forma
Repetición: repite el bloque
de instrucciones mientras la
condición es cierta
while
Condicional: ejecuta el
primer bloque de
instrucciones si la condición
es cierta y el segundo en
caso contrario
if …else
Condicional: ejecuta el
bloque de instrucciones se la
condición es cierta
if
función Estructura
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Tabla 1: (continuación)
switch (expr)
{
case const1:
bloque1 de instrucciones1
<break>;
case const2:
bloque2 de instrucciones
<break;>
…
<default:
bloqued de instrucciones>
}
for (expr1; expr2; expr3) {
bloque de instrucciones
}
Forma
Condicional: expr representa
un valor entero o tipo char.
El valor de char se compara,
comenzando por el tope, con
cada uno de los valores a la
derecha de los case. Si los
valores son iguales se ejecuta
el bloque de instrucciones
que le sigue. Si un break se
encuentra al final se termina
el switch de lo contrario se
ejecutan los demás bloques
que están debajo. La opción
default indica el proceso que
será ejecutado en caso de que
ningún case sea cierto.
switch
Repetición: expr1 es una expresión en la que se
inicializa el valor de una
variable de control. xxpr2
representa la condición que
debe ser cierta para que el
ciclo se continue repitiendo.
expr3 es la acción que se
ejecutará al final de cada
ciclo.
for
función Estructura
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Tabla 1: (continuación)
Repetición: similar al while
pero en este caso la
condición se verifica luego
de ejecutar el bloque de
instrucciones. Esta
estructura garantiza que el
bloque se ejecutará al menos
una vez, ya que la condición
no se verifica hasta que el
bloque es ejecutado al menos
una vez.
do
{
bloque de instrucciones
} while (condicion);
do…while
En las próximas subsecciones presentamos ejemplos sobre la implementación de
estructuras en Java. Para facilitar el entendimiento de las mismas presentamos un pedazo
genérico de flujograma en donde se implementa una estructura de control (como un
condicional) y al lado derecho presentamos cómo se codificaría en Java. Seguido del
código genérico presentamos un ejemplo utilizando una sección de un flujograma y el
código correspondiente al lado derecho. Una vez se ha presentado la construcción
general de la estructura se da uno o más ejemplos de programas utilizando la misma.
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Programa If01.java
1 //If01.java
2 //programa para leer dos valores e imprimir
3 //el mayor de ambos
4
5 import java.util.Scanner;
6 public class If01
7 {
8 public static void main( String args[] )
9 {
10 Scanner input = new Scanner( System.in );
11
12 //Declaración de variables
13 int valor1,
14 valor2,
15 mayor = 0; //es necesrio inicializarla
16 //porque sus valores siempre
17 //se actualizarán en condicionales
18
19 System.out.print("Entre el primer valor : ");
20 valor1 = input.nextInt();
21 System.out.print("Entre el segundo valor : ");
22 valor2 = input.nextInt();
23
24 if (valor1 > valor2)
25 {
26 mayor = valor1;
27 }
28 if (valor2 >= valor1)
29 {
30 mayor = valor2;
31 }
32
33 System.out.println("El valor mayor es: " + mayor);
34 }
35 }
Explicación
Este programa muestra el uso de la estructura if para la toma de decisiones. El programa
lee dos valores e imprime el mayor de los dos.
La línea 24 analiza la condición valor1 > valor2 (En Java las condiciones se escriben
siempre entre paréntesis) Si la condición es cierta, se ejecutará el bloque de instrucciones
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
que se encuentra debajo (líneas 25 a la 27). Si el bloque de instrucciones se compone de
más de una instrucción es necesario encerrarlo entre corchetes ‘{‘ para que el compilador
entienda que el grupo completo de instrucciones será ejecutado si la condición es cierta.
Si el bloque de instrucciones se compone de una sola instrucción (como en este caso) no
es necesario escribir los corchetes, sin embargo, es preferible escribirlos de forma tal que
la estructura de los programas sea consistente, así que siempre usaremos los corchetes.
La línea 28 analiza la condición valor2 >= valor1. Si la condición es cierta entonces se
ejecuta el bloque de instrucciones que se encuentra en las líneas de la 29 a la 31.
Como pueden notar en el programa el valor de la variable mayor se modifica dentro de
los dos condicionales (líneas 26 y 30). Si el valor de mayor no se hubiese inicializado
(asignado un valor inicial) en la línea 15, o en otra línea que no dependiera de una
condición, Java habría dado un error porque nos estaríamos arriesgando a utilizar una
variable en la línea 33 que no tenía valor asignado. Si analizamos el código notamos es
uno de los dos condicionales obligatoriamente tiene que ser cierto y por lo tanto mayor
siempre tendría un valor antes de llegar a la línea 33, pero el compilador no es “tan
inteligente”. Pruebe compilar el programa sin asignarle un valor cuando declare la
variable.
Un ejemplo de la corrida de este programa se presenta en la siguiente figura.
¼¼§ÏEntre el primer valor : 4 ¼¼§ÏEntre el segundo valor : 3 ÏϧÏEl valor mayor es: 4
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
10.2 Estructura if...else
condicion
bloque 1
nota >= 90
“A”
bloque 2
“B”
Ejemplo
:
if (condicion)
{
bloque1
}
else
{
bloque2
}
if (nota >= 90)
{
System.out.println(“A”);
}
else
{
System.out.println(“B”);
}
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Programa If02.java
1 //If02.java
2 //programa para leer dos valores e imprimir
3 //el mayor de ambos usando la estructura
4 //if ... else ...
5
6 import java.util.Scanner;
7 public class If02
8 {
9 public static void main( String args[] )
10 {
11 Scanner input = new Scanner( System.in );
12
13 //Declaración de variables
14 int valor1,
15 valor2,
16 mayor = 0; //es necesrio inicializarla
17 //porque sus valores siempre
18 //se actualizarán en condicionales
19
20 System.out.print("Entre el primer valor : ");
21 valor1 = input.nextInt();
22 System.out.print("Entre el segundo valor : ");
23 valor2 = input.nextInt();
24
25 if (valor1 > valor2)
26 {
27 mayor = valor1;
28 }
29 else
30 {
31 mayor = valor2;
32 }
33
34 System.out.println("El valor mayor es: " + mayor);
35 }
36 }
Explicación
Este programa realiza la misma la misma función que If01 pero en lugar de utilizar dos
estructuras if utiliza una estructura if...else. Si la condición en la línea 25 es cierta
entonces se ejecutará la instrucción en la línea 27, de lo contrario se ejecutará la
instrucción en la línea 31. Note que esta alternativa es mejor a la de utilizar dos if porque
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
aparte de requerir menos código se ejecuta más eficientemente. Utilizando dos if se
realizan dos comparaciones mientras que aquí se ejecuta sólo una. Un ejemplo de la
corrida se presenta a continuación.
¼¼§ÏEntre el primer valor : 6 ¼¼§ÏEntre el segundo valor : 9 ÏϧÏEl valor mayor es: 9
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
1 //If03.java
2 //programa para leer tres valores e imprimir
3 //el mayor usando estructuras if ... else ...
4 //anidadas
5
6 import java.util.Scanner;
7 public class If03
8 {
9 public static void main( String args[] )
10 {
11 Scanner input = new Scanner( System.in );
12
13 //Declaración de variables
14 int valor1,
15 valor2,
16 valor3,
17 mayor = 0;
18
19 System.out.print("Entre el primer valor : ");
20 valor1 = input.nextInt();
21 System.out.print("Entre el segundo valor : ");
22 valor2 = input.nextInt();
23 System.out.print("Entre el tercer valor : ");
24 valor3 = input.nextInt();
25
26 if ( (valor1 >= valor2) && (valor1 >= valor3) )
27 {
28 mayor = valor1;
29 }
30 else
31 {
32 if (valor2 >= valor3)
33 {
34 mayor = valor2;
35 }
36 else
37 {
38 mayor = valor3;
39 }
40 }
41
42 System.out.println("El valor mayor es: " + mayor);
43 }
44 }
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Explicación
Este programa lee tres números e imprime el mayor de los tres. Para lograr esto se
utilizan dos if anidados (uno dentro del otro). El primer if (línea 26) verifica si valor1 es
el mayor de los tres, de ser así lo guarda en mayor, de ser falso entonces se ejecuta el
bloque correspondiente al else de la línea 30. El bloque del else de la línea 30 es otra
estructura if...else... En este condicional no es necesario realizar una comparación
utilizando valor1 ya que si se llegó hasta este punto en el programa es porque valor1 no
es el mayor. En este condicional (línea 32) se comparan valor2 y valor3, si valor2 es el
mayor entonces se imprime el mismo, de lo contrario se imprime valor3.
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
10.3 Estructura while para Repeticiones
condicion
bloque de
instrucciones
Ejemplo
:
a < 100
a=a+1
a = 5
a*a
//formato del while
//en Java
while (condición)
{
bloque de
instrucciones
}
a = 5;
while (a < 100)
{
System.out.println(a*a);
a = a + 1;
}
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Ejemplo 01 de la Estructura While
start
contador = 0
suma = 0
contador < 10
“Entre un valor: “
input
valor
suma=suma+valor
contador=contador
+1
“La suma es”,suma
end
1 //while01.java
2 //Programa para calcular la suma de
3 //10 valores
4
5 import java.util.Scanner;
6
7 public class While01 {
8 public static void main( String args[])
9 {
10 int contador = 0,
11 suma = 0,
12 valor;
13
14 Scanner input = new Scanner(System.in);
15
16 while (contador < 10)
17 {
18 System.out.print("Entre un valor: ");
19 valor = input.nextInt();
20 suma = suma + valor;
21 contador++;
22 }//termina el while
23
24 System.out.println("La suma es: " + suma);
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
25 }
26 }
Explicación
Este programa presenta la utilización de la estructura while. El programa se mantiene
leyendo valores mientras (while) no haya leído diez. Según se van leyendo los diez
valores los mismos se van sumando al acumulador suma que inicialmente contiene un
valor de 0. Luego de leer los diez valores y acumular la suma la misma se imprime. El
flujograma correspondiente al programa se presenta antes del mismo.
La línea 16 incluye el comienzo de la estructura while en donde se coteja si la condición
contador < 10 es cierta o falsa. Si la condición es cierta se ejecuta el bloque de
instrucciones que se encuentra bajo el while. Este bloque de instrucciones se encierra
entre corchetes para que el compilador pueda determinar dónde comienza y donde
termina. Si el bloque de instrucciones consta de una sola instrucción no es necesario
utilizar los corchetes. Sin embargo, en este curso siempre utilizaremos los corchetes para
mantener la consistencia. Recuerde que el código contenido entre corchetes debe estar
indentado para facilitar el manejo del programa. Incluso si el bloque consta de una sola
instrucción la misma debe estar indentada con respecto al while. El bloque de
instrucciones que será ejecutado mientras la condición del while es cierta se encuentra de
las líneas 18 a la 21. Note que el bloque está indentado con respecto a los corchetes en
las líneas 17 y 22. Note además que ambos corchetes están alineados con el while. Esta
forma de alinear los corchetes e indentar el bloque de instrucciones se utiliza también en
las estructuras if, if...else, for y do...while.
La línea 19 se utiliza para leer el valor entrado por el usuario. Sólo una línea es necesaria
ya que la misma se ejecuta diez veces (las veces que se ejecuta el ciclo) y por lo tanto
será suficiente para leer los diez valores. La línea 20 acumula el valor en la variable
suma. La línea 21 incrementa el valor de contador por uno (1). Esta línea es importante
ya que es la que logra que eventualmente la condición del while sea falsa. El bloque de
todo while debe incluir una o más instrucciones que persiga que eventualmente la
condición sea falsa ya que de lo contrario la estructura quedaría atrapada en un ciclo
infinito. Mientras la condición es cierta el bloque de instrucciones se ejecuta en orden.
Cada vez que se llega a la última línea del bloque se regresa arriba a examinar la
condición del while si la condición es cierta se ejecuta el bloque nuevamente, de ser falsa
se pasa a ejecutar la primera instrucción que se encuentra luego del bloque. La línea 24
se encarga de imprimir el valor de la suma. A continuación se presenta un ejemplo de la
corrida.
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Programa while02.java
1 //while02.java
2 //Programa para calcular el promedio de
3 //n valores positivos utilizando un indicador
4
5 import java.util.Scanner;
6
7 public class While02 {
8 public static void main( String args[])
9 {
10 int contador = 0;
11 float suma = 0,
12 valor = 0,
13 promedio;
14
15 Scanner input = new Scanner(System.in);
16
17 //La lectura de los valores se detiene
18 //cuando se entra un valor negativo
19
20 while (valor >= 0)
21 {
22 System.out.print("Entre un valor: ");
23 valor = input.nextFloat();
24 suma = suma + valor;
25 contador++;
26 }//termina el while
27
¼¼§ÏEntre un valor: 5 ¼¼§ÏEntre un valor: 5 ¼¼§ÏEntre un valor: 5 ¼¼§ÏEntre un valor: 5 ¼¼§ÏEntre un valor: 5 ¼¼§ÏEntre un valor: 10 ¼¼§ÏEntre un valor: 10 ¼¼§ÏEntre un valor: 10 ¼¼§ÏEntre un valor: 10 ¼¼§ÏEntre un valor: 10 ÏϧÏLa suma es: 75
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
28 //La siguiente instrucción evita que el
29 //valor negativo se mantenga dentro de
30 //la suma ya que no nos interesa
31
32 suma = suma - valor;
33
34 //La siguiente suma resta 1 al contador
35 //para no tomar en consideración el
36 //incremento que se hace cuando se
37 //lee el valor negativo
38
39 contador--;
40
41 promedio = suma / contador;
42
43 System.out.println("El promedio es: " + promedio);
44 }
Explicación
Este programa calcula el promedio de n valores positivos utilizando el siguiente
procedimiento: leer valores e ir acumulando la suma hasta que se lea un valor negativo,
en ese momento se divide la suma entre los valores leídos y se imprime el resultado. El
procedimiento para calcular la suma es parecido al utilizado en el programa while01, la
diferencia estriba en que en primer programa se sabía de antemano cuántos valores se
leerían y en este caso no.
La línea 10 inicializa a cero el valor de la variable valor. Esto es necesario para garantizar
que la condición de while sea cierta la primera vez que se ejecuta, de hecho, cualquier
valor mayor o igual a cero cumple con este propósito. Es una mala técnica de
programación el utilizar en un condicional o cómputo una variable que no ha sido
inicializada previamente de forma explícita.
La estructura while se mantiene ejecutando mientras que el valor leído no sea negativo, el
bloque de instrucciones acumula la suma de los valores (línea 24) e incrementa por uno la
variable contador cada vez que se lee un valor.
El promedio se puede calcular como la suma de los valores dividido entre el total de
valores (línea 41) sin embargo, la forma en que está codificado este ciclo while provoca
que el último número leído (el valor negativo) sea sumado junto con los demás valores y
que además sea contado. Para solucionar este problema en la línea 32 se le resta a suma
el último valor leído (que corresponde al valor negativo) y en la línea 39 se le resta 1 a la
variable contador.
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Este programa presenta una deficiencia, ¿qué ocurriría si el primer número entrado fuera
negativo? ¿Cuál sería el valor del promedio? Se deja al estudiante el modificar el
programa para que contemple y maneje adecuadamente una situación como ésta.
A continuación se presenta un ejemplo de la corrida del programa.
10.4 Estructura for para Repeticiones
La estructura for se utiliza generalmente para ejecutar un bloque de instrucciones un
número específico de veces. O sea, si por ejemplo usted necesita que un bloque de
instrucciones se ejecute n veces en lugar de utilizar una estructura while es preferible
utilizar una estructura for. Todas las estructuras iterativas (con múltiples repeticiones) se
pueden implementar con un while pero en los casos en que se puede determinar la
cantidad de iteraciones de antemano es más sencillo utilizar una estructura for. Además,
la lógica de la estructura for es más fácil de entender que la estructura while.
El formato de la estructura for es el siguiente:
for (contador = valor_inicial; condicion; accion)
{
instrucciones
}
La variable contador se puede usar como un índice que va contando el número de
iteraciones. valor_inicial es el valor que se le asignará al índice al comienzo de la
primera iteración. condición es una expresión lógica que tiene que ser cierta para que los
ciclos de esta estructura iterativa se continúen repitiendo. Aunque el lenguaje acepta
cualquier expresión lógica en general se escribe una condición que verifica que el valor
del índice no ha excedido una cantidad determinada. Por ejemplo, que el del índice sea
menor que un valor n. accion es una instrucción que se ejecutará al final de cada ciclo
(iteración). En general esta instrucción se utiliza para incrementar o decrementar el valor
del índice pero puede ser otro tipo de instrucción también.
¼¼§ÏEntre un valor: 3 ¼¼§ÏEntre un valor: 4 ¼¼§ÏEntre un valor: 5 ¼¼§ÏEntre un valor: -1 ÏϧÏEl promedio es: 4.0
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Ejemplo 10.4.1
El siguiente ejemplo muestra un programa que imprime los valores del 1 al 10. Primero
se muestra el flujograma y luego el programa de forma que se pueda apreciar la relación
entre ambos.
Ejemplo 10.4.2
El siguiente ejemplo muestra un programa que lee 5 valores, determina el promedio e
imprime el mismo.
public class ForEx {
public static void
main(String args[])
{
int i;
for (i = 1; i <= 10; i++)
{
System.out.println(i);
}
}
}
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Programa For01.java
1 //For01.java
2 //Programa para calcular el promedio de 5 valores
3 //utilizando la estructura for
4
5 import java.util.Scanner;
6
7 public class For01 {
8 public static void main( String args[])
9 {
10
11 Scanner input = new Scanner(System.in);
12
13 int contador;
14 float suma = 0,
15 valor,
16 promedio;
17
18 for (contador = 1; contador <= 5; contador++)
19 {
20 System.out.print("Entre un valor: ");
21 valor = input.nextFloat();
22 suma = suma + valor;
23 }//termina el for
24
25 promedio = suma / 5;
26
27 System.out.println("Promedio = " + promedio);
28 }
29 }
Explicación
Este programa presenta la utilización de la estructura for. La estructura for facilita la
implementación de un ciclo cuando se conoce de antemano cuántas veces será ejecutado.
En este ejemplo se desea ejecutar un ciclo 5 veces para leer 5 valores distintos (uno en
cada fase del ciclo). Los valores serán sumados en una variable (suma) y al final este
total será dividido entre 5 para determinar el promedio.
La línea 18 presenta el comienzo de la estructura for. El ciclo inicializa la variable
contador con un valor de 1, y el ciclo se continuará ejecutando mientras contador tenga
un valor menor o igual a 5 (contador <= 5). Cada vez que se complete la ejecución del
bloque de instrucciones la variable contador se incrementará por 1 (contador++)*.
Como se puede apreciar, si el contador comienza en 1, se incrementa en 1 al final de la
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
ejecución del bloque y el ciclo se continuará ejecutando mientras contador sea menor o
igual a 5, entonces el ciclo se ejecutará exactamente 5 veces.
Al igual que en otras estructuras el bloque de instrucciones que pertenece a la estructura
for se encuentra encerrado entre corchetes. Si el bloque consta de sólo una instrucción,
no es necesario utilizar corchetes, sin embargo, utilizaremos siempre los corchetes para
mantener consistencia a través de todos nuestros programas. Recuerde que el código
dentro de los corchetes debe estar indentado con respecto a los corchetes y que los
corchetes que abren y cierran el bloque deben estar alineados con el for.
* contador++ provoca que el mismo resultado que contador = contador + 1. Esta forma
de incrementar el valor de una variable resulta en un código de ejecución más eficiente.
Por otro lado, la expresión podría resultar confusa para las personas que no conocen Java
o C++
Ejemplo de la ejecución del programa.
Ejemplo 10.4.3
El siguiente ejemplo muestra un programa que puede calcular el promedio de cualquier
cantidad de valores. El programa primero pide como dato cuántos valores se van a entrar
para calcular el promedio y luego procede con la lectura de los valores. Note que en este
caso el total de valores no se conoce antes de comenzar la ejecución del programa pero el
programa va a tener el valor antes de llegar a la sección de la lectura de los valores que se
usarán para el cómputo. Por lo tanto en este caso también se puede utilizar una estructura
for.
¼¼§ÏEntre un valor: 3 ¼¼§ÏEntre un valor: 23.4 ¼¼§ÏEntre un valor: 54.3 ¼¼§ÏEntre un valor: -30 ¼¼§ÏEntre un valor: 9 ÏϧÏPromedio = 11.94
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Programa For02.java
1 //For02.java
2 //Programa para calcular el promedio de n valores
3 //utilizando la estructura for
4
5 import java.util.Scanner;
6
7 public class For02 {
8 public static void main( String args[])
9 {
10
11 Scanner input = new Scanner(System.in);
12
13 int n;
15 float suma = 0,
16 valor,
17 promedio;
18
19 System.out.print("Número de valores: ");
20 n = input.nextInt();
21
22 for (int i = 1; i <= n; i++)
23 {
24 System.out.print("Entre un valor: ");
25 valor = input.nextFloat();
26 suma = suma + valor;
27 }//termina el for
28
29 //En la próxima línea como n es de tipo int
30 //y se quiere hacer un cómputo con lugares
31 //decimales se hace un type cast para tratar
32 //a n como si fuera un valor float
33
34 promedio = suma / (float) n;
35
36 System.out.println("Promedio = " + promedio);
37 }
38 }
Explicación
Este programa presenta la utilización de una estructura for para calcular el promedio de n
valores. En este programa, a diferencia del programa For01, la cantidad de veces que se
ejecutará que el bloque de instrucciones dentro del ciclo, no se conoce hasta el momento
de ejecución del programa.
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
La línea 19 del programa le indica al usuario que debe entrar el valor que indica cuántos
valores se van a sumar para calcular el promedio. En la línea 20 lee el valor del teclado y
lo almacena en la variable n. La línea 22 es la que indica cuántas veces se habrá de
ejecutar el bloque de instrucciones. En este caso el bloque de instrucciones se ejecutará n
veces, desde que i = 1 hasta que i = n. En la línea 22 también se introduce un concepto
nuevo, la declaración de una variable dentro de la misma estructura. En lugar de declarar
la variable i antes de la estructura for, ésta se puede declarar dentro la misma. Es
importante recordar que si una variable se declara dentro de una estructura entonces sólo
estará disponible dentro de esa estructura. Si tratamos de utilizarla en otro lugar del
programa recibiremos un mensaje de que la misma no está disponible.
Ejemplo de la corrida del programa
Ejemplo 10.4.4
El siguiente ejemplo muestra un programa que lee las puntuaciones de n exámenes de
100 puntos y determina el promedio y la nota correspondiente al mismo
Programa For03.java
1 //For03.java
2 //Programa para calcular el promedio de n exámenes
3 //de 100 puntos y determinar la nota
4 //correspondiente.
5
6 import java.util.Scanner;
7
8 public class For03 {
9 public static void main( String args[])
10 {
11
12 Scanner input = new Scanner(System.in);
13
14 int n;
15 float suma = 0,
16 valor,
¼¼§ÏNúmero de valores: 3 ¼¼§ÏEntre un valor: 1 ¼¼§ÏEntre un valor: 2 ¼¼§ÏEntre un valor: 4 ÏϧÏPromedio = 2.3333333
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
17 promedio;
18
19 System.out.print("Total de exámenes: ");
20 n = input.nextInt();
21
22 for (int i = 1; i <= n; i++)
23 {
24 System.out.print("Entre puntuación del examen: ");
25 valor = input.nextFloat();
26 suma = suma + valor;
27 }//termina el for
28
29 promedio = suma / (float) n;
30 System.out.println("Promedio = " + promedio);
31
32 if (promedio >= 90)
33 {
34 System.out.println("Nota = A");
35 }
36 else
37 {
38 if (promedio >= 80)
39 {
40 System.out.println("Nota = B");
41 }
42 else
43 {
44 if (promedio >= 70)
45 {
46 System.out.println("Nota = C");
47 }
48 else
49 {
50 if (promedio >= 60)
51 {
52 System.out.println("Nota = D");
53 }
54 else
55 {
56 System.out.println("Nota = F");
57 }
58 }
59 }
60 }
61 }
62 }
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Explicación
Este programa es una extensión del programa For02. En este caso se leerán n valores
para calcular el promedio de los mismos. Sin embargo, en este caso se le da una
interpretación específica a estos valores, los mismos representan los resultados de n
exámenes (asumiendo que los mismos tienen un valor máximo de 100). La extensión
principal al programa viene luego de calculado el promedio. El promedio de los
exámenes es utilizado para determinar la nota del estudiante utilizando la siguiente curva:
100 – 90 A
<90 – 80 B
<80 – 70 C
<70 – 60 D
<60 F
Para determinar la nota del estudiante se utiliza un grupo de if anidados. El primer if se
encuentra en la línea 32. Si el promedio se mayor o igual que 90 entonces se ejecuta la
línea 34 y se imprime la nota ‘A’. Si la condición en la línea 32 resulta falsa entonces se
pasa a ejecutar el bloque de instrucciones perteneciente al else que se encuentra en la
línea 36. Este bloque está compuesto por todas las instrucciones que van desde la línea
37 a la 60. Si la ejecución del programa llega a este bloque es indicativo de que el
promedio no es mayor o igual a 90, por lo tanto lo primero que se hace es verificar si el
promedio es el correspondiente a una calificación de ‘B’. La línea 38 coteja esta
condición, si el promedio es mayor o igual a 80 entonces se imprime la nota ‘B’ (línea
40), de lo contrario se ejecuta el bloque de instrucciones correspondiente al else de la
línea 42. De forma similar se verifica si el promedio es el correspondiente a una nota de
‘C’ o ‘D’. La línea 50 verifica si el promedio es correspondiente a una ‘D’, si esta
condición es falsa entonces la única opción restante es ‘F’ y esta nota se imprime en la
línea 56.
Un ejemplo de la corrida se presenta a continuación
Ejemplo 10.4.5
El siguiente ejemplo muestra una manera alterna para organizar las estructuras if
anidadas.
¼¼§ÏTotal de exámenes: 3 ¼¼§ÏEntre puntuación del examen: 87 ¼¼§ÏEntre puntuación del examen: 92 ¼¼§ÏEntre puntuación del examen: 81 ÏϧÏPromedio = 86.666664 ÏϧÏNota = B
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Programa For04.java
1 //For04.java
2 //Ejemplo del uso del if ... else if ...
3
4 import java.util.Scanner;
5
6 public class For04 {
7 public static void main( String args[])
8 {
9
10 Scanner input = new Scanner(System.in);
11
12 int n;
13 float suma = 0,
14 valor,
15 promedio;
16
17 System.out.print("Total de exámenes: ");
18 n = input.nextInt();
19
20 for (int i = 1; i <= n; i++)
21 {
22 System.out.print("Entre puntuación del examen: ");
23 valor = input.nextFloat();
24 suma = suma + valor;
25 }//termina el for
26
27 promedio = suma / (float) n;
28 System.out.println("Promedio = " + promedio);
29
30 if (promedio >= 90)
31 {
32 System.out.println("Nota = A");
33 }
34 else if (promedio >= 80)
35 {
36 System.out.println("Nota = B");
37 }
38 else if (promedio >= 70)
39 {
40 System.out.println("Nota = C");
41 }
42 else if (promedio >= 60)
43 {
44 System.out.println("Nota = D");
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
45 }
46 else
47 {
48 System.out.println("Nota = F");
49 }
50 }
51 }
Explicación
El propósito de este programa es presentar una forma alterna de escribir los if anidados
como los que se presentaron en el programa For03. La lógica de este programa es
idéntica a la lógica del programa For03, sin embargo, noten que los if no están escritos de
la misma forma. A continuación explicamos cómo se logra realizar esta modificación.
El siguiente ejemplo presenta una sección de programa con if anidados.
1. if (condicion1)
2. {
3. bloque1
4. }
5. else
6. {
7. if (condicion2)
8. {
9. bloque2
10. }
11. else
12. {
13. bloque3
14. }
15. }
Para efectos de la construcción de un programa, una estructura (if, if...else, while,
do...while o for) completa se considera como una unidad, esto es, se puede ver como si
fuese una sola instrucción. Por lo tanto si el bloque dentro una estructura es otra
estructura, no es necesario encerrarlo entre corchetes siempre y cuando no esté
acompañado de instrucciones adicionales. De esta forma el bloque de instrucciones
correspondiente al else de la línea 5 no necesita los corchetes que se encuentran en las
líneas 6 y 15. El código quedaría como se presenta a continuación:
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
1. if (condicion1)
2. {
3. bloque1
4. }
5. else
7. if (condicion2)
8. {
9. bloque2
10. }
11. else
12. {
13. bloque3
14. }
Esta forma de escribir el código no altera de forma alguna la lógica del programa. Java
permite que más de una línea de código se escriba en la misma línea, por lo tanto el
código de la línea 7. se puede escribir al lado del código en la línea 5 y entonces el código
quedaría como se presenta a continuación:
1. if (condicion1)
2. {
3. bloque1
4. }
5. else if (condicion2)
8. {
9. bloque2
10. }
11. else
12. {
13. bloque3
14. }
Como el bloque 2 y el bloque 3 corresponden a la partes cierta y falsa del if en la línea 5,
podemos moverlas para la izquierda, entonces el código quedaría así:
1. if (condicion1)
2. {
3. bloque1
4. }
5. else if (condicion2)
8. {
9. bloque2
10. }
11. else
12. {
13. bloque3
14. }
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
caso 1
bloque de
instrucciones
con break al final
caso 2
bloque de
instrucciones
con break al final
Si se incluye
default se
ejecuta este bloque
Vemos entonces que cuando el contenido de un else es una estructura if entonces
podemos unir el else y el if en la misma línea escribiendo un else if (condicion). Esta
forma de escribir el código resulta más adecuada en ocasiones como esta en la que todas
las condiciones se refieren a valores distintos de la misma variable o expresión.
10.5 Estructura switch para Selecciones Múltiples (utilizando el comando break)
Las estructuras switch se utilizan para implementar un grupo de condicionales
consecutivos en donde todas las condiciones evalúan una misma expresión y se toma la
decisión de qué bloque de instrucciones ejecutar en base al valor de la expresión. Las
expresiones pueden producir valores de tipo byte, short, int o char. Ningún otro tipo de
valor es permitido. Cuando se coloca la instrucción break al final de un bloque de
instrucciones la ejecución de la misma hace que la ejecución del programa continúe luego
del final de la estructura. En el caso de la estructura switch el efecto de ejecutar el break
es que no se ejecute ninguno de los bloques que pertenecen a los demás casos. Si no se
escribe el break entonces la ejecución del programa continúa con el próximo bloque que
se encuentre debajo.
switch (expresion)
{
case 1:
{
bloque de instruc-
ciones que se
ejecutará si
expresion = 1
}
case 2:
{
bloque de instruc-
ciones que se
ejecutará si
expresion = 2
}
default:
{
bloque de instruc-
ciones que se ejecu-
tará si ninguna de
las anteriores es
cierta
}
}
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
10.6 Estructura switch para Selecciones Múltiples (sin utilizar el comando break)
La siguiente figura muestra la secuencia en que se ejecutarían los bloques de
instrucciones si no se utiliza la instrucción.
caso 1
bloque de
instrucciones
sin break al final
caso 2
bloque de
instrucciones
sin break al final
Si se incluye
default se
ejecuta este bloque
caso 3
bloque de
instrucciones
sin break al final
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Programa switch01.cpp
1 //Switch01.java
2 //Programa para determinar el mayor, la suma
3 //y el promedio de dos valores utilizando un
4 //menú. El programa muestra el uso de la
5 //estructura switch.
6
7 import java.util.Scanner;
8
9 public class Switch01 {
10 public static void main( String args[])
11 {
12
13 Scanner input = new Scanner(System.in);
14
15 int opcion = 0;
16 float valor1,
17 valor2,
18 suma,
19 promedio;
20
21 System.out.print("Entre dos valores" +
22 " separados por un espacio: ");
23 valor1 = input.nextFloat();
24 valor2 = input.nextFloat();
25 while (opcion != 9) //la opción 9 termina el while
26 {
27 System.out.println("\n1. mayor");
28 System.out.println("2. suma");
29 System.out.println("3. promedio");
30 System.out.println("9. salir\n");
31
32 System.out.print("Seleccione opción: ");
33
34 opcion = input.nextInt();
35
36 switch (opcion)
37 {
38 case 1:
39 {
40 if (valor1 > valor2)
41 {
42 System.out.println("mayor: " + valor1);
43 }
44 else
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
45 {
46 System.out.println("mayor: " + valor2);
47 }
48 break;
49 }
50 case 2:
51 {
52 suma = valor1 + valor2;
53 System.out.println("suma: " + suma);
54 break;
55 }
56 case 3:
57 {
58 promedio = (valor1 + valor2) / (float) 2.0;
59 System.out.println("promedio: " + promedio);
60 break;
61 }
62 case 9:
63 {
64 //no se hace nada
65 break;
66 }
67 default:
68 {
69 System.out.println("Opción incorrecta");
70 }
71 }
72 }
73 }
74 }
Explicación
En muchas ocasiones, el código de un programa requiere una serie de if anidados en
donde todas las condiciones son diferentes valores de una misma variable o expresión,
similar a como vimos en el programa For04. Si los valores de esta variable son enteros o
caracteres, entonces la estructura puede ser implementada con una estructura switch. La
forma en que se escribe esta estructura, aunque implementa la misma lógica de los if
anidados resulta más fácil de asociar (generalmente) con la lógica para resolver el
problema que los if anidados.
Este programa le pide al usuario que entre tres valores y le presenta la opción de imprimir
el mayor de los dos, la suma o el promedio. Una vez que el usuario entra la opción
deseada, el programa imprime el resultado correspondiente y nuevamente presenta las
opciones, si el usuario desea terminar la ejecución del programa selecciona la alternativa
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
9. En caso de que el usuario seleccione una alternativa incorrecta, entonces el programa
le imprimirá el mensaje correspondiente.
Como se desea que el programa se mantenga imprimiendo las opciones (menú) y leyendo
las opciones hasta que el usuario desee dar por terminada la ejecución del programa, el
grueso del programa está contenido en un while que cubre las líneas de la 25 a la 72.
Para garantizar la ejecución del while la primera vez que se llega a él, es necesario
garantizar que la condición (opcion != 9) sea cierta. Para lograr esto se inicializa el valor
de opcion a un valor distinto a 9. En la línea 15 se inicializa el valor de opción con un 0.
El valor con que se inicialice la variable sólo tiene como condición el no ser 9.
El comienzo del bloque del while comienza con las líneas que imprimen las opciones
(líneas 27 a la 30). La línea 32 lee la opción seleccionada por el usuario y la guarda en la
variable opcion.
La estructura switch contiene las opciones de selección para el usuario e indica el
procedimiento que será seguido según la opción seleccionada. Al final del procedimiento
correspondiente a cada opción se incluye el comando break, este comando evita que el
programa continúe su ejecución en la siguiente línea del switch y lo obliga a salir de la
estructura. Esto no es siempre necesario y en algunos casos, dependiendo la lógica que
se desea implementar, el break no es utilizado en una o más de las opciones.
En caso de que el usuario entre la opción 9 la estructura switch hace “absolutamente
nada”, es por esto que sólo incluye un comentario indicando la situación.
En caso de que el usuario entre una opción incorrecta el switch lo manejará con la opción
default e imprime el mensaje “opción incorrecta”.
A continuación se muestra un ejemplo de la corrida del programa
¼¼§ÏEntre dos valores separados por un espacio: 10 15 ÏÏ§Ï ÏϧÏ1. mayor ÏϧÏ2. suma ÏϧÏ3. promedio ÏϧÏ9. salir ÏÏ§Ï ¼¼§ÏSeleccione opción: 1 ÏϧÏmayor: 15.0 ÏÏ§Ï ÏϧÏ1. mayor ÏϧÏ2. suma ÏϧÏ3. promedio ÏϧÏ9. salir
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
ÏÏ§Ï ¼¼§ÏSeleccione opción: 2 ÏϧÏsuma: 25.0 ÏÏ§Ï ÏϧÏ1. mayor ÏϧÏ2. suma ÏϧÏ3. promedio ÏϧÏ9. salir ÏÏ§Ï ¼¼§ÏSeleccione opción: 3 ÏϧÏpromedio: 12.5 ÏÏ§Ï ÏϧÏ1. mayor ÏϧÏ2. suma ÏϧÏ3. promedio ÏϧÏ9. salir ÏÏ§Ï ¼¼§ÏSeleccione opción: 4 ÏϧÏOpción incorrecta ÏÏ§Ï ÏϧÏ1. mayor ÏϧÏ2. suma ÏϧÏ3. promedio ÏϧÏ9. salir ÏÏ§Ï ¼¼§ÏSeleccione opción: 5 ÏϧÏOpción incorrecta ÏÏ§Ï ÏϧÏ1. mayor ÏϧÏ2. suma ÏϧÏ3. promedio ÏϧÏ9. salir ÏÏ§Ï ¼¼§ÏSeleccione opción: 9 ÏϧÏ
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
Programa de ejemplo utilizando valores tipo char para hacer las selecciones
La estructura switch permite utilizar valores de tipo char para realizar las selecciones.
Sin embargo, si se va a construir un programa para que el usuario entre por el teclado los
valores que se utilizarán para realizar las selecciones la situación es más compleja que si
se utilizan valores enteros.
Utilizando objetos de la clase Scanner podemos utilizar el método nextInt() para leer un
valor entero y podemos utilizar directamente ese valor en la estructura switch para que se
seleccione cuál es la selección correspondiente. Sin embargo, la clase Scanner no nos
provee un método para leer un solo carácter. Para leer un solo carácter podemos utilizar
otros mecanismos que provee Java, sin embargo, eso nos causa la siguiente situación:
Cuando un usuario entra un carácter por el teclado, además del carácter que se desea
entrar se entran otros caracteres especiales, como el que indica el final de la línea. Ese
carácter no es visible al usuario pero está incluido en la entrada. Luego de que el
programa lee el primer carácter, el próximo que se procesará es el próximo en la línea,
aunque no corresponda al carácter que explícitamente quiere entrar el usuario. Esta
situación requiere que se busquen métodos para descartar los caracteres no deseados.
En el ejemplo que mostramos próximamente se presenta una alternativa para utilizar el
carácter entrado explícitamente por el usuario y descartar los demás que componen la
línea. Para hacer esto se utilizará el método charAt(). Este método permite extraer de un
string el carácter que se encuentra en la posición indicada por el argumento entre
paréntesis. Por ejemplo, la instrucción
elCaracter = elString.charAt(3);
extrae del string elString el caracter que se encuentra en la posición 3 y almacena el
mismo en la variable elCarater. Es importante señalar que las posiciones comienzan en
la posición 0, o sea que el primer carácter del string se encuentra en la posición 0 (no en
la 1).
//Programa para mostrar el uso de la estructura switch
//cuando los valores utilizados para realizar las
//selecciones son de tipo char
import java.util.Scanner;
class switchStructUsingChars
{
public static void main(String args[])
{
Scanner input = new Scanner( System.in );
char alternativaChar; //variable que contendrá el
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
//caracter seleccionado
//por el usuario
String linea = "";
do
{
System.out.println(" M E N U");
System.out.println("a. Saludo");
System.out.println("b. Despedida");
System.out.println("c. Comentario");
System.out.println("x. Salir del programa");
//Se lee la línea completa en donde el usuario
//entró la alternativa ya que Scanner no provee
//para leer un sólo caracter.
linea = input.next();
//El método charAt() en la próxima instrucción
//permite extraer de un string el caracter que
//se encuentra en la posición indicada por el
//argumento.
//En este caso se utiliza para extraer el que
//se encuentra en la posición 0 del string
//que es donde se encuentra el caracter entrado
//por el usuario. Las otras posiciones contienen
//otros caracteres como el que indica el final
//de la línea.
alternativaChar = linea.charAt(0);
switch (alternativaChar)
{
case 'a':
System.out.println("Hola, que gusto verte.");
break;
case 'b':
System.out.println("Nos vemos luego.");
break;
case 'c':
System.out.println("Qué bonito está el día!");
break;
default:
System.out.print("La alternativa seleccionada");
System.out.println(" no es válida. Favor
seleccionar");
System.out.println("otra alternativa.");
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
break;
}
}
while (alternativaChar != 'x');
}
}
Ejemplo de la ejecución del programa
ÏÏ§Ï M E N U ÏϧÏa. Saludo ÏϧÏb. Despedida ÏϧÏc. Comentario ÏϧÏx. Salir del programa ¼¼§Ïa ÏϧÏHola, que gusto verte. ÏÏ§Ï M E N U ÏϧÏa. Saludo ÏϧÏb. Despedida ÏϧÏc. Comentario ÏϧÏx. Salir del programa ¼¼§Ïb ÏϧÏNos vemos luego. ÏÏ§Ï M E N U ÏϧÏa. Saludo ÏϧÏb. Despedida ÏϧÏc. Comentario ÏϧÏx. Salir del programa ¼¼§Ïc ÏϧÏQué bonito está el día! ÏÏ§Ï M E N U ÏϧÏa. Saludo ÏϧÏb. Despedida ÏϧÏc. Comentario ÏϧÏx. Salir del programa ¼¼§Ïd ÏϧÏLa alternativa seleccionada no es válida. Favor seleccionar ÏϧÏotra alternativa. ÏÏ§Ï M E N U ÏϧÏa. Saludo ÏϧÏb. Despedida ÏϧÏc. Comentario ÏϧÏx. Salir del programa ¼¼§Ïx ÏϧÏLa alternativa seleccionada no es válida. Favor seleccionar ÏϧÏotra alternativa.
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
10.7 Problemas de Práctica
1. Diseñe un programa que lea dos números e indique si la suma de ambos es mayor o si
el producto de ambos es mayor.
2. Diseñe un programa que imprima los números del 1000 al 0 en decrementos de 4.
3. Diseñe un programa que lea un número e indique si el mismo es igual a cero, es
positivo, o es negativo.
4. Codifique el siguiente flujograma
start
A=5
B=20
A>B
A*B
A=A+2
B=B-3
A,B
end
5. Codifique el siguiente flujograma
ICOM 4015 : Programación Avanzada Estructuras de Control
José Navarro 2012
start
end
“ro” print
“alfa”
“beta”
“delta”
input
A,B
B<9
A>B
A>5