5.1. Estructuras Repetitivas: Suma Suma
5.1. Estructuras Repetitivas: Suma Suma
5.1. Estructuras Repetitivas: Suma Suma
algoritmo suma
var
entero : SUMA, NUMERO
inicio
SUMA ← 0
leer(numero)
SUMA ← SUMA + numero
leer(numero)
SUMA ← SUMA + numero
leer(numero)
fin
y así sucesivamente para cada número de la lista. En otras palabras, el algoritmo repite muchas veces las acciones.
leer(numero)
SUMA ← SUMA + numero
Tales opciones repetidas se denominan bucles o lazos. La acción (o acciones) que se repite en un bucle se deno-
mina iteración. Las dos principales preguntas a realizarse en el diseño de un bucle son ¿qué contiene el bucle? y
¿cuántas veces se debe repetir?
Cuando se utiliza un bucle para sumar una lista de números, se necesita saber cuántos números se han de sumar.
Para ello necesitaremos conocer algún medio para detener el bucle. En el ejemplo anterior usaremos la técnica de
solicitar al usuario el número que desea, por ejemplo, N. Existen dos procedimientos para contar el número de iteracio-
nes, usar una variable TOTAL que se inicializa a la cantidad de números que se desea y a continuación se decrementa
en uno cada vez que el bucle se repite (este procedimiento añade una acción más al cuerpo del bucle: TOTAL ← TO-
TAL - 1), o bien inicializar la variable TOTAL en 0 o en 1 e ir incrementando en uno a cada iteración hasta llegar al
número deseado.
algoritmo suma_numero
var
entero : N, TOTAL
real : NUMERO, SUMA
inicio
leer(N)
TOTAL ← N
SUMA ← 0
mientras TOTAL > 0 hacer
leer(NUMERO)
SUMA ← SUMA + NUMERO
TOTAL ← TOTAL - 1
fin_mientras
escribir('La suma de los', N, 'números es', SUMA)
fin
Flujo de control II: Estructuras repetitivas 159
Para detener la ejecución de los bucles se utiliza una condición de parada. El pseudocódigo de una estructura
repetitiva tendrá siempre este formato:
inicio
//inicialización de variables
repetir
acciones S1, S2, ...
salir según condición
acciones Sn, Sn+1, ...
fin_repetir
Aunque la condición de salida se indica en el formato anterior en el interior del bucle —y existen lenguajes que
así la contienen expresamente1—, lo normal es que la condición se indique al final o al principio del bucle, y así se
consideran tres tipos de instrucciones o estructuras repetitivas o iterativas generales y una particular que denomina-
remos iterar, que contiene la salida en el interior del bucle.
iterar (loop)
mientras (while)
hacer-mientras (do-while)
repetir (repeat)
desde (for)
algoritmo SUMA_numeros
var
entero : N, TOTAL
real : NUMERO, SUMA
inicio
leer(N)
TOTAL ← N
SUMA ← 0
repetir
leer(NUMERO)
SUMA ← SUMA + NUMERO
TOTAL ← TOTAL - 1
hasta_que TOTAL = 0
escribir('La suma es', SUMA)
fin
Los tres casos generales de estructuras repetitivas dependen de la situación y modo de la condición. La condición
se evalúa tan pronto se encuentra en el algoritmo y su resultado producirá los tres tipos de estructuras citadas.
1. La condición de salida del bucle se realiza al principio del bucle (estructura mientras).
algoritmo SUMA1
inicio
1
Modula-2 entre otros.
160 Fundamentos de programación
//Inicializar K, S a cero
K ← 0
S ← 0
leer(n)
mientras K < n hacer
K ← K + 1
S ← S + K
fin_mientras
escribir (S)
fin
2. La condición de salida se origina al final del bucle; el bucle se ejecuta hasta que se verifica una cierta con-
dición.
repetir
K ← K + 1
S ← S + K
hasta_que K > n
i es un contador que cuenta desde el valor inicial (vi) hasta el valor final (vf) con los incrementos que se
consideren; si no se indica nada, el incremento es 1.
EJEMPLO 5.1
Leer por teclado un número que represente una cantidad de números que a su vez se leerán también por teclado.
Calcular la suma de todos esos números.
algoritmo suma_numeros
var
entero : N, TOTAL
real : numero, SUMA
inicio
leer(N)
{leer numero total N}
TOTAL ← N
SUMA ← 0
Flujo de control II: Estructuras repetitivas 161
Pseudocódigo en español
mientras condicion hacer
no accion S1
condición accion S2
.
.
sí acción Sn
fin _ mientras
acciones
Pseudocódigo en inglés
while condicion do
<acciones>
a) .
.
endwhile
dowhile condicion
<acciones>
acciones .
.
enddo
c) b)
En el caso anterior, como la variable TOTAL se va decrementando y su valor inicial era N, cuando tome el valor 0,
significará que se han realizado N iteraciones, o, lo que es igual, se han sumado N números y el bucle se debe parar
o terminar.
EJEMPLO 5.2
Contar los números enteros positivos introducidos por teclado. Se consideran dos variables enteras numero y con-
tador (contará el número de enteros positivos). Se supone que se leen números positivos y se detiene el bucle cuan-
do se lee un número negativo o cero.
algoritmo cuenta_enteros
var
entero : numero, contador
inicio
contador ← 0
leer(numero)
mientras numero > 0 hacer
leer(numero)
contador ← contador + 1
fin_mientras
escribir('El numero de enteros positivos es', contador)
fin
162 Fundamentos de programación
inicio
contador ← 0
leer numero
leer numero
contador ← contador + 1
fin
Obsérvese que los pasos 3 a 6 se ejecutarán mientras los números de entrada sean positivos. Cuando se lea –15
(después de 4 pasos), la expresión numero > 0 produce un resultado falso y se transfiere el control a la acción es-
cribir y el valor del contador será 4.
Obsérvese que en una estructura mientras la primera cosa que sucede es la evaluación de la expresión booleana;
si se evalúa falsa en ese punto, entonces del cuerpo del bucle nunca se ejecuta. Puede parecer inútil ejecutar el
cuerpo del bucle cero veces, ya que no tendrá efecto en ningún valor o salida. Sin embargo, a veces es la acción
deseada.
inicio
n ← 5
s ← 0
mientras n <= 4 hacer
leer(x)
s ← s + x
fin_mientras
fin
En el ejemplo anterior se aprecia que nunca se cumplirá la condición (expresión booleana n <= 4), por lo cual
se ejecutará la acción fin y no se ejecutará ninguna acción del bucle.
Flujo de control II: Estructuras repetitivas 163
EJEMPLO 5.3
El siguiente bucle no se ejecutará si el primer número leído es negativo o cero.
C ← 0
leer(numero)
mientras numero > 0 hacer
C ← C + 1
leer(numero)
fin_mientras
leer(capital)
tasa ← 10
mientras tasa <> 20 hacer
interes ← tasa*0.01*capital // tasa*capital/100=tasa*0.01*capital
escribir('interes producido', interes)
tasa ← tasa + 2
fin_mientras
escribir('continuacion')
Los sucesivos valores de la tasa serán 10, 12, 14, 16, 18, 20, de modo que al tomar tasa el valor 20 se detendrá
el bucle y se escribirá el mensaje 'continuación'. Supongamos que se cambia la línea última del bucle por
tasa ← tasa + 3
El problema es que el valor de la tasa salta ahora de 19 a 22 y nunca será igual a 20 (10, 13, 16, 19, 22,...). El
bucle sería infinito, la expresión booleana para terminar el bucle será:
Regla práctica
Las pruebas o test en las expresiones booleanas es conveniente que sean mayor o menor que en lugar de prue-
bas de igualdad o desigualdad. En el caso de la codificación en un lenguaje de programación, esta regla debe
seguirse rígidamente en el caso de comparación de números reales, ya que como esos valores se almacenan
en cantidades aproximadas las comparaciones de igualdad de valores reales normalmente plantean problemas.
Siempre que realice comparaciones de números reales use las relaciones <, <=, > o >=.
Examinémoslos por orden. El primer método simplemente solicita con un mensaje al usuario si existen más en-
tradas.
Suma ← 0
escribir('Existen mas numeros en la lista s/n')
leer(Resp) //variable Resp, tipo carácter
mientras(Resp = 'S') o (Resp = 's') hacer
escribir('numero')
leer(N)
Suma ← Suma + N
escribir('Existen mas numeros (s/n)')
leer(Resp)
fin_mientras
Este método a veces es aceptable y es muy útil en ciertas ocasiones, pero suele ser tedioso para listas grandes;
en este caso, es preferible incluir una señal de parada. El método de conocer en la cabecera del bucle el tamaño o el
número de iteraciones ya ha sido visto en ejemplos anteriores.
Tal vez el método más correcto para terminar un bucle que lee una lista de valores es con un centinela. Un valor
centinela es un valor especial usado para indicar el final de una lista de datos. Por ejemplo, supongamos que se tienen
unas calificaciones de unos tests (cada calificación comprendida entre 0 y 100); un valor centinela en esta lista pue-
de ser –999, ya que nunca será una calificación válida y cuando aparezca este valor se terminará el bucle. Si la lista
de datos son números positivos, un valor centinela puede ser un número negativo que indique el final de la lista. El
siguiente ejemplo realiza la suma de todos los números positivos introducidos desde el terminal.
suma ← 0
leer(numero)
mientras numero >= 0 hacer
suma ← suma+numero
leer(numero)
fin_mientras
Obsérvese que el último número leído de la lista no se añade a la suma si es negativo, ya que se sale fuera del
bucle. Si se desea sumar los números 1, 2, 3, 4 y 5 con el bucle anterior, el usuario debe introducir, por ejemplo:
1 2 3 4 5 -1
el valor final –1 se lee, pero no se añade a la suma. Nótese también que cuando se usa un valor centinela se invierte
el orden de las instrucciones de lectura y suma con un valor centinela, éste debe leerse al final del bucle y se debe
tener la instrucción leer al final del mismo.
El último método de agotamiento de datos de entrada es comprobar simplemente que no existen más datos de
entrada. Este sistema suele depender del tipo de lenguaje; por ejemplo, Pascal puede detectar el final de una línea;
en los archivos secuenciales se puede detectar el final físico del archivo (eof, end of file ).
EJEMPLO 5.4
Considere los siguientes algoritmos. ¿Qué visualizará y cuántas veces se ejecuta el bucle?
1. i ← 0
mientras i < 6 hacer
escribir(i)
i ← i + 1
fin_mientras
Flujo de control II: Estructuras repetitivas 165
La salida es el valor de la variable de control i al principio de cada ejecución del cuerpo del bucle: 0, 1, 2,
3, 4 y 5. El bucle se ejecuta seis veces.
2. i ← 0
mientras i < 6 hacer
i ← i + 1
escribir(i)
fin_mientras
La salida será entonces 1, 2, 3, 4, 5 y 6. El cuerpo del bucle se ejecuta también seis veces. Obsérvese que
cuando i = 5, la expresión booleana es verdadera y el cuerpo del bucle se ejecuta; con i = 6 la sentencia
escribir se ejecuta, pero a continuación se evalúa la expresión booleana y se termina el bucle.
EJEMPLO 5.5
Calcular la media de un conjunto de notas de alumnos. Pondremos un valor centinela de –99 que detecte el fin del
bucle.
inicio
total ← 0
n ← 0 //numero de alumnos
leer(nota) //la primera nota debe ser distinta de -99
mientras nota <> -99 hacer
total ← total + nota
n ← n + 1
leer (nota)
fin_mientras
media ← total / n
escribir('La media es', media)
fin
Obsérvese que total y n se inicializan a cero antes de la instrucción mientras. Cuando el bucle termina, la
variable total contiene la suma de todas las notas y, por consiguiente, total/n, siendo n el número de alumnos,
será la media de la clase.