Universidad Rafael Urdaneta Escuela de Ingeniería de ... · una de las partes sea menor que la del...
Transcript of Universidad Rafael Urdaneta Escuela de Ingeniería de ... · una de las partes sea menor que la del...
Prof. MSc Jaime Soto
Universidad Rafael Urdaneta
Escuela de Ingeniería de Computación
Los programas suelen subdividirse en partes menores(módulos), de modo que la complejidad algorítmica de cadauna de las partes sea menor que la del programa completo, locual ayuda al desarrollo del programa.
Según Niklaus Wirth un programa está formado por algoritmosy estructura de datos.
Se han propuesto diversas técnicas de programación, cuyoobjetivo es mejorar tanto el proceso de creación de softwarecomo su mantenimiento. Entre ellas se pueden mencionar lasprogramaciones lineal, estructurada, modular y orientada aobjetos.
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.
Corrección: un programa es correcto si hace lo que debe hacer. Paradeterminar si un programa hace lo que debe es muy importante especificarclaramente qué debe hacer el programa antes de desarrollarlo y una vezacabado compararlo con lo que realmente hace.
Claridad: es muy importante que el programa sea lo más claro y legibleposible para mejorar el mantenimiento del software. Cuando se acaba deescribir el código del programa, se deben buscar errores y corregirlos. Másconcretamente, cuando el programa está concluido, es necesario hacerleampliaciones o modificaciones, según la demanda de los usuarios, esta laborpuede ser llevada acabo por el mismo programador que implementó elprograma o por otros.
Eficiencia: debe consumir la menor cantidad de recursos posible.Normalmente al hablar de eficiencia se suele hacer referencia al consumo detiempo y/o memoria. La eficiencia y la claridad de un programa pueden serobjetivos contrapuestos: se puede conseguir mayor claridad sacrificandoparte de la eficiencia o viceversa. Pero hay que tener en cuenta que el tiempodel programador es caro, y que hoy en día el precio de los ordenadores esrazonable y cada vez son más baratos.
La palabra Algoritmo: se deriva de la traducción al latín de la palabra Abu
Abdallah Muḥammad ibn Mūsā al-Jwārizmī (Abu Yāffar) ( بن محمد هللا عبد أبو
conocido ,(جعفر ابو الخوارزمي موسى generalmente como al-Juarismi, nombre
de un matemático y astrónomo persa que escribió un tratado sobre
manipulación de números y ecuaciones en el siglo IX .
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 que debe ser finita, no el
número de pasos realizados como la ejecución de ellas.
Un Algoritmo es el medio por el que se explica cómo puede resolverse un
problema, mediante aproximaciones paso a paso. Se puede formular de
muchas formas con el cuidado de que no exista ambigüedad.
Al conjunto formado por la representación de datos utilizada y el algoritmo
mismo se llama Programa.
A través del tiempo se ha evidenciado grandes avances tecnológicos en los
sistemas de cómputo, pero esto no implica que todos los software que se
diseñen se ejecuten eficientemente. Además, de la maquina debemos tener
en cuenta la forma como esta diseñado la estructura de la Aplicación.
Un factor importante que debemos resaltar es la manipulación de un
conjunto de datos, su tamaño y el incremento de este a través del tiempo,
ya que a mayor cantidad de datos tienden a ser mayor el número de
operaciones a realizar para la publicación de la información.
Elaborar un algoritmo eficiente da como resultado un gran aprovechamiento
de los recursos que tenemos disponibles para optimizar los procesos que se
ejecutan en una aplicación. El análisis de algoritmos es una herramienta que
nos permite acercarnos más a este propósito.
¿Porque pasamos por esta fase intermedia? Porque así la persona queresuelve el problema no tiene porque saber nada lenguaje que seutilizará después por hacer la codificación a programa, quizás que nisiquiera sepa cual será este lenguaje.
Los algoritmos deben representar dos cosas: las acciones que hacefalta hacer y los objetos sobre los cuales se hacen estas acciones, esdecir los objetos que el algoritmo manipula. Para hacer esto de unamanera que lo pueda entender cualquier programador se haceutilizando lo que se llama pseudo-código, que no es más que, ennuestro caso, castellano con unas reglas sintácticas concretas pararepresentar las acciones y los objetos.
El científico de computación Donald Knuth ofreció una lista de cinco
propiedades, que son ampliamente aceptadas como requisitos para un
algoritmo:
Carácter finito. "Un algoritmo siempre debe terminar después de un número
finito de pasos".
Precisión. "Cada paso de un algoritmo debe estar precisamente definido; las
operaciones a llevar a cabo deben ser especificadas de manera rigurosa y no
ambigua para cada caso".
Entrada. "Un algoritmo tiene cero o más entradas: cantidades que le son
dadas antes de que el algoritmo comience, o dinámicamente mientras el
algoritmo corre. Estas entradas son tomadas de conjuntos específicos de
objetos".
Salida. "Un algoritmo tiene una o más salidas: cantidades que tienen una
relación específica con las entradas".
Eficacia. "También se espera que un algoritmo sea eficaz, en el sentido de
que todas las operaciones a realizar en un algoritmo deben ser
suficientemente básicas como para que en principio puedan ser hechas de
manera exacta y en un tiempo finito por un hombre usando lápiz y papel".
Análisis del Problema: Tener presente la especificación de los requisitos dados por el
cliente de la empresa o por la persona que encarga el programa.
Diseño: Se diseña una solución que conducirá a un algoritmo que resuelva el problema.
Codificación (Implementación): La solución se escribe en la sintaxis del lenguaje de alto
nivel (C) y se obtiene un programa.
Compilación, ejecución y verificación: El programa se ejecuta, se comprueba
rigurosamente y se eliminan todos los errores que puedan aparecer.
Depuración y mantenimiento: El programa se actualiza y modifica cada vez que sea
necesario, de modo que se cumplan todas las necesidades de cambio de los usuarios.
Documentación: Escritura de las diferentes fases del ciclo de vida del software,
esencialmente el análisis, diseño y codificación, unidos a manuales de usuarios y de
referencia, así como normas para el mantenimiento.
Esta fase requiere una clara definición donde se contempleexactamente lo que debe hacer el programa y el resultado osolución deseada. Dado que se busca una solución se precisanespecificaciones de entrada y salida.
Para poder definir bien un problema es conveniente responder a lassiguientes preguntas:
¿Qué entradas se requieren? (cantidad y tipo)
¿Cuál es la salida deseada? (cantidad y tipo)
¿Qué método produce la salida deseada?
Resolución de un problema
Análisis del problema
Diseño del Algoritmo
Resolución del problema
con Computadora
En la fase de análisis en el proceso de programación se determina que
hace el programa. En la fase de diseño se determina como hace el
programa la tarea solicitada.
Los métodos utilizados para el proceso del diseño se basan en el conocido
divide y vencerás. Es decir la resolución de un problema complejo se
realiza dividiendo el problema en subproblemas y a continuación dividir
estos subproblemas en otros de nivel más bajo, hasta que sea
implementada una solución en la computadora. Este método se conoce
técnicamente como diseño descendente (top-down) o modular.
Cada programa bien diseñado consta de un programa principal (el módulo
de nivel más alto) que llama a subprogramas (módulos) de nivel más bajo,
que a su vez pueden llamar a otros subprogramas.
Los módulos pueden ser planeados, codificados, comprobados ydepurados independientemente y a continuación combinarlos entresí. Este proceso implica la ejecución de estos pasos hasta que elprograma se ha terminado:
Programar un módulo
Comprobar el módulo
Si es necesario, depurar el módulo
Combinar el módulo, con el resto de los otros módulos
El diseño del algoritmo es independiente del lenguaje deprogramación en el que se vaya a codificar posteriormente.
Diseño de un Algoritmo
Diseño Descendente
Refinamiento por pasos
Herramientas de Programación:
1.Diagramas de Flujo2.Pseudocódigo
Las herramientas de programación, son aquellas que permitenrealizar aplicativos, programas, rutinas, utilitarios y sistemaspara que la parte física del computador u ordenador, funcione ypueda producir resultados.
Las herramientas de programación mas utilizadas comúnmentepara diseñar algoritmos son:
Pseudocódigos
Diagramas de flujo
Siendo el pseudocódigo el más popular por su sencillez y suparecido al lenguaje humano.
DIAGRAMAS DE FLUJO
Es una representación gráfica de un algoritmo. Los símbolosutilizados han sido normalizados por el Instituto Norteamericanode Normalización (ANSI).
Terminal Subprograma
Entrada / Salida
Decisión
Proceso ConectoresNo
Si
PSEUDOCÓDIGO
Es una herramienta de programación en la que las instruccionesse escriben en palabras similares al inglés o español, que facilitatanto la escritura como la lectura de programas. El pseudocódigose puede definir como un lenguaje de especificaciones dealgoritmos.
Para implementar un algoritmo en la
computadora, se debe ejecutar los siguientes
pasos:
Codificación
Compilación y ejecución
Verificación
Depuración
Documentación
Conjunto de instrucciones – órdenes dadas a la máquina
– que producirán la ejecución de una determinada tarea.
Es un medio para conseguir un fin. Es la información
necesaria para solucionar un problema.
Fases de un Programa: Definición y análisis del Problema.
Diseño de Algoritmo (pseudocódigo).
Codificación del programa.
Depuración y verificación del programa.
Documentación.
Mantenimiento.
Definición del
Problema
Diseño del
algoritmo
Codificación del
Programa
Depuración y Verificación
D
O
C
U
M
E
N
T
A
CI
Ó
N
MANTENIMIENTO
BLOQUES DE UN
PROGRAMA
ENTRADA PROGRAMA SALIDA
PARTES CONSTITUTIVAS DE UN PROGRAMA
Codificación: Es la escritura en un lenguaje de programación
de la representación de un algoritmo. Dado que el diseño del
algoritmo es independiente del lenguaje de programación
utilizado en su implementación, el código puede ser escrito
con igual facilidad en un lenguaje o en otro.
Compilación y ejecución: Una vez que el algoritmo se ha convertido en un
programa fuente, es preciso introducirlo en memoria mediante el teclado y
almacenarlo posteriormente en un disco. Esta operación se realiza con un
editor de texto, posteriormente el programa fuente se convierte en un
archivo de programa que se guarda en un disco.
El programa fuente debe ser traducido a lenguaje máquina. Este proceso se
realiza con el compilador y el sistema operativo que se encarga
prácticamente de la compilación. Si al compilar el programa fuente se
presentan errores (errores de compilación), es necesario volver a editar el
programa, corregir los errores y compilar de nuevo.
Esto se repite hasta que ya no se presenten mas errores, obteniéndose el
programa objeto, el cual todavía no es ejecutable directamente. Al ya no
existir errores en el programa fuente se debe instruir al sistema operativo para
que efectúe la fase de montaje o enlace, del programa fuente con las librerías
del programa del compilador. Este proceso de montaje produce un programa
ejecutable.
Cuando se ha creado un programa ejecutable este se puede ya ejecutar desde
el sistema operativo con solo teclear su nombre.
Suponiendo que no existen errores durante la ejecución (errores en tiempo de
ejecución), se obtendrá la salida de resultados correctos del programa.
Verificación y depuración: Es el proceso de ejecución del
programa con una amplia variedad de datos de entrada,
llamados datos de test o prueba como son: valores normales
de entrada, valores externos de entrada que comprueben los
límites del programa y valores de entrada que comprueben
aspectos especiales del programa. Estos determinarán si el
programa contiene errores o no.
Al ejecutar un programa se pueden producir tres tipos deerrores:
Errores de Compilación: Se producen normalmente por un usoincorrecto de las reglas del lenguaje de programación, suelen sererrores de sintaxis.
Errores de Ejecución: Se producen por instrucciones que lacomputadora puede comprender pero no ejecutar. En estoscasos se detiene la ejecución del programa y se imprime unmensaje de error. Ejemplo de esto puede ser una división porcero.
VERIFICACIÓN Y DEPURACIÓN DEL ALGORITMO
Errores Lógicos: Se producen en la lógica del programa y la
fuente del error suele ser el diseño del algoritmo, son mas
difíciles de detectar puesto que el programa puede funcionar y
no producir errores de compilación ni de ejecución pero
regresará resultados incorrectos. En este caso se debe regresar a
la fase de diseño, modificar el algoritmo, cambiar el programa
fuente y compilar y depurar una vez mas.
La importancia de la documentación debe ser destacada por suinfluencia en la etapa final, ya que programas pobrementedocumentados son difíciles de leer, mas difíciles de depurar y casiimposibles de mantener y modificar.
Puede ser interna y externa. La documentación interna es lacontenida en líneas de comentarios. La documentación externaincluye análisis, diagramas de flujo y/o pseudocódigos, manuales deusuarios con instrucciones para ejecutar el programa y parainterpretar los resultados.
La documentación es vital cuando se desea corregir posibles
errores futuros o bien cambiar el programa. Estos cambios se
denominan mantenimiento del programa.
Además es de buena costumbre para todo buen programador,
dejar comentado su código, esto es para que el futuro
programador pueda darle mantenimiento fácilmente a el
programa, o incluso, si es el mismo creador quien debe darle
mantenimiento.
Algunas teorías de la programación se centran en las técnicas
de programación modular y programación estructurada. El
diseño de un programa entraña la descomposición del
problema en módulos o partes independientes – programación
modular –, la programación de cada módulo mediante
métodos estructurados – programación estructurada – y su
unión posterior.
Es la base de la construcción de grandes programas.
Una estrategia muy utilizada para la resolución de problemas complejos
con la computadora, es como lo he venido comentando, la división del
problema en otros problemas mas pequeños o subproblemas. Estos
subproblemas se implementan mediante módulos o subprogramas.
Los subprogramas son una herramienta importante para el desarrollo de
algoritmos y programas de modo que normalmente un proyecto de
programación esta compuesto generalmente de un programa principal y
un conjunto de subprogramas con las llamadas a los mismos dentro del
programa principal.
Los subprogramas se clasifican en: procedimientos y funciones.
Se refiere a un conjunto de técnicas que han ido evolucionando.
Estas técnicas aumentan considerablemente la productividad del
programa reduciendo el tiempo requerido para escribir, verificar,
depurar y mantener los programas. La programación estructurada
utiliza un número limitado de estructuras de control que minimizan
la complejidad de los problemas y que reducen los errores.
Ésta incorpora entre otros elementos: el diseño descendente,
recursos abstractos y estructuras básicas.
1. Los programas son más fáciles de entender, ya que pueden ser leídos de
forma secuencial.
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 a la
documentación.
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.
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 muy definida y se
denominan capas
Uno de los métodos fundamentales para resolver un problema es dividirlo en
problemas mas pequeños, llamados subproblemas, en referencias sucesivas.
Estos problemas a su vez pueden ser divididos repetidamente en problemas
mas pequeños hasta que los problemas mas pequeños puedan ser
solucionados.
Esta técnica de dividir el problema principal en subproblemas se denomina
frecuentemente divide y vencerás. El método de diseño se denomina diseño
descendente, debido a que se comienza en la parte superior con un problema
general y se diseñan soluciones especificas a sus subproblemas.
El problema principal se resuelve con el programa principal
(también llamado conductor del programa), y los subproblemas
(módulos) mediante subprogramas: procedimientos y funciones.
Un subprograma realiza una tarea concreta que se describe con
una serie de instrucciones.
Modulo Principal
Módulo (1) Módulo (2) Módulo (3)
Consiste en descomponer una determinada acción compleja en
términos de un número de acciones más simples capaces de
resolverla, ejecutarlas, o que constituyan instrucciones de
computadoras disponibles.
Las estructuras de control de un lenguaje de programación se
refieren al orden en que las instrucciones de un algoritmo se
ejecutarán. El orden de ejecución de las sentencias o instrucciones
determinan el flujo de control.
Estas estructuras de control son por consiguiente fundamentales
en los lenguajes de programación y en los diseños de algoritmos
especialmente los pseudocódigos.
Las tres estructuras de control básico son:
secuencia
selección
repetición
La programación estructurada hace los programas mas fáciles de
escribir, verificar, leer y mantener, utiliza un número limitado de
estructuras de control que minimizan la complejidad de los
problemas.
En mayo de 1996, Bôhm y Jacopin demostraron que un programa
propio puede ser escrito utilizando solamente tres tipos de
estructuras de control: secuenciales, selectivas y repetitivas.
Un programa se define como propio si cumple lo siguiente:
Posee un solo punto de entrada y salida o fin para control del
programa.
Existen caminos desde la entrada hasta la salida que se pueden
seguir y que pasan por todas las partes del programa.
Todas las instrucciones son ejecutadas y no existen lazos o bucles
infinitos.
El programa completo tiene un diseño modular.
Los módulos se diseñan con metodología descendente (método top-
down).
Cada módulo se codifica utilizando las 3 estructuras de control
básicas: secuenciales, selectivas, repetitivas.
Estructuración y modularidad son complementarios mas no iguales.