Pero, ¿qué es exactamente un algoritmo?

(Este artículo forma parte del Curso de Programación en C)

Un algoritmo es un conjunto finito de pasos que conducen a la resolución de un problema. Cuando usted cruza la calle en un semáforo, cuando fríe un par de huevos o cuando resuelve con lápiz y papel una integral definida, está ejecutando algoritmos con su cerebro y su cuerpo.

Para escribir cualquier programa que resuelva un problema es necesario idear previamente un algoritmo que resuelva ese problema. Sin algoritmo, no existiría el programa, porque un programa no es más que un algoritmo traducido a un lenguaje comprensible por el ordenador, esto es, un lenguaje de programación.

Definición más o menos formal

Podemos definir un algoritmo como una secuencia ordenada de pasos que conducen a la solución de un problema. Los algoritmos tienen tres características fundamentales:

  1. Son precisos, es decir, deben indicar el orden de realización de los pasos.
  2. Están bien definidos, es decir, si se sigue el algoritmo dos veces usando los mismos datos, debe proporcionar la misma solución.
  3. Son finitos, esto es, deben completarse en un número determinado de pasos.

Por ejemplo, vamos a diseñar un algoritmo simple que determine si un número N es par o impar:

 1. Inicio
 2. Si N es divisible entre 2, entonces ES PAR
 3. Si N no es divisible entre 2, entonces NO ES PAR
 4. Fin

Si se fija usted bien, este algoritmo cumple las tres condiciones enumeradas anteriormente (precisión, definición y finitud) y resuelve el problema planteado. Lógicamente, al ordenador no le podemos dar estas instrucciones tal y como las hemos escrito, sino que habrá que expresarlo en un lenguaje de programación, pero esto es algo que trataremos en otros posts.

Notación de algoritmos

Los algoritmos deben representarse con algún método que permita independizarlos del lenguaje de programación que luego se vaya a utilizar. Así se podrán traducir más tarde a cualquier lenguaje. En el ejemplo que acabamos de ver hemos especificado el algoritmo en lenguaje español, pero existen otras formas de representar los algoritmos. Entre todas ellas, destacaremos las siguientes:

  1. Lenguaje español
  2. Diagramas de flujo
  3. Diagramas de Nassi-Schneiderman (NS)
  4. Pseudocódigo

En este blog utilizaremos, principalmente, el pseudocódigo, que es un lenguaje de especificación de algoritmos basado en la lengua española. Tiene dos propiedades que nos interesarán: facilita considerablemente el aprendizaje de las técnicas de programación y logra que la traducción a un lenguaje de programación real sea casi instantánea.

Los diagramas de flujo son representaciones gráficas de los algoritmos que ayudan a comprender su funcionamiento, pero enseguida se vuelven demasiado voluminosos e incómodos para trabajar con ellos.

Dedicaremos muchos otros post a discutir las técnicas básicas de programación usando pseudocódigo y, a veces, diagramas de flujo; pero, como adelanto, ahí va el algoritmo que determina si un número N es par o impar, escrito en pseudocódigo. Es recomendable que le eche un vistazo para intentar entenderlo y para familiarizarse con la notación en pseudocódigo:

 algoritmo par_impar
 variables
   N es entero
   solución es cadena
 inicio
   leer (N)
   si (N div 2 == 0) entonces solución = "N es par"
   si_no solución = "N es impar"
   escribir (solución)
 fin

Escritura inicial del algoritmo

Una vez superadas las fases de análisis y diseño, es decir, entendido bien el problema y sus datos y descompuesto en problemas más sencillos, llega el momento de resolver cada problema sencillo mediante un algoritmo.

Muchos autores recomiendan escribir una primera versión del algoritmo en lenguaje natural (en nuestro caso, en castellano), siempre que dicha primera versión cumpla dos condiciones:

  • que la solución se exprese como una serie de instrucciones o pasos a seguir para obtener una solución al problema
  • que las instrucciones haya que ejecutarlas de una en una, es decir, una instrucción cada vez

Consideremos un problema sencillo: el cálculo del área y del perímetro de un rectángulo. Evidentemente, tenemos que conocer su base y su altura, que designaremos con dos variables de tipo real. Una primera aproximación, en lenguaje natural, podría ser:

1. Inicio
2. Preguntar al usuario los valores de base y altura
3. Calcular el área como área = base * altura
4. Calcular el perímetro como perímetro = 2 * base + 2 * altura
5. Fin

Describir un algoritmo de esta forma puede ser útil si el problema es complicado, ya que puede ayudarnos a entenderlo mejor y a diseñar una solución adecuada. Pero esto sólo es una primera versión que puede refinarse añadiendo cosas. Por ejemplo, ¿qué pasa si la base o la altura son negativas o cero? En tal caso, no tiene sentido averiguar el área o el perímetro. Podríamos considerar esta posibilidad en nuestro algoritmo para hacerlo más completo:

1. Inicio
2. Preguntar al usuario los valores de base y altura
3. Si base es mayor que cero y altura también, entonces:
   3.1. Calcular el área como área = base * altura
   3.2. Calcular el perímetro como perímetro = 2 * base + 2 * altura
4. Si no:
   4.1. No tiene sentido calcular el área ni el perímetro
5. Fin

Estos refinamientos son habituales en todos los algoritmos y tienen la finalidad de conseguir una solución lo más general posible, es decir, que pueda funcionar con cualquier valor de “base” y “altura”.

Diagramas de flujo

El diagrama de flujo es una de las técnicas de representación de algoritmos más antigua y también más utilizada, al menos entre principiantes y para algoritmos sencillos. Con la práctica comprobará que, cuando se trata de problemas complejos, los diagramas de flujo se hacen demasiado grandes: es como conducir un camión por la zona antigua de su ciudad.

Un diagrama de flujo o flowchart es un gráfico en el que se utilizan símbolos (o cajas) para representar los pasos del algoritmo. Las cajas están unidas entre sí mediante flechas, llamadas líneas de flujo, que indican el orden en el que se deben ejecutar para alcanzar la solución.

Los símbolos de las cajas están estandarizados y son muy variados. En la tabla siguiente tiene los que utilizaremos en este blog. Ciertamente, alguien podrá objetar que me he dejado algunos símbolos en el tintero, y llevará razón si lo hace. Pero cuando se trata de introducir herramientas prefiero la simplicidad.

diagrama_flujo_simbolos.png
Clic para ampliar

Veamos un ejemplo: la representación del algoritmo que calcula el área y el perímetro de un rectángulo mediante un diagrama de flujo. Antes, tengamos en cuenta que:

  • los valores de “base” y “altura” los introducirá el usuario del programa a través del teclado; así, el programa servirá para cualquier rectángulo
  • después se realizarán los cálculos necesarios
  • los resultados, “área” y “perímetro”, deben mostrarse en un dispositivo de salida (por defecto, la pantalla) para que el usuario del programa vea cuál es la solución

Esta estructura en 3 pasos es muy típica de todos los algoritmos: primero hay una entrada de datos, luego se hacen cálculos con esos datos, y por último se sacan los resultados.

El diagrama de flujo será más o menos así (clic para ampliar):

diagrama_flujo.png

Pseudocódigo

El pseudocódigo es un lenguaje simplificado de descripción de algoritmos. El paso desde el pseudocódigo hasta el lenguaje de programación real (por ejemplo, C), es relativamente fácil. Además, la descripción de algoritmos en pseudocódigo ocupa mucho menos espacio que su equivalente con un diagrama de flujo, por lo que lo preferiremos a la hora de diseñar algoritmos complejos.

El pseudocódigo es bastante parecido a la mayoría de los lenguajes de programación reales, pero no tiene unas reglas tan estrictas, por lo que el programador puede trabajar en la estructura del algoritmo sin preocuparse de las limitaciones del lenguaje final que, como veremos al estudiar C, son muchas y variopintas.

El pseudocódigo utiliza ciertas palabras reservadas para representar las acciones del programa. Estas palabras originalmente están en inglés (y se parecen mucho a las que luego emplean los lenguajes de programación), pero por suerte para nosotros su traducción española está muy extendida entre la comunidad hispanohablante.

En próximos posts aprenderemos a utilizar el pseudocódigo aplicándolo a algoritmos sencillos que, progresivamente, iremos complicando. Por ahora, dejamos expuesta la solución en pseudocódigo del algoritmo de la base y la altura, para solaz del lector/a. Échele un vistazo y comprobará con alegría que no contiene nada que no pueda entender:

algoritmo rectángulo
inicio
  leer (base)
  leer (altura)
  área = base * altura
  perímetro = 2 * base + 2 * altura
  escribir (área)
  escribir (perímetro)
fin

Categorías

Licencia

ClustrMaps

hola soy nuevo en esto de la programacion, me gusta mucho la forma en que explicas los temas sin duda acabare el curso. y seguro tendre bases para aprender otros lenguajes!

muchas gracias por tu tiempo, y compartir tus comocimientos de esta forma.

Saludos desde Mexico!!

Muchas gracias y ánimo con su curso. Un saludo desde el otro lado del Atlántico.

Hola que tal descubri esta pagina precisamente por que necesitaba unos concepto para los trabajos de la escuela.
muchas gracias me interesa este curso
especificamente, por que quiero aprender mas sobre programacion y a no estar tan perdida a la hora de algunos talleres
muchas gracias
me gusta mucho tus explicaciones

ANA LUCIA RUIZ A.

UN SALUDO DESDE SAMANIEGO NARIÑO. MUCHAS FELICITACIONES POR SU PAGINA ME HA ORIENTADO MUCHO EN EL TEMA DE PROGRAMACION. Quisiera que me colabore en desarrollar unos ejercicios con el diagrama de flujo.
.- calcular el algoritmo del perimetro y el area de un rectangulo.
.- un algoritmo que determine el valor de una hipoenuza de un triangulo rectangulo dadas las longitudes de los catetos.
.- diseñe un algoritmo que calcule el area del triangulo basado en la longitud de sus lados. Mostrar mensajes de error en el caso que los datos tengan valores negativos o iguales a cero.
POR FAVOR MANDARME LAS RESPUESTAS SI ES POSIBLE CLARO ESTA, A MI CORREO ESTOY ALGO CONFUNDIDA, LOS NECESITO PARA UN EXAMEN. MUCHAS GRACIAS POR SU COLABORACION

Muchas gracias por un aporte tan bueno que haces con este blog.

Sigue adelante Alfredo Moreno, que personas como nosotros (los usuarios de tu blog), necesitamos sitios como el tuyo y gente con ganas de trabajar para los demas, sin animo de lucro como tu.

No pude estudiar en mis tiempos de jove, y gracias a aportes como el tuyo me siento mejor por poder ampliar mis conocimientos , sin necesidad de mantener un ritmo de estudio que no me puedo permitir.

Además, explicas muy bien el tema y lo haces ameno .

Gracias de nuevo.

un saludo

programar es muy dificil yo estoy estudiando eso en mi escuela y no hayo la ora de que se acabe la clase de lo dificil y con decirle que soy el mejor de mi salon y no puedo con la programación me tiene loco

steven torres boloña

bro buenas como estas danos mas tuto pana porque lo necesitamos muxas gracias pero aiudanos a cambiar los si por if i utilizar las variables se los agradeceran muxo i io tambien muxaxos agamos de esto IMPERIO ENTERPRISE.. cualquier cosa me agregan si me pueden aiudar ,

hacer un programa que lea N numeros calcular el cuadrado de cada numero y la sumatoria de los cuadrados de todos los numeros

buena nota conozco muy poco de logatitmo y es para mi una area desconocida,pero me interesa los ejemplos que he leido y la aplicacion de esta en el conocimiento humano como rama primordial del desarrollo tecnologico y cientifico del saber hacer,haciendo.
quisiera que me ayudaras a plasmar los pasos logicos,ya que me confundo en ordenarlos o representarlos en ese lenguaje.