miércoles, 30 de enero de 2019

Estilos de Programación

Estilos de programación


Programación estructurada (PE) 

La programación estructurada esta compuesta por un conjunto de técnicas que han ido evolucionando aumentando considerablemente la productividad del programa reduciendo el tiempo de depuración y mantenimiento del mismo. 

Esta programación estructurada utiliza un número limitado de estructuras de control, reduciendo así considerablemente los errores. 

Esta técnica incorpora: 


·         Diseño descendente (top-dow): el problema se descompone en etapas o estructuras jerárquicas.
·         Recursos abstractos (simplicidad): consiste en descompones las acciones complejas en otras más simples capaces de ser resueltas con mayor facilidad.
·         Estructuras básicas: existen tres tipos de estructuras básicas:
o    Estructuras secuenciales: cada acción sigue a otra acción secuencial mente. La salida de una acción es la entrada de otra.
o    Estructuras selectivas: en estas estructuras se evalúan las condiciones y en función del resultado de las mismas se realizan unas acciones u otras. Se utilizan expresiones lógicas.
o    Estructuras repetitivas: son secuencias de instrucciones que se repiten un número determinado de veces.

Las principales ventajas de la programación estructurada son: 


·         Los programas son mas fáciles de entender
·         Se reduce la complejidad de las pruebas
·         Aumenta la productividad del programador
·         Los programas queden mejor documentados internamente.

Un programa esta estructurado si posee un único punto de entrada y sólo uno de salida, existen de "1 a n" caminos desde el principio hasta el fin del programa y por último, que todas las instrucciones son ejecutables sin que aparezcan bucles infinitos. 

Programación modular 

En la programación modular consta de varias secciones dividas de forma que interactúan a través de llamadas a procedimientos, que integran el programa en su totalidad. 

En la programación modular, el programa principal coordina las llamadas a los módulos secundarios y pasa los datos necesarios en forma de parámetros. 

A su vez cada modulo puede contener sus propios datos y llamar a otros módulos o funciones. 

Programación orientada a objetos (POO) 

Se trata de una técnica que aumenta considerablemente la velocidad de desarrollo de los programas gracias a la reutilización de los objetos. 

El elemento principal de la programación orientada a objetos es el objeto. 
El objeto es un conjunto complejo de datos y programas que poseen estructura y forman parte de una organización. 
Un objeto contiene varios datos bien estructurados y pueden ser visibles o no dependiendo del programador y las acciones del programa en ese momento. 

El polimorfismo y la herencia son unas de sus principales características y por ello dedicaremos más adelante un artículo exclusivamente a tratar estos dos términos. 

En DesarrolloWeb.com hemos publicado anteriormente una explicación de lo que es la 
programación orientada a objetos

Programación concurrente 

Este tipo de programación se utiliza cuando tenemos que realizar varias acciones a la vez. 

Se suele utilizar para controlar los accesos de usuarios y programas a un recurso de forma simultanea. 

Se trata de una programación más lenta y laboriosa, obteniendo unos resultados lentos en las acciones. 

Programación funcional 

Se caracteriza principalmente por permitir declarar y llamar a funciones dentro de otras funciones. 

Programación lógica 

Se suele utilizar en la inteligencia artificial y pequeños programas infantiles. Se trata de una programación basada en el cálculo de predicados (una teoría matemática que permite lograr que un ordenador basándose en hecho y reglas lógicas, pueda dar soluciones inteligentes).






EXAMEN







3 UNIDAD

PRACTICA 2 FUNCIÓN PARA SACAR EL ÁREA DE UN TRIANGULO Y  RECTANGULO




EXAMEN








UNIDAD 4

4.1 Introducción a la programación lógica

La programación lógica es la parte de la informática que se ocupa de la lógica como lenguaje de programación.
En este paradigma, un programa es un conjunto finito de FBFs, y la computación es la obtención de pruebas formales.
Una cláusula definida es aquella que tiene, a lo sumo, un literal positivo. En programación lógica se representa como a <-- b1, b2, ..., bn siendo a el único literal positivo de haberlo. Los brepresentan los literales que eran negativos en la fórmula clausal, pero se representan sin la negación en programación lógica. Además, todas las variables se consideran cuantificadas universalmente.
La parte izquierda de la flecha se denomina cabeza de la cláusula, y la parte derecha es el cuerpo de la cláusula.

Caracterización de programas lógicos

  • Programas definidos: Cláusulas de Horn o definidas.
  • Programas normales: Cláusulas normales como extensión de la cláusula de Horn admitiendo literales negativos en el cuerpo de las cláusulas.
  • Programas: Cualquier FBF.

Programas definidos: sintaxis de Edimburgo

Términos: constantes numéricas o atómicas, variables y funciones.
Átomos: funciones con sus parámetros.
Cláusulas: Construidas con átomos, se componen de una cabeza y un cuerpo separados con una flecha.
Si una cláusula solo tiene cabeza, se denomina hecho (cláusula unitaria de programa). Si tiene cabeza y cuerpo, es una regla (cláusula de programa). Si no tiene cabeza, se trata de una pregunta o meta.
Un programa es un conjunto finito de cláusulas de programa.

4.2 semántica de los programas lógicos

Los lenguajes de programación lógico-funcionales son un intento de integrar las dos ramas principales de la programación declarativa: los lenguajes lógicos y los funcionales, Durante la década de los 80 se definieron unos cuantos de estos lenguajes y, de hecho, dos de ellos con la participación de nuestro departamento: Babel y su sucesor, Curry.
Sin embargo, cuando nos movemos de la formulación teórica a las realizaciones prácticas aparecen una serie de problemas. Algunos son provocados porla incompatibilidad de distintos mecanismos de ejecución adaptados de cada una de las dos partes -- por ejemplo, la evaluación perezosa necesaria para realizar la semántica no estricta en los lenguajes funcionales y las técnicas de retroceso usadas en Prolog para el tratamiento del indeterminismo y las variables lógicas.
Esta tesis abarca gran parte del trabajo de investigación que he llevado a cabo en la Facultad de Informática de la Universidad Politécnica de Madrid.
Esta investigación ha girado, fundamentalmente, alrededor de la optimización, basada en métodos semánticos, de la compilación de programas lógico-funcionales.
Caracteristica:
PROLOG
• Los objetos y las relaciones importantes deben aparecer explícitamente y de forma conjunta
• Las restricciones inherentes al problema se muestran pero no los detalles irrelevantes.
• La representación debe ser transparente: se entiende lo que se dice.
• Completa y concisa: Están representados con eficacia todos los objetos y relaciones.
• Una tarea de la semántica es investigar las CONDICIONES DE VERDAD de los enunciados
• La semántica formal se ocupa únicamente de los aspectos formales o estructurales de las condiciones de verdad
• Un enunciado complejo será verdadero o falso en función de la forma en que estén dispuestos los enunciados simples que lo componen

4.3 Consulta de una base de clausulas

SELECT select_list
FROM table_source
[WHERE search_condition]
[GROUP BY group_by_expression]
[HAVING search_condition]
[ORDER BY order_expression [ASC | DESC] ]
FROM
Especifica de dónde queremos obtener los datos, es decir, de que tabla. Se utiliza no sólo en el comando de consulta, SELECT, sino también en los comandos UPDATE y DELETE .
WHERE
Está clausula es donde se indican las condiciones de filtrado de los datos. Estas condiciones se definen a través de los operadores lógicos y de comparación.
GROUP BY
La clausula GROUP BY sirve para agrupar la información. Esta clausula es aplicable exclusivamente al comando SELECT.
HAVING
La clausula HAVING tiene siempre que ir acompañada de un GROUP BY. En ella indicamos las condiciones que debe satisfacer cada grupo y donde utilizaremos funciones de agregación. Como en el caso del GROUP BY de utilizarla será en el SELECT.
ORDER BY
Sirve para ordenar la información obtenida a través de la consulta en un determinado orden.
AND
El operador AND se traduce en lógica y matemáticas como conjunción. Su resultado será verdadero si ambos operandos son verdaderos.
OR
El operador OR es lo que en lógica se conoce como disyunción. Su resultado será verdadero cuando uno o más de sus operandos es verdadero.
NOT
El operador NOT, o negación, opera sobre un sólo operando y nos devuelve su valor contrario.
Consulta.
Las consultas son una forma de buscar y recopilar información de una o más tablas para conseguir información detallada de una base de datos. Al crear una consulta, defines condiciones específicas de búsqueda para encontrar, exactamente, la información que deseas.

4.4 Espacios de búsquedas

Cuando se resuelve un problema, se busca la mejor solución entre un conjunto de posibles soluciones. Al conjunto de todas las posibles soluciones a un problema concreto se llama espacio de búsqueda. Cada punto en el espacio de búsqueda representa una posible solución. Cada posible solución se le puede asociar un fitness o un valor que indicará cómo de buena es la solución para el problema. Un algoritmo genético (AG) devolverá la mejor solución de entre todas las posibles que tenga en un momento dado.
Entonces parece que buscar una solución se reduce a buscar un valor extremo (mínimo o máximo) en el espacio de búsqueda. A veces el espacio de búsqueda puede ser bien definido, pero en la mayoría de las ocasiones sólo se conocen algunos puntos en el espacio de búsqueda. Cuando se usa un AG las posibles soluciones generan otras a medida que el genético evoluciona.
La resolución de un problema puede expresarse como la busqueda del extremo de una función Aquí resolvemos ese problema, este es un algorítmo genético que calcula el máximo de una función. La gráfica representa un espacio de busqueda y las líneas verticales son posibles soluciones. La línea roja es el mejor individuo de la población y las verdes el resto.
Pulsa el botón Empezar para que el genético comience, el botón Parar detendrá la ejecución, en el botón Paso a Paso se ejecutará un único paso creando una nueva población y el botón Reiniciar creará una nueva población inicial.
El problema estriba en que la búsqueda puede ser muy compleja por diversas razones, como por ejemplo no saber dónde buscar una solución o dónde empezar a buscarla. Existen muchos métodos que se usan para buscar una solución válida, pero no necesariamente obtienen la mejor solución. Algunos de estos métodos son los algoritmos de escalada, backtracking o vuelta atrás, búsqueda a ciegas y los algoritmos genéticos. Las soluciones que encuentran estos tipos de búsqueda suelen ser buenas soluciones, pero no siempre encuentran la óptima.

Problemas NP Completos

Cuando se plantea un problema concreto, habrá una serie de algoritmos aplicables. Se suele decir que el orden de complejidad de un problema es el del mejor algoritmo que se conozca para resolverlo. Así se clasifican los problemas, y los estudios sobre algoritmos se aplican a la realidad.
Estos estudios han llevado a la constatación de que existen problemas muy difíciles, problemas que desafían la utilización de los ordenadores para resolverlos. En lo que sigue esbozaremos las clases de problemas que hoy por hoy se escapan a un tratamiento informático.

Clase P

Los algoritmos de complejidad polinómica se dice que son tratables en el sentido de que suelen ser abordables en la práctica. Los problemas para los que se conocen algoritmos con esta complejidad se dice que forman la clase P.
Aquellos problemas para los que la mejor solución que se conoce es de complejidad superior a la polinómica, se dice que son problemas intratables. Seria muy interesante encontrar alguna solución polinómica (o mejor) que permitiera abordarlos.

Clase NP

Algunos de estos problemas intratables pueden caracterizarse por el curioso hecho de que puede aplicarse un algoritmo polinómico para comprobar si una posible solución es válida o no. Esta característica lleva a un método de resolución no determinista consistente en aplicar heurísticos para obtener soluciones hipotéticas que se van desestimando (o aceptando) a ritmo polinómico.
Los problemas de esta clase se denominan NP (la N de no-deterministas y la P de polinómicos).

Clase NP Completos

Se conoce una amplia variedad de problemas de tipo NP, de los cuales destacan algunos de ellos de extrema complejidad. Gráficamente se puede decir que algunos problemas se hayan en la "frontera externa" de la clase NP. Son problemas NP, y son los peores problemas posibles de clase NP. Estos problemas se caracterizan por ser todos "iguales" en el sentido de que si se descubriera una solución P para alguno de ellos, esta solución sería fácilmente aplicable a todos ellos. Actualmente hay un premio de prestigio equivalente al Nobel reservado para el que descubra semejante solución... ¡y se duda seriamente de que alguien lo consiga!
Es más, si se descubriera una solución para los problemas NP-completos, esta sería aplicable a todos los problemas NP y, por tanto, la clase NP desaparecería del mundo científico al carecerse de problemas de ese tipo. Realmente, tras años de búsqueda exhaustiva de dicha solución, es hecho ampliamente aceptado que no debe existir, aunque nadie ha demostrado, todavía, la imposibilidad de su existencia...
Una alternativa para resolver los problemas NP-completos son los algoritmos genéticos. Ejemplos de problemas NP-completos son el problema del viajante de comercio (TSP), el problema del coloreamiento de un grafo, el problema de la satisfacibilidad...

Clase NP Duros

Esta clase puede ser descrita como conteniendo los problemas de decisión que son al menos tan dificiles como un problema de NP. Esta afirmación se justifica porque si podemos encontrar un algoritmo A que resuleve uno de los problemas H de NP-hard en tiempo polinómico, entonces es posible construir un algotimo que trabaje en tiempo polinómico para cualquier problema de NP ejecutando primero la reducción de este problema en H y luego ejecutando el algoritmo A. La clase NP-completo puede definirse alternativamente como la intersección entre NP y NP-hard.