ESCODIGO

Algoritmos de Estructura repetitivas

Es todos los algoritmos realizados hasta este punto, cada instrucción se ha ejecutado sólo una vez ya sea en forma secuencias o en forma selectiva. Sin embargo, con frecuencia, cierto tipo de problemas requieren de la ejecución reiterada o repetida de un grupo de instrucciones.

Por ejemplo, el programa que califica los exámenes de ingreso a la Universidad consta básicamente de un grupo de instrucciones que califican sólo una prueba. Luego, si deseamos procesar todos los exámenes, agregaremos algunas instrucciones el número de veces que sea necesario para procesar la totalidad de los exámenes.

Para la ejecución repetida de un conjunto de instrucciones, los lenguajes de programación ofrecen una variedad de sentencias o códigos, los que se denominan estructuras repetitivas, estructuras iterativas o simplemente bucles.



Contadores y acumuladores

Existen dos conceptos asociados a las estructuras repetitivas: Contadores y Acumuladores.

Contador

Un contador es una variable auxiliar o de proceso, cuyo propósito es llevar la cuenta del número de veces que se está ejecutando un conjunto de sentencias o un determinado proceso. Estas variables generalmente se verifican para salir del bucle.

Explicaremos como funciona un contador en una estructura secuencial. Escribimos un algoritmo secuencial que permita mostrar 5 veces la frase ‘Programar computadoras es fácil’.

El algoritmo seria el siguiente.


INICIO {escribir 5 veces la frase – Programar computadoras es facil-}
  Escribir ‘Programar computadoras es fácil’
  Escribir ‘Programar computadoras es fácil’
  Escribir ‘Programar computadoras es fácil’
  Escribir ‘Programar computadoras es fácil’
  Escribir ‘Programar computadoras es fácil’
FIN

A este programa que funciona correctamente, le podemos agregar un contador, K, el cual nos servirá para contar el número de veces que se va repitiendo la instrucción que nos permite mostrar el mensaje ‘Programar computadoras es fácil’.


Inicio { Escribir 5 veces la fase ‘Programar computadoras es fácil’}
  {Escribir la frase por primera vez}
    K = 1
    Escribir ‘Programar computadoras es fácil’
  {Escribir la frase por segunda vez}
    K = 2
    Escribir ‘Programar computadoras es fácil’
  {Escribir la frase por tercera vez}
    K = 3
    Escribir ‘Programar computadoras es fácil’
  {Escribir la frase por cuarta vez}
    K = 4
    Escribir ‘Programar computadoras es fácil’
  {Escribir la frase por quinta vez}
    K = 5
    Escribir ‘Programar computadoras es fácil’
Fin

Para mejorar la presentación de nuestro modelo, podemos uniformar el esquema de presentación de este algoritmo, modificándolo de manera que todos los bloques de instrucciones sean similares:


Inicio { Escribir 5 veces la fase ‘Programar computadoras es fácil’}
  K = 0
  {Escribir la frase por primera vez (K= 0+1)}
    K = K +1
    Escribir ‘Programar computadoras es fácil’

  {Escribir la frase por segunda vez (K= 1+1)}
    K = K +1
    Escribir ‘Programar computadoras es fácil’

  {Escribir la frase por tercera vez (K= 2+1)}
    K = K +1
    Escribir ‘Programar computadoras es fácil’

  {Escribir la frase por cuarta vez (K= 3+1)}
    K = K +1
    Escribir ‘Programar computadoras es fácil’

  {Escribir la frase por quinta vez (K= 4+1)}
    K = K +1
    Escribir ‘Programar computadoras es fácil’
Fin

Recordemos que en la instrucciones de asignación tal como K<- K+1, primero se ejecuta la expresión del lado derecho (en este caso: K+1), por tanto, si K tiene el valor inicial de cero, entonces el resultado de la expresión K + 1 será igual a 1 y este valor se asignará a la variable del lado izquierdo, en este caso, también K. Ahora K tiene el valor 1.

En conclusión con la instrucción: K <- K + 1, incrementamos el valor de K en 1

Así mismo, si K almacena inicialmente el valor de 0 y ejecutamos 5 veces la instrucción K<- K + 1, al final K tendrá el valor de 5.

A esta variable auxiliar K se le denomina contador.

Acumulador

El acumulador es también una variable auxiliar o de proceso, cuyo propósito es sumar (acumular) diferentes valores del mismo tipo.

Generalmente la implementación de los procesos con un acumulador tiene el siguiente formato.

S <- S + <Variable>

En esta expresión, S es el acumulador y <Variable> es el valor que se desea agregar a S.

Por ejemplo:


  Suma = 0 {Suma tiene un valor de cero}
  Suma = Suma + 5 {Suma tienen ahora el valor 5}
  Suma = Suma + 8{Suma tienen ahora el valor 13}
  Suma = Suma + 2 {Suma tienen ahora el valor 15}

En este ejemplo la variable suma es un acumulador.

Nótese que los contadores son acumuladores de constantes. Por ejemplo, en la expresión:

K<- K + 1

K es un acumulador de unos.

Tipos de estructuras repetitivas

En forma indistinta se utiliza estructuras repetitivas, estructura iterativa o bucle para referirse a la repetición de un proceso un número fijo o variable de veces.

En el desarrollo de los procesos iterativos se distinguen los siguientes tipos de bucles.

  • Bucles variable:
  • Estructura Repetir Hasta que
  • Estructura Mientras Hacer
  • Bucles fijos
  • Estructura Para

Toda estructura repetitiva tiene las siguientes partes.

  • Inicialización, en la cual se asigna valores iníciales a las variables que intervienen en el test de salida.
  • Actualización, en la que se actualizan las variables que intervienen en el test de salida.
  • Instrucción de proceso, parte del bucle en el que se escriben las instrucciones que se deben repetir.
  • Test de salida, es la que se controla si el bucle continua o se sale del bucle.

Bucles variables

Son estructuras repetitivas en las que no se conoce el número de veces que se ejecutarán las instrucciones que se encuentran dentro del bucle. Por ejemplo, si se trata se contar el numero de dígitos de un número entero positivo no sabemos cuántos dígitos tendrá el número; consiguientemente no se sabe cuantas veces se realizara el proceso de contar. Otro ejemplo es el número de clientes que debe atender un cajero de banco, quien no sabe a priori cuantas personas existen e cola para ser atendidos.


Bucles fijos

Son estructuras repetitivas en que se conoce a priori el número de veces que se ejecutaran las instrucciones que se encentran dentro del bucle. Ejemplo si se trata de ingresar 5 notas a priori se sabe que se debe leer repetidamente 5 notas; consiguientemente el proceso de leer se repetirá 5 veces.


Algoritmos con Estructura repetir-hasta que

Léxico: repetir, hasta que

Sintaxis:


{Inicialización de las variables del test de salida}
REPETIR
  {Actualización de las variables del test de salida}
  Instrucciones de actualización

  {Instrucciones de proceso}
  Instrucciones de proceso
HASTA QUE Condición {Evaluación del test de salida}

Semántica:

¿Cómo funcionan estas estructuras?

Primero se procede a la inicialización de las variables que involucran el test de salida; luego se entra al bucle ejecutándose primeramente las instrucciones de actualización del bucle que involucran variables del test de salida, seguidamente de las instrucciones de proceso. Ambas partes se ejecutan hasta que la condición que involucra la evaluación del test de salida sea verdadera, continuando la ejecución del programa con la ejecución de las instrucciones que siguen a la estructura repetitiva.

Las instrucciones de actualización y las instrucciones de proceso pueden permutarse, es decir, si la lógica del programa lo requiere, primero puede ejecutase las instrucciones de proceso y a continuación las instrucciones de actualización. En algunos casos, es posible que en una sola instrucción se realice la actualización y el proceso.

Esta estructura repetitiva exige que las instrucciones de proceso se realicen por lo monos una vez, pues primero se ejecutan las instrucciones de proceso y luego recién se verifica la validez de la condición en el test de salida.

Problema Base

Escribir un algoritmo que permita escribir 5 veces la frase ‘Programar computadoras es fácil’


Inicio {escribir 5 veces la frase – Programar computadoras es facil}

  Escribir ‘Programar computadoras es fácil’
  Escribir ‘Programar computadoras es fácil’
  Escribir ‘Programar computadoras es fácil’
  Escribir ‘Programar computadoras es fácil’
  Escribir ‘Programar computadoras es fácil’

Fin

Sin embargo este algoritmo no es optimo, esto se evidencia si se tuviese que escribir mil o más veces la misma frase.

Para poder adecuarla a una estructura repetitiva, le añadimos un contador, el cual nos contará el número de veces que se va repitiendo la frase, tal como se explico en la sección de contadores, cuyo algoritmo es el siguiente:


Inicio { Escribir 5 veces la fase ‘Programar computadoras es fácil’}
  K = 0
  {Escribir la frase por primera vez (K = 0+1)}
  K = K +1
  Escribir ‘Programar computadoras es fácil’

  {Escribir la frase por segunda vez (K = 1+1)}
  K = K +1
  Escribir ‘Programar computadoras es fácil’

  {Escribir la frase por tercera vez (K = 2+1)}
  K = K +1
  Escribir ‘Programar computadoras es fácil’

  {Escribir la frase por cuarta vez (K = 3+1)}
  K = K +1
  Escribir ‘Programar computadoras es fácil’

  {Escribir la frase por quinta vez (K = 4+1)}
  K = K +1
  Escribir ‘Programar computadoras es fácil’
Fin

Como podemos apreciar, las dos únicas instrucciones que se repiten 5 veces son


  K = K + 1;
  Escribir ‘Programar computadoras es fácil’

Trasladando este algoritmo al modelo repetitivo, se tiene:


  {Inicialización de la variable K del test de salida}
  K  < - 0
  REPETIR
    {Actualización de la variable K del test de salida}
    Escribir ‘Programar computadoras es fácil’
  HASTA QUE Condición {Evaluación del test de salida}

Condición tendrá que ser una variable booleana o expresión relacional, cuyo valor será verdadero o falso. Para que el bucle repita 5 veces la frase ‘Programar computadoras es fácil’, K deberá tomar el valor de 5, es decir la condición será k=5 , con lo que nuestro algoritmo queda como.


  {Inicialización de la variable K del test de salida} K = 0
  REPETIR
    {Actualización de la variable K del test de salida}
    Escribir ‘Programar computadoras es fácil’
  HASTA QUE K=5 {Evaluación del test de salida}

Este último algoritmo es equivalente al algoritmo secuencial anterior, pero tiene la ventaja de que si nos pidiesen escribir la frase 1000 veces, sólo tendremos que cambiar la sentencia hasta que k=5 por la sentencia hasta que K = 1000.

Generalmente la implementación de algoritmos con contador, tiene la siguiente estructura:


  {Inicializar el contador}
  K = 0
  REPETIR
    {Actualizar contador}
    K = K + 1
    {Instrucciones de proceso}
  HASTA QUE (K=Número de veces) {Controlar si contador llego al final}

La parte de {Instrucciones de proceso} es la que generalmente varia de un algoritmo a otro, y puede estar constituido por: Instrucciones de entrada, asignación, salida, estructuras selectivas e incluso por otras estructuras repetitivas.

La evaluación del test de salida se realiza mediante la condición que contiene <Número de veces> que es una variable que determina el número de veces que se debe repetir el bucle.

Sin embargo, en algorítmica no existen modelos rígidos aplicables a toda circunstancia. Tengamos presente que finalmente nuestra lógica y la naturaleza del problema determinará el algoritmo que planteemos como solución.


Algoritmos con Estructura Para - Hasta - Hacer

La estructura PARA es utilizada en aquellos algoritmos en los que se conoce previamente e numero de veces que se deben repetir la ejecución de un bloque de instrucciones. Esta estructura corresponde a las denominadas estructuras repetitivas fijas y especialmente diseñadas para simplificar la escritura de los siclos controlados por un contador.

Léxico: para – hacer

Sintaxis:


  PARA Variable desde Vinicio HASTA Vfin HACER
  INICIO
    Bloque de instrucciones del bucle
  FIN // Algunos autores también utilizan:

  DESDE Variable = Vinicio HASTA Vfin HACER
  INICIO
    Bloque de instrucciones de bucle
  FIN

Nosotros utilizaremos la primera forma.

Semántica

La variable se denomina variable de control del bucle y hace el papel de contador de la estructura repetitiva. La primera vez que se ejecuta la sentencia PARA, el valor inicial (Vinicio) se asigna a la variable de control, luego el bloque de instrucciones del bucle se ejecuta repetidamente y en cada repetición la variable contador del bucle se incrementa automáticamente en 1; hasta alcanzar el valor final (Vfinal), luego el control del programa continua en la siguiente instrucción a la estructura repetitiva.

Consideremos el siguiente ejemplo para aclarar esta idea.


Para Contador Desde 1 Hasta 5 Hacer
Inicio
  Escribir ‘PERU’
Fin

Cada vez que se ejecuta la instrucción escribir ‘PERU’, la variable de control Contador se incrementa automáticamente en 1, de manera que se escribirá 5 veces la cadena de caracteres ‘PERU’

El anterior ejemplo es funcionalmente equivalente a las siguientes instrucciones.


  Contador = 1
  Mientras Contador <= 5 Hacer
  Inicio
    Escribir ‘PERU’
    Contador = Contador + 1
  Fin

Como se puede ver, comparativamente con la sentencia mientras la estructura para no requiere de instrucciones para inicializar el contador, para verificar la condición y para incrementar el contador, éstas son inherentes a su semántica.

La estructura para no es de propósito general, por lo que al momento de usarla se debe recordar lo siguiente:

  • La variable de control del siclo no puede cambiarse desde dentro del ciclo, pero si puede utilizarse.
  • Después de ejecutarse el bloque de instrucciones de proceso, la variable de control se incrementa en 1 automáticamente.
  • Se debe verificar que al momento de iniciarse el ciclo El valor inicial de la variable de control debe ser menor o igual al valor final que debe de tomar
  • No se debe poner una condición adicional de terminación del ciclo.

Algoritmos con Estructura Mientras - Hacer

Léxico: Mientras, hacer

Sintaxis:


  {Inicialización de la variable del test de salida}
  MIENTRAS Condición HACER
  INICIO
    {Instrucciones de Proceso}
    {Actualización de las variables del test de salida}
  FIN

Semántica

¿Cómo funciona esta estructura?

La estructura repetitiva “mientras” es aquella es que el cuerpo del bucle se repite mientras se cumple una determinada condición.

Primero se procede a la inicialización de las variables que involucran el test de salida; luego se procede a verificar la condición o test de salida, entrando al bucle si esta condición es verdadera. Si la condición no es verdadera se termina la ejecución del bucle, pasando a ejecutarse la primera instrucción que sigue al bucle.

Al entrar al bucle, primero se ejecutan las instrucciones que sigue al bucle.

Al entrar al bucle, primero se ejecutan las instrucciones de proceso, seguidas de las instrucciones de actualización de las variables del test de salida. Ambas partes ejecutar hasta que la condición que involucra la evaluación del test de salida sea falsa.

Las instrucciones de actualización y las instrucciones de proceso pueden permutarse, al igual que en el bucle repetir.

Problema Base

Veamos un ejemplo para ilustrar esta estructura. Consideremos el enunciado y el análisis del primer problema resuelto en este capítulo.

Escribir un algoritmo que escriba los n primeros enteros positivos.


  inicio {Escribir los N primeros números enteros}
    leer N

    {Escribir los N primero números enteros}
    Numero = 1

    MIENTRAS Numero = 1 HACER {Test de salida}
    Inicio
      Escribir Número {Instrucciones de proceso}
      Numero = Numero + 1 {Actualización}
    Fin
  fin

Diferencia de las estructuras mientras y repetir

  • En la estructura mientras la condición se evalúa al inicio, antes de entrar al bucle, por tanto es más general y permite la posibilidad de que el bucle pueda no ejecutarse. Mientras que en la estructura repetir la condición se evalúa al final, por tanto el bucle se ejecutará al menos una vez bajo cualquier circunstancia.
  • La estructura mientras termina cuando la condición es falsa, en tanto que la estructura repetir termina cuando la condición es verdadera.
  • Ambas estructuras deben utilizarse cuando no se conoce de antemano el número de veces que debe ejecutarse el bucle.

¿Cuál de las estructuras es la más conveniente?, depende de la naturaleza de cada problema. Pero todo problema implementado con la estructura repitir - hasta puede implementarse con la estructura mientras hacer.