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.