Download Unidad VI: Sentencias repetitivas
Transcript
UNIDAD IV: Sentencias repetitivas Unidad VI: Sentencias repetitivas UNIDAD IV: Sentencias repetitivas 4.1 INTRODUCCIÓN: En temas anteriores hemos hablado sobre las estructuras algorítmicas de repetición Mientras y Para, estas son las estructuras de repetición principales y la forma de implementación al momento de la construcción de los algoritmos difiere una de la otra. Todo ciclo debe terminar de ejecutarse en algún momento dado, por lo general se evalúa en cada iteración si el ciclo debe o no terminar. Esto está dado por lo que se conoce condición de parada. Las estructuras repetitivas Mientras y Para tienen su condición de parada al inicio del bucle, y la estructura repetitiva Repetir posee la condición de parada al final de la misma. 4.2 Sentencia Repetir La estructura repetitiva Repetir es otra estructura repetitiva, la cual ejecuta al menos una vez su bloque repetitivo, a diferencia de Mientras y Para que podían no ejecutar el bloque. Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutará el bloque repetitivo ya que la condición de parada de la estructura repetitiva está al final del bloque a repetir. Representación gráfica: <Acciones> Falso <Expresión lógica> La forma de uso de la sentencia es la siguiente: Repetir secuencia_de_acciones Hasta Que expresion_logica La estructura repetitiva Repetir permite la ejecución del grupo de sentencias al menos una vez. Puesto que la condición de parada será evaluada hasta que se ejecute el grupo de sentencias, el ciclo Repetir se ejecutara hasta que la condición de parada resulte ser verdadera. 2 Unidad VI: Sentencias repetitivas 1 2 3 4 5 6 7 8 Ejemplo: Proceso Ejemplo01_Mientras Definir contador Como Entero; contador <- 1; Mientras contador <= 10 Hacer Escribir "Repeticion numero ", contador; contador <- contador + 1; FinMientras FinProceso Explicación del algoritmo: Línea 2, se declara una variable llamada contador la cual se utilizará para controlar las veces que se ejecutara el ciclo Mientras. Línea 3, se le da un valor inicial a la variable contador Línea 4, inicia el ciclo Mientras cuya condición de parada esta determinada por la expresión lógica contador <= 10. El ciclo Mientras se ejecutara mientras la variable contador posea un valor menor o igual a 10. Línea 5, se presenta un rotulo en pantalla por medio de la sentencia Escribir. Línea 6, la variable contador es incrementada en 1. Si este incremento no esta presente el ciclo Mientras se ejecutara indefinidamente. Diagrama de flujo Resultado de la ejecución Como se puede observar el ciclo Repetir se ejecuta en diez ocasiones, estas repeticiones están dadas por el valor de la variable contador. Será hasta que contador tome un valor mayor a 10 que el ciclo Repetir se detenga. 3 Unidad VI: Sentencias repetitivas Importante La estructura algorítmica Repetir se ejecuta (se termina) hasta que se cumpla una condición determinada. La condición se comprueba al final del bucle. Lo que permite que el bucle se ejecute al menos una vez antes de comprobar la condición de parada. El bucle se repite mientras la condición sea falsa y termina cuando sea verdadera (contrario a la sentencia mientras). 4.2.1 Analicemos el siguiente ejemplo: Se quiere desarrollar un juego de adivinanzas, este permitirá que el usuario ingrese un numero y lo compare con un número generado de forma aleatoria (este número generado debe de estar en el rango de 1-15). Si el número ingresado es igual al número generado, se presentara un mensaje indicándole al usuario que ha ganado. En caso contrario se presentara un mensaje que indique si el número ingresado es mayor o menor que el generado de forma aleatoria. El usuario tendrá como máximo 3 oportunidades. Solución, primera aproximación 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Proceso Repetir_ejemplo02 Definir num, oportunidad, respuesta Como Entero; num <- Azar(15)+1; //Genera un numero aleatorio entre 1-15 oportunidad <- 0; //No se han utilizado oportunidades Repetir Escribir Sin Saltar "Ingrese un numero "; Leer respuesta; oportunidad<-oportunidad+1; //Incrementa las aportunidades Si respuesta = num Entonces Escribir "FELICIDADES, haz ganado... "; Sino Si respuesta < num Entonces Escribir "El numero ingresado es menor...."; Sino Escribir "El numero ingresado es mayor...."; FinSi FinSi Hasta Que oportunidad = 3 Escribir "Se han agotado las oportunidades "; FinProceso ¿Qué sucede cuando el usuario gana en la primera oportunidad? En la siguiente imagen se presenta el caso ya mencionado. 4 Unidad VI: Sentencias repetitivas Como se puede observar en la imagen, en la primera oportunidad el usuario ingreso un número con el que gano el juego. Al no existir un mecanismo que controle si el usuario ha ganado o no el juego, este ultimo sigue pidiendo al usuario que ingrese un número hasta agotar sus oportunidades. Para controlar si el usuario ha ganado, vamos a utilizar una variable que actué como bandera. La solución se muestra a continuación: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Proceso Repetir_ejemplo02 Definir num, oportunidad, respuesta Como Entero; Definir detener como logico; detener <- falso; num <- Azar(15)+1; //Genera un numero aleatorio entre 1-15 oportunidad <- 0; //No se han utilizado oportunidades Repetir Escribir Sin Saltar "Ingrese un numero "; Leer respuesta; oportunidad<-oportunidad+1; //Incrementa las aportunidades Si respuesta = num Entonces Escribir "FELICIDADES, haz ganado... "; detener <- Verdadero; //Indica que se debe detener el ciclo Sino Si respuesta < num Entonces Escribir "El numero ingresado es menor...."; Sino Escribir "El numero ingresado es mayor...."; FinSi FinSi Hasta Que oportunidad = 3 | detener = Verdadero Escribir "Se han agotado las oportunidades "; FinProceso Como se observa en la imagen ahora el ciclo se detiene cuando el usuario adivina el número y gana el juego, pero se muestra un mensaje que indica que se ha quedado sin oportunidades. 5 Unidad VI: Sentencias repetitivas Para corregir esto hemos de realizar el siguiente cambio: //… Si detener = falso Entonces Escribir "Se han agotado las oportunidades "; FinSi //… Luego de realizar el cambio, el mensaje se muestra solo cuando se agotaron las oportunidades y no se ha encontrado el número secreto. Algoritmo completo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Proceso Repetir_ejemplo02 Definir num, oportunidad, respuesta Como Entero; Definir detener como logico; detener <- falso; num <- Azar(15)+1; //Genera un numero aleatorio entre 1-15 oportunidad <- 0; //No se han utilizado oportunidades Repetir Escribir Sin Saltar "Ingrese un numero "; Leer respuesta; oportunidad<-oportunidad+1; //Incrementa las aportunidades Si respuesta = num Entonces Escribir "FELICIDADES, haz ganado... "; detener <- Verdadero; //Indica que se debe detener el ciclo Sino Si respuesta < num Entonces Escribir "El numero ingresado es menor...."; Sino Escribir "El numero ingresado es mayor...."; FinSi FinSi Hasta Que oportunidad = 3 | detener = Verdadero si detener = falso Entonces Escribir "Se han agotado las oportunidades "; FinSi FinProceso 6 Unidad VI: Sentencias repetitivas 1. 4.2.2 Auto aprendizaje Se desea hacer que el juego pregunte al usuario si desea continuar adivinando números o desea abandonar el juego. a. Modifique el algoritmo para que permita lo anteriormente descrito. Ejemplos estructura repetitiva Repetir Ejemplo1 Realice un algoritmo que presente en pantalla la cantidad de números pares positivos y impares positivos, se ingresaron por parte del usuario. El algoritmo permitirá ingresar números enteros finalizando la entrada de datos cuando se ingrese un número negativo. Variables a utilizar - num: Almacenara el número ingresado por parte del usuario. - pares: llevara el conteo de los números pares ingresados - impares: llevara el conteo de los números impares ingresados Datos de entrada: - Se ingresara un número a la vez, cuyo valor se almacenara en la variable num. Datos de salida: - Cantidad de números pares e impares ingresados por parte del usuario. Procedimiento: - Utilizando el ciclo repetir, se solicitara al usuario que ingrese un número, el cual se almacena en la variable num. o Una vez captura el valor, se verificara por medio de la estructura de decisión SI, si el numero ingresado es o no par. Si el número es par, se incrementa en uno a la variable pares, que de inicio deberá poseer el valor cero. Si no es par se aumentara en uno el valor de la variable impares, la variable impares debe de poseer un valor inicial a cero. o El ciclo repetir se detendrá cuando el usuario ingrese un número negatio. 1 2 3 4 5 6 7 8 Solución Proceso Repetir_ejemplo01 Definir num, pares, impares Como Entero; pares<-0; impares<-0; Repetir Escribir Sin Saltar "Ingrese un numero "; 7 Leer num; Unidad VI: Sentencias repetitivas 9 10 11 12 13 14 15 16 17 18 Si num % 2 = 0 Entonces pares <- pares + 1; Sino impares <- impares + 1; FinSi Hasta Que num < 0 Escribir "Se ingresaron ", pares, " numeros pares "; Escribir "Se ingresaron ", impares, " numeros impares "; FinProceso Explicación del algoritmo Línea 2, se declaran las variables a utilizar en el algoritmo. Líneas 3 y 4, se le dan los valores iníciales a las variables pares e impares. Línea 6, inicia el ciclo repetir Línea 7, se le pide al usuario, ingrese un número, el número ingresado por el usuario es almacenado en la variable num. Esto último se realiza en la línea 8. Línea 10, con ayuda de la sentencia SI se verifica si el número ingresado es par o impar, si el número resulta ser par se ejecuta la línea 11 sino se ejecuta la línea 13. Línea 15, en esta línea se encuentra la evaluación de la condición de parada, si la evaluación de la expresión lógica resulta ser falsa, se continua ejecutando el ciclo repetir. Pero si la evaluación de la condición resulta ser verdadera se termina la ejecución del ciclo. Líneas 17 y 18, se presenta en pantalla la cantidad de números pares e impares ingresados por parte del usuario. Resultado 8 Unidad VI: Sentencias repetitivas Diagrama de flujo 2. 3. 4. Auto aprendizaje ¿Analice el algoritmo y verifique si la salida en pantalla es la adecuada?, comente con sus compañeros ¿Qué sucede si al ejecutar el algoritmo se ingresa como primer elemento un número negativo, los resultados son los esperados? Proponga una solución que solucione el problema que surge al ingresar valores negativos. 9 Unidad VI: Sentencias repetitivas Ejemplo2 Escriba un algoritmo que simule la funcionalidad de un menú. Variables a utilizar - opción: variable de tipo entero, almacenara el valor correspondiente al número ingresado por parte del usuario. Datos de entrada: - Se ingresara un número, cuyo valor se almacenara en la variable opcion. Datos de salida: - Se presentara en pantalla un mensaje que indique el valor de la opción ingresada por parte del usuario. Procedimiento: - Utilizando el ciclo repetir, se presentara un menú con 4 opciones. El usuario ingresara un número que puede o no estar en el rango de 1-4. o Si el valor ingresado esta fuera de rango, se vuelve a mostrar cada una de las opciones. o El ciclo se repetirá hasta que el usuario ingrese un número en el rango de 1-4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Solución: Proceso Repetir_Ejemplo02 Definir opcion Como Entero; Repetir Escribir "1.- Ingrese 1 para esta Escribir "2.- Ingrese 2 para esta Escribir "3.- Ingrese 3 para esta Escribir "4.- Ingrese 4 para esta Escribir "¿Que opcion desea: ?"; Leer opcion; Hasta Que opcion >= 1 & opcion <= 4 Opcion"; Opcion"; Opcion"; Opcion"; Escribir "Opcion ingresada: ", opcion; FinProceso Explicación del algoritmo Línea 2, se declara la variable a utilizar “opcion”. Línea 4, inicia el ciclo repetir Líneas 5 a 8, se presentan en pantalla las opciones que puede elegir el usuario Línea 10, se captura en valor ingresado por el usuario. Línea 11, se verifica la condición de parada del ciclo repetir. Línea 13, se presenta en pantalla el valor de la opción ingresada por parte del usuario. Resultado 10 Unidad VI: Sentencias repetitivas Como se puede observar en la imagen cuando el usuario ingresa un valor fuera del rango permitido por ejemplo 0 (primer intento) o 5 (segundo intento). Se le pide que ingrese de nuevo una opción. Es hasta el tercer intento, cuando el usuario ingresa el valor 1, que el ciclo repetir termina de ejecutarse. Diagrama de flujo 11 Unidad VI: Sentencias repetitivas 4.3 Ciclos anidados En ciertas ocasiones se hace necesario la concatenación de estructuras algorítmicas, es decir que una estructura algorítmica forme parte de otra estructura algorítmica. Básicamente el término anidación o concatenación se refiere al hecho de ingresar una sentencia de control dentro de otra sentencia de control. Analicemos el siguiente caso: Se desea desarrollar un algoritmo que presente la siguiente salida en pantalla. 1 1 1 1 1 1 1 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 6 6 6 6 6 Observemos que tenemos 10 filas y en cada fila se presentan tantos números como lo indique la fila, por ejemplo en la fila uno se presenta en pantalla al número 1. En la fila dos se presentan los números 1 2 y así hasta llegar a la última fila “10” donde se presentan los 10 números. 7 7 8 7 8 9 7 8 9 10 Solución Proceso Anidacion_Ejemplo01 definir f, c como entero; Para f<-1 Hasta 10 Con Paso 1 Hacer Para c<-1 Hasta f Con Paso 1 Hacer Escribir sin saltar " ", c; FinPara Escribir " "; //Salto de linea "linea vacia"; FinPara FinProceso Resultado 12 Unidad VI: Sentencias repetitivas Analicemos el siguiente caso: Se desea desarrollar un algoritmo que presente la siguiente salida en pantalla. * * * * * 1 2 3 4 5 6 7 8 9 10 11 * * * * * * * * * * Observemos que tenemos 5 filas y en cada fila se presentan tantos asteriscos como lo indique la fila, por ejemplo en la fila uno se presenta en pantalla un asterisco. En la fila dos se presentan dos asteriscos y así hasta llegar a la última fila “5” donde se presentan los 10 asteriscos. Solución Proceso Anidacion_Ejemplo01 definir x, y como entero; Para x<-1 Hasta 5 Con Paso 1 Hacer Para y<-1 Hasta x Con Paso 1 Hacer Escribir sin saltar " *"; FinPara Escribir " "; FinPara FinProceso Resultado 4.4 Comparando funcionalidad de ciclos La sentencia de iteración Repetir es de tipo posprueba es decir que primero realiza las acciones que están dentro del ciclo y luego realiza la condición de parada. Esto garantiza que el grupo de sentencias que forman parte del ciclo Repetir se ejecutan al menos una vez. La estructura repetitiva primeramente evalúa la condición de parada y si esta resulta ser verdadera se ejecutan las sentencias que formen parte del ciclo. La sentencia Para funciona de la misma manera que Mientras con la salvedad que Para se utiliza (normalmente) cuando se sabe de antemano el número de iteraciones que se realizaran por parte del ciclo. Analicemos en siguiente ejemplo: 13 Unidad VI: Sentencias repetitivas Realicemos un programa que cuente la cantidad de dígitos que posee un número. Para ello tendremos que dividir por diez el número que nos han dado, hasta que el resultado se vuelva cero. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Proceso EjemploCuentaDigitosMientras Definir num, digitos como entero; num <- 4557888; digitos <- 0; Mientras num > 0 Hacer num <- num / 10; digitos <- digitos + 1; FinMientras Escribir "El numero tiene ", digitos, " dígitos"; FinProceso 1. Auto aprendizaje ¿Qué ocurre si el número que nos dan es el cero? El resultado nos dará cero. Obviamente es erróneo, debería devolver un dígito. Pero no entra en el ciclo debido a que de entrada no satisface la condición. Podríamos implementar una solución "ad hoc" como se muestra a continuación: num <- num / 10; digitos <- digitos + 1; Mientras num > 0 Hacer num <- num / 10; digitos <- digitos + 1; FinMientras Realice el cambio mencionado al algoritmo y pruebe de nuevo el algoritmo pero ahora recibiendo en número por parte del usuario Lo ideal es realizar primeramente las operaciones y luego entrar en el bucle verificando la condición de parada al final del bucle. La solución presentada en la parte superior aparentemente es la mejor, pero no hace falta mirar mucho para darnos cuenta que es una solución poco elegante. En realidad quedará mejor con la sentencia Repetir ya que esta última permite entrar al ciclo al menos una vez. La solución se presenta a continuación: 1 2 3 4 5 6 Proceso CuentaDigitosRepetir Definir num, digitos como entero; num <- 4557888; digitos <- 0; Repetir 14 Unidad VI: Sentencias repetitivas 7 8 9 10 11 12 num <- num / 10; digitos <- digitos + 1; Hasta Que num <= 0 Escribir "El numero tiene ", digitos, " digitos"; FinProceso 1. 2. 4.5 Auto aprendizaje Realice el algoritmo anterior, en esta ocasión implementando la estructura repetitiva Para. Comente con sus compañeros, cual es la solución más optima para el problema planteado. Ejercicios Propuestos Ejercicio1 Elabore un algoritmo que presente la siguiente salida. 1 1 2 1 2 3 1 2 3 4 1 2 3 1 2 1 Ejercicio2 Realice un algoritmo para cada una de las siguientes figuras Ejercicio3 Elabore un algoritmo que presente la siguiente salida. 1 1 2 1 2 3 1 2 3 4 1 2 3 4 5 15