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