Algoritmos y programas
 9788484298915, 8484298914

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

Algoritmos y programas Joan Vancells Flotats P01/79008/00053

 FUOC • P01/79008/00053

Índice

Introducción............................................................................................... 5 Objetivos ...................................................................................................... 6 1. Algoritmos y programas .................................................................... 7 1.1. Definición de algoritmo .................................................................... 7 1.2. Lenguaje............................................................................................. 8 1.3. Computador y programa ................................................................... 9 1.3.1. Esquema funcional de un computador.................................. 12 1.4. Fases de la programación................................................................... 14 1.5. Tipos de programación ...................................................................... 15 1.6. Programación: ¿arte o técnica?.......................................................... 17 Resumen....................................................................................................... 20 Glosario ........................................................................................................ 21 Bibliografía................................................................................................. 21

Algoritmos y programas

 FUOC • P01/79008/00053

5

Introducción

En este módulo definiremos conceptos fundamentales de programación. Las definiciones son lo más simples e inteligibles posible para quien no tenga ningún tipo de experiencia previa en programación. Presentaremos la base del lenguaje que se utiliza para expresar algoritmos, lo mínimo imprescindible para poder empezar, ya que la programación solo tiene sentido como progresión o acumulación, es decir, se debe empezar haciendo cosas sencillas con pocas herramientas básicas y, una vez asimiladas, se debe ir aumentando la complejidad a la vez que se van explicando las herramientas más avanzadas.

Algoritmos y programas

 FUOC • P01/79008/00053

6

Objetivos

Los objetivos que el estudiante podrá alcanzar son los siguientes: 1. Tener claros los conceptos de algoritmo, lenguaje de programación y computador. 2. Ser conscientes de las diferentes etapas en las que es recomendable dividir la elaboración de un programa, para poder llevarlo a cabo con las máximas garantías de éxito. 3. Conocer los diferentes tipos de programación.

Algoritmos y programas

 FUOC • P01/79008/00053

7

Algoritmos y programas

1. Algoritmos y programas

1.1. Definición de algoritmo La definición de algoritmo según el diccionario es la siguiente: “Procedimiento de cálculo que consiste en cumplir una serie o conjunto ordenado y finito de instrucciones que conduce, una vez especificados los datos, a la solución que el problema genérico en cuestión tiene para los datos considerados.”

El punto más importante de esta definición consiste en el hecho de ser un método general de resolución de un problema, ya que la sucesión ordenada y finita de instrucciones o acciones es la manera de expresar este método.

Por lo tanto, se debe pensar en un algoritmo como en una receta o guión que hay que seguir para resolver un determinado problema, normalmente a partir de una información o de datos de partida o de entrada que pueden variar.

Está claro que en la definición no hay ninguna clase de restricción sobre el tipo de problema y que, por lo tanto, puede ser cualquier cosa que se nos ocurra: hacer una tortilla de patatas, cambiar la rueda de un coche, encender un buen fuego, traducir un texto de una lengua a otra, construir un edificio, hacer el balance contable de una empresa, preparar la declaración de la renta, personalizar las circulares informativas, encontrar los divisores de un cierto número, multiplicar dos matrices, etc. También vemos que la idea de algoritmo no va necesariamente unida al concepto de ordenador, sino que es bastante anterior. Incluso, forzando un poco la definición (procedimiento de cálculo), podríamos decir que es tan antigua como el hombre en su necesidad de comunicar a los demás cómo se pueden llevar a cabo determinadas tareas. Ahora bien, si volvemos a la definición más estricta, los que se consideran los primeros algoritmos conocidos son babilonios y se encontraron en la zona conocida como Mesopotamia (actual Irak) entre los años 1500-300 a.C. Consisten en simples secuencias de pasos que deben seguirse para resolver ciertos problemas, sin el uso de condiciones ni de iteraciones. También los griegos desarrollaron algoritmos, algunos de los cuales siguen vigentes hoy día. Tal vez el más conocido de éstos es el algoritmo que propuso Euclides hacia el año 300 a.C. para calcular el máximo común divisor de dos números enteros positivos.

Lectura complementaria D.E. Knuth (1986). The art of Computer Programming (vol. 1: Fundamental Algorithms, pág. 1-9). Reading, MA: Addison-Wesley. (Hay traducción castellana en la editorial Reverté.)

8

 FUOC • P01/79008/00053

Algoritmos y programas

El algoritmo de Euclides • Problema genérico: cálculo del máximo común divisor de dos números. • Datos considerados: dos enteros positivos cualesquiera. • Algoritmo o procedimiento de cálculo propuesto para resolver el problema: restar al número mayor el menor hasta que ambos números sean iguales, y ésta es la solución. Observar que el procedimiento se puede aplicar a cualquier pareja de enteros positivos y que, de hecho, no hace más que repetir varias veces una cierta operación de resta. El número de veces que se repite esta operación depende de los números o datos considerados; no es siempre el mismo. Por ejemplo, si los dos enteros positivos coinciden, no se hace ninguna operación de resta (ciertamente, el máximo común divisor de dos enteros positivos iguales es él mismo) y, en cambio, si son por ejemplo 49 y 42, se hacen seis y la evolución del algoritmo es la siguiente:

Evolución del algoritmo de Euclides Datos considerados

49

42

Datos después de la primera resta

7

42

Datos después de la segunda resta

7

35

Datos después de la tercera resta

7

28

Datos después de la cuarta resta

7

21

Datos después de la quinta resta

7

14

Datos después de la sexta resta

7

7

Solución

7

El algoritmo de Euclides nos da un método general que debe seguirse para obtener el máximo común divisor de un par de enteros positivos. La alternativa es el método clásico de descomponer los dos números en sus factores primos y obtener el mínimo común múltiplo. Por cierto, este método clásico también es un algoritmo y, por lo tanto, ya conocemos dos maneras diferentes de resolver el mismo problema.

Hemos dicho antes que el problema puede ser cualquiera que se nos ocurra, esto no quiere decir necesariamente que todo problema tenga un algoritmo que lo resuelva. Hay problemas que no se pueden ni definir, y entre los definibles está demostrado que los hay sin solución algorítmica, o con una solución algorítmica no factible o intratable.

1.2. Lenguaje

Un lenguaje es un conjunto de símbolos y sus normas de uso que sirve para comunicarnos. Es imprescindible conocer estos símbolos, el modo en que hay que colocarlos y el significado que adquieren, tanto para el que expresa algo como para el que lo tiene que entender. Estos dos aspectos que definen un lenguaje son la sintaxis (cómo hay que decir las cosas) y la semántica (qué se dice).

Observar… … que el algoritmo nos sirve en ambos casos para resolver el problema “a mano”, pero expresado en un lenguaje adecuado nos servirá para decirle al ordenador cómo debe hacerlo.

 FUOC • P01/79008/00053

9

Algoritmos y programas

Un ejemplo claro de lenguaje es el que ahora mismo estamos utilizando para comunicar estas ideas, al que llamaremos lenguaje natural. Es el que utilizamos normalmente y nos enseñan de pequeños. También es el que hemos usado para expresar nuestro primer algoritmo, el algoritmo de Euclides (que él debió de formular de una manera parecida, pero en griego, en el libro en el que lo propuso).

Ahora bien, el problema de utilizar este lenguaje para expresar nuestros algoritmos es su extraordinaria complejidad (parece que con un pequeño subconjunto tendríamos suficiente) y, sobre todo, la posibilidad de ambigüedades (que puede conducir a malentendidos y errores). A lo largo del tiempo se han propuesto, para diferentes usos, lenguajes alternativos no tan complejos que tenían como objetivo la claridad, la simplicidad

Son ejemplos de lenguajes formales el álgebra y la lógica.

y la precisión. Los llamaremos lenguajes formales. Concretamente, uno de los lenguajes formales más importantes, la lógica, se utiliza para expresar sin margen de error o duda los enunciados de problemas, antes de pensar en un algoritmo que los resuelva.

Los algoritmos se pueden expresar de muchas maneras, con lenguajes diferentes. En lenguaje natural pueden llegar a ser muy complicados y difíciles de entender; pueden existir tantas posibilidades de expresarlos como personas lo hagan. Necesitamos un lenguaje más reducido, simple y preciso. Necesitamos un lenguaje formal que nos ayude a expresar nuestras ideas con el máximo de claridad y sin ambigüedades, creado expresamente para esta función. Lo llamaremos lenguaje algorítmico.

Se trata de presentar un lenguaje algorítmico concreto, a nuestra medida que tenga el mínimo de construcciones posibles para poder expresar cualquier algoritmo por medio de una combinación adecuada de éstas.

1.3. Computador y programa Por fin llegamos al concepto de computador (ordenador). Hemos querido dejar claro que es posterior a los conceptos de algoritmo y lenguaje. El origen de los computadores hay que ir a buscarlo en el intento de automatización de cálculos o cómputos con la construcción de autómatas específicos: el ábaco, las máquinas de Babbage, etc.

Un autómata es cualquier mecanismo capaz de realizar un trabajo de manera autónoma.

Son ejemplos de autómatas… … un reloj, una caja de música o un radiador con termostato. Estos aparatos son bastante simples, hacen siempre el mismo trabajo. Algo más flexibles son un vídeo o una lavadora, ya que tienen un repertorio de trabajos posibles más variado, aunque limitado.

 FUOC • P01/79008/00053

10

Un computador u ordenador es un autómata de cálculo gobernado por un programa (codificación de un algoritmo). Es la más flexible de las máquinas, porque no hace una serie predeterminada y prefijada de trabajos, sino tantos como programas diferentes tiene, y que son potencial-

Algoritmos y programas

Es lógico… … que parezca más correcta la palabra computador que la más utilizada ordenador, que hace referencia a usos posteriores.

mente infinitos. Dicho de otro modo, un computador es una máquina formada por circuitos eléctricos, que tiene la capacidad de resolver problemas bajo el control de unas instrucciones dadas. Ya tenemos la relación entre algoritmos y computadores. Esta relación es precisamente el lenguaje. Un algoritmo es un método general de resolución de un problema expresado normalmente en lenguaje algorítmico. Si codificamos un algoritmo en un cierto lenguaje que entienda el computador, obtenemos un programa. Este programa es el que permite que el ordenador resuelva el problema de manera automática.

Así, el computador es un mecanismo que permite ejecutar nuestros algoritmos para resolver los problemas correspondientes. Este lenguaje que entiende el computador recibe el nombre de lenguaje máquina y depende de su diseño. Los programas que puede ejecutar un determinado computador deben estar expresados o codificados en este lenguaje máquina.

Figura 1

Ya que codificar un algoritmo en lenguaje máquina acostumbra a ser pesado, lento y requiere un conocimiento exhaustivo y profundo del computador, además de tener que realizar una serie de tareas de manera repetitiva, se ha inventado una serie de lenguajes de alto nivel. Éstos, como su nombre indica, son más cercanos al lenguaje natural para hacer más fácil la expresión de programas, pero continúan siendo formales. Ahora bien, si expresamos nuestros programas en un lenguaje de alto nivel, que no entiende directamente el computador, habrá que “traducírselo” a lenguaje máquina. Esta traducción la lleva a cabo un programa traductor.

El lenguaje ensamblador… … es el más próximo al lenguaje máquina. Utiliza códigos mnemotécnicos para describir las instrucciones y las diferentes posiciones de memoria; es el lenguaje simbólico más elemental.

 FUOC • P01/79008/00053

11

Existen dos técnicas básicas de traducción: 1) La interpretación o simulación es un procedimiento mediante el cual se obtiene cada instrucción en lenguaje de alto nivel, se decide qué acciones de lenguaje máquina se deben ejecutar y se ejecutan, y así sucesivamente con todas las instrucciones del programa. Si en el programa hay un error, se ejecutará hasta encontrarlo. 2) La compilación es un procedimiento mediante el cual el programa escrito en lenguaje de alto nivel se debe traducir entero a un programa equivalente en lenguaje máquina antes de ejecutarlo. En este caso, si en el programa hay un error, esté donde esté, no se ejecuta nada. En general, los lenguajes compilados pueden conseguir más eficacia que los interpretados (se traduce una sola vez), pero los lenguajes interpretados ofrecen un grado de flexibilidad más alto. Figura 2

Algoritmos y programas

 FUOC • P01/79008/00053

12

Algoritmos y programas

1.3.1. Esquema funcional de un computador La definición que hemos dado de computador no es suficiente para elaborar programas. Tampoco es necesario describirlo tan a fondo como si tuviéramos que escribir los programas en lenguaje máquina (además, en este caso no tendríamos más remedio que hablar de una máquina concreta y hacer programas que sólo serían válidos para ella). La ventaja de escribir programas en lenguajes de alto nivel es que servirá para un gran número de computadores muy diferentes internamente. En concreto, para todos aquellos que disponen de un programa traductor del lenguaje de alto nivel utilizado al lenguaje máquina del computador.

El esquema general y superficial donde aparecen las diferentes partes del computador y las funciones que realizan es el mismo para la mayoría de los computadores. Es lo único que necesitamos para desarrollar programas en lenguaje de alto nivel; el resto son técnicas de programación y el conocimiento del lenguaje de programación que hay que utilizar.

En este esquema se reúnen los siguientes elementos: • Una unidad de tratamiento o cálculo, que permite efectuar operaciones muy elementales (aritméticas), lógicas… que hace muy deprisa un circuito eléctrico ya diseñado. • Una unidad de control, que se encarga, principalmente, de asegurar el encadenamiento entre las instrucciones que va ejecutando la unidad de tratamiento. • Las unidades de tratamiento y de control juntas forman lo que se denomina unidad central de proceso (UCP) o procesador. • Una memoria principal o de trabajo, que almacena el conjunto de instrucciones (programa) que rigen el computador, por un lado, y por otro, los datos que manipulan estas instrucciones. Algunos de estos datos son los transmitidos por los dispositivos de entrada a los dispositivos de salida. • Una memoria externa o secundaria, compuesta por diferentes dispositivos periféricos de memorización que permiten el almacenamiento permanente de los programas y de los datos que éstos tratan. Se diferencia de la memoria anterior porque tiene más capacidad de almacenamiento y es más lenta. • Unos dispositivos de entrada y salida, que permiten la comunicación entre el computador y el exterior en ambos sentidos. Los dispositivos clásicos de entrada son el teclado, el ratón, y los de salida, la pantalla y la impresora.

Otros dispositivos de entrada y salida • Entrada: escáner, micrófono, cámara de vídeo. • Salida: altavoces. • Entrada y salida: módem. CD-ROM, disquetera.

 FUOC • P01/79008/00053

13

Figura 3

Una versión aún más simplificada del esquema anterior nos puede servir de base para diseñar nuestros algoritmos. Se trata de eliminar la memoria externa o secundaria, y de considerar dos dispositivos de entrada y salida para comunicarse con el exterior: • Un dispositivo sólo para entrada, que llevará asociada una instrucción de lectura. • Otro sólo para la salida, que llevará asociada una instrucción de escritura. Figura 4

Algoritmos y programas

 FUOC • P01/79008/00053

14

Algoritmos y programas

El esquema resultante se denomina máquina algorítmica, una máquina abstracta lo más sencilla posible para pensar nuestros algoritmos y que supondremos que está gobernada directamente por el lenguaje algorítmico (podríamos decir que es su lenguaje máquina).

Representamos los dispositivos de entrada y salida mediante unas cintas formadas por una sucesión de casillas o celdas (compartimentos para separar las diferentes informaciones) y un cursor en cada cinta. Este cursor está situado inicialmente al principio e irá avanzando automáticamente después de cada operación del lectura y escritura.

1.4. Fases de la programación En el procedimiento de la programación podemos distinguir las siguientes fases: a) El punto de partida de la programación es el enunciado de un problema determinado que se debe resolver, expresado normalmente en lenguaje natural. Lo primero que hay que hacer (que normalmente no se hace y es muy importante) es asegurarse de que se ha entendido bien el enunciado. Ya hemos comentado las posibles ambigüedades a que puede inducir el lenguaje natural: las cosas que no se dicen pero que están implícitas en el enunciado, los detalles que pasan inadvertidos en el primer vistazo, etc. Si no existe una correcta comprensión del enunciado, el error se perpetuará en los pasos siguientes.

Una buena manera de asegurar que se ha entendido bien el enunciado es expresarlo en un lenguaje formal. Este primer paso se denomina formalización del enunciado (es una simple traducción de lenguaje no formal a lenguaje formal). El lenguaje formal que se acostumbra a utilizar es el cálculo de predicados.

El enunciado formalizado acostumbra a recibir el nombre de especificación del algoritmo y tiene las siguientes características: • Reúne las características de todo lenguaje formal: claridad, precisión, ausencia de ambigüedades. • Siempre es un buen comentario para acompañar y explicar qué hace un algoritmo. • Es el paso previo fundamental para verificar formalmente la idoneidad de un algoritmo, para demostrar matemáticamente que siempre hace lo que tiene que hacer.

Cada una de estas casillas… … puede tener un valor de cierto tipo; en la cinta de entrada estos datos ya estarán, y, en la de salida, será el lugar donde se tendrán que dejar.

 FUOC • P01/79008/00053

15

Algoritmos y programas

b) Después de habernos asegurado que hemos entendido el enunciado, y si es posible lo hemos expresado formalmente, podemos pasar a la siguiente fase: el diseño del algoritmo. c) Una vez obtenemos el algoritmo, lo ideal sería hacer una comprobación formal de su corrección, demostrar que el algoritmo hace lo que la especificación previa había marcado como objetivo. d) Ha llegado el momento de codificar nuestro algoritmo en un lenguaje que entienda el computador, o bien directamente en lenguaje máquina (no demasiado recomendable desde el punto de vista práctico) o bien, indirectamente, en un lenguaje de programación de alto nivel (posteriormente será compilado o interpretado para que el computador lo ejecute). En esta fase se incluye la corrección de los posibles errores de sintaxis en la utilización del lenguaje (ayudados por las indicaciones del traductor). En este punto, el algoritmo se transforma en programa. La objeción clásica es que hay demasiados pasos intermedios. Defendemos la separación de estos pasos porque el objetivo de cada uno es diferente: • El lenguaje algorítmico ha sido concebido para un interlocutor humano y su independencia de la máquina permite concentrarnos en el diseño sin tener que estar pendientes de los detalles de sintaxis. • El lenguaje de programación debe ser interpretado por una máquina y al codificar el algoritmo podemos olvidar el diseño, fijarnos sólo en los problemas de sintaxis y en el máximo aprovechamiento de los recursos del lenguaje de programación.

En definitiva, en el lenguaje algorítmico interesa la claridad y la expresividad, y en el lenguaje de programación, la potencia y la eficiencia.

e) Finalmente, y sólo mientras no se lleve a cabo la verificación formal, hay que dedicarse a los posibles errores semánticos. Se trata de probar el programa resultante con diferentes datos de entrada, que reciben el nombre de juegos de pruebas. Sin embargo, como muchos autores dicen desde hace mucho tiempo, los juegos de pruebas sólo sirven para comprobar que el programa no es correcto (si algún juego de pruebas no nos da el resultado esperado), pero no para asegurar que sí lo es (excepto en el caso de que se comprueben todas las entradas posibles, que es prácticamente imposible).

1.5. Tipos de programación Normalmente se diferencia entre programación imperativa y programación funcional, según los lenguajes que se utilicen.

A falta de la verificación formal… … con una cierta experiencia en la elaboración de los juegos de pruebas (haciendo especial énfasis en los casos extremos o raros), es posible adquirir unos niveles de seguridad en la corrección bastante altos.

 FUOC • P01/79008/00053

16

Algoritmos y programas

1) En programación imperativa o procedimental, los programas son secuencias de instrucciones que se deben cumplir como una receta para resolver un problema determinado. Se basan en el esquema funcional de computador descrito anteriormente y que es la base de la mayor parte de computadores actuales (máquina de von Neumann).

Los programas imperativos están formados por una combinación de la instrucción básica de asignación (como relación de un valor o expresión con una cierta posición de memoria) junto a las estructuras de control secuencial, alternativo e iterativo.

Los lenguajes más conocidos Todos los lenguajes más conocidos son imperativos, aunque pueda haber grandes diferencias, entre ellos: Fortran, Cobol, Algol, Basic, Pascal, C, Modula o Ada. Parece que estos lenguajes se usarán aún durante bastante tiempo, sobre todo teniendo en cuenta que se amplían y se ponen al día con nuevas ideas propuestas por los diseñadores de lenguajes. Uno de sus mayores inconvenientes es la dificultad para verificar la corrección, ya que están muy lejos del lenguaje de especificación, pero convencen por su mayor eficiencia porque están pensados para el esquema de máquina que ha imperado hasta ahora.

2) La programación declarativa está muy poco influida por los detalles particulares de la máquina, en cambio, sí que lo está por una comprensión matemática clara de las descripciones.

Mientras que la programación declarativa está más cerca del qué hay que hacer (de la declaración del objetivo), la programación imperativa está más cerca del cómo lo tenemos que hacer para resolver este objetivo.

Von Neumann... … fue uno de los matemáticos más brillantes de nuestro siglo. Hizo contribuciones importantes a la física cuántica, a la lógica, a la meteorología y a la teoría de los ordenadores. Era admirable su rapidez con los números. Cuando su ordenador estuvo acabado para hacer una prueba preliminar, alguien propuso presentarle un problema relativamente fácil relacionado con potencias de dos (del tipo: ¿cuál es la menor potencia de dos tal que el cuarto dígito decimal sea 7?). Neumann empezó al mismo tiempo que la máquina y acabó antes que ella. Para un ordenador actual, este problema es trivial: sólo necesita una fracción de segundo.

Enseguida nos damos cuenta de que un programa declarativo estará mucho más cerca de la especificación formal de éste y, en muchos casos, llegará a coincidir con él. Su verificación será mucho más sencilla y la programación se

 FUOC • P01/79008/00053

17

Algoritmos y programas

convierte en una tarea de formalización de enunciados. El problema es que son ineficientes cuando se implementan sobre máquinas con la arquitectura von Neumann. En los lenguajes declarativos se acostumbra a diferenciar principalmente dos clases: a) Los lenguajes funcionales son aquellos en los que todas las construcciones son funciones en el sentido matemático del término. Un programa funcional es

Los lenguajes funcionales más conocidos son ML, APL, Lisp, y Miranda.

una función que se define por composición de funciones más simples. b) La programación lógica trata con relaciones entre objetos en lugar de hacerlo con funciones, y se basa en la lógica clausular utilizando el principio de reso-

El lenguaje lógico más conocido es el Prolog.

lución como forma de ejecución. Un programa lógico está formado por hechos y reglas, y su ejecución en la demostración de hechos sobre las relaciones por medio de preguntas. Más allá de esta clasificación entre programación imperativa y declarativa, en los últimos tiempos se habla mucho de programación orientada a objetos. Es un estilo de programación que se caracteriza por la forma de manipular la información y se aplica sobre todo para la programación de sistemas de gran dimensión.

Dentro de poco tiempo... … puede suceder que todo lenguaje de programación incorpore la orientación a objetos como una característica más.

Se diferencia entre lenguajes orientados a objetos puros y extensiones de lenguajes existentes: El ejemplo más conocido y utilizado…

a) El más importante de los lenguajes orientados a objetos puros, y referencia obligada para todos los conceptos de orientación a objetos, es el Smalltalk. b) Pero lo más habitual es encontrar mil y una extensiones de lenguajes imperativos clásicos que incorporan, con mayor o menor gracia, algunas de las

… de extensión de un lenguaje imperativo es C++, una extensión de C, pero también hay extensiones del Pascal (Object Pascal), el Ada e incluso el Cobol.

características del Smalltalk. c) Sin embargo, esto no quiere decir que esta posibilidad esté restringida a los lenguajes imperativos, sino que también hay extensiones de lenguajes declarativos* orientadas a objetos.

1.6. Programación: ¿arte o técnica? Todo lo que se refiere al mundo de la informática ha seguido una evolución vertiginosa. Según personalidades competentes, la programación no ha seguido el mismo ritmo en su evolución. Empezó siendo etiquetada como un arte. Esta etiqueta nos hace pensar en algo instintivo, donde lo que cuenta es la inspiración del momento. Iríamos por

* La extensión de lenguaje declarativo orientada a objetos más conocida es el CLOS, una extensión del Lisp.

 FUOC • P01/79008/00053

18

mal camino si todo lo que depende, hoy en día, de la programación tuviera que confiar únicamente en la gracia de las musas. Por otro lado, también es cierto que determinados algoritmos clásicos imprescindibles en la historia de la programación, elaborados normalmente por personajes fuera de serie, no son concebibles si no han sido creados bajo un cierto estado de gracia. Sin embargo, esto no significa que un programador tenga que ser siempre una persona excepcional y que no se pueda aprender a programar aplicaciones de una cierta complejidad con la ayuda de una serie de técnicas.

El ENIAC (electronic numerical integrator and computer) fue el primer ordenador electrónico conocido por el público.

En el momento en que el trabajo de programación aumentaba e incluía a más gente, se empezaron a proponer metodologías para asegurar el éxito en el desarrollo de aplicaciones: • Se impuso la programación estructurada. • Se empezaron a introducir técnicas como el diseño descendente para afrontar el desarrollo de aplicaciones más largas y complejas. • También se explicaron las soluciones más ingeniosas dadas a problemas importantes, por si podían servir de referencia a aplicaciones posteriores. A pesar de estas mejoras, llegó un momento en el que el ritmo marcado por otros aspectos de la informática (sobre todo la construcción de computadores más potentes y rápidos) dejó atrás la programación. Mientras el coste de la maquinaria (hardware) no paraba de bajar, el coste de los programas (software) no paraba de aumentar, con importantes problemas de fiabilidad en cuanto a las aplicaciones. Es lo que se conoce como crisis del software. Aspectos como la verificación de la corrección de las aplicaciones adquirían cada vez mayor importancia.

Algoritmos y programas

Uno de los primeros libros clásicos de programación tenía precisamente como título The art of programming, de D.E. Knuth.

 FUOC • P01/79008/00053

19

Las propuestas de soluciones a estos problemas han sido muchas y variadas: • Hay una, que ya hemos comentado, que es la programación orientada a objetos, útil para grandes aplicaciones de gestión. • Los defensores de lenguajes declarativos también han aprovechado para intentar imponer su filosofía. Al aumentar la velocidad de los ordenadores, los problemas de ineficacia de los programas declarativos disminuían y, en cambio, aseguraban una fiabilidad mayor de las aplicaciones. Sin embargo, se hace difícil renunciar a los éxitos obtenidos en eficiencia, y los cambios radicales nunca han sido muy populares.

Una línea que parece que se impone es la de conceder más importancia a la verificación de algoritmos. Sin embargo, se quiere llegar más lejos, en la derivación o cálculo de algoritmos a partir de las especificaciones (a la larga, automáticamente). Aún quedan muchos aspectos por pulir, pero la idea es la de construir algoritmos de manera guiada desarrollando formalmente la especificación con una serie de pasos deducibles matemáticamente. De la concepción como arte inicial hemos pasado a la concepción como técnica.

Todo esto es lo que justifica la importancia que hemos concedido, ya de entrada, a la especificación formal de algoritmos y a la presentación del lenguaje algorítmico de manera formal.

Algoritmos y programas

 FUOC • P01/79008/00053

20

Resumen

En este módulo didáctico se han introducido los conceptos básicos de los fundamentos de computadores de una forma sencilla y clara, sin presuponer conocimientos previos por parte del estudiante. Hemos partido de la definición de algoritmo como un método general para resolver problemas o como un conjunto de reglas que se tienen que seguir para solucionar un problema de forma genérica. Después hemos situado la programación en su contexto. Hemos hablado del lenguaje que necesitamos para expresarlo y las diferentes posibilidades –si es un lenguaje de programación, el algoritmo se convierte en programa–. Hemos dado un esquema general del computador con el que lo tenemos que ejecutar o realizar de forma automática –programa como una automatización del método general para resolver un problema–. Hemos establecido las etapas recomendadas de la programación. Finalmente, hemos comparado los diferentes tipo de programación.

Algoritmos y programas

 FUOC • P01/79008/00053

21

Glosario algoritmo Conjunto explícito de reglas para resolver un problema en un número finito de pasos. asignación Proporcionar un valor a una variable de memoria. computador Autómata de cálculo gobernado por un programa. especificación Formalización del enunciado de un problema. especificación funcional Relación entre el estado inicial (precondición) y el estado final (postcondición) de un algoritmo. estado Relación entre las variables y las constantes que intervienen en un algoritmo. estructuras de control Estructuras que indican el orden, bajo qué condiciones y el número de veces que se tienen que ejecutar las instrucciones. invariante Predicado que se mantiene verdadero durante la ejecución de una iteración. lenguaje algorítmico Lenguaje artificial que se utiliza antes de la fase de programación para expresar algoritmos, y que utiliza recursos del lenguaje natural. lenguaje de programación Lenguaje artificial creado específicamente para expresar programas. palabra reservada Palabra que tiene un significado específico en un lenguaje y que no se puede utilizar para nada más. predicado Expresión booleana, combinación de variables y constantes mediante unos operadores que evalúan a verdadero o falso. programa Codificación de un algoritmo en un lenguaje que entienda el computador.

Bibliografía Dijkstra, E.; Feijen, W. (1998). A method of programming. Addison-Wesley. Scholl, P.C.; Peyrin, J.P. (1991). Esquemas algorítmicos fundamentales. París: Masson. Vancells, J.; López, E. (1992). Programació: introducció a l’algorítmica. Vic: Eumo Editorial. (Tecno-Ciència, 9). Wirth, N. (1973). Systematic Programming: An introduction. Prentice-Hall.

Algoritmos y programas