Download Unidad VI: Sentencias repetitivas

Document related concepts
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