3.2 Algoritmos

3.2.1 Características

  • Carácter finito. Un algoritmo siempre debe terminar después de un número finito de pasos.
  • Precisión. Cada paso de un algoritmo debe estar precisamente definido; las operaciones a llevar a cabo deben ser especificadas de manera rigurosa y no ambigua para cada caso.
  • Entrada. Un algoritmo tiene cero o más entradas: cantidades que le son dadas antes de que el algoritmo comience, o dinámicamente mientras el algoritmo corre. Estas entradas son tomadas de conjuntos específicos de objetos.
  • Salida. Un algoritmo tiene una o más salidas: cantidades que tienen una relación específica con las entradas.
  • Eficacia. También se espera que un algoritmo sea eficaz, en el sentido de que todas las operaciones a realizar en un algoritmo deben ser suficientemente básicas como para que en principio puedan ser hechas de manera exacta y en un tiempo finito por un hombre usando lápiz y papel.
  • Los problemas complejos se pueden resolver de manera más eficaz cuando se dividen en subproblemas que sean más fáciles de solucionar que el inicial (diseño descendente).

3.2.2 Medios de expresión

  • Máquina de Turing: Es un modelo matemático diseñado por Alan Turing que formaliza el concepto de algoritmo, es una descripción que se puede considerar de abstracción de bajo nivel.
  • Pseudocódigo: Es la descripción, de tal forma que se asemeja a un lenguaje de programación pero con algunas convenciones del lenguaje natural.
  • Diagrama de Flujo: Los diagramas de flujo son descripciones gráficas de algoritmos, usando símbolos conectados con flechas para indicar la estructura del algoritmo.
  • Descripción de Alto Nivel: Se establece el problema, se selecciona el modelo matemático y se explica el algoritmo de manera verbal.

3.2.3 Elementos básicos

3.2.3.1 Comentarios

Los comentarios sirven para documentar el algoritmo y en ellos se escriben anotaciones generalmente sobre su funcionamiento. En pseudocódigo, cuando se coloque un comentario de una sola línea se escribirá precedido de //. Si el comentario es multilínea, lo pondremos entre {}.

3.2.3.2 Palabras reservadas

Las palabras reservadas o palabras clave (Keywords) son palabras que tienen un significado especial, como: inicio y fin, que marcan el principio y fin del algoritmo.

3.2.3.3 Identificadores

Identificadores son los nombres que se dan a las constantes simbólicas, variables, funciones, procedimientos, u otros objetos que manipula el algoritmo. La regla para construir un identificador establece que:

  • Debe resultar significativo, sugiriendo lo que representa.
  • No podrá coincidir con palabras reservadas, propias del lenguaje algorítmico. Como se verá más adelante, la representación de algoritmos mediante pseudocódigo va a requerir la utilización de palabras reservadas.
  • Se recomienda un máximo de 50 caracteres.
  • Comenzará siempre por un carácter alfabético y los siguientes podrán ser letras, dígitos o el símbolo de subrayado.
  • Podrá ser utilizado indistintamente escrito en mayúsculas o en minúsculas

3.2.3.4 Datos

Dato es la expresión general que describe los objetos con los cuales opera el algoritmo. El tipo de un dato determina su forma de almacenamiento en memoria y las operaciones que van a poder ser efectuadas con él. En principio hay que tener en cuenta que, prácticamente en cualquier lenguaje y por tanto en cualquier algoritmo, se podrán usar datos de los siguientes tipos:

  • entero. Subconjunto finito de los números enteros, cuyo rango o tamaño dependerá del lenguaje en el que posteriormente codifiquemos el algoritmo y de la computadora utilizada.
  • real. Subconjunto de los números reales limitado no sólo en cuanto al tamaño, sino también en cuanto a la precisión.
  • lógico. Conjunto formado por los valores verdad y falso.
  • carácter. Conjunto finito y ordenado de los caracteres que la computadora reconoce.
  • cadena. Los datos (objetos) de este tipo contendrán una serie finita de caracteres, que podrán ser directamente traídos o enviados a/desde la consola.

En los algoritmos para indicar que un dato es de uno de estos tipos se declarará utilizando directamente el identificador o nombre del tipo.

Los datos pueden venir expresados como constantes, variables, expresiones o funciones.

Las constantes son datos cuyo valor no cambia durante todo el desarrollo del algoritmo.

Una variable es un objeto cuyo valor puede cambiar durante el desarrollo del algoritmo. Se identifica por su nombre y por su tipo, que podrá ser cualquiera, y es el que determina el conjunto de valores que podrá tomar la variable. En los algoritmos se deben declarar las variables que se van a usar, especificando su tipo.

Una expresión es una combinación de operadores y operandos. Los operandos podrán ser constantes, variables u otras expresiones y los operadores de cadena, aritméticos, relacionales o lógicos. Las expresiones se clasifican, según el resultado que producen, en:

  • Numéricas. Los operandos que intervienen en ellas son numéricos, el resultado es también de tipo numérico y se construyen mediante los operadores aritméticos. Se pueden considerar análogas a las fórmulas matemáticas. Debido a que son los que se encuentran en la mayor parte de los lenguajes de programación, los algoritmos utilizarán los siguientes operadores aritméticos: menos unario (), multiplicación (*), división real (/), adición (+), resta (), módulo de la división entera (mod) y cociente de la división entera (div). Tenga en cuenta que la división real siempre dará un resultado real y que los operadores mod y div sólo operan con enteros y el resultado es entero.
  • Alfanuméricas. Los operandos son de tipo alfanumérico y producen resultados también de dicho tipo. Se construyen mediante el operador de concatenación, representado por el operador ampersand (&) o con el mismo símbolo utilizado en las expresiones aritméticas para la suma.
  • Booleanas. Su resultado podrá ser verdad o falso. Se construyen mediante los operadores relacionales y lógicos. Los operadores de relación son: igual (=), distinto (<>), menor que (<), mayor que (>), mayor o igual (>=), menor o igual (<=). Actúan sobre operandos del mismo tipo y siempre devuelven un resultado de tipo lógico. Los operadores lógicos básicos son: negación lógica (no), multiplicación lógica (y), suma lógica (o). Actúan sobre operandos de tipo lógico y devuelven resultados del mismo tipo, determinados por las tablas de verdad correspondientes a cada uno de ellos.

En los lenguajes de programación existen ciertas funciones predefinidas o internas que aceptan unos argumentos y producen un valor denominado resultado.

3.2.3.5 La operación de asignación

Esta operación se utiliza para dar valor a una variable en el interior de un algoritmo y permite almacenar en una variable el resultado de evaluar una expresión, perdiéndose cualquier otro valor previo que la variable pudiera tener.

Se supone que se efectúan conversiones automáticas de tipo cuando el tipo del valor a asignar a una variable es compatible con el de la variable y de tamaño menor. En estos casos se considera que el valor se convierte automáticamente al tipo de la variable. También se interpreta que se efectúa este tipo de conversiones cuando aparecen expresiones en las que intervienen operandos de diferentes tipos.

3.2.4 Estructura general y partes

El pseudocódigo es la herramienta más adecuada para la representación de algoritmos. El algoritmo en pseudocódigo debe tener una estructura muy clara y similar a un programa, de modo que se facilite al máximo su posterior codificación. Interesa por tanto conocer las secciones en las que se divide un programa, que habitualmente son:

  • La cabecera.
  • El cuerpo del programa:
    • Bloque de declaraciones.
    • Bloque de instrucciones.

La cabecera contiene el nombre del programa.

El cuerpo del programa contiene a su vez otras dos partes: el bloque de declaraciones y el bloque de instrucciones.

En el bloque de declaraciones se definen o declaran las constantes con nombre, los tipos de datos definidos por el usuario y también las variables. Suele ser conveniente seguir este orden. La declaración de tipos suele realizarse en base a los tipos estándar o a otros definidos previamente, aunque también hay que considerar el método directo de enumeración de los valores constituyentes.

El bloque de instrucciones contiene las acciones a ejecutar para la obtención de los resultados. Las instrucciones o acciones básicas a colocar en este bloque se podrían clasificar del siguiente modo:

  • De inicio/fin. La primera instrucción de este bloque será siempre la de inicio y la última la de fin.
  • De asignación. Esta instrucción se utiliza para dar valor a una variable en el interior de un programa.
  • De lectura. Toma uno o varios valores desde un dispositivo de entrada y los almacena en memoria en las variables que aparecen listadas en la propia instrucción.
  • De escritura. Envía datos a un dispositivo de salida.

La representación de un algoritmo mediante pseudocódigo se muestra a continuación. Esta representación es muy similar a la que se empleará en la escritura al programar.

algoritmo <nombre_algoritmo>
const
  <nombre_de_constante 1> = valor1
  ...
var
  <tipo_de_dato1>: <nombre_de_variable1> [, <nombre_de_variable2>, .....]
  ...
  //Los datos han de ser declarados antes de poder ser utilizados
inicio
  <acción 1>
  <acción 2>
  .........
  <acción N>
  // Algunas acciones podrían ser de lectura: leer(<lista_de_variables>)
  // Algunas acciones podrían ser de escritura: escribir(<lista_de_expresiones>)
  // Algunas acciones podrían ser de asignación: <nombre_de_variable> <- <expresión>
fin