18 de mayo de 2017

Diagramas de flujo.

   Un diagrama de flujo es una notación algorítmica de tipo gráfica.

   Un diagrama de flujo es una herramienta gráfica de descripción de algoritmos, que se caracteriza por utilizar un conjunto de símbolos gráficos para expresar simbólicamente los flujos de control o el orden lógico en el que se realizan las acciones de un algoritmo.

   Aunque existe en la literatura una amplia variedad de representaciones para los símbolos utilizados en los diagramas de flujo, en este blog se adoptarán sólo cinco, mismos que se presentan a continuación:

Elementos gráficos de los diagramas de flujo y su significado.

Estructuras de control.
   Esta sección muestra los diagramas de flujo de las estructuras de control, para más detalles respecto a las estructuras de control, refiérase por favor a la entrada Algoritmos (panorama general).

   Estructura secuencial.
   La siguiente figura muestra el diagrama de flujo que representa a la estructura de control secuencial. La estructura y su funcionamiento se explican por sí mismas:
Estructura secuencial en diagrama de flujo.

   Estructuras de selección.
   Las siguientes figuras muestran los diagramas de flujo de las estructuras de selección:

(a) Estructura de selección simple (if) en diagrama de flujo.
(b) Estructura de selección doble (if-else) en diagrama de flujo.
   
(c) Estructura de selección múltiple (switch-case) en diagrama de flujo.

   Puede observarse en la figura (a), que en la estructura de selección simple se evalúa la condición, y si ésta es verdadera, se ejecuta un determinado grupo de sentencias; en caso contrario, las sentencias son ignoradas.

   Por otro lado, en la estructura de selección doble (b), cuando la condición es verdadera se ejecutará un determinado grupo de sentencia(s) 1, y si es falsa se procesará otro grupo diferente de sentencia(s) 2.

   Por último, en la estructura de selección múltiple se ejecutarán unas sentencias u otras según sea el valor que se obtenga al evaluar una expresión representada por el indicador. Se considera que dicho resultado debe ser de tipo ordinal, es decir, de un tipo de datos en el que cada uno de los elementos que constituyen el tipo, excepto el primero y el último, tiene un único predecesor y un único sucesor.

   Estructuras de repetición.
Las siguientes figuras muestran las estructuras de repetición básicas.

(a) Estructura de repetición while en diagrama de flujo.
(b) Estructura de repetición do-while en diagrama de flujo.
 
    Lo que caracteriza a la estructura de repetición “mientras” (while) como puede apreciarse en la figura (a), es que las sentencias del cuerpo del ciclo se procesan cuando la condición es verdadera, además de que la condición es verificada al principio, de donde se deduce que las sentencias se podrán ejecutar de 0 a n veces.

   Por otro lado, en la estructura de repetición “hacer mientras” (do-while), las sentencias del cuerpo del ciclo se ejecutan al menos una vez, y continúan repitiéndose hasta que la condición sea falsa. La verificación de la condición se realiza al final del ciclo (figura (b)), por lo que se deduce que las sentencias se ejecutarán de 1n veces; i.e., al menos una vez.

Diagrama de flujo del algoritmo de Euclides
   La siguiente figura  muestra el diagrama de flujo para el problema propuesto en la sección Algoritmo de Euclides: definición del problema de la entrada Algoritmos (definición y conceptos). La solución a dicho problema está determinada por el algoritmo de Euclides, mismo que se presenta a continuación en su versión de diagrama de flujo:

Diagrama de flujo para el algoritmo de Euclides.
 
   Para ser congruentes con la propuesta de solución realizada en la sección Estructura de un algoritmo de la entrada Algoritmos (definición y conceptos), además del algoritmo, se ha indicado en recuadros de menor intensidad, las especificaciones del proceso de entrada, del proceso de salida, y del proceso general de solución.

17 de mayo de 2017

Ejercicios selectos (bienvenido).

  1. Investigue qué secuencias de escape existen y para qué sirven. Escriba un programa que las incluya, y pruebe cada una de ellas.
  2. Escriba un programa en C que imprima su nombre completo en la pantalla en una sola línea.
  3. Escriba un programa en C que imprima su nombre completo en la pantalla pero dividido en tres líneas:
    1. En la primera línea su(s) nombre(s).
    2. En la segunda línea su primer apellido.
    3. En la tercera línea su segundo apellido.
  4. Diferentes culturas y pueblos tienen distintos tipos de leyendas y la disciplina de la computación no escapa a ellas. Se dice que todo aquel que se inicie en las maravillosas artes de la programación estructurada usando al lenguaje de programación C debe, si no quiere recibir la maldición de ser un mal programador toda su vida, escribir un programa que imprima, en la salida estándar el mensaje: Hola Mundo! Independientemente de sus creencias, evite el riesgo de la maldición y colabore con la perpetuidad de esta tradicional leyenda realizando este simple pero gratificante ejercicio de tal manera que, si el augurio se cumple, se dé por descartada al menos, la maldición...
  5. Investigue qué otros tipos de datos existen en C, qué representación tienen, cuál es el rango de números que pueden almacenar, y cuál es el especificador de formato que utilizan para las funciones printf y scanf respectivamente. Nota: no siempre es el mismo.
  6. Extienda el Ejemplo 2.5 para que considere todos los tipos de datos en C que investigó en el ejercicio anterior.  El Ejemplo 2.5 muestra el uso del operador unario (un operador unario se refiere a que el operador sólo necesita un operando para realizar su función; el operador + por ejemplo es un operador binario porque necesita dos operandos para realizar su función) sizeof para determinar el tamaño en bytes que ocupa el operando asociado. Observe también que el operador sizeof trabaja no sólo sobre tipos de datos (líneas 12 y 14), sino también sobre variables (líneas 11 y  13). El rango de los números representados por un tipo de dato depende del tamaño en bits del tipo de dato; para determinar el tamaño en bits multiplique el tamaño en bytes del tipo de dato y multiplíquelo por ocho.
  7. Experimente omitiendo intencionalmente el uso del operador “&” (ampersand) en la lectura de una variable como la que se hace en el Ejemplo 2.3. ¿Qué sucede cuando compila? ¿Qué pasa cuando se ejecuta?,  si el programa es ejecutado, ¿qué valor se guarda en la variable?
  8. Escriba una programa que basándose en el Ejemplo 2.3, realice la resta de dos números enteros decimales.
  9. Escriba una programa que basándose en el Ejemplo 2.3, realice la multiplicación de dos números enteros decimales.
  10. Escriba una programa que basándose en el Ejemplo 2.3, realice el módulo de dos números enteros decimales. ¿Qué podría pasar en este caso?
  11. Escriba una programa que basándose en el Ejemplo 2.3, realice la división de dos números enteros decimales ¿Qué podría pasar en este caso?
  12. Repita los ejercicios 8-11 con las consideraciones implementadas en el Ejemplo 2.4.
  13. Basándose en el Ejemplo 2.4, modifíquelo para que ahora trabaje con números con punto decimal (float). Haga lo propio para los ejercicios 8, 9 y 11; tome en cuenta que el especificador de formato a utilizar es ahora "%f".
  14. Dependiendo del IDE que esté utilizando, investigue y documéntese acerca de la depuración de programas. Si está compilando en línea, busque un tutorial del programa gdb; en cualquier caso, debe saber que la depuración no sólo le será de suma utilidad, sino que es una tarea fundamental de la programación.


Ejercicios selectos (el proceso).

  1. Busque y lea la historia tan interesante que existe atrás del lenguaje de programación C, y conteste al menos las siguientes preguntas:
    1. ¿Quién o quiénes fueron sus creadores?
    2. ¿Cómo fue su evolución?
    3. ¿En qué año surge?
    4. ¿Cuántas versiones han habido?
    5. ¿A qué se refiere el ANSI C?
  2. Investigue el concepto de código espagueti y compárelo con el concepto de programación estructurada. En base a lo anterior, ¿cuáles considera que serían las ventajas de tener una estructura dentro de un código fuente?
  3. Investigue qué lenguajes de programación además de C, soportan el paradigma estructurado.
  4. Investigue el concepto de Ingeniería de Software.
  5. Investigue el concepto de Proceso de Desarrollo de Software.


Bibliografía sugerida.

  1. Abellanas, M. y Lodares D., "Análisis de Algoritmos y Teoría de Grafos". Macrobit ra-ma.
  2. Deitel, H. M. y Deitel, P. J., "Cómo Programar en C/C++", Prentice Hall.
  3. Joyanes, Aguilar L., "Metodología de la Programación: Diagramas de Flujo, Algoritmos y Programación Estructurada", Mc Graw Hill.
  4. Kernighan, B.W. y Pike R, "La Práctica de la Programación", Prentice Hall.
  5. Kernighan, L., Brian, A.H., y Ritchie, K., Dennis, "El Lenguaje de Programación C", Prentice Hall.
  6. Knuth, Donald Ervin., "The Art of Computer Programming", Vol. 1, 3rd. ed. Addison-Wesley.
  7. Pérez-Aguila, R., "Una Introducción a las Matemáticas para el Análisis y Diseño de Algoritmos", El Cid Editor 2012. 
  8. Schildt, Herbert, "C: the Complete Reference", Osborne, Mc Graw Hill.
  9. Ullman, Jeffrey. D.,  "Fundamental Concepts of Programming Systems", Addison-Wesley Publishing Company Inc.
  10. Wirth, Niklaus, "Algoritmos y Estructuras de Datos", Prentice Hall.

Algoritmos (definición y conceptos).

   El concepto de algoritmo forma parte esencial de los fundamentos de la computación. La matemática discreta y en particular la matemática constructivista, son tan antiguas como la propia matemática, y trata aquellos aspectos para los cuales existe una solución constructivista; esto es, no se conforma con demostrar la existencia de solución, sino que se pregunta cómo encontrar dicha solución.

   El término algoritmo es muy anterior a la era de la computación: proviene hasta donde se sabe de Mohammed al-Khowârizmî (cuyo apellido se tradujo al latín en la palabra algoritmus), quien era un matemático persa del siglo IX que enunció paso a paso las reglas para sumar, restar, multiplicar y dividir números decimales. En este mismo contexto también debe recordarse el algoritmo de Euclides obtenido aproximadamente 300 años antes de nuestra era.

Definición y conceptos.
   En términos generales se define un algoritmo, como el método para resolver un determinado problema, donde el ejecutor de las instrucciones que realiza la tarea correspondiente se denomina procesador.

   Existen algoritmos que describen toda clase de procesos, por ejemplo:
  • Las recetas de cocina.
  • Las partituras musicales.
  • Cambiar la llanta de un auto, etc.
   El procesador realiza dicho proceso siguiendo o ejecutando el algoritmo correspondiente. La ejecución de un algoritmo requiere de la ejecución de cada uno de los pasos o instrucciones que lo conforman.

   Por otro lado, un algoritmo debe estar expresado de tal forma que el procesador lo entienda para poder ejecutarlo. Se dice que el procesador es capaz de interpretar un algoritmo, si el procesador puede:
  1. Entender lo que significa cada paso.
  2. Llevar a cabo (procesar) la sentencia correspondiente.
   Esto significa que para que un algoritmo pueda ser correctamente ejecutado, cada uno de sus pasos debe estar expresado de tal forma que el procesador sea capaz de entenderlos y ejecutarlos adecuadamente.

   Ahora bien, el término de algoritmo puede tener diferentes connotaciones dependiendo del contexto del que se hable; en nuestro caso el contexto es el de programación, esto es, el de utilizar a la computadora como herramienta para la resolución de problemas.

   En este sentido, se definirá un algoritmo como un conjunto finito de instrucciones que especifican la secuencia ordenada de operaciones a realizar para resolver un problema.

   Con base en lo anterior, si el procesador del algoritmo es una computadora, el algoritmo debe estar expresado en forma de un programa, el cual se escribe en un lenguaje de programación. Un lenguaje de programación es lenguaje artificial que se utiliza para expresar programas de computadora, y a la actividad de expresar un algoritmo en un lenguaje de programación determinado se le denomina programar.

   Cada paso del algoritmo se expresa mediante una instrucción o sentencia en el programa, por lo que un programa consiste en una secuencia de instrucciones en donde cada una de las cuales especifica ciertas operaciones a realizar por parte de la computadora.

Uso de la computadora en la resolución de problemas a través de programas.
   En general, se escriben algoritmos para resolver problemas que no son tan fáciles de resolver a primera vista, y de los que se necesita especificar el conjunto de acciones que se llevarán a cabo para su resolución. Además, como lo que interesa es resolver problemas utilizando a la computadora como medio, los algoritmos tendrán la finalidad de ser traducidos en programas, razón por la cual es conveniente el mencionar el proceso general de resolución de problemas a través de programas, mismo que abarca desde que se dispone de un algoritmo, hasta que la computadora lo ejecuta.

   El proceso general de resolución de problemas a través de programas se muestra a continuación:
  1. Algoritmo.
  2. Programación.
  3. Programa en lenguaje de alto nivel.
  4. Traducción.
  5. Programa en código de máquina.
  6. Ejecución.
   Existen diferentes formas de traducir un algoritmo a un programa. En el proceso mostrado con anterioridad, se ha escogido la representación en un lenguaje de programación de alto nivel debido a que los lenguajes de éste tipo proporcionan un mayor nivel de abstracción y semejanza con el lenguaje natural (inglés).

   Es importante recordar que las computadoras tienen su propio lenguaje (binario), por lo que es necesario un proceso de traducción (realizado por el compilador o intérprete), para que se traduzca el conjunto de sentencias escritas en un lenguaje de programación de alto nivel (código fuente), a un conjunto de instrucciones que sean comprensibles para la computadora (código de máquina o código objeto).

   Aunque lo que sucede en cada una de las etapas del proceso involucrado es algo mucho más complejo que lo que aquí se ha sucintamente descrito, si todo está bien, el resultado de dicho proceso será la ejecución del programa basado en el algoritmo.

   Teniendo en consideración lo anterior, debería ser claro que el papel del algoritmo es fundamental, ya que sin algoritmo no puede haber programas, y sin programas, no hay nada que ejecutar en la computadora.

   Por otro lado, es importante también mencionar y enfatizar que un algoritmo es independiente tanto del lenguaje de programación en que finalmente se transcribe, como de la computadora en la que se ejecuta, por lo que no deberían ser diseñados en función de ello.

   Finalmente, otro aspecto muy importante dentro de los algoritmos es el del análisis. El análisis y diseño formal de algoritmos es una actividad intelectual considerable y no trivial, ya que el diseño de buenos algoritmos requiere creatividad e ingenio por un lado, y por el otro que, en general, no existe un algoritmo que diseñe un algoritmo a partir de la descripción de un determinado problema. El análisis formal de algoritmos está fuera de los alcances de este blog.

Cinco importantes condiciones de un algoritmo.
   Los algoritmos, además de ser un conjunto finito de reglas que dan lugar a una secuencia de operaciones para resolver un tipo específico de problemas, deben cumplir con cinco importantes condiciones [Abellanas] mismas que son descritas a continuación:
  1. Finitud: un algoritmo tiene que acabar siempre tras un número finito de pasos (un procedimiento que tiene todas las características de un algoritmo, salvo que posiblemente falla en su finitud, se conoce como método de cálculo.).
  2. Definibilidad: cada paso de un algoritmo debe definirse de modo preciso; las acciones a realizar deben estar especificadas para cada caso rigurosamente y sin ambigüedad.
  3. Conjunto de entradas: debe existir un conjunto específico de elementos donde cada uno de ellos, constituye los datos iniciales de un caso particular del problema que resuelve el algoritmo. A este conjunto de elementos se le denomina conjunto de entradas del algoritmo.
  4. Conjunto de salidas: debe existir un conjunto específico de elementos donde cada uno de ellos, constituye la salida o respuesta que debe obtener el algoritmo para los diferentes casos particulares del problema. A este conjunto de elementos se le denomina conjunto de salidas del algoritmo, y para cada entrada del algoritmo debe existir una correspondiente salida asociada, misma que constituye la solución al problema particular determinada por dicha entrada.
  5. Efectividad: un algoritmo debe ser efectivo. Todas las operaciones a realizar por el algoritmo deben ser lo bastante básicas para poder ser efectuadas de modo exacto y en un lapso de tiempo finito por el procesador que ejecute el algoritmo.
   Las cinco condiciones anteriores reducen significativamente el espectro tan amplio que hasta ahora se ha manejado como algoritmo. Así por ejemplo, aunque una receta de cocina podría considerarse como un algoritmo, es común encontrar expresiones imprecisas en ella que dan lugar a ambigüedad (violando la condición 2), tales como “añádase una pizca de sal”, “batir suavemente", etc., invalidando con ello la formalidad de un algoritmo dentro del contexto que nos compete e interesa.

Estructura de un algoritmo.
   Aunque no existe una única forma de representar un algoritmo (vea [Abellanas}, [Deitel], [Joyanes], [Ullman], [Wirth], etc., cada uno tiene formas diferentes aunque esencialmente iguales de representar un algoritmo), la estructura general de un algoritmo debería ser como la que se muestra a continuación:

      Algoritmo <nombre_del_algoritmo>
      Inicio
               definición de constantes
               definición de variables

               sentencia 1
               sentencia 2
                      .
                      .
                      .
               sentencia n
      Fin

   Cuando se escribe un algoritmo es recomendable que, aunado a la estructura general y partiendo de la descripción del problema y de un análisis inicial, se determine la entrada, la salida y el proceso general de solución del algoritmo.

   Con la finalidad de mostrar dicho procedimiento, a continuación se describirá brevemente un ejemplo clave y clásico en los algoritmos: el algoritmo de Euclides.

Algoritmo de Euclides: definición del problema.
   Dados dos números enteros positivos m y n, encontrar su máximo común divisor (MCD), es decir, el mayor entero positivo que divide a la vez a m y a n.
Entrada: dos números enteros positivos m y n.
Salida: un número que representa el MCD (Máximo Común Divisor) de m y n.
Proceso: la solución está basada en el residuo de la división de los operandos m y n. Si el residuo es 0 entonces hemos terminado; en otro caso, habrá que hacer intercambio de valores y continuar con el proceso.
   El ejemplo del algoritmo de Euclides se utilizará para mostrar el proceso de solución que se debería seguir para resolver un problema. A partir de este análisis inicial, la idea será entonces ir especificando la entrada, la salida y el proceso de solución en un refinamiento progresivo, de tal forma que eventualmente se genere un algoritmo más específico, definido, y funcional.

Pruebas de algoritmos.
   Una vez que se ha generado un algoritmo que parece correcto, una de las partes más importantes dentro de su diseño es la referente a las pruebas. La fase de verificación y validación del algoritmo con respecto a los datos de entrada, es un aspecto sumamente importante de su diseño.

   Una vez que se tiene una solución algorítmica de un problema, no se debería suponer que funcionará bien siempre. En el diseño del algoritmo se deben considerar al menos algunos casos de prueba. En este sentido, es habitual que el dominio de trabajo de un algoritmo sea un conjunto de elementos, en cuyo caso sería deseable el saber por ejemplo, ¿cómo se comporta el algoritmo en los límites del conjunto?, dado un mismo dato de entrada, ¿se obtiene siempre la salida esperada?, dado un mismo dato de entrada, ¿se obtiene siempre la misma salida?, etc.
 
   La fase de prueba de los algoritmos es una parte fundamental dentro del diseño del mismo, y debe ser una práctica habitual de cualquier programador, ya que es una importante técnica de programación, y un principio esencial de la Ingeniería de Software. Es una grave defecto, y fuente de múltiples calamidades, el realizar las pruebas una vez que el programa ha sido realizado, con el programa pueden extenderse las pruebas, hacerse más pruebas, repetir las hechas al algoritmo, pero no esperar a hacer pruebas hasta que el programa esté hecho.
 

   Las técnicas y métodos formales de pruebas están fuera de los alcances de este blog, pero a este nivel, es suficiente saber que es conveniente realizar pruebas sobre los algoritmos desarrollados.
 
    En la entrada Pruebas de escritorio se muestra un ejemplo de la realización  de dicho tipo de pruebas para el algoritmo de Euclides.

Algoritmos (panorama general).

   La resolución de un problema mediante una computadora, se refiere al proceso que consiste en partir de la descripción de un problema y desarrollar un programa de computadora que resuelva dicho problema. Cabe mencionar que el problema está expresado, habitualmente, en lenguaje natural y en los términos propios del dominio del problema, lo cual conlleva sus propias complicaciones independientemente de la complejidad de éste. El proceso involucrado en la solución considera, grosso modo, las siguientes etapas:
  1. Comprensión del problema.
  2. Análisis del problema.
  3. Diseño o desarrollo de un algoritmo.
  4. Transformación del algoritmo en un programa (codificación).
  5. Ejecución y validación del programa.
   Aunque cada una de las etapas es de significativa importancia, la experiencia indica que las tres primeras de ellas son en las que el estudiante presenta mayor dificultad.

   En este sentido, el orden en el que se presentan dichas etapas no es aleatorio, ya que cada una de ellas supone la adecuada terminación de la anterior; así por ejemplo, sería imposible tratar de analizar un problema que ni siquiera se ha comprendido en su contexto más general, y ni qué decir entonces de la elaboración de un algoritmo.

   Probablemente la etapa más sencilla de las cinco sea la número cuatro: la codificación; ya que una vez que el problema se ha comprendido, analizado, y obtenido un algoritmo que lo resuelve, su transformación a un programa de computadora es una tarea de simple traducción, que si bien requiere del conocimiento de la sintaxis del lenguaje elegido para ello, la parte intelectual y de raciocinio queda plasmada en el algoritmo.

   La meta de la programación estructurada es la de hacer programas que sean fáciles de diseñar, depurar (analizar), y susceptibles de ser entendidos por personas diferentes a las que escribieron el programa [Ullman]. No se trata de escribir programas que solamente su creador entienda, se trata de algo más que eso.

   Ahora bien, un programa puede ser visto como un sistema en el que sus componentes son programas más pequeños, y a su vez estos componentes pueden ser vistos como otros, compuestos por similares todavía más pequeños y así sucesivamente hasta un nivel granular razonable, en donde los componentes finales están compuestos de unas cuantas sentencias de código. Los programas escritos siguiendo este diseño se denominan programas estructurados [Jeffrey Ullman].

   En un programa estructurado, el flujo lógico de ejecución se gobierna por tres estructuras de control:
  1. Estructura secuencial.
  2. Estructuras de selección.
  3. Estructuras de repetición.
Teorema de Böhm y Jacopini.
   El teorema de Böhm y Jacopini establece que un programa propio puede ser escrito utilizando únicamente tres tipos de estructuras de control: estructura secuencial, estructuras de selección y estructuras de repetición.

   Para que un programa sea estructurado el programa debe ser propio, y un programa se define como propio si cumple las siguientes condiciones:
  • Tiene un único punto de entrada, y un único punto de salida.
  • Todas las sentencias del algoritmo son alcanzables, y existe al menos un camino que va desde el inicio hasta el fin del algoritmo.
  • No tiene ciclos infinitos.
   De lo anterior se deduce que, si los algoritmos se diseñan empleando las estructuras de control anteriormente mencionadas, los algoritmos, y en consecuencia los programas derivados de ellos, serán propios siempre y cuando se cumplan también las tres condiciones antes mencionadas.

Estructuras de Control.
   Las estructuras secuencial, de selección y de repetición se denominan estructuras de control porque son las que controlan el modo o flujo de ejecución del algoritmo. Su importancia es tal que, una vez que se comprendan, se podrá tener el control respecto al flujo de ejecución de los algoritmos.

   Estructura secuencial.
   La estructura secuencial es las más simple de las tres, y se caracteriza porque una acción o sentencia se ejecuta detrás de otra; es decir, el flujo del algoritmo coincide con el orden físico en el que se han colocado las sentencias en el algoritmo.

   Estructuras de selección.
   Este tipo de estructuras realizan una selección de las acciones o sentencias a ejecutar. La selección de qué sentencias se procesarán está en directa función o dependencia de una condición.

   La condición puede ser tan elaborada como la naturaleza del problema lo requiera, pero se deberá asegurar de que dicha condición pueda ser evaluada de manera booleana, esto es, como verdadera o falsa: sin ambigüedad (la ambigüedad viola una de las cinco condiciones de un algoritmo como se describirá más adelante).

   En este sentido, existen tres tipos de estructuras de selección:
  1. Estructura de selección simple.
  2. Estructura de selección doble.
  3. Estructura de selección múltiple.
   Los flujos de ejecución que siguen, dependiendo de la evaluación de su condición, pueden visualizarse mejor al observar sus representaciones en diagrama de flujo o en pseudocódigo, y se describirán en las entradas correspondientes.

   Estructuras de repetición.
   En las estructuras de repetición las acciones o sentencias del cuerpo del ciclo se repiten mientras se cumpla una determinada condición, misma que deberá seguir los mismos lineamientos descritos para las estructuras de selección.

   En este tipo de estructuras, es frecuente el uso de contadores (utilizados cuando se conoce de antemano el número de repeticiones) o centinelas (utilizados cuando no se conoce con anticipación el número de repeticiones que se realizarán) para controlar el número de repeticiones de un ciclo.

   En la entrada Diagramas de flujo y Pseudocódigo se muestran las notaciones algorítmicas respectivas utilizadas en las estructuras de control aquí mencionadas.

Contenido temático.

El interés que despierta en mí un filósofo depende exactamente de su capacidad para darnos un ejemplo.
Friedrich Nietzsche.