Página principal


Recursos de Internet

publicado a la‎(s)‎ 20/12/2009 11:56 por Ignacio Matilla Iraola   [ actualizado el 20/12/2009 12:07 ]

Quedelibros

Sitio de venta de libros. Utilizado para obtener datos de Luis Joyanes.

http://www.quedelibros.com/autor/18810/Joyanes-Aguilar-Luis.html


Wikipedia

Enciclopedia libre; de ella he obtenido datos de varios artículos.

http://es.wikipedia.org/wiki/Algoritmo

http://es.wikipedia.org/wiki/Ordinograma

http://es.wikipedia.org/wiki/Pseudocodigo

http://es.wikipedia.org/wiki/Donald_Knuth

http://en.wikipedia.org/wiki/Robert_Sedgewick_%28computer_scientist%29


CarlosPes

Sitio web dedicado a cursos de programación, algoritmia, y otros aspectos de la informática

http://www.carlospes.com/


ALGORITMIA ALGO+ - Algoritmos y Estructuras de Datos

Website dedicado al análisis de algoritmos y estructuras de datos en distintos lenguajes.

http://www.algoritmia.net/

Conclusiones

publicado a la‎(s)‎ 20/12/2009 11:55 por Ignacio Matilla Iraola

En mi opinión, el mundo de la algoritmia consiste en la tarea de ver cómo problemas que normalmente no piensas en como resolver se pueden expresar de un modo que nunca te habias planteado, y en la fascinación de ver cómo los comandos encajan poco a poco hasta realizar la acción que tú deseas que realicen. Esto alcanza su máximo exponente cuando te topas con un problema que ni siquiera tú sabes como resolver, y, utilizando las herramientas que has ido obteniendo durante el aprendizaje de algoritmia y programación, consigues hallar la forma de obtener la solución (y eso es la algoritmia: no tanto el obtener la solución sino obtener el procedimiento necesario para llegar a ella).


Relación entre pseudocódigos y códigos

publicado a la‎(s)‎ 20/12/2009 11:53 por Ignacio Matilla Iraola

Con todas las herramientas en la mano y el algoritmo preparado, ya solo queda ver la relación entre el algoritmo construido y el código resultante de la traducción a lenguaje de programación. Si bien las estructuras básicas son prácticamente las mismas, las instrucciones son menos “explicativas” y más concretas. Así, en lenguaje c, para declarar una variable numérica entera se escribe “int”, al escribir un mensaje se usa “printf”, para que en la pantalla se pase a la siguiente línea se usa “\n” (en el pseudocódigo se obvia), para iniciar y terminar un bucle se utilizan los signos “{” y “}”...


En los pseudocódigos de este documento,


Y no hay que olvidar que cada lenguaje de programación tiene sus propias especificaciones. En este documento he utilizado pseudocódigos cercanos al lenguaje C, pero para otros lenguajes (pascal, html, php) se utilizan comandos distintos o incluso la estructura tiene diferente apariencia.

Herramientas para la creación de algoritmos

publicado a la‎(s)‎ 20/12/2009 11:51 por Ignacio Matilla Iraola

Empezaremos por explicar un poco las variables. En alguno de los algoritmos se ven en el entorno las palabras “variable numérica entera”. Hay tres tipos de variables: numéricas enteras, numéricas reales y alfanuméricas. En una variable entera se puede meter un número entero (positivo o negativo, pero sin decimales), en una variable real se puede meter un número real (positivo y negativo con coma flotante) y en una variable alfanumérica se pueden meter números, caracteres y cadenas de caracteres (hay una gran diferencia entre estos dos últimos a la hora de programar; sin embargo, no es significativo a la hora de diseñar un algoritmo).


En todos los tipos de bucles y selecciones se verifica el valor de una variable (normalmente; como excepción se pueden usar sentencias del tipo “mientras 1 sea distinto de 2” para crear bucles infinitos). Dentro del bucle, el valor de esa variable se deberá modificar para, en algún momento, llegar a la condición de salida del bucle. Para ello, se puede pedir al usuario un nuevo valor de la variable, o se puede crear lo que se llama contador; esto es, una variable que inicializas en cualquier valor y luego modificas de forma constante su valor dentro del bucle para “contar” algo. A continuación incluyo un ejemplo:


variable numérica entera contador /*la variable puede tener cualquier nombre. */

contador ← 1 /*Llamarla contador es un capricho del autor*/

mientras contador <> 5 hacer

escribir “es la “,contador,”ª vez que hago el bucle”

contador ← contador + 1

Fmientras

Falgoritmo


Parecidos a los contadores son los acumuladores: Variables en las que vas guardando valores que se pueden sumar, multiplicar, elevar a una potencia, etc. Ejemplo:


variable numérica entera acumulador, contador, numero

contador ← 1

acumulador ← 0

mientras contador <> 5 hacer

escribir “introduzca un número”

leer numero


acumulador ← acumulador + numero

contador= ← contador + 1

Fmientras

escribir “el total introducido es ” acumulador

Falgoritmo


Otra gran herramienta es el switch, ya nombrado en el ejemplo “juego de nim” ( Que puede encontrarse en la sección de ejemplos). Resumiendo, se trata de una variable que puede tener 2 valores. Pueden ser cualquiera, pero a lo largo del programa tiene que intercambiar de valor entre uno y otro sin cambiar a otro valor. Se suele utilizar 0 y 1, aunque una de las posibilidades que ofrece es utilizar 1 y -1; de este modo, solo habrá que cambiar su valor una vez al final del bucle, multiplicandolo por -1. La diferencia sería algo así.


/*Ejemplo con SW=0 ó 1*/

variable numérica entera contador, SW

contador ← 1

SW ← 0

Mientras contador <> 5 hacer

si SW=0 entonces

escribir “hola”

SW ← 1

sino

escribir “adiós”

SW ← 0

Fsi

Fmientras

Falgoritmo


/*Ejemplo con SW=1 ó -1*/

variable numérica entera contador, SW

contador ← 1

SW ← 1

Mientras contador <> 5 hacer

si SW=0 entonces

escribir “hola”

sino

escribir “adiós”

Fsi

SW ← SW*-1

Fmientras

Falgoritmo


Comentarios: Habrás observado que, a lo largo de los algoritmos, en ocasiones se ven porciones de texto entre los signos /* y */. Se llaman comentarios, y son una herramienta utilizada en programas largos para no perderse, o en caso de ser un programa que se va a realizar en más de una sesión. También es válido para introducir un comentario utilizar dobles barras (// comentario //).


Por último, queda decir que la gran herramienta definitiva para la creación de un algoritmo es la imaginación y la lógica. Combinando las herramientas explicadas hasta ahora con algunas herramientas más concretas se puede realizar casi cualquier algoritmo que, una vez traducido a lenguaje de programación, hará que el ordenador realice todo aquello que le quieras mandar hacer.

Personajes relevantes relacionados con la algoritmia

publicado a la‎(s)‎ 20/12/2009 11:47 por Ignacio Matilla Iraola

Donald Knuth

Datos biográficos:

Nacido el 10 de enero de 1938 en Milwaukee, Wisconsin


Es uno de los más reconocidos expertos en ciencias de la computación por su seminal investigación dentro del análisis de algoritmos y compiladores. Es Profesor Emérito de la Universidad de Stanford.


Se le conoce principalmente por ser el autor de la obra The art of computer programming (El arte de programar computadoras u ordenadores), una de las más respetadas referencias en el campo de las ciencias de la computación. Sentó las bases de y dio nombre al análisis de algoritmos y ha realizado numerosos aportes a varias ramas teóricas de la informática. Es el creador de TEX, del sistema de diseño de tipos METAFONT y del estilo de programación conocido como programación literaria (Literate programming).


Knuth es un programador conocido por su humor geek: ofrece una recompensa de 2,56 dólares a quien encuentre errores conceptuales o tipográficos en sus libros (la razón detrás de la extraña cifra es que «256 centavos son 1 dólar hexadecimal»), y por otro lado ofrecía 3,16 por errores en 3:16 Bible Texts Illuminated. Numeró las distintas versiones de TEX de manera que se aproximaran al número π (3, 3,1, 3,14, etc.), al igual que los números de versión de MetaFont se van aproximando a e. Su cita más célebre, al enviarle sus comentarios a un colega autor de un algoritmo, es: «Cuidado con los errores en el código anterior; sólo he demostrado que es correcto, no lo he probado».


Knuth es el autor de 3:16 Bible Texts Illuminated (1991, ISBN 0895792524), libro en el que intenta examinar la Biblia por un proceso de «muestreo estratificado aleatorio», es decir, un análisis del capítulo 3, versículo 16 de cada libro. Cada versículo se acompaña de un renderizado en arte caligráfico, realizado por un grupo de calígrafos capitaneado por Hermann Zapf.


Está casado con Jill Carter Knuth. Tienen dos hijos.



Luis Joyanes Aguilar


Datos biográficos:

Dr. en Ingeniería Informática y Dr. en Sociología (Licenciado en Ciencias Físicas y Licenciado de Enseñanza Superior Militar). Profesor Titular de la Cátedra de Lenguajes y Sistemas Informáticos de la Facultad de Informática de la Universidad Pontificia de Salamanca, campus de Madrid.


Decano de la Facultad de Informática y Director del Departamento de Postgrado (Doctorado y Master en Ingeniería Informática). Conocido por crear el lenguaje de pseudocódigo UPSAM, que es referencia en gran cantidad de cursos de programación.


Su bibliografía se puede encontrar en la sección “cursos de diseño de algoritmos” de este website.


Robert Sedgewick


Datos biográficos:

Nacido en Estados Unidos en 1946. Profesor de informática en la Universidad de Princeton y miembro de la directiva de Adobe Systems.


Terminó su doctorado en Filosofía en 1975 bajo la supervisión de Donald Knuth en Stanford. Su tesis fue sobre un algoritmo de ordenación quicksort. Entre 1975 y 1985 fue ayudante en la facultad de la Universidad de Brown. Desde 1985 ha estado en el departamento de Ciencia Informática de la Universidad de Princeton. En 1997 fue nombrado “fellow” (compañero) de la Asociación por la Maquinaria de Computación por su trabajo en análisis matemático de algoritmos.


Robert Swdgewick es autor de la serie de libros Algorihtms, publicada por Addison-Wesley. La primera edición del libro fue publicada en 1983 y contenía código en pascal. Las siguientes ediciones utilizaron C, C++, Modula-3 y Java.

Cursos de diseño de algoritmos

publicado a la‎(s)‎ 18/12/2009 09:21 por Ignacio Matilla Iraola   [ actualizado el 20/12/2009 11:22 ]

Como buenos adictos a la algoritmia, uno siempre esta buscando dónde ampliar sus conocimientos, por ello a continuación referenciaré algunos cursos que me han parecido interesantes.


  • Curso de diseño de algoritmos de Carlos Pes.

Uno de los más comprensibles que he encontrado para aprendices con escasa experiencia, a la par que muy completo, incluye tanto pseudocódigos como ordinogramas, guías de como anidar distintas estructuras y obtener buenos resultados, explica todas las herramientas existentes en la creación de algoritmos (acumuladores, contadores, funciones, subprogramas, etc.).


            http://www.carlospes.com/curso_de_algoritmos/

  • Fundamentos de programación por Luis Joyanes (libro)

Curso ejercido por Luis Joyanes Aguilar, profesor de la UPSAM y creador del lenguaje UPSAM de pseudocódigo. Libro disponible en librerias o en compra por internet. Este y otros libros del mismo autor (todos relacionados con la programación pueden encontrarse en el siguiente website.

            http://www.casadellibro.com/libros/joyanes-aguilar-luis/joyanes2aguilar32luis

  • Empezar de cero a programar en lenguaje C (libro)

Libro con todo lo necesario para programar en lenguaje c, explicando todas las bases algorítmicas y todas las funciones, secuencias y herramientas disponibles en este lenguaje. Libro escrito por Carlos Pes Rivas (el mismo autor que el curso citado arriba). Cabe destacar que en el website de este autor se incluye un listado de las bibliotecas en las que puedes pedir prestado su libro (de forma gratuita), así como las librerías colaboradoras donde se puede comprar, y un índice de información con un par de erratas, contenidos, metodologías y más información sobre el producto y contenidos gratuitos (incluso partes del libro en PDF).

http://www.carlospes.com/libro_edc_lenguajec/



Pseudocódigos (parte 2)

publicado a la‎(s)‎ 18/12/2009 09:16 por Ignacio Matilla Iraola   [ actualizado el 20/12/2009 11:32 ]

Anidamiento

Hasta ahora hemos visto estructuras en cuyo interior hay instrucciones, pero: ¿En qué consisten esas instrucciones? Pueden ser instrucciones del estilo de x ← 1+2, pero también puede haber más estructuras dentro de una estructura (de hecho el “Sino si” es en realidad un “si” dentro del conjunto de instrucciones del “sino”), dando lugar a una estructura anidada.

Funciones y procedimientos

Una función, al igual que una función matemática, recibe uno o más valores de entrada y devuelve una salida, mientras que un procedimiento no devuelve nada.

Función x (a, …, n) /*Comentario: En el parentesis vienen los valores de entrada*/

Instrucciones

Devolver r /*r sera un valor obtenido de las instrucciones*/

Ffunción

Para llamar a una función desde la principal se tendrá que escribir el nombre de la función y en el interior del paréntesis las variables que envias a esa función (en blanco si no envias nada).

Ventajas de usar un pseudocódigo

La principal diferencia es que ocupa mucho menos espacio para algoritmos más largos, sobre todo si incluyen iteraciones y condiciones. En estructuras repetitivas también da facilidad para representar operaciones complicadas. Puesto que se usa de base para realizar un programa, tiene la ventaja de ser más facil de traducir, puesto que la estructura es básicamente la misma. Si se utilizan los márgenes correctamente, es más facil ver los niveles de la estructura del algoritmo, y al estar escrito linealmente es fácil seguir una por una las instrucciones para llegar a la solución del problema.

Pseudocódigo de la UPSAM

El pseudocódigo de la UPSAM (Universidad Pontificia de SAlamanca, campus de Madrid) es un lenguaje basado en pascal y traducido al castellano, creado por el profesor Luis Joyanes Aguilar. Cuenta con equivalentes a prácticamente todas las funciones, y es fácil de entender y traducir. Para conocer las especificaciones de este, entra aquí




Para obtener ejemplos de algoritmos en pseudocódigo y un ejemplo de programa, visita esta sección del site


Pseudocódigos (parte 1)

publicado a la‎(s)‎ 18/12/2009 09:11 por Ignacio Matilla Iraola

Como su nombre indica, se trata de “códigos falsos”. Se refiere a códigos de programación, y consiste en transcribir, con la estructura de un programa, la lista de pasos de forma que sea traducible a algún lenguaje de programación. Al contrario que en los ordinogramas, no hay ningun estándar oficial para los pseudocódigos, aunque se intenta que se asemejen al lenguaje en el que se espera tradudirse. Suelen utilizar los símbolos comunes a la hora de realizar operaciones matemáticas, a diferencia de los programas que requieren un lenguaje propio para referirse a la mayoría de operaciones.


Estructuras de control


  • Secuencial:

Las instrucciones se siguen de forma lineal una tras otra, de arriba hacia abajo, de la siguiente forma:


Instrucción 1

Instrucción 2

Instrucción 3

Instrucción n


  • Selectiva:

-Selectiva simple (si)

Comprueba una condición, y si se cumple, realiza las instrucciones en el interior.


Si condición entonces

Instrucciones.

Fsi.



-Selectiva doble (si, sino)

Parecida a la anterior, pero, si no se cumple, realiza otras instrucciones.


Si condición entonces

Instrucciones1.

Sino

Instrucciones2.

Fsi


-Selectiva múltiple.(si, sino si)

Da lugar a selecciones con más de dos opciones.


Si condición entonces

Instrucciones1.

Sino Si condición2 entonces

Instrucciones2.

Sino

Instrucciones n

Fsi


En este tipo de selección, cada condición excluye a las siguientes. Si el que realiza las instrucciones del algoritmo entra en una condición, no hará ninguna de las demás. En caso de poder darse una situación en la cual no se cumple ninguna de las situaciones, se

haría el último “Sino” o, en ausencia de este, se saldría de la selección sin hacer nada.


-Selectiva múltiple en casos.

Esta es un poco distinta, aunque en esencia es similar a la anterior. Se busca en el contenido de un “indicador” el valor de uno de los casos, en el cual se entrará y se

realizarán las instrucciones del interior. La aparencia de esta estructura sería así:


Seleccionar indicador

Caso 1

Instrucciones1

Caso 2

Instrucciones2

Caso 3

Instrucciones3

En otro caso

Instrucciones n.

Fseleccionar


  • Iterativa: (bucles)

Realiza unas acciones un número de veces que viene definido por una condición.


-Bucle mientras:

Realiza las instrucciones mientras la condición dada sea cierta. La variable que se

compruebe en el inicio del bucle debe tratarse antes de entrar en este y antes de salir (si

no se tratara antes de salir, daría lugar a un bucle infinito).


Mientras condición Hacer

Instrucciones

Fmientras


-Bucle repetir:

Tiene como principal diferencia con el anterior que realiza las instrucciones mínimo

una vez, ya que comprueba la condición al final. Además, este bucle realizara las

instrucciones hasta que se cumpla la condición, y no mientras.


Repetir

Instrucciones

Hasta condición


-Bucle para:

Este se utiliza cuando se conoce el número de veces que se desean realizar las

instrucciones.


Para i ← x hasta n hacer

Instrucciones

Fpara

Aclaración: en este caso, “i” tiene un valor inicial “x” y va aumentando en 1 hasta

llegar a “x”. Si se quisiera incrementar (o reducir) el valor de i en otra cantidad, la

línea inicial sería así: Para i ← x hasta n en y hacer


-Bucle para cada:

Se utiliza cuando hay una lista L y se quiere realizar las instrucciones para cada

componente de dicho grupo.


Para cada x de L hacer

instrucciones

Fpara cada


(Continua en la parte 2)


Ordinogramas

publicado a la‎(s)‎ 18/12/2009 09:01 por Ignacio Matilla Iraola   [ actualizado el 18/12/2009 09:10 ]

También conocidos como diagramas de flujo, consisten en una representación gráfica del algoritmo. Siguen un estándar oficial que regula el significado de la forma de cada “globo” de información; por ejemplo, el rombo significa decisión entre dos o más caminos. En un ordinograma, se deben cumplir tres condiciones:


1. Existe un camino para hallar la solución.


2. Solo existe un inicio para el proceso.


3. Existe un solo final, a no ser que haya más de un camino.


Antes de realizar un ordinograma se deben llevar a cabo los siguientes puntos.

  • 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.


Una vez hecho esto, para construir el diagrama de flujo, se deben seguir los siguientes pasos.

  • 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 (consultar los anexos para conocer el significado estándar de los símbolos).

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


Como ventajas, los diagramas de flujo tienen a su favor una rápida y fácil interpretación. Se distinguen fácilmente los bucles, repeticiones, etc...

Como desventaja principal es la cantidad de espacio que ocupa, mucho mayor que un algoritmo que solo tenga texto, lo cual limita los ordinogramas a algoritmos pequeños y más o menos sencillos.

¿Qué es la algoritmia?

publicado a la‎(s)‎ 18/12/2009 08:54 por Ignacio Matilla Iraola

La algoritmia consiste en la búsqueda de soluciones a un problema concreto. Pero, en aras de entender mejor lo que esto significa, hace falta una definición más extensa. Un algoritmo es la transcripción exacta de una serie de instrucciones concretas con las cuales se encuentra una solución.

Para el mejor entendimiento, lo mejor es un ejemplo: Si quieres encender una televisión, nadie se plantea que eso pueda ser un problema, puesto que el objetivo es verla. Sin embargo, si te planteas el encender la televisión como el problema a resolver, verás que los pasos exactos e infalibles son:


- Buscar el mando.

- Comprobar que tiene pilas.

- Comprobar que la televisión esta enchufada.

- Comprobar que los fusibles están encendidos.

- Pulsar el botón de encendido.


Este es un ejemplo, pero cada paso a su vez se podría plantear como un problema (¿Cómo compruebo si tiene pilas? ¿Cómo busco el mando si no se donde está?). Además. Puede haber caminos alternativos, más o menos seguros que este para llegar a la misma solución: Puede ser una televisión sin mando o que simplemente prefieras encender desde el botón, por ejemplo. Por lo tanto, hay infinidad de posibles algoritmos para el mismo problema. Si dos personas realizan un algoritmo, es más que probable que los algoritmos serán distintos puesto que cada uno tiene su punto de vista de la forma correcta de llegar a su objetivo.


Tampoco son necesarios ejemplos “rebuscados” para encontrar un algoritmo: Casi cualquier aparato electrónico (o no) viene con instrucciones de uso: He ahí un algoritmo.

1-10 of 12