Bases Metodológicas de la Programación Tema 2 Bases Metodológicas de la Programación
Representación de Algoritmos Diagramas de Flujo Representación gráfica Claros en problemas pequeños y confusos en problemas grandes Pseudocódigo Lenguaje natural restringido Se ajusta a la programación estructurada
Programación estructurada Programa estructurado es el construido a partir de las cinco estructuras básicas de control: Secuencia Selección Simple Selección doble Iteración con condición al principio Iteración con condición al final
Métodos de Descripción de Sintaxis Gráficos de Conway Método de representación gráfico Claro y visual en casos pequeños Notación Backus-Naur Cada descripción es una definición Las definiciones se representan usando caracteres con un significado especial
Gráficos de Conway Realizan la descripción mediante el recorrido de un grafo dirigido Los literales se escriben dentro de un círculo Los objetos definidos aparecen dentro de un rectángulo
Ejemplo: Digito 1 2 3 4 dígito 5 6 7 8 9
Ejemplo: Número sin signo dígito . - + E
Notación Backus-Naur Los símbolos ::= se usan como equivalencia El objeto a definir aparece a la izquierda de ::= y la definición a la derecha Si hay más de una definición de separan con el símbolo | Los literales en letra normal Los términos que se usan para describir entre <> o en itálica Los términos que se repitan (0 o más) se encierran entre llaves {}
Ejemplo: Número sin signo <digito> ::= 0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <digitos> ::= <digito> {<digito>} <exponente> ::= E <digitos> | E + <digitos> | E - <digitos> | <numero> ::= <digitos> | <digitos> <exponente> | <digitos> . <digitos> | <digitos> . <digitos> <exponente>
Métodos de Diseño de Programas Diseño descendente Diseño modular Diseño mixto En cada paso del refinamiento se decide si una acción no elemental: Se refina (diseño descendente) Se “contrata” (diseño modular)
Diseño Descendente Se busca una solución para un procesador de alto nivel Refinamientos sucesivos En cada nivel se van detallando las acciones hasta obtener un algoritmo en términos de acciones elementales Ejemplo: Resolver la ecuación de segundo grado ax2 + bx + c = 0 dados tres números reales como coeficientes
Ejemplo diseño descendente: Nivel 1 inicio leer a, b, c si a ≠ 0 entonces disc ← b2 – 4*a*c si disc > 0 entonces calcular soluciones reales si‗no si disc = 0 entonces calcular solución doble calcular soluciones complejas fin‗si si_no escribir ‘No es de segundo grado’ fin
Ejemplo diseño descendente: Nivel 2 inicio leer a, b, c si a ≠ 0 entonces disc ← b2 – 4*a*c si disc > 0 entonces escribir (-b+ √ disc) / (2*a) escribir (-b - √ disc) / (2*a) si‗no si disc = 0 entonces escribir –b / (2*a) ‘doble’ real ← -b / (2*a) imag ← √ (-disc) / (2*a) escribir real ‘+’ imag ‘i’ escribir real ‘-’ imag ‘i’ fin‗si si_no escribir ‘No es de segundo grado’ fin
Diseño Modular Cada acción no elemental se convierte en un módulo que se traduce en un subprograma Los módulos no se comunican con el exterior Módulos Tarea determinada (acción o calculo no elemental) Análisis, diseño, codificación y pruebas independientes Reutilizables Elevan el nivel del lenguaje Favorecen la fragmentación y distribución de trabajo Pueden definir subtareas (submódulos) Ejemplo: Expresar en binario un número estrictamente positivo
Ejemplo diseño modular decimal_binario maxima_potencia num maxpot
Ejemplo diseño modular. Algoritmo principal inicio leer n si (n > 0) entonces maxima‗potencia (n, maxpot) repetir si n ≥ maxpot entonces escribir 1 n ← n – maxpot si‗no escribir 0 fin‗si maxpot ← maxpot / 2 hasta_que (maxpot = 0) si_no escribir ‘Dato inválido’ fin
Ejemplo diseño modular. Algoritmo para el módulo modulo maxima_potencia (entrada:num, salida:maxpot) inicio maxpot ← 1 mientras (maxpot ≤ num) hacer maxpot ← maxpot * 2 fin_mientras maxpot ← maxpot / 2 fin
Documentación de Programas Documentación Interna Comentarios Identificación (objetivo, e/s, fecha, autor…) Rastros de diseño Verificación Nombres adecuados de elementos (constantes, variables, subprogramas) Documentación Externa Resultados de las fases de Análisis (documento de especificación, pruebas de escritorio) Diseño (diseño modular, algoritmo, trazas) Codificación (pruebas de ejecución)
Depuración y Pruebas de Programas Verificación: demostrar la corrección: “el programa/módulo cumple la especificación” Tiene éxito cuando lo demuestra Se basa en una formulación lógica del programa/módulo Validación: incrementar la fiabilidad del programa/módulo Se basa en pruebas (de escritorio, trazas, en ejecución) Tiene éxito cuando encuentra un error Batería de pruebas “económica”, encuentra el mayor número de errores con el menor número casos Depuración: estudio de las causas y consecuencias del error, localización, reparación (codificación, diseño, análisis) y actualización de la documentación