17 de mayo de 2017

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.

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.