capítulo 3: estructuras de repetición - Inicio

Anuncio
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca CAPÍTULO 3: ESTRUCTURAS DE REPETICIÓN
Seguimos avanzando en el desarrollo de contenidos y ahora revisemos otras
estructuras de control denominadas como ciclos repetitivos. Además,
combinaremos todo lo aprendido anteriormente con lo que estudiaremos aquí,
con el fin de resolver ciertos ejercicios con un mayor grado de dificultad.
Muchas veces cuando estamos creando algoritmos y programas necesitamos
repetir algunas veces un grupo de sentencias. Imagínese que necesita leer los
datos de 5 alumnos. En pseudocódigo podría expresarse así:
Algoritmo 5 ALUMNOS
Clase CincoAlumnos
1. Método principal
a. Declaraciones
Variables
n1, a1, n2, a2, n3, a3, n4, a4, n5, a5 : Cadena
b. Solicitar Nombre y apellido del alumno 1
c. Leer n1, a1
d. Presentar n1, a1
e. Solicitar Nombre y apellido del alumno 2
f. Leer n2, a2.
g. Presentar n2, a2
h. Solicitar Nombre y apellido del alumno 3
i. Leer n3, a3.
j. Presentar n3, a3
k. Solicitar Nombre y apellido del alumno 4
l. Leer n4, a4
m. Presentar n4, a4
n. Solicitar Nombre y apellido del alumno 5
o. Leer n5, a5
p. Presentar n5, a5
r. Fin Método principal
Fin Clase CincoAlumnos
Fin
Como podemos ver el pseudocódigo anterior las acciones solicitar, leer y
presentar se repiten para cada alumno. Puede suceder que con el tiempo ya no
sean 5 alumnos sino 10, 20 ó 30 ¿sería conveniente seguir trabajando así? La
respuesta inmediata es no ¿qué deberíamos hacer? Buscar algún mecanismo
que nos permita repetir las acciones: solicitar, leer y presentar.
A continuación se muestra una alternativa (usando el ciclo repetitivo FOR) para
el pseudocódigo anterior:
Algoritmo 5 ALUMNOS USANDO FOR
Clase CincoAlumnosFor
1. Método principal
a. Declaraciones
Variables
nom, ape: Cadena
i : Entero
b. FOR i = 1; i <= 5; i ++
1. Solicitar Nombre y apellido del alumno i
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca 2. Leer nom, ape
3. Presentar nom, ape
c. ENDFOR
d. Fin Método principal
Fin Clase CincoAlumnos
Fin
A simple vista podemos ver la disminución de las líneas de código así como de
las variables a usar, dando una mejor legibilidad del código. El algoritmo
anterior muestra el funcionamiento del ciclo FOR, podemos decir, sin entrar en
demasiados detalles, que las acciones solicitar, leer y presentar se ejecutaran
mientras i sea menor o igual que cinco (Fíjese en el punto b. del algoritmo).
Pasamos a estudiar la primera de tres estructuras de repetición que
generalmente existen en todos los lenguajes de programación y veremos como
al igual que con las estructuras de selección se usan condiciones para
determinar la terminación del ciclo repetitivo.
3.1 Ciclo DO … WHILE Inicie el estudio de los ciclos repetitivos con la estructura
DO…WHILE, acuda al texto básico y lea el Capítulo 5 “La
repetición DO…WHILE” página 98. Revise el formato y el
funcionamiento de la estructura de repetición motivo de
nuestro estudio.
¿Qué le pareció la lectura? ¿Comprendió? Si es así avancemos y
repasemos ciertos elementos de la lectura anterior.
Estudiemos algunos detalles importantes de este ciclo repetitivo ya que
ellos nos permitirán diferenciarlo de los otros ciclos repetitivos que
estudiaremos más adelante.
Una de las características más importantes, que posee este ciclo
repetitivo es que se ejecuta por lo menos una vez, ya que la condición se
evalúa al final, luego de las acciones o sentencias que forman parte del
bloque. Recuerden que este ciclo se debe interpretar así: hacer …
mientras se cumpla la condición. Revise la nota que se encuentra en la
página 99 del texto básico.
La representación de este ciclo dentro de Java es la
(“Traducción” del algoritmo de la página 99 del texto básico):
siguiente
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 1 Ejemplo de un ciclo DO...WHILE en Java
La siguiente ilustración muestra la ejecución del programa Empleados1
(Ilustración 28)
Ilustración 2 Ejecución del programa anterior
Para entender el programa lea la explicación y las notas 1 y 2 que se muestran
en la página 100 del texto básico.
Las sentencias desde la 24 hasta la 34 (en la Ilustración 28) constituyen el
bloque o cuerpo o lista de acciones del ciclo repetitivo, recuerde que en Java el
bloque o cuerpo se encierra entre llaves {}. Dentro del algoritmo (que se
encuentra en la página 99 del texto básico) el bloque inicia en la siguiente línea
luego de la palabra DO y termina en la línea anterior a la palabra WHILE.
Fije su atención en la líneas 33 y 34 de la Ilustración 28, ellas muestran como se
podría implementar en Java las acciones 5 y 6 del algoritmo de la página 99 del
texto básico. Si bien el algoritmo, en la línea 5 dice “Preguntar” en Java, se
debe escribir un mensaje, para luego leer la respuesta del mismo.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Dentro de la programación se suele usar dos tipos de condiciones para
determinar cuando se termina el ciclo repetitivo, que se denominan por valor
centinela y por contador.
El programa anterior (Ilustración 28) muestra un ciclo repetitivo controlado por
un valor centinela, es decir un valor que es ingresado por el usuario y que
determina el momento en el que el ciclo termina. Este valor centinela puede ser
un entero (Presione 1 para continuar y 0 para salir) o un carácter como en el
programa anterior. Sería demasiado engorroso para el usuario decirle (presione
1.1 para continuar y 0.0 para salir ó digite las palabras Salir y Continuar). La
repetición controlada por un valor centinela únicamente se aplica para los ciclos
repetitivos DO…WHILE y WHILE. Un ciclo FOR siempre trabajará con un
contador (aunque se podría implementar el control por centinela)
Si bien el texto básico en las páginas 101 y 102 explica lo que es un contador,
el mismo no se usa para determinar el fin del ciclo repetitivo, pero se lo podría
utilizar con ese propósito. Por ejemplo: Elabore un programa o algoritmo que
permita ingresar los datos de 5 alumnos. Deberíamos entonces contar los datos
que han sido ingresados para determinar el fin del ciclo repetitivo.
Acuda nuevamente al texto básico y revise los conceptos contadores y
acumuladores que se muestran en las páginas 101 y 102 del texto básico y
analice como se implementan en los algoritmos que ahí se muestran.
En la página 101, también se habla de la impresión de reportes, tema que lo
dejaremos de lado, ya que el tratar de dar formato a la salida que produce un
programa en Java, vía línea de comandos, resultaría en una tarea compleja, y
que por ahora no es necesaria. Así que cuando en el pseudocódigo encuentre
acciones que dicen “Imprimir encabezado” debe ignorarlas, en especial al
momento de “traducir” el algoritmo a Java.
Dentro de los lenguajes de programación existen algunas funcionalidades que
cambian el comportamiento de los ciclos repetitivos, ellas son break y
continue. Analicemos ahora estas funciones.
3.1.1. Las funciones break y continue En el capítulo anterior cuando revisamos la estructura SWITCH en Java, usamos
para cada caso (case) una sentencia denominada break. Ahora vamos a verla
más formalmente, nos ubicamos en la página 104 del texto básico.
El texto básico enfoca la aplicación de break y continue a los ciclos repetitivos
exclusivamente, por tal motivo el autor del mismo escribe una nota que se
encuentra en la página 104 y se complementa con un texto que se encuentra
en la 105, en donde habla que el uso de break y continue crea programas no
tan bien estructurados.
Bajo nuestra apreciación la afirmación anterior es algo discutible, especialmente
en lo referente a la función break, ya que se puede usar sin dañar la estructura
del programa y antes que causar problemas su uso puede mejorar el
desempeño y tiempo de ejecución de los ciclos repetitivos. Mientras que,
coincidimos con el autor del texto básico en lo que al uso de la sentencia
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca continue se refiere. En nuestra experiencia su uso es casi nulo y puede causar
confusiones.
Por ahora dejaremos el tema hasta ahí y cuando analicemos el ciclo repetitivo
FOR mostraremos el uso de la función break y comprenderemos su utilidad.
Por lo contrario la función continue se quedará en la explicación teórica y no
veremos su aplicación práctica, lo cual no implica de ningún modo que no deba
estudiarla y comprenderla.
Como lo hemos venido haciendo anteriormente, explicaremos el funcionamiento
del ciclo DO … WHILE usando ejercicios y su representación en Java.
Al igual como sucede con las estructuras de selección, dentro de cualquier ciclo
repetitivo, en general, se puede colocar como parte del bloque de sentencias,
otras estructuras de repetición. Recuerde que debemos combinar las diferentes
estructuras de control, con el afán de resolver cualquier tipo de problema. Si
bien los primeros ejercicios tienen el objetivo de que usted entienda el
funcionamiento de cualquier estructura de control, en los ejercicios posteriores
verá otros ejercicios en donde encontrará combinaciones de estructuras de
control.
Dentro del bloque de sentencias o acciones que forman parte de cualquier
estructura de control, se pueden ubicar otras estructuras de control de
diferente tipo.
Con estas ideas analice el algoritmo que se encuentra en la página 106 del
texto básico, el cual muestra una estructura SWITCH dentro de un bucle DO …
WHILE, así como también el uso de contadores, que mencionamos
anteriormente, pero que no vimos su aplicación práctica en Java. El programa
elaborado en base a dicho algoritmo es el siguiente:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 3 Programa en Java que representa al algoritmo de la página 106 (texto básico). Parte 1
En esta primera parte (Ilustración 30, líneas 8 a la 38) podemos ver: la
declaración e inicialización de las variables y la creación del objeto (lector).
Vemos también parte del ciclo repetitivo y las sentencias para realizar la
solicitud y el ingreso de los datos. En la línea 38 la variable descuento es
inicializada, aunque en el algoritmo de la página 106 no se muestra esta acción,
en Java es necesario asignarle un valor, caso contrario el programa no compila,
ya que la variable descuento se usa para realizar un cálculo.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 4 Programa Java que representa el algoritmo de la página 106
En esta segunda parte (Ilustración 31, líneas 39 hasta la 65) vemos como dentro
de un ciclo DO … WHILE podemos ubicar un SWITCH.
El SWITCH que muestra el programa no tiene un caso por defecto. Y como
mencionamos anteriormente, no siempre se necesita. Tal como se muestra en
el programa los tipos de usuario son 4 (casos desde el 1 al 4), si el usuario
ingresa otro valor (diferente a 1, 2, 3, 4) no se ejecutaría ningún caso, por lo
que el valor de descuento sería igual a 0 (revise la línea 38 de la Ilustración 31).
En las líneas 56-59 (Ilustración 31) vemos los contadores. Un contador siempre
se incrementará de unidad en unidad.
Para los mensajes de salida o escritura de información, líneas 54 y 55; 63 y 64
(Ilustración 31); hemos obviado el texto por razones de espacio y presentamos
únicamente valores. Además mostramos cómo funciona la secuencia de escape
\t (tabulador hacia la derecha).
Finalmente veamos la salida que produce el programa:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 5 Salida del programa Java (Imágenes 23 y 24)
Podemos ver en la salida, el nombre del cliente, el sub-total, el descuento y el
valor neto a pagar. Vemos como estos valores cambian según el tipo de cliente.
En el último cliente intencionalmente se digito un tipo de cliente que no existe,
para así mostrar que no se ejecuta ninguno de los casos del SWITCH y el
descuento es igual a 0. Fije su atención en la penúltima línea, vemos ahí las
salidas de los contadores, un entero (el primer número) y de valores reales (los
otros valores).
Ahora desarrollemos un ejercicio en donde se utilice un ciclo repetitivo DO …
WHILE, pero a diferencia de los anteriores que sea controlado por un contador.
El siguiente algoritmo muestra un ciclo repetitivo controlado por un contador y
calcula la sumatoria de los n primeros términos de la siguiente sucesión
numérica:
S = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + ...
O podríamos plantearlo así: elabore un algoritmo que haga la suma de todos
los números enteros positivos que son menores o iguales a un valor ingresado
por el usuario.
Si analizamos el problema, vemos como la entrada es el número de elementos
a sumar o el límite superior (un número). La salida es la suma de todos los
números que pertenecen a la serie (o los números enteros positivos menores o
igual al número ingresado). El proceso es obtener un número y sumarlo a un
acumulador.
Veamos el algoritmo:
Algoritmo SUMATORIA
Clase Sumatoria1
1. Método principal
a. Declaraciones
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Variables
limite, contador, suma, nro : Entero
b. contador = 0
suma = 0
nro = 1;
c. Solicitar el límite
d. Leer limite
e. DO
1. suma = suma + nro
2. nro = nro + 1;
3. contador = contador + 1
f. WHILE contador < limite
g. Imprimir suma
h. Fin Método principal
Fin Clase Sumatoria1
Fin
La representación del algoritmo en Java es la siguiente:
Ilustración 6 Programa Java que muestra un DO ... WHILE controlado por contador
Podemos ver, tanto en el algoritmo como en el programa en Java (Ilustración
33), que el ciclo DO ... WHILE es controlado por el valor de la variable
contador, es decir el fin del ciclo repetitivo es determinado por el valor de
dicha variable; vemos también como el valor del contador es modificado
dentro del bloque de sentencias del ciclo repetitivo.
Uno de los errores más frecuentes cuando se utiliza este tipo de control es
olvidar modificar el valor del contador (líneas: 3 (algoritmo) y 29 (Java
Ilustración 33)) , provocando lo que se conoce como ciclo repetitivo infinito,
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca debido a que la condición nunca dejará de ser verdadera, imagínese que no
existen las líneas 3 del algoritmo y tampoco la línea 29 del código Java ¿Qué
pasaría? La condición del ciclo repetitivo será siempre verdadera provocando un
ciclo repetitivo infinito.
En ciclos repetitivos controlados por un contador recuerde siempre modificar el
valor del control, para evitar ciclos repetitivos infinitos.
Continuando con la explicación del ejemplo vemos que la variable suma es un
acumulador, mientras que la variable nro, es la encargada de generar cada uno
de los términos de la serie, por tal motivo se la usa en la suma.
La salida del programa (Ilustración 33) sería la siguiente:
Ilustración 7 Salida del programa Java que muestra un DO … WHILE controlado por contador
Una vez analizada la estructura DO … WHILE, estudiaremos otra estructura de
repetición denominado FOR. Esta estructura tiene una forma diferente pero el
objetivo de repetir un grupo de sentencias un número finito de veces es el
mismo.
3.2 La repetición FOR Es necesario, antes de continuar, que realice una lectura
comprensiva del Capítulo 6 “La repetición FOR” del texto
básico, ahí se desarrolla el tema de la repetición controlada por
un ciclo FOR
¿Qué le pareció la lectura? ¿Comprendió? Si es así avancemos y repasemos
ciertos elementos de la lectura anterior.
Como menciona el texto básico, en el capítulo 6, página 122, se trata de un
ciclo repetitivo que se lo emplea, cuando se sabe de antemano cuantas veces
se repetirán las sentencias que forman el bloque del ciclo. Y como se mencionó
anteriormente, esta estructura de repetición es controlada por un contador.
Lea detenidamente el formato y funcionamiento de la estructura de repetición
FOR (páginas de la 122 a la 124 del texto básico). En la página 122, se dice
que el contador es una variable tipo entero, real o carácter, pero en nuestra
experiencia en lenguajes de programación, el contador es una variable de tipo
entero. Vea también la sección incremento y la nota que ahí se muestra,
tenemos ya otros 2 operadores aritméticos (++ y --).
En la página 124 casi al final de la misma se muestra un bucle FOR, en donde
en lugar de hacer incrementos de la variable de control se hace decrementos,
mire como cambia el valor inicial y la condición.
La codificación en Java de un ciclo FOR se muestra a continuación, representa
al algoritmo de la página 125 del texto básico.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 8 Ejemplo de bucle FOR en Java
En la Ilustración 35, en la línea 18 se puede ver la principal diferencia entre el
pseudocódigo y el programa en Java. En el pseudocódigo, la variable de control
se declara en la sección de las variables, pero en Java se puede hacer en la
declaración del bucle. En la misma línea observamos el uso del operador de
incremento ++.
En la siguiente tabla se muestran algunas equivalencias entre operadores:
Tabla 1 Operadores unarios y su equivalencia
Operador unario
a++
b --
Equivalencia A
a=a+1
b=b–1
Equivalencia B
b += 1
b -= 1
Le recomiendo seleccionar el operador o la equivalencia (columnas A o B) que
se les haga más sencilla de manejar. Aunque dentro del ciclo FOR generalmente
se hace uso del operador unario.
En la página 125 del texto básico, también se muestra el tema 6.1 “FOR
anidados”, que como ya se ha venido mencionando anteriormente, es colocar
un bucle FOR dentro de otro FOR. Recordemos nuevamente que dentro de una
estructura de control se puede ubicar cualquier otra estructura.
Una recomendación es no modificar la variable de control en alguna de las
sentencias que forman el bloque del ciclo FOR, esto puede traer confusiones al
tratar de leer el mismo, recuerde que el propio ciclo define el incremento o
decremento de la variable de control.
En la página 132 del texto básico se encuentra el ejercicio 6.2.8 en donde se
muestra un algoritmo que trabaja con un FOR descendente, es decir que en
lugar de incremento existe un decremento de la variable de control. Veamos
este mismo algoritmo programado en Java.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 9 Programa en Java que muestra un bucle FOR descendente
Podemos ver, en la Ilustración 36, la estructura del bucle FOR. En la línea 25,
vemos como a la variable de control en cada pasada del ciclo repetitivo se le
disminuye una unidad, por tal motivo a este tipo de bucle se le denomina FOR
descendente. Para que este tipo de bucle funcione, la variable de control se
debe inicializar con un valor alto, la condición generalmente será mientras la
variable de control sea mayor o igual que… La salida del programa se muestra a
continuación:
Ilustración 10 Ejecución del programa que se muestra en la imagen anterior
Recuerde que para formular las condiciones de los ciclos repetitivos debe
siempre pensar en: “repetir estas acciones mientras se cumpla la condición”.
Dentro de la condición de los ciclos repetitivos FOR, no se usa el operador
de igual, ya que ello haría que el bloque de sentencias del ciclo, se ejecuta
como máximo una sola vez.
En la página 133 del texto básico, se explica como a través de un bucle DO …
WHILE se puede representar o simular a un bucle FOR. Podemos generalizar y
decir que se puede representar un ciclo repetitivo usando otro ciclo, con más o
menos líneas de código.
Para finalizar con el estudio de las estructuras de repetición, explicaremos el
ciclo repetitivo WHILE que es una combinación de las estructuras de repetición
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca anteriores.
3.3 La repetición WHILE Es el momento para que acuda al texto básico y lea
detenidamente el Capítulo 7 “La repetición WHILE”. Recuerde
revisar a detalle los ejercicios que ahí se plantean, así como
también revisar el análisis a los algoritmos que se desarrollan.
¿Qué le pareció la lectura? ¿Comprendió? Si es así avancemos y repasemos
ciertos elementos de la lectura anterior.
Este bucle es bastante similar al DO … WHILE, su principal diferencia, es el
número mínimo de veces que se ejecuta. En un ciclo repetitivo WHILE el bloque
de sentencias se ejecuta cero(0) o varias veces; mientras que el DO … WHILE
lo hace una (1) o varias veces. Ubíquese en la página 146 del texto básico, ya
que ahí se explica el formato y funcionamiento del ciclo.
En este ciclo (WHILE), primero se evalúa la condición y luego se ingresa al
bloque de sentencias o acciones que se repetirán. Revise la página 147 y 148
para ver como se puede usar un ciclo WHILE en lugar de un DO … WHILE.
En Java un ciclo WHILE se representa como lo muestra la siguiente Ilustración:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 11 Programa en Java que muestra un ciclo WHILE
El programa que se elaboró representa al algoritmo que se muestra en la
página 148 del texto básico. En la línea 24 de la ilustración anterior se puede
ver al ciclo WHILE y a la condición, el bloque o cuerpo del ciclo se forma desde
la línea 25 hasta la línea 36. Para comprender el funcionamiento del mismo
revise la nota de la página 148 y la explicación que se encuentra en la página
149 del texto básico. La ejecución del programa es la siguiente:
Ilustración 12 Ejecución del programa anterior
En la página 149 del texto básico se muestra como usar un ciclo WHILE para
hacer las mismas acciones que un ciclo FOR. Mientras que en las páginas 150 y
151 muestra como se puede realizar una misma tarea usando los 3 ciclos
repetitivos analizados. Vea la similitud entre el WHILE y el DO … WHILE.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Al igual que el ciclo DO … WHILE, en un ciclo WHILE se puede aplicar el control
por un valor centinela (como lo muestra la Ilustración 33) y por contador como
lo muestra la siguiente ilustración:
Ilustración 13 Bucle WHILE, controlador por un contador
En la Ilustración 40 la variable i hace las veces de contador y su valor controla la
finalización del ciclo repetitivo. La línea 21 imprime un salto de línea y se la
ubicó con el fin de mejorar la salida del programa. El programa se elaboró
tomando como base el algoritmo que se encuentra en la página 150 del texto
básico. La ejecución del programa es la siguiente:
Ilustración 14 Ejecución del programa anterior
A continuación mostraremos algunos usos del ciclo WHILE. Una de las
aplicaciones de un ciclo WHILE (controlado por contador), es cuando el valor
del contador cambia cuando se satisface cierta(s) condición(es). Veamos un
ejemplo:
Elabore un algoritmo y luego un programa que permita encontrar los 3
primeros números perfectos. Un número es perfecto cuando la suma de sus
divisores enteros positivos menores es igual al mismo número. Ejemplo: el
número 6 es perfecto, porque sus divisores son (enteros positivos menores): 1,
2 y 3; y sumamos: 1 + 2 +3 = 6.
Analizando el problema, vemos que no recibe entrada alguna, el proceso sería:
generar números y determinar cuales son sus divisores, sumarlos y comparar la
suma con el número generado, si la suma es igual al número generador,
entonces encontramos un número perfecto y el contador debe incrementarse en
una unidad.
En pseudocódigo tendríamos:
Algoritmo ENCUENTRA 3 NUMEROS PERFECTOS
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Clase TresPerfectos
1. Método principal
a. Declaraciones
contador, generaNum, div, sumaDiv: Entero
b. contador = 0, generaNum = 0
c. WHILE contador < 3
1. generaNum = generaNum + 1
2. sumaDiv = 0
3. FOR div = 1; div < generNum; div ++
a. IF generaNum MOD div == 0 THEN
1. sumaDiv = sumaDiv + div
b. ENDIF
4. ENDFOR
5. IF sumaDiv == generaNum THEN
a. Presentar generaNum
b. contador = contador + 1
6. ENDIF
d. ENDWHILE
e. Fin Método principal
Fin Clase TresPerfectos
Fin
El programa en Java equivalente al algoritmo anterior sería:
Ilustración 15 Programa en Java que calcula y muestra los 3 primeros números perfectos
El resultado de ejecutar el programa que se muestra en la Ilustración 42 es la
siguiente:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 16 Ejecución del programa de la Ilustración 42
Podemos ver (en el algoritmo como en el programa) que se usa un bucle WHILE
controlado por un contador para determinar cuantos números perfectos se han
encontrado, un ciclo FOR para encontrar los divisores del número generado y
una estructura IF para determinar si se trata de un número perfecto.
Entremos en detalles del algoritmo y programa anterior: se declaran las
variables, luego se inicializan, e ingresamos al ciclo WHILE ya que contador es
menor que 3. En la línea 20(Java) y línea 2(algoritmo) se genera un número.
En la siguiente línea la suma de los divisores se iguala a cero (por cada número
generado la suma de divisores debe igualarse a cero, para evitar errores).
Ingresamos al ciclo FOR para encontrar los divisores (Los posibles divisores
deberían empezar por el 1 y ser siempre menor al número generado, esto
explica la inicialización y condición del FOR). En el IF de la línea 24 (Java) y a.
bajo 3. (algoritmo), se determina si el contador del FOR (variable div) es un
divisor del número generado (para lo cuál se usa el módulo), si el módulo es
igual a cero es un divisor y debemos sumar dicho divisor (variable div) a la
suma de divisores. Una vez completado el ciclo FOR (es decir una vez
encontrados y sumados los divisores menores al número generado) llegamos a
la línea 28 (Java) – 5. bajo c. (algoritmo) en donde se compara si la suma de
divisores es igual al número generado; si es así presentamos el número (ya que
es un número perfecto) e incrementamos el contador. Todo lo anterior se
repite mientras el contador no sea igual a 3.
El problema anterior muestra como se pueden anidar diferentes estructuras de
repetición, y como se pueden combinar varias estructuras para resolver un
problema.
Si bien hemos visto como se pueden dar equivalencias entre las estructuras de
repetición, en este caso no sería posible usar un ciclo FOR para reemplazar al
bucle WHILE (línea 19 Java y línea c. algoritmo); porque en las
recomendaciones de uso del ciclo FOR se dice claramente que no se debe
modificar el valor de la variable de control del ciclo FOR en el bloque de
sentencias a repetir, y eso es justamente lo que hace la línea 30 (Java) y b.
bajo 5. del ciclo WHILE (algoritmo), modificar el valor de la variable de control.
Recuerde que el bucle FOR, en su declaración, especifica como la variable de
control debe cambiar y sería contradictorio que otra sentencia cambie
nuevamente la variable de control. Lo anterior trae confusiones y posibles
errores.
Por lo contrario, el bucle WHILE (línea 19 Java – c. algoritmo) se podría
reemplazar con un ciclo DO … WHILE y el ciclo FOR (línea 23 Java – 3 bajo c.
en el algoritmo) podría ser reemplazado por un DO … WHILE o un WHILE.
Al final de la página 151 del texto básico, se muestra la diferencia de los tipos
de repetición, léalo ya que le ayudará a decidir que ciclo repetitivo utilizar. A
continuación presentamos un resumen e indicaciones de cuando usar cada
bucle, aunque se diferencia en algo a lo dicho por el texto básico.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca ¿Cuándo usar cada ciclo repetitivo?
- Cuando se conoce con anticipación cuántas veces se repite(n) la(s)
sentencia(s) se debe usar un ciclo FOR.
- Cuando se requiere modificar la variable de control a alguna lógica, es
conveniente utilizar un ciclo WHILE.
- Cuando es necesario que se ejecute(n) la(s) sentencia(s), por lo meno una
vez, debe utilizar el ciclo DO … WHILE.
A continuación se presenta una serie de ejercicios que pretende aclarar las
conceptos expuestos y sobretodo con la finalidad de que ejercite en la
resolución de problemas.
3.4 Series numéricas Una serie numérica es un grupo de números que comparten una o varias
características. Los elementos de una serie numérica pueden ser números
enteros o reales (generalmente expresados como fracciones).
Algunos ejemplos:
• 1, 2, 3, 4, 5, 6, 7, … (Números consecutivos)
• 2, 4, 6, 8, 10, 12, 14, … (Números pares)
• 1, 2, 3, 5, 7, 11, 13, 17, … (Números primos)
• 0, 1, 1, 2, 3, 5, 8, 13, 21, … (Serie Fibonacci1 )
Los ejemplos anteriores muestran algunos series formadas por números
enteros. Las series que se forman por números reales se expresan como
fracciones, así:
•
S=
2 4 6 8 10 12
+ + + + + + ...
1 2 3 5 7 11
El uso de las sucesiones numéricas es una estrategia que tiene como objetivo
poner en práctica los conocimientos en el manejo de las diferentes estructuras
de control (y sus combinaciones) para resolver problemas.
En la guía didáctica vamos a desarrollar varios ejercicios de este tipo, muchos
de ellos hacen combinaciones de las series de números enteros, para generar
series de números reales.
En nuestra experiencia personal, hemos clasificado a las series numéricas en 2
grupos. Veamos una explicación de dicha clasificación.
Tipos de series
- Según sus elementos:
o Elementos que se calculan aplicando una fórmula. Ejemplo: Fibonacci.
La fórmula que se aplica es que el siguiente elemento se calcula
sumandos los dos anteriores. Para trabajar con este tipo de series se
usa un ciclo FOR.
1
Wikipedia,
Sucesión
de
Fibonacci
[En
línea]
Disponible
http://es.wikipedia.org/wiki/Sucesión_de_Fibonacci [Consultado: 25 de Sep 2009]
en:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca o
Elementos que cumplen ciertas condiciones. Ejemplo: números
primos. La condición que deben cumplir los números que pertenecen a
esta serie es tener como únicos divisores a sí mismo y la unidad. Para
resolver este tipo de series se genera un número y se determina si
cumplo con las condiciones. Se usa ciclos WHILE o DO … WHILE para
resolver series así.
Al igual que debe hacerlo con cualquier tipo de problema, cuando se enfrente a
un problema de series, debe analizar la serie, para clasificarla en alguno de los
2 grupos y así tener una idea de cual estructura de repetición podría usar. Debe
analizar elemento por elemento para tratar de determinar como se forma cada
uno de ellos.
Veamos unos ejemplos de series, resueltas a través de algoritmos. El primer
algoritmo resuelve el siguiente problema: Calcule y presente la sumatoria de
los n primeros términos de una serie formada por números primos (un número
primo es el que es divisible únicamente para si mismo y la unidad). La
representación de la serie sería:
S = 1 + 2 + 3 + 5 + 7 +11 +13 +17 + …
Como lo dijimos en la clasificación de las series según sus elementos, los
primos corresponden al grupo en donde los elementos cumplen ciertas
condiciones. En este caso la condición es que únicamente tenga 2 divisores (el
1 y a si mismo). Al hablar de los n primeros números, n representa cuantos
números de la serie se deben sumar, es decir un límite. Por ejemplo si n = 3, se
debería sumar los números 1, 2 y 3. Si n = 6 se debería sumar 1, 2, 3, 5, 7 y
11.
Recuerde que los programas que estamos desarrollando, deben buscar la
solución más general para el problema, de tal manera que este pueda
responder a todas las entradas válidas hechas por el usuario.
Para el caso de las series lo anterior implica que el programa, que resuelve una
serie, debería trabajar para cualquier valor de n.
Algoritmo SUMATORIA DE NUMEROS PRIMOS
Clase SumaPrimos
1. Método principal
a. Declaraciones
genNum, suma, contador, limite, i: Entero
esPrimo : Boolean
b. suma = 0, genNum = 0, contador = 0
c. Solicitar el número de elementos a sumar
d. Leer limite
e. WHILE contador < limite
1. genNum = genNum + 1
2. esPrimo = True
3. FOR i = 2; i < genNum; i ++
a. IF genNum % i == 0 THEN
1. esPrimo = False
b. ENDIF
4. ENDFOR
5. IF esPrimo == True THEN
a. suma = suma + genNum
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca b. contador = contador + 1
6. ENDIF
f. ENDWHILE
g. Imprimir suma
h. FIN Método principal
Fin Clase SumaPrimos
Fin
El algoritmo anterior, genera un número (vea la línea 1, bajo el punto e.) y
luego se comprueba que ese número es primo (líneas de la 2. a la 4., bajo e.)
la comprobación se hace buscando otro divisor diferente de la unidad y del
número generado, si se encuentra otro divisor (sentencia IF línea a. y b., bajo
3.), la variable (esPrimo) cambia de valor. Luego en el punto 5. (bajo e.) se
verifica si el valor de la variable esPrimo se ha conservado en verdadero
(True), eso señala que no se encontró otro divisor, de tal manera que el
número generado es primo, se agrega a la variable acumulador (suma) y el
contador se incrementa en una unidad.
Usualmente a una variable, que toma un valor para señalar el cumplimiento de
una determinada regla y otro para señalar lo contrario es denomina bandera.
Es el caso de la variable esPrimo, mientras sea verdadera, el número generado
es primo y cuando cambia a falsa, el número generado no es primo.
El siguiente programa muestra el programa en Java del algoritmo anterior.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 17 Programa en Java que hace una sumatoria de números primos
La ejecución del programa anterior sería:
Ilustración 18 Ejecución del programa 39
Veamos un algoritmo que resuelve las series que pertenecen al primer tipo,
elementos que se obtienen aplicando una fórmula. El problema es el siguiente:
Elabore un algoritmo que encuentra la suma de las n primeros términos de la
siguiente serie:
S = 0 + 1 + 1+ 2 + 3 + 5 + 8 + 13 + 21 + …
Analizando el problema, vemos que la entrada es el número de elementos a
sumar, es decir el límite de la serie. Esta sucesión pertenece al primer tipo de
series, ya que a partir del tercer elemento en adelante se obtiene sumando los
dos elementos anteriores. Vamos a llamar a los dos primeros términos primero
y segundo; luego de haber calculado el siguiente término (al que llamaremos
fibo), se hace un intercambio, primero toma el valor de segundo y segundo
toma el valor de fibo, y procederemos de la misma forma con los siguientes
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca elementos. La salida será en este caso la suma de todos los valores que toma la
variable fibo.
El algoritmo es el siguiente:
Algoritmo SUMA TERMINOS DE FIBONACCI
Clase SumaFibonacci
1. Método principal
a. Declaraciones
Variables
limite, primero, segundo, fibo, suma, i: Entero
b. Solicitar límite
c. Leer límite
d. primero = 0, segundo = 1, suma = 0
e. IF limite == 1 OR limite == 2 THEN
suma = limite – 1
f. ELSE
1. suma = suma + 1
2. FOR i = 0; i < limite; i++
a. fibo = primero + segundo
b. primero = segundo
c. segundo = fibo
d. suma = suma + fibo
3. ENDFOR
g. ENDIF
h. Imprimir suma
2. Fin Método principal
Fin Clase SumaFibonacci
Fin
Explicando el algoritmo, empezamos por la línea e., bajo el método principal;
en dicha línea encontramos una estructura de selección IF, esta estructura es
necesaria porque los 2 primeros elementos de la serie (0 y 1) no son generados
por la fórmula, entonces si el usuario ingresa un valor para límite que sea 1, la
suma debería ser 0, mientras que si el usuario ingresa 2, la suma debería ser 1,
como se puede haber percatado la suma sería igual al límite menos 1. Ahora
nos ubicamos en la línea 1. bajo f. (ELSE - si el usuario ingresa un valor mayor
o igual a 3 para límite) la variable suma se incrementa en una unidad, porque
la suma de los dos elementos anteriores es 1. Ingresamos al ciclo FOR y
calculamos el siguiente término de la serie y hacemos el intercambio de los
valores de las variables (primero pasa a ser segundo, segundo toma el valor de
fibo). Finalmente en la línea h. se imprime el resultado.
El programa en Java que representa a este algoritmo es el siguiente:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 19 Programa en Java que muestra la suma de los elementos de Fibonacci
La ejecución del programa anterior muestra la siguiente salida
Ilustración 20 Ejecución del programa 41
Fíjese en la línea 28 del programa que se muestra en la Ilustración 46. Hacemos
uso de los operadores aritméticos, adicionales que tiene Java y que vimos en la
Tabla 5.
Con las explicaciones realizadas deberían estar en la capacidad de resolver
ejercicios un poco más complejos, por tal motivo les planteamos los siguientes
problemas.
Les recomendamos que primero trate de resolver el ejercicio y luego compare
su solución con la que nosotros proponemos. No olvide revisar la parte de
análisis de cada ejercicio independientemente si pudo o no llegar a resolver el
problema.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca 3.5 Ejercicios Importante: En el análisis de los ejercicios desarrollados se utiliza números
para referirse a líneas de código de los programas Java. Mientras que, para los
algoritmos escritos en pseudocódigo se utiliza letras del alfabeto y a veces la
combinación de letras y números.
Muchas veces en nuestros programas es necesario realizar una validación, de
los datos ingresados por los usuarios, antes de realizar cualquier acción. La
validación no es más que determinar si el valor(es) ingresado(s) cumple(n) con
alguna(s) característica(s). Por ejemplo:
• Validar que un valor ingresado por el usuario este en un rango. Ejemplo:
Verificar que el valor ingresado sea mayor que 0 y menor que 70.
• Validar el tipo de dato. Ejemplo: Validar que el número ingresado sea un
número real. Aunque en el pseudocódigo que estudiamos no es posible
realizar este tipo de validaciones, por no contar con algunas
funcionalidades, en Java sí es posible.
Las validaciones se las puede hacer a través de ciclos repetitivos, el más
comúnmente empleado es el DO…WHILE.
Veamos un ejemplo.
1. Elabore un algoritmo y luego un programa en Java que reciba como
entrada un número y verifique si es un número comprendido entre 0 y
10; sino es así, se debe volver a solicitar el ingreso hasta que ingrese un
valor correcto.
Algoritmo VALIDA NUMERO ENTRE 0 Y 10
Clase ValidarNumero1_10
1. Método principal
a. Declaraciones
Variables
numero : Entero
b. DO
1. Solicitar número
2. Leer numero
c. WHILE numero < 0 || numero > 10
d. Presentar “Número correcto”
2. Fin método principal
Fin Clase ValidarNumero1_10
Fin
El programa en Java es el siguiente:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 21 Programa en Java que muestra la validación vía DO...WHILE
Análisis:
Recuerde que: para el análisis del código Java todas los números de
líneas hacen referencia a la Ilustración 48.
Vemos tanto en el algoritmo como en el programa Java, que la condición
del DO … WHILE siempre señala valores fuera del rango que necesitamos
validar (Línea 22 Java – c. Algoritmo). En el problema que estamos
analizando (Validar que el número esté entre 0 y 10), el ciclo repetitivo
dice mientras el número sea menor a cero ó mayor que diez. El
planteamiento es lógico ya que, mientras el número este fuera del rango
(menor que 0 ó mayor que 10) debemos solicitar el ingreso del número
nuevamente.
La ejecución del programa es la siguiente y podemos ver que se
rechazan los valores que se encuentran fuera del rango.
La ejecución del programa Java (Ilustración 48) es la que se muestra a
continuación:
Ilustración 22 Salida del programa que realiza la validación de rangos
La validación puede integrarse también a otros algoritmos/programas, como
por ejemplo las series. En ese caso la validación se realiza sobre el número de
elementos a sumar, validando que sea un número positivo mayor que cero.
Algoritmo SUMA TERMINOS DE FIBONACCI VALIDACION
Clase SumaFibonacci1
1. Método principal
a. Declaraciones
Variables
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca limite, primero, segundo, fibo, suma, i: Entero
b. DO
1. Solicitar límite
2. Leer límite
c. WHILE limite < 0
d. primero = 0, segundo = 1, suma = 0
e. IF limite == 1 || limite == 2 THEN
suma = limite – 1
f. ELSE
1. suma = suma + 1
2. FOR i = 0; i < limite; i++
a. fibo = primero + segundo
b. primero = segundo
c. segundo = fibo
d. suma = suma + fibo
3. ENDFOR
g. ENDIF
h. Imprimir suma
2. Fin Método principal
Fin Clase SumaFibonacci
Fin
El programa en Java es el siguiente:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 23 Suma de la serie de Fibonacci con validación del ingreso de datos
2. Elabore un algoritmo y luego un programa en Java que imprima los
números pares que existen entre 20 y 70. Además se debe contar la
cantidad de números pares que existen.
Algoritmo Números Pares
Clase Pares
1. Método Principal
a. Declaraciones
Variables
i, contador : Entero
b. Calcular contador = 0
c. FOR i = 20; i < 70; i = i + 2
1. Imprimir i
2. contador = contador + 1
d. ENDFOR
e. Imprimir contador
f. Fin Método principal
Fin Clase Pares
Fin
El código en Java se presenta a continuación:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 24 Programa que imprime y cuenta números pares
Análisis:
Tenga presente que: para el análisis del código Java todas los números
de líneas hacen referencia a la Ilustración 51.
En este caso el programa no usa datos de entrada. El proceso usa un
ciclo repetitivo FOR (Vea el punto c. del algoritmo y la línea 16 del código
Java) la variable de control del ciclo se inicializa en 20 y se ejecutará
hasta que sea mayor que 70, con incrementos de 2 unidades. Se
imprime cada valor de i ya que es un número par. La variable contador
(que es un acumulador) se incrementa en una unidad.
La salida del programa son los números pares y el valor del contador. El
contador se imprime al final del ciclo FOR (punto d., línea 20; algoritmo y
Java respectivamente), la impresión se hace al final porque se quiere
conocer el valor total.
3. Elabore un algoritmo y luego un programa en Java que permita obtener
cada uno de los dígitos que forman un número entero positivo.
Algoritmo OBTENER DIGITOS
Clase Digitos
1. Método Principal
a. Declaraciones
Variables
cifra, digito, resto : Entero
b. Solicitar un número
c. Leer cifra
d. WHILE cifra > 0
1. Calcular digito = cifra MOD 10
2. Calcular resto = cifra \ 10
3. Calcular cifra = resto
3. Imprimir digito
e. ENDWHILE
f. Fin Método principal
Fin Clase Digitos
Fin
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca El programa en Java se muestra a continuación:
Ilustración 25 Programa que obtiene los dígitos de un número
La ejecución del programa es la siguiente:
Ilustración 26 Ejecución del programa Digitos
Análisis:
No olvide que: para el análisis del código Java todas los números de
líneas hacen referencia a la Ilustración 52.
El problema recibe como entrada una cifra entera.
El proceso es obtener cada dígito que forma el número, para ello
obtenemos el residuo de la división entera del número para 10 (vea el
punto 1., bajo el punto d. del algoritmo y la línea 24 del código Java);
una vez obtenido el número debemos extraer de la cifra el dígito que se
obtuvo, y se hace una división entera por 10 (punto 2. del algoritmo y
línea 25 de Java). El proceso anterior se repetirá mientras aún existen
dígitos (punto d. del algoritmo, línea 23 de Java).
La salida del programa es cada uno de los dígitos.
4. Elabore un algoritmo y luego un programa en Java que adivine en un
máximo de 7 intentos un número entero entre 0 y 100 que fue pensado
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca por el usuario. El usuario debe pensar en un número y luego responder a
una pregunta. Jamás ingresará el número que pensó. Si el usuario es
realmente sincero el programa encontrará el número pensado por el
usuario.
El algoritmo es el siguiente
Algoritmo ADIVINA NÚMERO
Clase Adivina
1. Clase Principal
a. Declaraciones
Variables
inf, sup, medio, resp, nroIntentos : Entero
encontrado : Booleano
b. Calcular inf = 0 sup = 100 resp = 0 nroIntentos = 0 encontrado
= false
c. Imprimir “Piense en un número”
d. DO
1. medio = (inf + sup) / 2
2. Imprimir “El nro que pensó es “ medio
3. nroIntentos ++
4. Imprimir “Digite 1. Si acerté 2. Si el nro es mayor 3. Si
es menor”
5. Leer resp
6. SWITCH rep
1 : encontrado = true
2 : inf = medio + 1
3 : sup = medio – 1
7. DEFAULT: Imprimir “Opción no válida”
8. ENDSWITCH
e. WHILE nroIntentos <= 7 AND encontrado == true
f. Imprimir nroIntentos
g. Fin Método principal
Fin Clase Adivina
Fin
El programa en Java se puede ver en la siguiente ilustración:
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Ilustración 27 Programa que Adivina un número en 7 intentos
Análisis:
Es necesario que tenga presente lo siguiente: para el análisis del código
Java todas los números de líneas hacen referencia a la Ilustración 54.
La entrada que recibe el programa es la respuesta a la pregunta que se
plantea en el punto 2 bajo d. (algoritmo) o en Java en la línea 25.
El proceso consiste en aplicar una técnica que se denomina búsqueda
binaria, la cual consiste en calcular el valor medio de la lista de posibles
valores (en este caso 0 y 100). Con el valor medio calculado (punto 1.
bajo d. (algoritmo) y línea 24 (Java)) se pregunta si el valor medio es el
valor pensado, si es así se terminó la búsqueda (por eso el caso 1 del
SWITCH cambia el valor de la variable encontrado); sino se debe
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca preguntar si el valor pensado es mayor o menor al valor medio (punto 4.,
bajo d. (algoritmo) y líneas de la 27 a la 30 (Java)).
La búsqueda binaria consiste en cambiar los límites inferior y superior de
la lista según las respuestas del usuario.
Si el usuario afirma que el valor pensado es menor que el medio, se
mueve el límite superior (Vea el punto 3. bajo 6. y línea 40); caso
contrario si el valor pensado es mayor que el medio se mueve el límite
inferior (Vea el punto 2. bajo 6. del algoritmo y línea 37 de Java). Se
debe repetir este proceso mientras el número de intentos sea menor o
igual que 7 y que la variable bandera, encontrado, sea igual a falso
(punto e. del algoritmo y línea 45 Java).
Las salidas que produce el algoritmo se encuentran en los puntos: 2.
bajo d. y 2. bajo f., mientras que en Java en las líneas 25 y 46.
5. Elabore un algoritmo y programa en Java que encuentre la sumatoria de
los n primeros términos de la siguiente serie: S = 10 + 21 + 31 + 52 + 73
+ 115 + …
Algoritmo SUMATORIA SERIE
Clase Serie
1. Método Principal
a. Declaraciones
Variables
limite, genNum, cont, i : Entero
suma : Real
primero, segundo, fibo : Entero
esPrimo : Boleano
b. Calcular genNum = 0, cont = 0, suma = 0
c. Calcular primero = 0, segundo = 1, esPrimo = false
d. Solicitar el número de términos
e. Leer limite
f. WHILE cont < limite
1. genNum = genNum + 1
2. esPrimo = True
3. FOR i = 2; i < genNum; i++
a. IF genNum % i == 0 THEN
1. esPrimo = False
b. ENDIF
4. ENDFOR
5. IF esPrimo == True THEN
a. cont = cont + 1
b. IF cont == 1 OR cont == 2 THEN
1. fibo = cont – 1
c. ELSE
1. fibo = primero + segundo
2. primero = segundo
3. segundo = fibo
d. ENDIF
e. suma = suma + Pot(genNum, fibo)
6. ENDIF
g. ENDWHILE
h. Imprimir suma
2. Fin Método principal
Fin Clase
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Fin
El código Java es el siguiente:
Ilustración 28 Ejemplo de una serie numérica
Análisis:
Recuerde que: para el análisis del código Java todas los números de
líneas hacen referencia a la Ilustración 55.
Este problema recibe como entrada el número de términos a sumar (vea
el punto d. y e. bajo 1. o las líneas de código 23 y 24).
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca El proceso tal como se lo explico en este mismo capítulo se tiene que
analizar cada elemento de la serie; en ella podemos ver que tenemos
como base a los números primos y como exponentes a los términos de
Fibonacci. Cada uno de estos elementos pertenecen a cada uno de los
tipos de series que se analizó, Fibonacci es del tipo en la que un
elemento se obtiene aplicando una fórmula; mientras que los primos son
del tipo en la que un elmento cumple con una o varias características.
El tipo de serie determina que ciclo repetitivo usar y cuando se tiene una
serie con ambos tipos, se selecciona el bucle de la serie cuyos elementos
cumplen con ciertas restricciones, es decir primos. Por eso se usa un
ciclo repetitivo WHILE (punto 1. bajo f. del algoritmo ó línea 26 Java). Lo
primero que haremos será generar un número (punto 1. bajo f. del
método principal del algoritmo o línea 27 de Java) y determinar si ese
número generado es primo (puntos desde el 2. bajo f. del método
principal al 4. bajo f. del mismo método o líneas desde la 28 a la 33).
Para determinar si el número (genNum) es primo se busca otro divisor
diferente de la unidad y del mismo número (genNum) (por eso el FOR
del punto 3. bajo f. y de la línea 29 inicia en 2 y se ejecuta mientras sea
menor que genNum). Si el módulo de la división es igual 0 (IF del punto
a. bajo 3. del ciclo WHILE que se encuentra en f) ese número (i) es
divisor por lo que la variable esPrimo toma el valor de falso (punto 1.
bajo el IF que se encuentra en a. o línea 31 de Java)
Una vez encontrado un número primo el contador de términos se
incrementa y se empieza a trabajar con los elementos de Fibonacci líneas
del algoritmo desde la b. hasta el d. del IF que se encuentra en 5. del
algoritmo o líneas desde la 36 a la 42 en Java. Es necesario recordar que
los 2 primeros términos de la serie de Fibonacci son la base de la misma,
por lo que si se trata de alguno de estos elementos se asigna a fibo el
valor de la variable contador menos una unidad (puntos b. y 1. (bajo
b.) que se encuentran bajo el IF del punto 5. ó líneas 36 y 37 Java). Si
se trata del tercer elemento en adelante se aplica la fórmula para
calcular los elementos de Fibonacci (puntos desde el c. hasta el d. bajo el
IF del punto 5. o líneas desde la 39 a la 41 de Java).
Finalmente se realiza la suma, punto e. bajo el IF que se encuentra en 5.
del algoritmo o línea 43 Java, para ello se aplica la función Pot del
algoritmo o pow de la clase Math. En Java este método devuelve un
valor tipo real lo que hace que la variable suma deba ser de ese tipo de
dato. En el algoritmo no tendríamos ese problema, si la variable suma es
entero o real. Por último se presenta la suma (punto h. bajo 1. del
algoritmo o línea 46 de Java).
En este capítulo se estudio las estructuras de repetición, así como las
equivalencias entre dichas estructuras, se dieron recomendaciones para usar
cada ciclo de repetición, analizamos lo que son las series numéricas y su
importancia en la enseñanza de la programación en general.
Como un complemento a lo expuesto en esta guía didáctica los invitamos a
revisar el siguiente material adicional, que le permitirá incrementar su
conocimiento del lenguaje de programación Java.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Escuela de Ciencias de la Computación – UTPL Fundamentos de la Programación Autores: Ing. Jorge López, Ing. Greyson Alberca Material adicional:
En el CD que se adjuntó en la guía didáctica, puede revisar
(programación-en-java-i\Contenidos\LecturaObligatoria\)
los
archivos:
6-sentenciasrepetitivasobucles.pdf
7-otrassentencias.pdf – Hasta el punto 7.2
Es el momento de comprobar lo aprendido en este capítulo, para lo cual le
proponemos que desarrolle las siguiente autoevaluación. Trate de resolverlos
usted mismo y compare su respuesta con la respuesta que proponemos al final
de la guía didáctica.
Esta obra ha sido licenciada con Creative Commons Ecuador 3.0 de Reconocimiento - No comercial Compartir igual (http://creativecommons.org/licenses/by-nc-sa/3.0/ec/).
Descargar