21 de junio de 2017

Pruebas de escritorio.

   En las secciones correspondientes al algoritmo de Euclides de las entradas Diagramas de flujo y Pseudo código respectivamente, se muestran esencialmente el mismo algoritmo en dos notaciones distintas. El algoritmo de Euclides determina el Máximo Común Divisor (MCD) de dos números enteros positivos.

   Una prueba de escritorio es un tipo de prueba algorítmica que consiste en la validación y verificación del algoritmo a través de la ejecución de las sentencias que lo componen (proceso) para determinar sus resultados (salida) a partir de un conjunto inicial determinado de elementos (entrada).
 
    Por simplicidad y para facilitar la comprensión de la prueba se repetirá aquí la versión en diagrama de flujo, pero se puede y recomienda consultar también la versión en Pseudo código:
Algoritmo de Euclides para determinar el MCD.

   Suponga que desea saber cuál es MCD de 15 y 4. Una prueba de escritorio para el algoritmo de MCD consistiría, en primer lugar, de la identificación de las variables involucradas, es decir:

      m =
      n =
      r =

   La sentencia Obtener(m, n) (proceso de entrada) definirá los valores de las variables m y n respectivamente que, con base en lo planteado en el algoritmo y en lo que se desea saber sería:

      m = 15
      n = 4
      r =

mientras que r se define en función de la expresión r = m mod n, es decir:

      m = 15
      n = 4
      r = 3

el siguiente paso es verificar la condición del while (¿es el residuo r distinto de cero?). Como dicha condición es evaluada como verdadera (tres es distinto de cero), se tendría la siguiente secuencia de valores para las variables con base en las operaciones descritas si se sigue el lado derecho del diamante, mismas que constituyen las operaciones realizadas dentro del ciclo:

      m = 15, 4
      n = 4, 3
      r = 3, 1

para la primera iteración o ejecución del ciclo. Como el residuo es distinto de cero, la condición del ciclo es verdadera y sea realiza una segunda iteración, generando ahora los valores:

      m = 15, 4, 3
      n = 4, 3, 1
      r = 3, 1, 0
 
de donde puede verse, que el MCD de 15 y 4 es 1 (almacenado en n) cuando la condición del ciclo se hace falsa, debido a que el residuo es finalmente cero.

   Asegúrese de comprender el proceso descrito y genere usted mismo cada uno de los valores descritos para corroborar lo aquí expuesto. También utilice ahora los mismos valores pero intercambiados, ¿qué sucede? ¿qué secuencia de valores se genera? ¿cuál es el MCD? ¿cuál es ahora el MCD de 15 y 10? ¿cuál es el MCD de 10 y 15?

   Pruebe con otros valores hasta que comprenda el funcionamiento del algoritmo, y compruebe los resultados de sus pruebas de escritorio con los algoritmos descritos en diagrama de flujo y pseudo código respectivamente.


19 de junio de 2017

Pseudo código.

   El pseudo código es un tipo de notación algorítmica en el que se utiliza texto. Es un lenguaje artificial de especificación de algoritmos, caracterizado por:
  1. Mantener una sangría conveniente para la fácil identificación de los elementos que lo componen.
  2. Permitir la declaración de los datos (constantes y/o variables) manipulados por el algoritmo.
  3. Disponer de un conjunto pequeño y completo de palabras reservadas. Las palabras reservadas son propias del lenguaje artificial y no pueden ser utilizadas como identificadores de variables o módulos. Las palabras reservadas se muestran en negritas en la descripción de las estructuras de control correspondientes.
   El pseudo código se concibió para superar las dos principales desventajas del diagrama de flujo:
  1. Lento de crear.
  2. Difícil de modificar.
   A pesar de esto, los diagramas de flujo son una excelente herramienta para el seguimiento del flujo de un algoritmo, así como para transformar con relativa facilidad dichos algoritmos en programas.

Estructuras de control.
   Esta sección describe brevemente en su representación en pseudo código las estructuras de control. Todas las estructuras de control enunciadas siguen las mismas características descritas con anterioridad en las entradas correspondientes de Algoritmos (panorama general) y Algoritmos (definición y conceptos), por lo que se recomienda su revisión.

   Estructura secuencial.
   La siguiente lista de sentencias ilustra la representación en pseudo código de la estructura de control secuencial:

                                                       <Sentencia 1>
                                                       <Sentencia 2>
                                                                  .
                                                                  .
                                                                  .
                                                       <Sentencia n>
Estructura secuencial en pseudo código.

    Es claro que el orden en que se ejecutan o procesan las sentencias es el orden natural en el que aparecen: de izquierda a derecha y de arriba hacia abajo, exactamente de la misma forma en la que leemos un texto.
 
   Estructuras de selección.
   Las estructuras de selección simple, doble y múltiple se muestran a continuación. La condición debe tener una naturaleza de carácter booleano, es decir, que la condición pueda ser evaluada sin ambigüedad como verdadera o falsa:

                                                  if (condición)
                                                         <Sentencia(s)>

Estructura de selección simple (if) en pseudo código.

    Si condición es verdadera, se procesan el grupo de Sentencias (puede ser una o varias) correspondiente, si es falsa, se ignora.
 
                                                  if (condición)
                                                         <Sentencia(s) 1>
                                                  else
                                                         <Sentencia(s) 2>
Estructura de selección doble (if-else) en pseudo código.
 
    Para la estructura de control if-else, si condición es verdadera, se procesan el grupo de Sentencias 1 (puede ser una o varias) correspondiente, si es falsa, se procesan el grupo de Sentencias 2. 

                                                  if (condición 1)
                                                         <Sentencia(s) 1>
                                                  else if (condición 2)
                                                         <Sentencia(s) 2>
                                                  else if (condición 3)
                                                         <Sentencia(s) 3>
                                                                      .
                                                                      .
                                                                      .
                                                  else
                                                         <Sentencia(s) n + 1>

Estructura de selección múltiple anidada (if-else) en pseudo código.

    La estructura de control if-else se puede anidar, permitiendo con ello una mayor versatilidad, así por ejemplo, si condición 1 es verdadera, se procesan el grupo de Sentencias 1 (puede ser una o varias) y se ignoran todas las demás; si es falsa se evalúa la condición 2 y, si es verdadera, se procesan el grupo de Sentencias 2 y se ignoran todas las restantes y así sucesivamente con todas las condiciones y sentencias que existan.
    El último else es opcional. Si existe y ninguna de las condiciones anteriores fue verdadera, entonces se procesa el grupo de Sentencias n + 1.

                                                switch (indicador)
                                                        case <valor 1>:
                                                                <Sentencia(s) 1>
                                                        case <valor 2>:
                                                                <Sentencia(s) 2>
                                                                      .
                                                                      .
                                                                      .
                                                        case <valor n>:
                                                                <Sentencia(s) n>
                                                        default:
                                                                <Sentencia(s) n + 1>

Estructura de selección múltiple (switch-case) en pseudo código.

    La estructura de selección múltiple switch-case es un caso particular de selección múltiple anidada if-else. En ella, el indicador se evalúa y se compara con alguno de los valores (valor 1, valor 2, ..., valor n) para que, se coincide con alguno de ellos, se procese el grupo de Sentencias correspondiente.
    El default y su grupo de sentencias asociado es opcional. Si existe, y el indicador no coincidió con ninguno de los valores propuestos por los case, entonces se procesa el grupo de Sentencias n + 1.
 
    Estructuras de repetición.
   Finalmente, las estructuras de repetición “mientras” (while) y “hacer mientras” (do-while), son presentadas a continuación:


                                                   while (condición)
                                                         <Sentencia(s)>
                                                   end while

Estructura de repetición mientras (while) en pseudo código.
 
    En la estructura de repetición while, mientras la condición sea verdadera se procesará el grupo de Sentencias correspondiente. Una vez que la condición sea falsa, se ejecutará la primera sentencia que aparezca después del end while continuando el flujo de control secuencial a partir de ahí.

                                                   do
                                                         <Sentencia(s)>
                                                   while (condición)

Estructura de repetición hacer-mientras (do-while) en pseudo código.

       En la estructura de repetición do-while, mientras la condición sea verdadera se procesará el grupo de Sentencias correspondiente. Una vez que la condición sea falsa, se ejecutará la primera sentencia que aparezca después del while continuando el flujo de control secuencial a partir de ahí.
   
    Observe que la descripción y el funcionamiento de la estructura do-while es similar al de la estructura while, con la diferencia de que la expresión en el ciclo while es evaluada al principio, mientras que en el ciclo do-while es evaluada al final. Con base en lo anterior se tiene que:
  • Las sentencias de la estructura de repetición while se repiten de 0 a n-veces.
  • Las sentencias de la estructura de repetición do-while se repiten de 1 a n-veces.
   En esencia, esta es la única diferencia que existe entre las estructuras de repetición while y do-while. No pierda de vista esta simple pero fundamental diferencia.

   Pseudocódigo del algoritmo de Euclides.
   Esta sección muestra el pseudocódigo para el problema propuesto en la sección Algoritmo de Euclides: definición del problema de la entrada Algoritmos (definición y conceptos), por lo que convendría revisarla para tener una mejor comprensión del algoritmo.

   Se deja como ejercicio al lector el comparar el siguiente algoritmo en pseudo código con el de la sección Diagrama de flujo del algoritmo de Euclides de la entrada Diagramas de flujo.

                Algoritmo MCD
                    Inicio
                               Variables
                                          m, n, r de tipo entero

                               obtener (m, n)

                               r = m mod n

                               while (r != 0)
                                          m = n
                                          n = r
                                          r = m mod n
                               end while

                               imprimir (n)
                    Fin
Algoritmo de Euclides en pseudo código.


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.