Analista de Sistemas de Computación
Programación Lógica
Tema 6
ESTRUCTURAS REPETITIVAS MIENTRAS-HACER / REPETIR - HASTA
Se usan cuando no conocemos con anticipación el número de veces que se ejecutará la
acción.
En este tipo de estructura es frecuente el uso de contadores, banderas y centinela para
controlar el bucle.
Un centinela es un valor específico predefinido dado a una variable que permite detectar
cuando se desea terminar de repetir las acciones que constituyen el cuerpo del bucle. Por
ejemplo, se puede diseñar un bucle que pida el nombre y edad de una serie de personas y
establecer que termine el bucle cuando se ingresa 0 (cero) como edad.
La bandera (interruptor) o conmutador - también recibe el nombre de switch - es una va-
riable, por lo general booleana, que puede tomar uno de dos valores (verdadero o falso) a
lo largo de la ejecución del programa. Puede tener las siguientes funciones:
• Salir de un ciclo de iteración variable.
• Comunicar información de una parte a otra parte del programa para variar la secuen-
cia de la ejecución.
ESTRUCTURA MIENTRAS - HACER
Nos permite ejecutar un conjunto de instrucciones hasta que se cumpla una condición es-
pecífica. (El orden de iteraciones no se conoce por anticipado).
Las instrucciones contenidas en el cuerpo del ciclo se ejecutarán solamente si al evaluar la
condición se genera un valor verdadero, en caso contrario se ejecutará la instrucción que
esté del FinMientras
Su diagrama de flujo es:
2
Su pseudocódigo es el siguiente:
Mientras <expresión_logica> Hacer
<acciones>
FinMientras.
Funcionamiento
• La condición (expresión lógica) se evalúa antes y después de cada ejecución del bucle.
Si la condición es verdadera, se ejecuta el bucle y si es falsa, el control pasa a la sen-
tencia siguiente del bucle.
• Si la condición se evalúa a falso cuando se ejecuta el bucle por primera vez, el cuerpo
del bucle no se ejecutará nunca. En este caso se dice que el bucle se ha ejecutado
cero veces.
• Mientras la condición sea verdadera el bucle se ejecutará. Esto significa que el bucle
se ejecutará indefinidamente a menos que “algo” en el interior del bucle modifique la
condición haciendo que su valor pase a falso.
Si la expresión nunca cambia de valor, entonces el bucle no termina nunca y se deno-
mina bucle infinito o sin fin. Situación no deseable.
Veamos unos ejemplos
Ejemplo 1:
Leer una serie de números y calcular su promedio. El proceso termina cuando se ingresa
el número -999
• Datos de salida: promedio de los números (promedio)
• Datos de entrada: cada uno de los números (n)
• Datos auxiliares: un contador para contar los números que introducimos excepto el
-999 (i), un acumulador para realizar la suma de los números menos el -999 (suma)
En este caso vamos a usar un ciclo Mientras controlado por un registro centinela que indi-
cará el fin de archivo. En este caso es el número -999. Cuando se ingresa este valor se
terminará de ejecutar el ciclo.
Cuando utilizamos el registro centinela debemos leer antes del ciclo el primer registro; una
vez que se procese éste, se realiza la lectura del siguiente (antes del fin de ciclo).
3
No tenemos que utilizar un contador para controlar el fin de ciclo.
El pseudocódigo es el siguiente:
Algoritmo promedio
i=0
suma=0
Escribir "Ingrese un número (-999 para terminar): "
Leer n
Mientras n <> -999 Hacer
i=i+1
suma = suma + n
Escribir "Ingrese otro número (-999 para terminar): "
Leer n
FinMientras
prom = suma/i
Escribir "El promedio de los números ingresados es: ", prom
FinAlgoritmo
Pedimos el ingreso de un número antes de comenzar el ciclo. Se verifica si el número in-
gresado es distinto de -999, para ingresar al ciclo. (Mientras n <> -999 Hacer). Si el número
ingresado es distinto a -999 se ingresa al ciclo.
Dentro del ciclo se incrementa el contador (i) que lo utilizaremos luego para calcular el
promedio. El acumulador (suma) guarda la suma parcial de los números ingresados.
4
Luego se solicita el ingreso de otro número. Al ejecutar la instrucción FinMientras automá-
ticamente se vuelve a evaluar la condición n <> -999. Si la condición es verdadera, se vuel-
ven a ejecutar las instrucciones que se encuentran dentro del Mientras.
Si la condición falsa, el algoritmo se sale del ciclo. Una vez fuera del ciclo, calculamos y
mostramos el promedio.
Ejemplo 2:
Calcular la suma de los primeros números enteros, donde n es un número que se ingresa
por teclado. Los números naturales son: 1 2 3 4 5 6 7 8 9 10 … n
• Datos de entrada: n, es el número de valores que deseamos sumar.
• Datos de salida: la suma de los n primeros números enteros
En este caso no sabemos la cantidad de números que se van a sumar, por esta razón hay
que emplear una variable que nos cuente los números hasta que llegue a n. Para esto
usamos la variable i
El diagrama de flujo es el siguiente:
5
El pseudocódigo es:
Algoritmo suma_de_n_nros
i=1 // contador que nos permitirá salir del ciclo
suma=0
Escribir "Cuántos números desea sumar: "
Leer n
Mientras i <=n Hacer
suma = suma + i
i= i + 1 // incrementamos el contador en 1
FinMientras
Escribir "La suma de los ", n " primeros números es: " suma
FinAlgoritmo
Primero inicializamos el contador (i) en 1 y el acumulador (suma) en 0. Solicitamos cuantos
números se desean sumar (n). Luego se verifica si el contador es menor o igual a la canti-
dad de números a sumar (Mientras i <=n Hacer) , que es lo que debe durar el ciclo (n
veces). Se realiza el proceso de suma (suma = suma + i) y se incrementa el contador por
cada vuelta que de.
Al terminar el ciclo, se muestran la suma de los n primeros números. (Escribir "La suma de
los ", n " primeros números es: " suma)
Ejemplo 3
En un comercio se desea saber si un cliente obtiene puntos en base al valor de su compra.
Si la compra supera los $5000 recibe una cantidad de puntos equivalente al 5% sobre el
valor de compra. Mostrar por cada cliente, su nombre y la cantidad de puntos recibida.
Indicar también la cantidad de puntos totales otorgados en el día. Se desconoce la antidad
de clientes que serán atendidos en el día.
Analicemos
En este caso vamos a usar un ciclo mientras cuya condición está manejada por una variable
switch (resp) cuyo valor dentro del ciclo será actualizado mediante una instrucción de en-
trada. La variable resp contendrá dos valores posibles “S” y “N”. “S” indica que el usuario
quiere procesar un nuevo cliente y “N” indica que ya no hay más clientes para procesar.
• Datos de entrada: resp, nombre (nombre del cliente), importe (importe de la com-
pra)
• Datos de salida: puntos (cantidad de puntos que recibe el cliente). totalPuntos (total
de puntos otorgados en el día en el comercio)
6
El diagrama de flujo es el siguiente
Y su pseudocódigo es el siguiente
Algoritmo comercio
resp = "S" // inicializamos en "S" para que al llegar al ciclo, la condición sea verdadera.
totalPuntos = 0 // i=inicializamos el acumulador
Mientras resp = "S" o resp = "s" Hacer // si se ingresa en mayúscula o minúscula
Escribir "Ingrese nombre del cliente: "
Leer nombre
Escribir "Ingrese el valor de la compra: "
Leer importe
Si importe > 5000 Entonces
puntos = importe * 5/100
SiNo
puntos = 0
FinSi
totalPuntos = totalPuntos + puntos
Escribir "Nombre: ", nombre, " Puntos: ", puntos
Escribir "Quiere ingresar otro cliente (S/N)?"
Leer resp
FinMientras
Escribir "Total otorgado de puntos en el día: ", totalPuntos
FinAlgoritmo
7
ESTRUCTURA REPETIR
Ejecuta repetitivamente un conjunto o bloque de instrucciones hasta que se cumpla una
condición determinada que se verifica al final del ciclo. Se ejecuta mientras el valor de la
condición es falso, justo lo contrario de al ciclo mientras.
La estructura repetir se ejecuta al menos una vez, ya que cuando la instrucción repetir se
ejecuta, sólo se evalúa después de ejecutar las instrucciones que hay dentro del bucle.
Su pseudocódigo es:
Repetir
<acciones>
Hasta Que <expresión_logica>
Funcionamiento:
• La condición (expresión lógica) se evalúa al final del bucle, después de ejecutarse
todas las instrucciones.
• Si la expresión lógica es falsa, se vuelve a repetir el bucle y se ejecutan todas las
sentencias
• Si la expresión lógica es verdadera, se sale del bucle y se ejecuta la siguiente ins-
trucción.
Diferencias con la estructura mientras
La estructura Mientras, termina cuando la condición es falsa y repite las instrucciones den-
tro del bucle siempre que la condición es verdadera.
En la estructura Repetir …. Hasta, el cuerpo del bucle se llega a ejecutar al menos una
vez. Por el contrario, el Mientras es mas general y existe la posibilidad de que las acciones
dentro del ciclo no sean ejecutadas
8
Ejemplo 1:
Realizar un algoritmo que pida al usuario una contraseña de acceso, y que no le
permita seguir hasta que la introduzca correctamente. Una vez que ingresa, emita
un mensaje de bienvenida. (La contraseña correcta es 1234)
• Datos de salida: mensaje de bienvenida
• Datos de entrada: la contraseña (pass)
En este caso tenemos que construir un programa que nos pida la contraseña y si existe
algún error, la solicite nuevamente hasta que la misma sea correcta.
Su pseudocódigo es el siguiente:
Algoritmo contraseña
Repetir
Escribir "Ingresa tu contraseña"
Leer pass
Si pass <> 1234 Entonces
Escribir "Contraseña incorrecta"
FinSi
Hasta Que pass=1234
Escribir "Bienvenido!"
FinAlgoritmo
Ejemplo 2:
9
Calcular la suma de los cuadrados de los primeros 50 enteros y mostrar el resultado
Su diagrama de flujo es el siguiente:
Su pseudocódigo es:
Algoritmo Cuadrados
i=1
suma =0
Repetir
suma = suma + i ^ 2
i= i+1
Hasta Que i > 50
Escribir "suma de los cuadrados de los primeros 50 enteros es: ", suma
FinAlgoritmo
Este mismo algoritmo lo podríamos haber resuelto con las estructuras: Para y Mientras.
Usando la estructura Para
10
Algoritmo Cuadrados
i<-1
suma<-0
Para i = 1 Hasta 50 Hacer
suma= suma + X ^ 2
FinPara
Escribir "La suma de los cuadrados de los primeros 50 enteros es, " suma
FinAlgoritmo
Usando la estructura Mientras
Algoritmo Cuadrados
i=1
suma = 0
Mientras i <= 50 Hacer
suma = suma + i ^ 2
i= i+1
FinMientras
Escribir "La suma de los cuadrados de los primeros 50 enteros es, " suma
FinAlgoritmo
11
Ejemplo 3:
En este ejemplo veremos el uso de la variable señal (flag, bandera)
En un conjunto de elementos numéricos enteros sin el cero (pueden existir positivos y ne-
gativos) encontrar el menor de los elementos que sea divisible por el número 3.
Analicemos:
Aquí existen elementos de cualquier valor, excepto el cero que fue dejado fuera del conjunto
adrede, para simplificar el algoritmo y utilizarlo como señal.
Pero vamos a tener que agregar una señal más para saber cuando inicializar la variable
que va a contener el menor. ¿por qué? Bueno, sabemos que pueden o no existir valores
negativos pero no estamos seguro de eso, por lo tanto no podemos utilizar el cero como
valor inicial para la variable menor ya que al comparar, si todos lo valores son positivos
nunca se encontrará uno menor que cero. También esta señal nos servirá para determinar
si existe al menos un número divisible por 3, porque también puede pasar que no exista
ningún múltiplo. Entonces con este flag inicializaremos la variable menor con el primer múl-
tiplo de 3 que se ingrese.
Algoritmo menorMultiplo3
flag = Verdadero
Leer elemento
Mientras elemento <> 0 Hacer
si elemento % 3 = 0 Entonces
Si flag Entonces
menor = elemento
flag = Falso
SiNo
Si elemento < menor Entonces
menor = elemento
FinSi
FinSi
FinSi
Leer elemento
FinMientras
Si flag Entonces
Escribir "no se ingresó ningún múltiplo de 3"
SiNo
Escribir "El menor de los multiplos de 3 es: ", menor
FinSi
FinAlgoritmo
12
ELECCION DE LA ESTRUCTURA REPETITIVA ADECUADA
La elección adecuada de estructuras repetitivas es una de las partes más importantes en
el diseño de algoritmos. La repetición de sentencias en el interior de bucle requiere definir
las condiciones de terminación del bucle con sumo cuidado para evitar un bucle incorrecto
o infinito.
• Si el número de iteraciones se conoce por adelantado, debemos usar el ciclo Para
• Si el número de iteraciones es indeterminado y el bucle no se debe ejecutar cuando
la condición es falsa la primera vez, debemos utilizar el ciclo Mientras
• Si el número de iteraciones es indeterminado y el bucle se debe ejecutar siempre al
menos una vez, utilizamos el ciclo Repetir.
13
ACTIVIDADES:
1) Dadas 15 edades y nombres mostrar por pantalla el nombre con mayor edad
2) Contar y mostrar la cantidad de 0 de una serie de 50 números.
3) Determinar de 500 números cuántos de ellos son positivos.
4) Hacer un algoritmo para obtener la estatura promedio de un grupo de personas, cuyo
número de miembros se desconoce, el ciclo debe efectuarse siempre y cuando se tenga
una estatura registrada (distinta de cero).
5) Realizar un diagrama que permita el ingreso de distintos números. Calcular y mostrar
por pantalla:
a) Cantidad de números positivos
b) Cantidad de números negativos
c) Cantidad de números neutros
d) Suma de números positivos
e) Suma de números negativos
14