viernes, 24 de abril de 2015

QUE SON ALGORITMOS, DIAGRAMAS DE FLUJO Y PSEUDOCODIGOS


ALGORITMO:


El término algoritmo parece derivar del nombre de un matemático árabe llamado Mohamed ibn Musa al – Khuwarizmi, que vivió en Bagdad alrededor del año 830 de nuestra era, y que escribió un libro que contenía un sistema de numeración decimal y reglas de cálculo. Dicho libro sería utilizado con posterioridad impulsando la sustitución del uso del ábaco.

Modernamente, se ha usado el término algoritmo en referencia a cualquier procedimiento sistemático de cálculo, que da lugar a un resultado después de seguirse una serie de instrucciones precisas.

En el campo de la informática y la programación, se ha adoptado el término para describir cualquier serie de instrucciones precisas que dan lugar a un resultado. La relación con las matemáticas sigue siendo estrecha, aunque ha ganado peso la concepción como serie de instrucciones precisas, que no necesariamente implican cálculo. Así, podríamos hacernos una primera idea de qué es un algoritmo pensando en las instrucciones para montar un mueble desarmado, o en la preparación de un plato a partir de una receta de cocina. 








1. Inicio [Actualización Precios de Plantas aprenderaprogramar.com]
2. Mostrar “Introduzca el precio actual”
3. Pedir Actual
4. Nuevo = Actual
5. Desde i = 1 hasta 6 Hacer
Mostrar “Introduzca la inflación del mes”, i
Pedir inf(i)
Nuevo = Nuevo * (1 + inf(i) / 100)
Siguiente
6. Mostrar “El precio nuevo del producto debe ser”, Nuevo
7. Fin












El diagrama de flujo o diagrama de actividades es la representación gráfica del algoritmo o proceso. Se utiliza en disciplinas como programacióneconomíaprocesos industriales y psicología cognitiva.
En Lenguaje Unificado de Modelado (UML), un diagrama de actividades representa los flujos de trabajo paso a paso de negocio y operacionales de los componentes en un sistema. Un diagrama de actividades muestra el flujo de control general.

En SysML el diagrama ha sido extendido para indicar flujos entre pasos que mueven elementos físicos (p.ej., gasolina) o energía (p.ej., presión). Los cambios adicionales permiten al diagrama soportar mejor flujos de comportamiento y datos continuos.
Estos diagramas utilizan símbolos con significados definidos que representan los pasos del algoritmo, y representan el flujo de ejecución mediante flechas que conectan los puntos de inicio y de fin de proceso.

En UML 1.x, un diagrama de actividades es una variación del diagrama de estado UNL donde los "estados" representan operaciones, y las transiciones representan las actividades que ocurren cuando la operación es completa.
El diagrama de mensajes de UML 2.0, mientras que es similar en aspecto al diagrama de actividades UML 1.x, ahora tiene semánticas basadas en redes de Petri. En UML 2.0, el diagrama general de interacción está basado en el diagrama de actividades. El diagrama de actividad es una forma especial de diagrama de estado usado para modelar una secuencia de acciones y condiciones tomadas dentro de un proceso.
La especificación del Lenguaje de Notificación Unificado (UNL) define un diagrama de actividad como:
“… una variación de una máquina estados, lo cual los estados representan el rendimiento de las acciones o subactividades y las transiciones se provocan por la realización de las acciones o subactividades.”1
El propósito del diagrama de actividad es modelar un proceso de flujo de trabajo (workflow) y/o modelar operaciones.
Una Operación es un servicio proporcionado por un objeto, que está disponible a través de una interfaz.
Una Interfaz es un grupo de operaciones relacionadas con la semántica.





PSEUDOCODIGO: 
En ciencias de la computación, y análisis numérico, el pseudocódigo (o falso lenguaje) es una descripción de alto nivel compacta e informal1 del principio operativo de un programa informático u otro algoritmo.

Utiliza las convenciones estructurales de un lenguaje de programación real,2 pero está diseñado para la lectura humana en lugar de la lectura mediante máquina, y con independencia de cualquier otro lenguaje de programación. Normalmente, el pseudocódigo omite detalles que no son esenciales para la comprensión humana del algoritmo, tales como declaraciones de variables, código específico del sistema y algunas subrutinas. El lenguaje de programación se complementa, donde sea conveniente, con descripciones detalladas en lenguaje natural, o con notación matemática compacta. 

Se utiliza pseudocódigo pues este es más fácil de entender para las personas que el código del lenguaje de programación convencional, ya que es una descripción eficiente y con un entorno independiente de los principios fundamentales de un algoritmo. Se utiliza comúnmente en los libros de texto y publicaciones científicas que se documentan varios algoritmos, y también en la planificación del desarrollo de programas informáticos, para esbozar la estructura del programa antes de realizar la efectiva codificación.

No existe una sintaxis estándar para el pseudocódigo, aunque los ocho IDE's que manejan pseudocódigo tengan su sintaxis propia. Aunque sea parecido, el pseudocódigo no debe confundirse con los programas esqueleto que incluyen código ficticio, que pueden ser compilados sin errores. Los diagramas de flujo y UML pueden ser considerados como una alternativa gráfica al pseudocódigo, aunque sean más amplios en papel.








CARACTERÍSTICAS DEL PSEUDOCODIGO



 LAS PRINCIPALES CARACTERÍSTICAS DEL PSEUDOCODIGO



Las principales características de este lenguaje son:
  1. Se puede ejecutar en un ordenador (con un IDE como por ejemplo SLE, LPP, PilatoX, Maruga Script, Seudocódigo o PSeInt. Otros Ides de consideración son Inter-P y Algor)
  2. Es una forma de representación sencilla de utilizar y de manipular.
  3. Facilita el paso del programa al lenguaje de programación.
  4. Es independiente del lenguaje de programación que se vaya a utilizar.
  5. Es un método que facilita la programación y solución al algoritmo del programa.



Todo documento en pseudocódigo debe permitir la descripción de:
  1. Instrucciones primitivas.
  2. Instrucciones de proceso....
  3. Instrucciones de control.
  4. Instrucciones compuestas.
  5. Instrucciones de descripción.






Estructura a seguir en su realización:
  1. Cabecera.
    1. Programa.
    2. Módulo.
    3. Tipos de datos.
    4. Constantes.
    5. Variables.
  2. Cuerpo.
    1. Inicio.
    2. Instrucciones.
    3. Fin.








DEFINICIÓN DE DATOS DEL PSEUDOCOCDIGO



La definición de datos se da por supuesta, sobre todo en las variables sencillas, si se emplea formaciones: pilas, colas, vectores o registros, se pueden definir en la cabecera del algoritmo, y naturalmente cuando empleemos el pseudocódigo para definir estructuras de datos, esta parte la desarrollaremos adecuadamente.
















DESARROLLO DE ALGORITMOS


Con este pseudocódigo se puede desarrollar cualquier algoritmo que:

  • Tenga un único punto de inicio.

  • Tenga un número finito de posibles puntos de término.

  • Haya un número finito de caminos, entre el punto de inicio y los posibles puntos de término.


FUNCIONES Y PROCEDIMIENTOS


Muchas personas prefieren distinguir entre funciones y procedimientos. Una función, al igual que una función matemática, recibe uno o varios valores de entrada y regresa una salida mientras que un procedimiento recibe una entrada y no genera ninguna salida aunque en algún caso podría devolver resultados a través de sus parámetros de entrada si estos se han declarado por referencia (ver formas de pasar argumentos a una función o procedimiento).

En ambos casos es necesario dejar en claro cuáles son las entradas para el algoritmo, esto se hace comúnmente colocando estos valores entre paréntesis al principio o bien declarándolo explícitamente con un enunciado. En el caso de las funciones, es necesario colocar una palabra como regresar o devolver para indicar cuál es la salida generada por el algoritmo. Por ejemplo, el pseudocódigo de una función que permite calcular a^n (un número a elevado a potencia n).




VENTAJAS DEL PSEUDOCODIGO SOBRE EL DIAGRAMA DE FLUJO

  1. Ocupan mucho menos espacio en el desarrollo del problema.

  1. Permite representar de forma fácil operaciones repetitivas complejas.

  1. Es más sencilla la tarea de pasar de pseudocódigo a un lenguaje de programación formal.

  1. Si se siguen las reglas de identación se puede observar claramente los niveles en la estructura del programa.

  1. En los procesos de aprendizaje de los alumnos de programación, éstos están más cerca del paso siguiente (codificación en un lenguaje determinado, que los que se inician en esto con la modalidad Diagramas de Flujo).

  1. Mejora la claridad de la solución de un problema





CARACTERÍSTICAS DEL PSEUDOCODIGO




CARACTERÍSTICAS DEL PSEUDOCODIGO



Generalmente se utiliza pseudocódigo en los libros de texto y publicaciones científicas relacionadas con la informática y la computación numérica, para la descripción de algoritmos, de manera que todos los programadores puedan entenderlo, aunque no todos conozcan el mismo lenguaje de programación. Generalmente, en los libros de texto se adjunta una explicación que acompaña a la introducción y que explica las convenciones particulares en uso. El nivel de detalle del pseudocódigo puede, en algunos casos, acercarse a la de formalizar los idiomas de propósito general.






Un programador que tiene que aplicar un algoritmo específico, sobre todo uno desfamiliarizado, generalmente comienza con una descripción en pseudocódigo, y luego "traduce" esa descripción en el lenguaje de programación meta y lo modifica para que interactúe correctamente con el resto del programa. Los programadores también pueden iniciar un proyecto describiendo la forma del código en pseudocódigo en el papel antes de escribirlo en su lenguaje de programación, como ocurre en la estructuración de un enfoque de Top-down y Bottom-up arriba hacia abajo.


Pseudocódigo estilo Pascal:
procedimiento bizzbuzz
para i := 1 hasta 100 hacer
establecer print_number a verdadero;
Si i es divisible por 3 entonces
escribir "Bizz";
establecer print_number a falso;
Si i es divisible por 5 entonces
escribir "Buzz";
establecer print_number a falso;
Si print_number, escribir i;
escribir una nueva lína;
fin



En la actualidad y por lo general, el pseudocódigo, como su nombre lo indica, no obedece a las reglas de sintaxis de ningún idioma en particular ni es de forma estándar sistemática, a pesar de que cualquier escritor en particular vaya a pedir prestado lasestructuras de control general, la sintaxis y el estilo, por ejemplo, de algún lenguaje de programación convencional. Pero en caso de que se quiera ejecutar, se debe llevar a forma tipo, para que no genere mensajes de error. Las fuentes populares incluyen la sintaxis de PascalBASICCC++JavaLisp, y ALGOL. Por lo general, se omiten las declaraciones de variables. A veces, las llamadas a funciones, los bloques de código y el código contenido dentro de un loop se remplazan por una sentencia de una línea en lenguaje natural.
Dependiendo del escritor, el pseudocódigo puede variar mucho en su estilo, yendo desde en un extremo, una imitación casi exacta de un lenguaje de programación real, hasta al acercarse a una descripción en prosa de formato de pseudocódigo en el otro extremo.



Pseudocódigo estilo Fortran:
programa bizzbuzz
hacer i = 1 hasta 100 
    establecer print_number a verdadero
    si i es divisible por 3
        escribir "Bizz"
        establecer print_number a falso
    si i es divisible por 5
        escribir "Buzz" 
        establecer print_number a falso
    si print_number, escribir i
    escribir una nueva línea
fin del hacer


El pseudocódigo, en este sentido, esta considerado como una descripción de un algoritmo que resulta independiente de otros lenguajes de programación. Para que una persona pueda leer e interpretar el código en cuestión, se excluyen diversos datos que no son clave para su entendimiento.
Un pseudocódigo, por lo tanto, se emplea cuando se pretende describir un algoritmo sin la necesidad de difundir cuáles son sus principios básicos. De esta manera, un ser humano encontrará mayores facilidades para comprender el mensaje, a diferencia de lo que ocurriría si estuviese frente a un lenguaje de programación real.





Pseudocódigo estilo C:
subproceso funcion bizzbuzz
para (i <- 1; i<=100; i++) {
establecer print_number a verdadero;
Si i es divisible por 3
escribir "Bizz";
establecer print_number a falso;
Si i es divisible por 5
escribir "Buzz";
establecer print_number a falso;
Si print_number, escribir i;
escribir una nueva línea;
}









PSEUDOCODIGO



QUE ES UN PSUDOCODIGO

En ciencias de la computación, y análisis numérico, el pseudocódigo (o falso lenguaje) es una descripción de alto nivel compacta e informal1 del principio operativo de un programa informático u otro algoritmo.




Utiliza las convenciones estructurales de un lenguaje de programación real,2 pero está diseñado para la lectura humana en lugar de la lectura mediante máquina, y con independencia de cualquier otro lenguaje de programación. Normalmente, el pseudocódigo omite detalles que no son esenciales para la comprensión humana del algoritmo, tales como declaraciones de variables, código específico del sistema y algunas subrutinas. El lenguaje de programación se complementa, donde sea conveniente, con descripciones detalladas en lenguaje natural, o con notación matemática compacta.



 Se utiliza pseudocódigo pues este es más fácil de entender para las personas que el código del lenguaje de programación convencional, ya que es una descripción eficiente y con un entorno independiente de los principios fundamentales de un algoritmo. Se utiliza comúnmente en los libros de texto y publicaciones científicas que se documentan varios algoritmos, y también en la planificación del desarrollo de programas informáticos, para esbozar la estructura del programa antes de realizar la efectiva codificación.
No existe una sintaxis estándar para el pseudocódigo, aunque los ocho IDE's que manejan pseudocódigo tengan su sintaxis propia. Aunque sea parecido, el pseudocódigo no debe confundirse con los programas esqueleto que incluyen código ficticio, que pueden ser compilados sin errores. Los diagramas de flujo y UML pueden ser considerados como una alternativa gráfica al pseudocódigo, aunque sean más amplios en papel.











































DISEÑO ALGORITMICO DE FUNCIONES




QUE ES UN DISEÑO ALGORÍTMICO DE FUNCIONES

Funciones algorítmicas de diseño Una función algorítmica se refiere a la implementación de un algoritmo y normalmente forma parte de un programa grande. También se llama una función algorítmica como procedimiento, rutina, método o subprograma. 


Un algoritmo es un procedimiento detallado paso a paso para resolver un problema, pero es independiente de cualquier lenguaje de programacion ya que representa el concepto abstracto de la solución. Por lo tanto, después de diseñar un algoritmo y desarrollar su pesudocode, el siguiente paso es implementar en un lenguaje de programación específico. Al diseñar un algoritmo que muchos factores como tiempo, espacio y tamaño esperado de entrada se consideran.









 Desarrollo y análisis de algoritmos también implican encontrar peor de los casos, el mejor de los casos y situaciones de promedio, como el rendimiento es muy importante para una aplicación cuya entrada aumenta con el tiempo. Una vez que haya finalizado el algoritmo, se traduce en una función o un procedimiento que es específico de un lenguaje de programación. Teóricamente, independientemente de un lenguaje de programación, un algoritmo debe producir repetidamente misma salida. Pero, esto no sucede en la realidad, ya que cada lenguaje de programación tiene sus propias ventajas y desventajas.


 Las características de un lenguaje de programación determinan la eficiencia de un algoritmo debido a problemas como la incapacidad para asignar recursos en tiempo de ejecución o tener fugas de memoria silenciosa puede ralentizar un programa y puede llevar a mal funcionamiento de un algoritmo especialmente cuando aumenta la entrada.






 Factores que influyen en el diseño de una función algorítmica Si un algoritmo hace uso de dividir y conquistar el enfoque o la programación dinámica, el lenguaje de programación que se utiliza para codificar una función algorítmica debe tener soporte para realizar llamadas recursivas anidados.


 Casi todos los lenguajes de programación modernos tienen soporte para realizar llamadas recursivas pero programas escritos en lenguajes antiguos como FORTRAN no tenga soporte para realizar llamadas anidadas. En el caso de recursividad, un lenguaje de programación se encarga de varias ejecuciones de una función de anidación y hacer nuevas copias de las variables en cada llamada. Para lograrlo, la mayoría de lenguajes de programación almacenar detalles sobre las llamadas de función anidada en una pila. Aunque todos los lenguajes de programación proporcionan apoyo para realizar llamadas de función anidada, existe una actuación aérea en almacenar y recuperar los parámetros y variables locales, en recuperar direcciones relativas de cada llamada a una función anidada y en ajusta el puntero de pila. 











Esta sobrecarga a su vez aumenta el tiempo de ejecución como el número de aumentos de llamadas recursivas. Al analizar y diseñar una función algorítmica, esta involucrado en la fabricación de llamadas recursivas de gastos generales no se puede predecir, pero es mejor dejar espacio para lenguaje de programación factores dependientes como este. 


Casi todos los lenguajes de programación orientada a objetos producen excepciones cuando la entrada no es válida o cuando encuentra un error. Sin embargo, otra alternativa, que se puede considerar al diseñar la función algorítmica es devolver un código de error.












 Este enfoque puede ser útil en idiomas que no proporcionan ningún apoyo para el manejo de errores. Un código de error normalmente da descripción sobre el tipo de error que se ha encontrado una función. A pesar de que un algoritmo establece claramente la esperada entrada y salida junto con los Estados intermedios, la aplicación real de la función algorítmica podría variar de un lenguaje de programación a otro. Una función algorítmica diseñada aumenta la legibilidad de un programa, aumenta la calidad del código, reduce errores de hard to find y ayuda a mantener grandes programas fácilmente.













jueves, 23 de abril de 2015

DISEÑO DE ALGORITMOS Y TÉCNICAS DE DISEÑO



QUE ES UN DISEÑO CON ALGORITMOS?


el diseño de algoritmos es un método específico para poder crear un modelo matemático ajustado a un problema específico para resolverlo. El diseño de algoritmos es una teoría de la Investigación de operaciones.


En la etapa de análisis del proceso se determina qué hace el programa. En la etapa del diseño se determina como hace el programa la tarea solicitada.








 Los métodos más eficientes para el proceso de diseño se basan en el conocido de divide  y vencerás. Es decir, la resolución de un problema complejo se realiza dividiendo el problema es sub problemas y a continuación dividir estas sub problemas en otros de nivel más bajo, hasta que puede ser implementado una solución en el computador. Este método se conoce con el nombre de diseño descendente o modular.



Las dos herramientas más utilizadas comúnmente para diseñar algoritmos son: Diagramas de Flujo y pseudocódigos.




ALGUNAS TÉCNICAS DE DISEÑO 


  • Algoritmos voraces (greedy): seleccionan los elementos más prometedores del conjunto de candidatos hasta encontrar una solución. En la mayoría de los casos la solución no es óptima.


  • Algoritmos paralelos: permiten la división de un problema en subproblemas de forma que se puedan ejecutar de forma simultánea en varios procesadores.




  • Algoritmos determinísticos: El comportamiento del algoritmo es lineal: cada paso del algoritmo tiene únicamente un paso sucesor y otro ancesor.








  • Algoritmos no determinísticos: El comportamiento del algoritmo tiene forma de árbol y a cada paso del algoritmo puede bifurcarse a cualquier número de pasos inmediatamente posteriores, además todas las ramas se ejecutan simultáneamente.

  • Divide y vencerás: dividen el problema en subconjuntos disjuntos obteniendo una solución de cada uno de ellos para después unirlas, logrando así la solución al problema completo.



  • Metaheurísticas: encuentran soluciones aproximadas (no óptimas) a problemas basándose en un conocimiento anterior (a veces llamado experiencia) de los mismos.


  • Programación dinámica: intenta resolver problemas disminuyendo su coste computacional aumentando el coste espacial.





UNA PROGRAMACIÓN DINÁMICA



  • Ramificación y acotación: se basa en la construcción de las soluciones al problema mediante un árbol implícito que se recorre de forma controlada encontrando las mejores soluciones.



  • Vuelta Atrás (Backtracking): se construye el espacio de soluciones del problema en un árbol que se examina completamente, almacenando las soluciones menos costosas.


https://www.youtube.com/watch?v=UHMjSO6Ql8U