BIENVENIDOS AL MUNDO DE LA COMPUTACION

BIENVENIDOS AL MUNDO DE LA

COMPUTACION.


Aqui encontraras temas de interes relacionados con el Procesamiento de datos y mucho mas.



LA PROGRAMACION



La  Programación

Libros acerca de programación.En informática, la programación es un proceso por el cual se escribe (en un lenguaje de programación), se prueba, se depura y se mantiene el código fuente de un programa informático. Dentro de la informática, los programas son los elementos que forman el software, que es el conjunto de las instrucciones que ejecuta el hardware de una computadora para realizar una tarea determinada. Por lo tanto, la programación es una de las principales áreas dentro de la informática.


Para el desarrollo de programas de cierta envergadura o complejos, con ciertas garantías de calidad, es conveniente seguir alguno de los modelos de desarrollo de software existentes, en donde la programación es sólo una de las etapas del proceso de desarrollo de software. Los modelos de desarrollo de software los aborda una disciplina específica del campo de la informática: la ingeniería del software.


Historia

Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje específico conocido como código máquina, el cual comprende fácilmente, pero que lo hace excesivamente complicado para las personas. De hecho sólo consiste en cadenas interminables de números 1 y 0. (Binario)


Para facilitar el trabajo, los primeros operadores de computadoras decidieron reemplazar los 1 y 0 por palabras o letras provenientes del inglés; éste se conoce como lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). En realidad escribir en lenguaje ensamblador es básicamente igual que hacerlo en lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que los números.

A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método más adecuado para programarlas. Entonces, se crearon los lenguajes de alto nivel. Mientras que una tarea tan sencilla como sumar dos números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una.


Una vez que se termina de escribir un programa en ensamblador o en un lenguaje de alto nivel es necesario compilarlo, es decir, traducirlo a lenguaje máquina.

 Programas y algoritmos


Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa (traduce a un lenguaje de programación concreto) un algoritmo. Nótese que es la secuencia de instrucciones en sí (la ejecución) la que debe ser finita, no el número de pasos realizados.
Los programas suelen subdividirse en partes menores (módulos), de modo que la complejidad algorítmica de cada una de las partes sea menor que la del programa completo, lo cual ayuda al desarrollo del programa.

Según Niklaus Wirth, un programa está formado por algoritmos y estructura de datos.

Se han propuesto diversas técnicas de programación cuyo objetivo es mejorar tanto el proceso de creación de software como su mantenimiento. Entre ellas, se pueden mencionar las siguientes:

Programación estructurada
La programación estructurada es una forma de escribir programas de ordenador (programación de computadora) de manera clara. Para ello utiliza únicamente tres estructuras: secuencia, selección e iteración; siendo innecesario el uso de la instrucción o instrucciones de transferencia incondicional (GOTO, EXIT FUNCTION, EXIT SUB o múltiples RETURN).

Hoy en día las aplicaciones informáticas son mucho más ambiciosas que las necesidades de programación existentes en los años 1960, principalmente debido a las aplicaciones gráficas, por lo que las técnicas de programación estructurada no son suficientes. Ello ha llevado al desarrollo de nuevas técnicas, tales como la programación orientada a objetos y el desarrollo de entornos de programación que facilitan la programación de grandes aplicaciones.


Orígenes de la programación estructurada [editar]A finales de los años 1960 surgió una nueva forma de programar que no solamente daba lugar a programas fiables y eficientes, sino que además estaban escritos de manera que facilitaba su comprensión posterior.


El teorema del programa estructurado, demostrado por Böhm-Jacopini, demuestra que todo programa puede escribirse utilizando únicamente las tres instrucciones de control siguientes:

Secuencia


Instrucción condicional.


Iteración (bucle de instrucciones) con condición al principio.


Solamente con estas tres estructuras se pueden escribir todos los programas y aplicaciones posibles. Si bien los lenguajes de programación tienen un mayor repertorio de estructuras de control, éstas pueden ser construidas mediante las tres básicas.

Estructura secuencial [editar]Una estructura de programa es secuencial si se ejecutan una tras otra a modo de secuencia, es decir que una instrucción no se ejecuta hasta que finaliza la anterior.


Ejemplo:

INPUT x


INPUT y


auxiliar= x


x= y


y= auxiliar


PRINT x


PRINT y




Esta secuencia de instrucciones permuta los valores de x e y, con ayuda de una variable auxiliar, intermedia.


1º Guardamos una copia del valor de x en auxiliar.


2º Guardamos el valor de y en x, se pierde el valor anterior de x pero no importa porque tenemos una copia en auxiliar.


3º Guardamos en y el valor de auxiliar, que es el valor inicial de x.


El resultado es el intercambio de los valores de x e y, en tres operaciones secuenciales.


Estructura selectiva o de selección [editar]La estructura selectiva permite la realización de una instrucción u otra según un criterio, solo una de estas instrucciones se ejecutara.
Ejemplo:
IF a > b THEN


PRINT a ; "es mayor que" ; b


ELSE


PRINT a ; "no es mayor que" ; b


END IF


Esta instrucción selectiva puede presentar dos mensajes, uno a es mayor que b, y el otro a no es mayor que b, solo uno de ellos será presentado, según el resultado de la comparación de a y b, si el resultado de a > b es cierto, se presenta el primer mensaje, si es falso el segundo, las palabras IF, THEN, ELSE, END IF; son propias de la instrucción (palabra reservadas) que tienen un significado en el lenguaje, sirven de separadores, y el usuario no debe utilizarlas salvo para este fin

 
IF señala el comienzo de la instrucción condicional, y se espera que después esté la condición de control de la instrucción.


THEN señala el fin de la condición, y después estará la instrucción a realizar si la condición es cierta.


ELSE separa la instrucción que se ejecutará si la condición es cierta de la que se ejecutará si es falsa.


END IF indica que la instrucción condicional finaliza y el programa seguirá su curso.


Ampliemos un poco el ejemplo anterior:


IF a > b THEN


PRINT a ; "es mayor que" ; b


ELSEIF a < b THEN


PRINT a ; "es menor que" ; b


ELSE


PRINT a ; "es igual que" ; b


END IF


Este ejemplo nos permite considerar situaciones en las que tenemos más de dos alternativas. En este caso hemos considerado tres, pero hay situaciones en las que deben considerarse más casos y para ellos se puede repetir las veces que queramos la parte ELSEIF.


Estructura iterativa [editar]Un bucle iterativo o iteración de una secuencia de instrucciones, hace que se repitan mientras se cumpla una condición, en un principio el número de iteraciones no tiene porque estar determinado.


Ejemplo:






a= 0


b= 7




WHILE b > a DO


PRINT a


a= a + 1


WEND


Esta instrucción tiene tres palabras reservadas WHILE, DO y WEND.




WHILE: señala el comienzo del bucle y después de esta palabra se espera la condición de repetición, si la condición es cierta se pasa al cuerpo del bucle, si no al final de la instrucción mientras.


DO: señala el final de la condición, lo que esté después será el cuerpo del bucle.


WEND: señala el final del cuerpo del bucle y de la instrucción WHILE.


El bucle mientras, se repite mientras la condición sea cierta, esta condición se comprueba al principio por lo que el cuerpo del bucle puede que no se ejecute nunca, cuando la condición es falsa en un principio, o que se repita tantas veces como sea necesario, mientras la condición sea cierta.


En el ejemplo tenemos dos variables a y b que al iniciarse el bucle tienen los valores a=0 y b=7.


La condición del bucle es b > a.


Cuando a=0 y b=7. la condición es cierta, en el cuerpo del bucle se escribe el valor de a en pantalla y se incrementa a en una unidad. Entonces a=1 y b=7.


...


...


Cuando a=6 y b=7. la condición es cierta, se escribe el valor de a en pantalla y se incrementa en una unidad.


Resultando que a=7 y b=7. Entonces la condición es falsa y la instrucción WHILE finaliza.


La salida por pantalla de este ejemplo seria 0 1 2 3 4 5 6


Anidamiento [editar]El cuerpo de cualquier estructura puede ser una instrucción simple u otra estructura, que a su vez puede anidar a otra.
Ejemplo:


IF a > b THEN


auxiliar= a


a= b


b= auxiliar


ELSE


REM nada


END IF


PRINT a ; b


Ventajas de la programación estructurada
1. Los programas son más fáciles de entender, ya que pueden ser leídos de forma secuencial, sin necesidad de hacer seguimiento a saltos de línea (GOTO) dentro de los bloques de código para entender la lógica.
2. La estructura del programa es clara, puesto que las instrucciones están más ligadas o relacionadas entre sí.
3. Reducción del esfuerzo en las pruebas. El seguimiento de los fallos o errores del programa ("debugging") se facilita debido a la estructura más visible, por lo que los errores se pueden detectar y corregir más fácilmente.

4. Reducción de los costos de mantenimiento de los programas.

5. Programas más sencillos y más rápidos (ya que es más fácil su optimización).

6. Los bloques de código son auto explicativos, lo que facilita la documentación.
7. Los GOTO se reservan para construir las instrucciones básicas. Aunque no se usan de forma directa, por estar prohibida su utilización, están incluidas implícitamente en las instrucciones de selección e iteración.
8. Un programa escrito de acuerdo a estos principios no solamente tendrá una mejor estructura sino también una excelente presentación.
9. La programación estructurada ofrece estos beneficios, pero no se la debe considerar como una panacea ya que el desarrollo de programas es, principalmente, una tarea de dedicación, esfuerzo y creatividad.
Inconvenientes de la programación estructurada [editar]El principal inconveniente de este método de programación es que se obtiene un único bloque de programa, que cuando se hace demasiado grande puede resultar problemático su manejo; esto se resuelve empleando la programación modular, definiendo módulos interdependientes programados y compilados por separado (en realidad esto no es necesario, pero es recomendable para su mantenimiento y funcionalidad).
En realidad, cuando se programa hoy en día (inicios del siglo XXI) se suelen utilizar, tanto las técnicas de programación estructurada como las de programación modular, de forma conjunta y por lo tanto es posible que cuando uno haga referencia a la programación estructurada esté considerando también las técnicas de modularización.
Un método un poco más sofisticado es la programación por capas, en la que los módulos tienen una estructura jerárquica en la que se pueden definir funciones dentro de funciones o de procedimientos.


Compilación



El programa escrito en un lenguaje de programación (comprensible por el ser humano, aunque se suelen corresponder con lenguajes formales descritos por gramáticas independientes del contexto) no puede ejecutarlo directamente una computadora. La opción más común es compilar el programa obteniendo un módulo objeto, aunque también puede ejecutarse a través de un intérprete informático.


El código fuente del programa se debe someter a un proceso de traducción para convertirse en lenguaje máquina, interpretable por el procesador. A este proceso se le llama compilación.


Normalmente la creación de un programa ejecutable (un típico.exe para Microsoft Windows o DOS) conlleva dos pasos. El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje de programación almacenado en un archivo a código en bajo nivel (normalmente en código objeto, no directamente a lenguaje máquina). El segundo paso se llama enlazado en el cual se enlaza el código de bajo nivel generado de todos los ficheros y subprogramas que se han mandado compilar y se añade el código de las funciones que hay en las bibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo así finalmente el código objeto a código máquina, y generando un módulo ejecutable.


Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de compilación en archivos objetos (un típico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase de compilación se almacena sólo temporalmente. Un programa podría tener partes escritas en varios lenguajes (por ejemplo C, C++ y Asm), que se podrían compilar de forma independiente y luego enlazar juntas para formar un único módulo ejecutable.

Programación e ingeniería del software


Existe una tendencia a identificar el proceso de creación de un programa informático con la programación, que es cierta cuando se trata de programas pequeños para uso personal, y que dista de la realidad cuando se trata de grandes proyectos.

El proceso de creación de software, desde el punto de vista de la ingeniería, incluye los siguientes pasos:
1.Reconocer la necesidad de un programa para solucionar un problema o identificar la posibilidad de automatización de una tarea.


2.Recoger los requisitos del programa. Debe quedar claro qué es lo que debe hacer el programa y para qué se necesita.


3.Realizar el análisis de los requisitos del programa. Debe quedar claro cómo debe realizar el programa las cosas que debe hacer. Las pruebas que comprueben la validez del programa se pueden especificar en esta fase.


4.Diseñar la arquitectura del programa. Se debe descomponer el programa en partes de complejidad abordable.


5.Implementar el programa. Consiste en realizar un diseño detallado, especificando completamente todo el funcionamiento del programa, tras lo cual la codificación debería resultar inmediata.


6.Implantar (instalar) el programa. Consiste en poner el programa en funcionamiento junto con los componentes que pueda necesitar (bases de datos, redes de comunicaciones, etc.).


La ingeniería del software se centra en los pasos de planificación y diseño del programa, mientras que antiguamente (programación artesanal) la realización de un programa consistía únicamente en escribir el código.
 Referencias históricas


La primera programadora de computadora conocida fue Ada Lovelace, hija de Anabella Milbanke Byron y Lord Byron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera de sus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a esta programadora.

No olvidemos que este proceso está aplicado a todos los métodos científicos que actualmente se practican.
Objetivos de la programación


La programación debe perseguir la obtención de programas de calidad. Para ello se establece una serie de factores que determinan la calidad de un programa. Algunos de los factores de calidad más importantes son los siguientes:
Corrección. Un programa es correcto si hace lo que debe hacer tal y como se estableció en las fases previas a su desarrollo. Para determinar si un programa hace lo que debe, es muy importante especificar claramente qué debe hacer el programa antes de desarrollarlo y, una vez acabado, compararlo con lo que realmente hace.


Claridad. Es muy importante que el programa sea lo más claro y legible posible, para facilitar así su desarrollo y posterior mantenimiento. Al elaborar un programa se debe intentar que su estructura sea sencilla y coherente, así como cuidar el estilo en la edición; de esta forma se ve facilitado el trabajo del programador, tanto en la fase de creación como en las fases posteriores de corrección de errores, ampliaciones, modificaciones, etc. Fases que pueden ser realizadas incluso por otro programador, con lo cual la claridad es aún más necesaria para que otros programadores puedan continuar el trabajo fácilmente. Algunos programadores llegan incluso a utilizar Arte ASCII para delimitar secciones de código. Otros, por diversión o para impedir un análisis cómodo a otros programadores, recurren al uso de código ofuscado.
Eficiencia. Se trata de que el programa, además de realizar aquello para lo que fue creado (es decir, que sea correcto), lo haga gestionando de la mejor forma posible los recursos que utiliza. Normalmente, al hablar de eficiencia de un programa, se suele hacer referencia al tiempo que tarda en realizar la tarea para la que ha sido creado y a la cantidad de memoria que necesita, pero hay otros recursos que también pueden ser de consideración al obtener la eficiencia de un programa, dependiendo de su naturaleza (espacio en disco que utiliza, tráfico de red que genera, etc.).


Portabilidad. Un programa es portable cuando tiene la capacidad de poder ejecutarse en una plataforma, ya sea hardware o software, diferente a aquélla en la que se elaboró. La portabilidad es una característica muy deseable para un programa, ya que permite, por ejemplo, a un programa que se ha desarrollado para sistemas GNU/Linux ejecutarse también en la familia de sistemas operativos Windows. Esto permite que el programa pueda llegar a más usuarios más fácilmente.

Diagrama de flujo

 

Ejemplo Diagrama de Flujo


Diagrama de flujo sencillo con los pasos a seguir si una lámpara no funciona.Un diagrama de flujo es una forma de representar gráficamente los detalles algorítmicos de un proceso multifactorial es decir dar soluciones a problemas que se pueden resolver en una manera que a veces no es sencilla o simplemente si no hay solucion con problema se debe usar una sencilla y sin problemas. Se utiliza principalmente en programación, economía y procesos industriales, pasando también a partir de estas disciplinas a formar parte fundamental de otras, como la psicología cognitiva. Estos diagramas utilizan una serie de símbolos con significados especiales y son la representación gráfica de los pasos de un proceso. En computación, son modelos tecnológicos utilizados para comprender los rudimentos de la programación secuencial
Definición


Es la representación gráfica de flujo de un algoritmo o de secuencias rutinarias. Se basan en la utilización de diversos símbolos para representar operaciones específicas. Se les llama diagramas de flujo porque los símbolos utilizados se conectan por medio de flechas para indicar la secuencia de la operación.


Símbolos utilizados


Los símbolos que se utilizan para diseño se someten a una normalización, es decir, se hicieron símbolos casi universales, ya que, en un principio cada usuario podría tener sus propios símbolos para representar sus procesos en forma de Diagrama de flujo. Esto trajo como consecuencia que sólo aquel que conocía sus símbolos, los podía interpretar. La simbología utilizada para la elaboración de diagramas de flujo es variable y debe ajustarse a las normas preestablecidas universalmente para dichos símbolos o datos.


Características que debe cumplir un diagrama de flujo


En los diagramas de flujo se presuponen los siguientes aspectos:






Existe siempre un camino que permite llegar a una solución (finalización del algoritmo).


Existe un único inicio del proceso.


Existe un único punto de fin para el proceso de flujo (salvo del rombo que indica una comparación con dos caminos posibles).


Desarrollo del diagrama de flujo


Las siguientes son acciones previas a la realización del diagrama de flujo:


Identificar las ideas principales a ser incluidas en el diagrama de flujo. Deben estar presentes el dueño o responsable del proceso, los dueños o responsables del proceso anterior y posterior y de otros procesos interrelacionados, otras partes interesadas.


Definir qué se espera obtener del diagrama de flujo.


Identificar quién lo empleará y cómo.


Establecer el nivel de detalle requerido.


Determinar los límites del proceso a describir.


Los pasos a seguir para construir el diagrama de flujo son :


Establecer el alcance del proceso a describir. De esta manera quedará fijado el comienzo y el final del diagrama. Frecuentemente el comienzo es la salida del proceso previo y el final la entrada al proceso siguiente.


Identificar y listar las principales actividades/subprocesos que están incluidos en el proceso a describir y su orden cronológico.


Si el nivel de detalle definido incluye actividades menores, listarlas también.


Identificar y listar los puntos de decisión.


Construir el diagrama respetando la secuencia cronológica y asignando los correspondientes símbolos.


Asignar un título al diagrama y verificar que esté completo y describa con exactitud el proceso elegido.


Recomendaciones


A su vez, es importante que al construir diagramas de flujo, se observen las siguientes recomendaciones:
Evitar sumideros infinitos, burbujas que tienen entradas pero no salidas.


Evitar las burbujas de generación espontánea, que tienen salidas sin tener entradas, porque son sumamente sospechosas y generalmente incorrectas.


Ventajas de los diagrama de flujo


Favorecen la comprensión del proceso a través de mostrarlo como un dibujo. El cerebro humano reconoce fácilmente los dibujos. Un buen diagrama de flujo reemplaza varias páginas de texto.


Permiten identificar los problemas y las oportunidades de mejora del proceso. Se identifican los pasos redundantes, los flujos de los re-procesos , los conflictos de autoridad, las responsabilidades, los cuellos de botella, y los puntos de decisión.


Muestran las interfaces cliente-proveedor y las transacciones que en ellas se realizan, facilitando a los empleados el análisis de las mismas.


Son una excelente herramienta para capacitar a los nuevos empleados y también a los que desarrollan la tarea, cuando se realizan mejoras en el proceso.


Tipos de diagramas de flujos


Formato vertical: En él el flujo o la secuencia de las operaciones, va de arriba hacia abajo. Es una lista ordenada de las operaciones de un proceso con toda la información que se considere necesaria, según su propósito.


Formato horizontal: En él, el flujo o la secuencia de las operaciones, va de izquierda a derecha.


Formato panorámico: El proceso entero está representado en una sola carta y puede apreciarse de una sola mirada mucho más rápido que leyendo el texto, lo que facilita su comprensión, aun para personas no familiarizadas. Registra no solo en línea vertical, sino también horizontal, distintas acciones simultáneas y la participación de más de un puesto o departamento que el formato vertical no registra.


Formato Arquitectónico: Describe el itinerario de ruta de una forma o persona sobre el plano arquitectónico del área de trabajo. El primero de los flujogramas es eminentemente descriptivo, mientras que los utilizados son fundamentalmente representativos.
Algoritmo

Los diagramas de flujo sirven para representar algoritmos de manera gráfica.En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo (del latín, dixit algorithmus y éste a su vez del matemático persa Al Juarismi[1] ) es un conjunto de intruccciones bien definida, ordenada y finita que permite realizar una actividad específica mediante pasos sucesivos que no generen dudas a quien lo vaya a ejecutar.[2] Dado un estado inicial y una entrada, a través de lo mencionados pasos sucesivos se llega a un estado final, obteniendo una solución. Los algoritmos son objeto de estudio de la algoritmia.
En la vida cotidiana se emplean algoritmos en multitud de ocasiones para resolver diversos problemas. Algunos ejemplos se encuentran en los instructivos (manuales de usuario), los cuales muestran algoritmos para usar el aparato en cuestión o incluso en las instrucciones que recibe un trabajador por parte de su patrón. También existen ejemplos de índole matemática, como el algoritmo de la división para calcular el cociente de dos números, el algoritmo de Euclides para calcular el máximo común divisor de dos enteros positivos, o el método de Gauss para resolver un Sistema lineal de ecuaciones.

A lo largo de la historia varios autores han tratado de definir formalmente a los algoritmos utilizando modelos matemáticos como máquinas de Turing entre otros Sin embargo estos modelos están sujetos a un tipo particular de datos como son números, símbolos o gráficas mientras que, en general, los algoritmos funcionan sobre una basta cantidad de estructuras de datos En general, la parte común en todas las definiciones se puede resumir en las siguientes tres propiedades siempre y cuando no consideremos algoritmos paralelos

Tiempo secuencial. Un algoritmo funciona en tiempo discretizado –paso a paso–, definiendo así una secuencia de estados "computacionales" por cada entrada válida (la entrada son los datos que se le suministran al algoritmo antes de comenzar).


Estado abstracto. Cada estado computacional puede ser descrito formalmente utilizando una estructura de primer orden y cada algoritmo es independiente de su implementación (los algoritmos son objetos abstractos) de manera que en un algoritmo las estructuras de primer orden son invariantes bajo isomorfismo.


Exploración acotada. La transición de un estado al siguiente queda completamente determinada por una descripción fija y finita; es decir, entre cada estado y el siguiente solamente se puede tomar en cuenta una cantidad fija y limitada de términos del estado actual.


En resumen, un algoritmo es cualquier cosa que funcione paso a paso, donde cada paso se pueda describir sin ambigüedad y sin hacer referencia a una computadora en particular, y además tiene un límite fijo en cuanto a la cantidad de datos que se pueden leer/escribir en un solo paso. Esta amplia definición abarca tanto a algoritmos prácticos como aquellos que solo funcionan en teoría, por ejemplo el método de Newton y la eliminación de Gauss-Jordan funcionan, al menos en principio, con números de precisión infinita; sin embargo no es posible programar la precisión infinita en una computadora, y no por ello dejan de ser algoritmos En particular es posible considerar una cuarta propiedad que puede ser usada para validar la tesis de Church-Turing de que toda función calculable se puede programar en una máquina de Turing (o equivalentemente, en un lenguaje de programación suficientemente general


Aritmetizabilidad. Solamente operaciones innegablemente calculables están disponibles en el paso inicial.


Medios de expresión de un algoritmo


Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. Las descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico.


La descripción de un algoritmo usualmente se hace en tres niveles:


1.Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles.


2.Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución.


3.Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones.


También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de complejidad o ambos.

 
Algoritmos como funciones


Artículo principal: Teoría de la computabilidad


Esquemática de un algoritmo solucionando un problema de ciclo hamiltoniano.Un algoritmo se puede concebir como una función que transforma los datos de un problema (entrada) en los datos de una solución (salida). Más aún, los datos se pueden representar a su vez como secuencias de bits, y en general, de símbolos cualesquiera Como cada secuencia de bits representa a un número natural (véase Sistema binario), entonces los algoritmos son en esencia funciones de los números naturales en los números naturales que sí se pueden calcular. Es decir que todo algoritmo calcula una función donde cada número natural es la codificación de un problema o de una solución.


En ocasiones los algoritmos son susceptibles de nunca terminar, por ejemplo, cuando entran a un bucle infinito. Cuando esto ocurre, el algoritmo nunca devuelve ningún valor de salida, y podemos decir que la función queda indefinida para ese valor de entrada. Por esta razón se considera que los algoritmos son funciones parciales, es decir, no necesariamente definidas en todo su dominio de definición.


Cuando una función puede ser calculada por medios algorítmicos, sin importar la cantidad de memoria que ocupe o el tiempo que se tarde, se dice que dicha función es computable. No todas las funciones entre secuencias datos son computables. El problema de la parada es un ejemplo.


Análisis de algoritmos


Artículo principal: Análisis de algoritmos


Como medida de la eficiencia de un algoritmo, se suelen estudiar los recursos (memoria y tiempo) que consume el algoritmo. El análisis de algoritmos se ha desarrollado para obtener valores que de alguna forma indiquen (o especifiquen) la evolución del gasto de tiempo y memoria en función del tamaño de los valores de entrada.


El análisis y estudio de los algoritmos es una disciplina de las ciencias de la computación y, en la mayoría de los casos, su estudio es completamente abstracto sin usar ningún tipo de lenguaje de programación ni cualquier otra implementación; por eso, en ese sentido, comparte las características de las disciplinas matemáticas. Así, el análisis de los algoritmos se centra en los principios básicos del algoritmo, no en los de la implementación particular. Una forma de plasmar (o algunas veces "codificar") un algoritmo es escribirlo en pseudocódigo o utilizar un lenguaje muy simple tal como Léxico, cuyos códigos pueden estar en el idioma del programador.


Algunos escritores restringen la definición de algoritmo a procedimientos que deben acabar en algún momento, mientras que otros consideran procedimientos que podrían ejecutarse eternamente sin pararse, suponiendo el caso en el que existiera algún dispositivo físico que fuera capaz de funcionar eternamente. En este último caso, la finalización con éxito del algoritmo no se podría definir como la terminación de éste con una salida satisfactoria, sino que el éxito estaría definido en función de las secuencias de salidas dadas durante un periodo de vida de la ejecución del algoritmo. Por ejemplo, un algoritmo que verifica que hay más ceros que unos en una secuencia binaria infinita debe ejecutarse siempre para que pueda devolver un valor útil. Si se implementa correctamente, el valor devuelto por el algoritmo será válido, hasta que evalúe el siguiente dígito binario. De esta forma, mientras evalúa la siguiente secuencia podrán leerse dos tipos de señales: una señal positiva (en el caso de que el número de ceros sea mayor que el de unos) y una negativa en caso contrario. Finalmente, la salida de este algoritmo se define como la devolución de valores exclusivamente positivos si hay más ceros que unos en la secuencia y, en cualquier otro caso, devolverá una mezcla de señales positivas y negativas.


Ejemplo de algoritmo




El problema consiste en encontrar el máximo de un conjunto de números. Para un ejemplo más complejo véase Algoritmo de Euclides.


Descripción de alto nivel


Dado un conjunto finito C de números, se tiene el problema de encontrar el número más grande. Sin pérdida de generalidad se puede asumir que dicho conjunto no es vacío y que sus elementos están numerados como .






Es decir, dado un conjunto se pide encontrar m tal que para todo elemento x que pertenece al conjunto C.
Para encontrar el elemento máximo, se asume que el primer elemento (c0) es el máximo; luego, se recorre el conjunto y se compara cada valor con el valor del máximo número encontrado hasta ese momento. En el caso que un elemento sea mayor que el máximo, se asigna su valor al máximo. Cuando se termina de recorrer la lista, el máximo número que se ha encontrado es el máximo de todo el conjunto.


Descripción formal


El algoritmo escrito de una manera más formal, esto es, en pseudocódigo tendría el siguiente aspecto:
Algoritmo Encontrar el máximo de un conjunto


función //C es un conjunto no vacío de números//