evaluacion de algoritmos - Docencia FCA-UNAM

Download Report

Transcript evaluacion de algoritmos - Docencia FCA-UNAM

UNIVERSIDAD LATINA (UNILA)
V. EVALUACION DE ALGORITMOS.
LE, EI, Profesor Ramón Castro Liceaga
Que son los paradigmas de programación ?
Un paradigma de programación son las técnicas que proveen
y determinan la visión y métodos de un programador en la
construcción de un algoritmo, programa o subprograma.
Diferentes paradigmas resultan en diferentes estilos de
programación y en diferentes formas de pensar la solución
de problemas (con la solución de múltiples “problemas” se
construye una aplicación).
Los lenguajes de programación son basados en uno o más
paradigmas Por ejemplo: Smalltalk y Java son lenguajes
basados en el paradigma orientado a objetos. El lenguaje
de programación Scheme, en cambio, soporta sólo
programación funcional.
En cambio Python, soporta múltiples paradigmas.
Programación imperativa (instrucciones)
Es también conocida como programación procedural, está
basada en los lenguajes imperativos, que son la forma
tradicional de programación.
Este tipo de programación se basa en la especificación
explícita de los pasos que se deben seguir para obtener el
resultado deseado.
Utiliza variables y operaciones de asignación para el
almacenamiento de información, define procedimientos bien
claros en donde se procesan las variables de acuerdo con
operaciones explícitas.
Algunos de los lenguajes para programación imperativa son
Basic, Pascal, C y Modula - 2.
Programación lógica (lógica formal)
Es un tipo de programación declarativa y relacional que está basada en
lógica de primer orden.
La programación declarativa describe relaciones entre variables en
términos de funciones y reglas de inferencia dejando en manos del
traductor la aplicación de un algoritmo fijo sobre estas relaciones para
producir un resultado.
La programación relacional genera salidas en función de atributos y
argumentos.
El lenguaje de programación lógica por excelencia es Prolog, es utilizado
para la inteligencia artificial y basa su funcionamiento en cláusulas
formadas por un conjunto de literales atómicas donde por lo menos una
es positiva. Hechos y reglas son conocidos, en su conjunto, como
cláusulas.
Otros lenguajes de programación lógica son: ALF (Another logical
framework), Gödel programming language, Mercury programming
language y CLP(FD)
Programación funcional (basada en funciones)
Este paradigma basa su programación en la definición de un conjunto de
funciones (posiblemente recursivas) y una expresión cuyo valor de salida
se utilizará para representar el resultado del algoritmo.
Los programas escritos en lenguaje funcional tienden a ser compactos y
elegantes, aunque también son lentos y requieren de gran cantidad de
memoria para su ejecución.
Algunos de los principales lenguajes de programación funcional son:
DR Racket, Clean, FP, Haskell, Hope, LML, Miranda, SML y LISP.
programación declarativa (declaraciones)
La programación declarativa es un estilo de
programación en el que el está basado en el
desarrollo de programas especificando o
"declarando" un conjunto de condiciones,
proposiciones, afirmaciones, restricciones,
ecuaciones o transformaciones que describen el
problema y detallan su solución.
Ejemplos: Prolog, Maude, SQL y Haskell
programación dirigida por eventos (eventos/componentes)
La programación dirigida por eventos es un
paradigma de programación en el que tanto la
estructura como la ejecución de los programas van
determinados por los sucesos que ocurran en el
sistema, definidos por el usuario o que ellos mismos
provoquen
El creador de un programa dirigido por eventos debe definir los eventos
que manejarán su programa y las acciones que se realizarán al
producirse cada uno de ellos, lo que se conoce como el administrador de
evento. Los eventos soportados estarán determinados por el lenguaje de
programación utilizado, por el sistema operativo e incluso por eventos
creados por el mismo programador.
Ejemplos: Visual Basic, Visual C# y C++, JavaScript, ASP
programación orientada a aspectos (POA)
Es un paradigma de programación relativamente
reciente cuya intención es permitir una adecuada
modularización de las aplicaciones y posibilitar una
mejor separación de incumbencias.
Gracias a la POA se pueden encapsular los
diferentes conceptos que componen una aplicación
en entidades bien definidas, eliminando las
dependencias entre cada uno de los módulos
Ejemplos: AspectC++, AspectJ, AspycAOP y Flow3
programación orientada a componentes (Componentes)
Es una rama de la ingeniería del software, con
énfasis en la descomposición de sistemas ya
conformados en componentes funcionales o lógicos
con interfaces bien definidas usadas para la
comunicación entre componentes.
Ejemplos: COM, Enterprice Java Beans
programación orientada a objetos (Clases y Objetos)
Tiene por principio la representación de los objetos de la realidad en un
lenguaje de programación que permita acercarse lo más posible al
pensamiento humano.
La programación orientada a objetos postula la identificación de los
objetos que participan en el problema o situación que se quiere
solucionar a través de un algoritmo.
Realizada la identificación de los objetos, se lleva a cabo una
abstracción de sus características más relevantes, así como de las
principales operaciones que efectúan, posteriormente, se busca asociar
objetos con características y operaciones comunes para llegar a la
definición de una clase.
Ejemplos: Java, Smalltalk, Ruby, Python, ActionScript 3, C++ y C#.
Computación en Nube
La computación en nube es un sistema informático basado
en Internet y centros de datos remotos para gestionar
servicios de información y aplicaciones.
La computación en nube permite que los consumidores y las
empresas gestionen archivos y utilicen aplicaciones sin
necesidad de instalarlas en cualquier computadora con
acceso a Internet.
Esta tecnología ofrece un uso mucho más eficiente de
recursos, como almacenamiento, memoria, procesamiento y
ancho de banda, al proveer solamente los recursos
necesarios en cada momento
Evaluación de algoritmos
La evaluación de algoritmos es un proceso de análisis de
desempeño del tiempo de ejecución que este tarda los
algoritmos en encontrar una solución y la cantidad de
recursos empleados para ello.
Entre las técnicas más confiables se encuentran aquellas
que miden la complejidad de algoritmos a través de
funciones matemáticas
Depuración y Prueba
Es el proceso de identificación y corrección de errores en
algoritmos y de programación.
Para depurar el código fuente, el programador se vale de
herramientas de software que le facilitan la localización y
depuración de errores. Los compiladores son un ejemplo de
estas
Documentación del algoritmo y programa
Es la documentación detallada de los procedimientos, algoritmos y programas que realiza
el desarrollador del software y debe incluir:
1. Nombre del Programa (código). Indicará código que identifica el programa y el título del programa.
2. Descripción. Indicará la función que realiza el programador.
3. Frecuencia de Procesamiento. Diaria, semanal, quincenal, mensual, etcétera.
4. Fecha de Vigencia. Fecha a partir de la cual se comienza a ejecutar en producción la versión modificada o
desarrollada del programa.
5. Archivos de Entrada.
6. Lista de Archivos de Salida: Indicará el nombre y copia y descripción de los archivos.
7. Lista de Informes y/o Totales de Control. Se indicará el nombre de los informes y se incluirá ejemplo de los
informes y/o totales de control producidos por el programa, utilizando los datos de prueba.
8. Datos de Prueba. Se incluirá una copia de los datos usados para prueba.
9. Mensajes al Operador - Pantallas la definición de todos los mensajes al operador por consola y las posibles
contestaciones con una breve explicación de cada una de ellas.
10. Datos de Control para ejecutar el programa (parámetros).
11. Transacciones.
12. Nombre del Programador Deberá indicar el nombre del programador que escribió el algoritmo y programa o que
efectuó el cambio, según sea el caso.
13. Fecha. Indicará fecha en que se escribió el programa o que se efectuó el cambio, según sea el caso.
14. Diccionario de datos. En caso que aplique, se incluirá detalle de las diferentes tablas y códigos usados; con los
valores, explicaciones y su uso en el programa.
15. Lista de Programas. Deberá incluir copia de la última compilación del programa con todas las opciones.
Mantenimiento de algoritmos y programas.
Los usuarios de los programas solicitarán los cambios necesarios al área de sistemas con
el fin de que los programas sigan operando correctamente. Para ello, periódicamente se
le debe dar el mantenimiento que requieren los algoritmos y programas, el cual puede ser
de tres tipos:
Preventivo: Los programas no presentan error alguno, pero hay necesidad de regenerar
los índices de los registros, realizar respaldos, verificar la eficiencia de los algoritmos y
la integridad de los programas, actualizar porcentajes y tablas de datos, etcétera.
Correctivo: Los programas presentan algún error en algún reporte, por lo que es
necesario revisar la codificación para depurarlo y compilarlo. Se debe realizar las
pruebas al sistema, imprimiendo los reportes que genera y verificar si los cálculos que
estos presentan son correctos.
Adaptativo: Los algoritmos y programas no tienen error alguno, pero se requiere alguna
actualización por una nueva versión del programa, una nueva plataforma de sistema
operativo o un nuevo equipo de cómputo con ciertas características, es decir, hay que
adaptar los algoritmos y los programas a la nueva tecnología tanto de software como de
hardware.
Practica 21:
Desarrolla un sistema conversor que:
Mostrará tres opciones: 1 .- Convertir un
numero decimal a binario; 2.- Convertir un
numero Binario a Decimal; 3.- Salir del
Sistema.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main()
{
unsigned long n;
char op;
char menu()
{
char c;
printf("\n");
printf("1 - Decimal -> Binario\n");
printf("2 - Binario -> Decimal\n");
printf("S - Salir\n");
printf("\nSeleccione opcion: ");
c = getche();
return c;
}
unsigned long conversor(unsigned long n1,int
base1,int base2)
{
unsigned long alg,mult=1,n2=0;
while (n1 > 0)
{
alg = n1 % base1;
n1 /= base1;
n2 += (alg*mult);
mult *= base2;
}
return n2;
}
}
for(;;)
{
op = menu();
switch(op)
{
case '1':
printf("\nConversor Decimal -> Binario\n");
printf("Introduza un numero Decimal: ");
scanf("%lu",&n);
printf("Numero Binario correspondente: ");
printf("%lu",conversor(n,2,10));
break;
case '2':
printf("\nConversor Binario -> Decimal\n");
printf("Introduza un numero Binario: ");
scanf("%lu",&n);
printf("Numero Decimal correspondente: ");
printf("%lu",conversor(n,10,2));
break;
case 'S':
case 's':
exit(0);
break;
default:
printf("\nOpcion invalida!\n");
}//switch
getch();
}//for