DISEÑO DESCENDENTE: SUBPROGRAMAS

Documentos relacionados
Procedimientos y funciones

Tema 5: Subprogramas Estructura y Contenidos

Programación MODULAR: Subalgoritmos - funciones y procedimientos

Fundamentos de programación

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 1. Problemas de tratamiento de información, algoritmos y programas

Programación 1 Tema 4. Diseño de programas elementales

ELEMENTOS DE PROGRAMACIÓN

Modularización. Bibliografía

INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS

Programación 1 Tema 5. Instrucciones simples y estructuradas

TEMA 5: Subprogramas, programación modular

Programación 1 Tema 5. Instrucciones simples y estructuradas

Programación 1. Tema II. Diseño de los primeros programas. Lección 4. Diseño de algunos programas elementales

Primer Cuatrimestre 2018 Resolución de Problemas y Algoritmos

Clases y Objetos en C++

UNIDAD 3 Modularidad

FUNCIONES. Identificador valido. Tipo-Funcion Identificador_de_la_funcion (Tipo par1,tipo par2 )

Programación 1 Tema 7. Desarrollo modular y descendente de programas

Funciones Propias con C++ (funciones definidas por el usuario)

Tema 2. Diseño Modular.

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 1

Programación Orientada a Objetos en C++

Unidad IV. Este tipo de codificación nos es permitido gracias a la sobrecarga, la cual se aplica a métodos y constructores.

Tema: Plantillas en C++.

Tema: Funciones Virtuales y Polimorfismo.

Tema: Funciones Virtuales y Polimorfismo.

Programación de Ordenadores

Programación Orientada o Objetos

Programación Unidad 4. Modularidad. Programación TIG - TUP. Sede Regional Orán UNIVERSIDAD NACIONAL DE SALTA

Programación Avanzada CONCEPTOS BÁSICOS DE IMPLEMENTACIÓN EN C++

Índice general Justificación

Tema 1. Programación modular. Programación Avanzada Ingeniería Técnica en Informática de Gestión Jorge Badenas

Tema: Sobrecarga de Operadores Unarios. Sobrecarga de Funciones.

SUBPROGRAMAS. Los subprogramas pueden ser invocados varias veces desde diferentes partes del programa.

GESTIÓN DE MEMORIA DINÁMICA

Algoritmos y Estructuras de Datos Ingeniería en Informática, Curso 2º SEMINARIO DE C++ Sesión 2

CONTENIDO DE LA LECCIÓN 15

Programación 1. Tema II. Diseño de programas elementales. Lección 7. Diseño modular y descendente de programas

ALMACENAMIENTO PERSISTENTE DE DATOS

Laboratorio de Informática GRADO EN FÍSICA

Programación Estructurada. Complementos de Informática Tema 2: Programación Estructurada y Programación Modular. Números Amigos

U.A.B.C. Facultad de Ingeniería Programación Estructurada UNIDAD III

Funciones: Pasos por Referencia Recursividad

1. Corrección de un programa TEMA 2: ESPECIFICACIÓN Y CORRECCIÓN DE ALGORITMOS. 1. Corrección de un programa. 1. Corrección de un programa

LABORATORIO #1 INTRODUCCIÓN AL LENGUAJE DE PROGRAMACIÓN C++

Laboratorio 4 Tema 6. Procedimientos: Acciones, Funciones y Pase de Parámetros

Examen escrito de Programación 1

Programación Modular. Programación digital I Escuela de Sistemas Facultad de Ingeniería Gilberto Diaz

Introducción a c++ Introducción a la programación EIS Informática III

Programación y Algoritmia

Unidad IV: Funciones

Una función es un miniprograma dentro de un programa. Las funciones contienen varias

2.2 Nombres, Ligado y Ámbito

7.3. Estructura de un programa

Programación orientada a objetos I

Funciones como Subprogramas en C++

Declaración. Introducción. Definición o implementación. Llamada. Un programa en C consta de una o más funciones.

Fundamentos de la programación

Lenguaje C, tercer bloque: Funciones

UTN FRBA Algoritmos y Estructura de Datos Examen Final 13/02/2015. Apellido y nombre: Legajo: Cursó con Prof:

Tema 2: Programación basada en Objetos

Examen escrito de Programación 1

Introducción a los Computadores ITTELSI. Curso

Programación orientada a objetos II

Principios de Computadoras II

Fundamentos de la programación

CONTENIDO DE LA LECCIÓN 14

ANEXO XVII DE LA RESOLUCION N

El lenguaje C++ A partir del lenguaje C Entorno de programación Visual C++

Capitulo 2. Programación Modular

Tema: Repaso sobre uso de Funciones, Arreglos y Punteros en C++.

Programación I Teoría II.

Funciones Definición de función

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.

Clases, Objetos y Métodos (I)

Los constructores son funciones miembro especiales que sirven para inicializar un objeto de una determinada clase al mismo tiempo que se declara.

Contenido. Prefacio Orígenes de la programación orientada a objetos... 1

1 Introducción a los algoritmos y a la programación de computadoras... 1

Introducción a la Programación en C Funciones

Programación 1. Tema I. Conceptos y elementos básicos de Programación. Lección 2. Lenguaje de programación y ejecución de un programa

CAPITULO 6: FUNCIONES

Programación 1 Problemas del Composición condicional

COMPUTACIÓN I TEMA 5. Subprogramas o funciones. Alcance de variables. Pasaje de parámetros por valor. Prof. Mireya Morales

1. Sobrecarga de operadores. 2. Métodos operadores unarios Operador de incremento (prefijo)

Modularización en lenguaje C. Funciones

Introducción a C++ Índice

Fundamentos de la programación

Abstracción. Encapsulamiento. Polimorfismo. Objeto. método / objeto / clase / módulo. Separación de las propiedades de un

Introducción a la Programación Métodos

Definición y Conversión de datos. Agustín J. González ELO-329

Subrutinas o Funciones

Subprogramas en Fortran 90. Seminario de Computación 2009

SUBPROGRAMAS FUNCIONES

Programación 1 Problemas 3. Composición condicional

Transcripción:

UNIVERSIDAD DE MÁLAGA Dpto. Lenguajes y CC. Computación E.T.S.I. Telecomunicación DISEÑO DESCENDENTE: SUBPROGRAMAS Tema 3 Programación I Programación I 0 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 1 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DISEÑO DESCENDENTE: ABSTRACCIÓN La ABSTRACCIÓN es la herramienta mental que nos permite analizar, comprender y construir sistemas complejos. Identificamos y denominamos conceptos abstractos con significado. Aplicamos Refinamientos Sucesivos. Programación I 2 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DISEÑO DESCENDENTE: ABSTRACCIÓN La ABSTRACCIÓN es la herramienta mental que nos permite analizar, comprender y construir sistemas complejos. Identificamos y denominamos conceptos abstractos con significado. Aplicamos Refinamientos Sucesivos. COCHE CARROCERIA BASTIDOR ASIENTOS MOTOR PANEL DE CONTROL Programación I 3 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DISEÑO DESCENDENTE: ABSTRACCIÓN Y REFINAMIENTOS Divide un PROBLEMA en SUBPROBLEMAS Asocia a cada subproblema un SUBPROGRAMA Utilizamos ABSTRACCIÓN: NO importa como se resuelve un subproblema Nos centramos en la FUNCIONALIDAD del subprograma Que subproblema resuelve, que datos necesita, que datos produce Bajo que condiciones se debe ejecutar Aplicamos REFINAMIENTOS SUCESIVOS Objetivo: división en SUBPROGRAMAS INDEPENDIENTES Funcionalidad clara y bien definida Aislados: minimizar las dependencias con otros subprogramas Transferencia de información simple y bien definida Programación I 4 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DISEÑO DESCENDENTE: INTERFAZ (interface) Genéricamente define la interacción entre dos entidades. La forma en que se comunican y cooperan dos subprogramas. Define la transferencia de información entre subprogramas. Debemos considerar: Que información necesita para resolver el problema Que información produce como resultado de la solución del problema Bajo que condiciones se realiza el intercambio de información Cuanto más simple sea el interfaz: El subprograma estará más aislado del entorno El subprograma será más fácil de utilizar Menos errores se producirán en su utilización Programación I 5 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DISEÑO DESCENDENTE: VENTAJAS Los subprogramas encapsulan y aislan las diferentes tareas que componen un programa. Simplificación en el diseño y solución del programa. Si el método para solucionar una tarea debe cambiar, el aislamiento evita que dicho cambio influya en las otras tareas. Permite que el programador esté concentrado en la solución individual del subproblema concreto. Simplifica la comprensión y legibilidad del programa. Facilita la detección y corrección de errores (depuración). Posibilidad de reutilización del subprograma en otro contexto. Programación I 6 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DISEÑO DESCENDENTE: DIVISIÓN MODULAR CALCULAR MEDIA 3, 11, 13 3, 11, 13 9 PRINCIPAL MONOLÍTICO SUMAR MEDIA DIVIDIR Programación I 7 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DISEÑO DESCENDENTE: DIVISIÓN MODULAR CALCULAR MEDIA 3, 11, 13 3, 11, 13 Entrada Salida Consola 9 PRINCIPAL 3, 11, 13 3, 11 9 Interfaz Transferencia Datos 14 27, 3 Interfaz 14, 13 9 SUMAR 27 MEDIA Interfaz DIVIDIR Programación I 8 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DISEÑO DESCENDENTE: DIVISIÓN MODULAR CALCULAR MEDIA 3, 11, 13 3, 11, 13 Entrada Salida Consola 9 PRINCIPAL 3, 11, 13 9 Interfaz Transferencia Datos ERROR 3, 11 14 27, 3 LENTO Interfaz 14, 13 9 SUMAR 27 MEDIA Interfaz DIVIDIR Programación I 9 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 10 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

SUBPROGRAMAS Definición de subprogramas: La cabecera de un subprograma especifica el tipo del valor devuelto (o void), el nombre del subprograma y los parámetros formales. El cuerpo del subprograma especifica la secuencia de acciones que resuelven un subproblema. Define sus propias variables locales de trabajo. Donde sea necesaria la resolución de dicho subproblema, se realizará una invocación (llamada) al subprograma, especificando el nombre del subprograma y los parámetros actuales. La transferencia de información en la invocación se realiza a través de los parámetros: Parámetros Formales: aparecen en la definición del subprograma. Parámetros Actuales: aparecen en la invocación al subprograma. La definición de un subprograma debe aparecer antes de su invocación. Los subprogramas proporcionan abstracción de procesamiento y de operaciones: Funciones: calculan un único valor a partir de la información de entrada. Procedimientos: procesamiento general de información. // Definición de Función // Parámetros formales int menor (int x, int y) int z = x; // Vble Local if (y < z) z = y; return z; // Única,Última // Def. de Procedimiento // Parámetros formales void ordenar (int& x, int& y) if (x > y) int z = x; // V. Local x = y; y = z; // -- Principal -------- int main () int a, b; // Vbles Locales cin >> a >> b; int c = menor(a, b); // Invocación ordenar(a, b); // Par. actuales bool ok = (c == a); Programación I 11 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DEFINICIÓN DE SUBPROGRAMAS Definición de Funciones: calculan un único valor a partir de la información de entrada. La cabecera de una función especifica el tipo del valor devuelto, el nombre del subprograma y los parámetros formales. El cuerpo de una función sólo debe tener una única sentencia return, y será la última sentencia del cuerpo de la función. El valor resultado de la función es el resultado de evaluar la expresión de la sentencia return. No está permitida cualquier otra utilización de la sentencia return. Definición de Procedimientos: procesamiento general de información. La cabecera de un procedimiento especifica que no devuelve ningún valor (void), el nombre del subprograma y los parámetros formales. El cuerpo de un procedimiento no debe tener ninguna sentencia return. Procesa información que se transfiere a través de los parámetros. // Definición de Función // Parámetros formales int menor (int x, int y) int z = x; // Vble Local if (y < z) z = y; return z; // Única,Última // Def. de Procedimiento // Parámetros formales void ordenar (int& x, int& y) if (x > y) int z = x; // V. Local x = y; y = z; // -- Principal -------- int main () int a, b; // Vbles Locales cin >> a >> b; int c = menor(a, b); // Invocación ordenar(a, b); // Par. actuales bool ok = (c == a); Programación I 12 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 13 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

PARÁMETROS (ARGUMENTOS) Todo el intercambio/transferencia de información con un subprograma se realiza a través de los parámetros (argumentos) El flujo de información posee una determinada direccionalidad: ( ) Entrada ( ) Salida ( ) Entrada/Salida Los parámetros poseen: TIPO que define el intercambio de información NOMBRE con el que referenciarlos Parám. Formales: aparecen en la definición del subprograma Parám. Actuales: aparecen en la invocación al subprograma Programación I 14 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

PASO DE PARÁMETROS POR VALOR Y POR REFERENCIA Es la forma práctica en que se implementa la transferencia de información del interfaz. Parámetros de Entrada de Tipos Simples: en el paso por valor (int x) se almacena en el parámetro formal una copia del valor del parámetro actual, manteniendose ambos como objetos distintos. Parámetros de Salida y Entrada/Salida: en el paso por referencia (int& x) el parámetro formal se vincula a la variable situada como parámetro actual, referenciando ambos al mismo objeto. Parámetros de Entrada de Tipos Compuestos: en el paso por referencia constante (const Persona& x) el parámetro formal constante se vincula al valor del parámetro actual, referenciandolo de forma constante y permitiendo acceder a dicho valor. ( ) Entrada ( ) Salida, ( ) E/S Simples P.Valor (int x) P.Ref (int& x) Tipos Compuestos P.Ref.Cte (const Persona& x) P.Ref (Persona& x) Programación I 15 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 16 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

UTILIZACIÓN DE SUBPROGRAMAS: INVOCACIÓN La invocación (llamada) se realiza mediante el nombre seguido por los parámetros actuales. La invocación a una función no puede constituir por sí sola una sentencia, sino que debe aparecer dentro de alguna estructura que utilice el valor resultado de la función. La invocación a un procedimiento constituye por sí sola una sentencia que puede ser utilizada como tal en el cuerpo de subprogramas y del programa principal. Un subprograma puede invocar a otros subprogramas (definidos previamente) // Definición de Función // Parámetros formales int menor (int x, int y) int z = x; // Vble Local if (y < z) z = y; return z; // Única,Última // Def. de Procedimiento // Parámetros formales void ordenar (int& x, int& y) if (x > y) int z = x; // V. Local x = y; y = z; // -- Principal -------- int main () int a, b; // Vbles Locales cin >> a >> b; int c = menor(a, b); // Invocación ordenar(a, b); // Par. actuales bool ok = (c == a); Programación I 17 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

UTILIZACIÓN DE SUBPROGRAMAS. PARÁMETROS El número de parámetros actuales debe coincidir con el número de parámetros formales. Correspondencia posicional entre parámetros actuales y formales. El tipo del parámetro actual debe coincidir con el tipo del correspondiente parámetro formal. Un parámetro formal de salida o entrada/salida (paso por referencia) requiere que el parámetro actual sea una variable. Un parámetro formal de entrada (paso por valor o referencia constante) requiere que el parámetro actual sea una variable, constante o expresión. Tipos Simples Tipos Compuestos ( ) Ent ( ) Sal ( ) E/S ( ) Ent ( ) Sal ( ) E/S Parámetro Formal P.Valor P.Referencia P.Ref.Constante P.Referencia (int x) (int& x) (const Persona& x) (Persona& x) Constante Constante Parámetro Actual Variable Variable Variable Variable Expresión Expresión Programación I 18 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

UTILIZACIÓN DE SUBPROGRAMAS Cuando se produce una invocación a un subprograma: 1. Se establecen las vias de comunicación entre los algoritmos llamante y llamado. Copia de valores en el paso por valor. Vinculación de variables en el paso por referencia. 2. El flujo de control pasa a ejecutar la primera instrucción del cuerpo del subprograma llamado, ejecutándose éste. 3. Las variable locales se crearán a medida que se ejecuten sus definiciones. 4. Cuando finaliza la ejecución del subprograma, los parámetros y variables locales previamente creadas se destruyen y el flujo de control continúa por la siguiente instrucción a la invocación realizada. int menor (int x, int y) int z = x; if (y < z) z = y; return z; void ordenar (int& x, int& y) if (x > y) int z = x; x = y; y = z; // -- Principal -------- int main () int a, b; cin >> a >> b; int c = menor(a, b); ordenar(a, b); bool ok = (c == a); Programación I 19 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

#include <iostream> #include <string> using namespace std; // -- Constantes ------- const double PI = 3.1416; const int PI_GRAD = 180; const int MIN_GRAD = 60; const int SEG_MIN = 60; const int SEG_GRAD = SEG_MIN * MIN_GRAD; // -- Subalgoritmos ---- void leer_grados (int& grad, int& min, int& seg) cout << "Grados, minutos y segundos "; cin >> grad >> min >> seg; //--------------------------- void escribir_radianes (double rad) cout << "Radianes: " << rad << endl; //--------------------------- double calc_rad (double grad_tot) return (grad_tot * PI) / double(pi_grad); // -- Subalgoritmos ---- double calc_gr_tot (int grad, int min, int seg) return double(grad) + (double(min) / double(min_grad)) + (double(seg) / double(seg_grad)); //--------------------------- double trans_gr_rad (int grad, int min, int seg) double gr_tot = calc_gr_tot(grad, min, seg); return calc_rad(gr_tot); // -- Principal -------- int main () int grad, min, seg; leer_grados(grad, min, seg); double rad = trans_gr_rad(grad, min, seg); escribir_radianes(rad); Programación I 20 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 21 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

SOBRECARGA DE SUBPROGRAMAS Y OPERADORES Se denomina sobrecarga cuando distintos subprogramas se denominan con el mismo identificador u operador En C++ es posible sobrecargar subprogramas y operadores siempre y cuando tengan parámetros diferentes Con propósitos de eficiencia, cuando un subprograma se reduce a una simple expresión, es posible definirlo inline inline double media (int x, int y, int z) return double(x + y + z) / 3.0; inline double media (int x, int y) return double(x + y) / 2.0; Programación I 22 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 23 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

PRECONDICIONES Y POSTCONDICIONES Precondición es un enunciado que debe ser cierto antes de la invocación a un subprograma. Especifica las condiciones bajo las cuales se ejecutará dicho subprograma. Postcondición es un enunciado que debe ser cierto tras la ejecución de un subprograma. Especifica el comportamiento de dicho subprograma. Codificar las pre/post-condiciones mediante asertos proporciona una valiosa documentación, y tiene varias ventajas: Hace al programador expĺıcitamente consciente de los prerequisitos y del objetivo del subprograma. Durante la depuración, las precondiciones comprueban que la invocación al subprograma se realiza bajo condiciones válidas. Durante la depuración, las postcondiciones comprueban que el comportamiento del subprograma es adecuado. A veces no es posible codificarlas adecuadamente. Ayudan en la detección de errores de programación. Programación I 24 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

PRECONDICIONES Y POSTCONDICIONES. EJEMPLO #include <iostream> #include <string> #include <cassert> using namespace std; //--------------------------- // Desactivar asertos: g++ -DNDEBUG -ansi -Wall -Wextra -Werror -o programa programa.cpp //--------------------------- bool es_par (int num) return num % 2 == 0; //--------------------------- void dividir_par (int dividendo, int divisor, int& cociente, int& resto) assert(es_par(dividendo) && (divisor > 0)); // PRECOND cociente = dividendo / divisor; resto = dividendo % divisor; assert(dividendo == (divisor * cociente + resto)); // POSTCOND Programación I 25 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 26 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

CRITERIOS DE MODULARIZACIÓN No existen métodos objetivos para determinar cómo descomponer un problema en subprogramas, es una labor subjetiva. No obstante, se siguen algunos criterios que pueden guiarnos para descomponer un problema y modularizar adecuadamente. Acoplamiento Cohesión Programación I 27 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

ACOPLAMIENTO Un objetivo en el diseño descendente es crear subprogramas aislados e independientes. Debe haber alguna conexión entre los subprogramas para formar un sistema coherente. Dicha conexión se conoce como acoplamiento. Maximizar la independencia será minimizar el acoplamiento. Programación I 28 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

COHESIÓN Hace referencia al grado de relación entre las diferentes partes internas a un subprograma. Si la cohesión es muy débil, la diversidad entre las distintas tareas realizadas dentro de un subprograma es tal que posteriores modificaciones podrían resultar complicadas. Se busca maximizar la cohesión dentro de cada subprograma. Programación I 29 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

CRITERIOS DE MODULARIZACIÓN El diseñador de software debe buscar un bajo acoplamiento entre subprogramas y una alta cohesión dentro de cada uno. Si no es posible analizar y comprender un subprograma de forma aislada e independiente del resto, entonces podemos deducir que la división modular no es la más adecuada Programación I 30 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 31 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

REGLAS DE ÁMBITO 1. Un identificador es visible y accesible en la zona comprendida entre el lugar en que se declara y el final del bloque o cuerpo del subprograma donde ha sido declarado. A esta zona se le denomina ámbito de visibilidad del identificador. 2. En el caso de una variable, el ámbito de visibilidad coincide con su Tiempo de Vida durante la ejecución del programa. La variable se crea cuando la ejecución entra en el ámbito de visibilidad, y se destruye cuando la ejecución sale del mismo. 3. Si dentro del ámbito de un determinado identificador, éste mismo aparece declarado en un nivel de anidamiento (bloque) más interno, entonces dentro del ámbito de esta segunda declaración, la declaración más externa quedará ocultada (y por lo tanto no accesible). 4. Si la variable de control del bucle for se declara en la zona de inicialización del mismo, entonces su ámbito de visibilidad se extiende hasta el final del cuerpo del bucle. Programación I 32 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

#include <iostream> #include <string> using namespace std; // -- Constantes ------- const int MAX = 30; // -- Subalgoritmos ---- void Sub1 (int m, int& i ) int x, z ; x = m + MAX; for (int i = 0; i < MAX; ++i) int z ; z = x + m; void Sub2 (int z ) int x ; Sub1(3, x); //... // -- Principal -------- int main () int i, j ; //... Programación I 33 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

#include <iostream> #include <string> using namespace std; // -- Constantes ------- const int MAX = 30; // -- Subalgoritmos ---- void Sub1 (int m, int& i ) int x, z ; x = m + MAX; for (int i = 0; i < MAX; ++i) int z ; z = x + m; void Sub2 (int z ) int x ; Sub1(3, x); //... // -- Principal -------- int main () int i, j ; //... z i Programación I 34 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DECLARACIÓN DE SUBPROGRAMAS: PROTOTIPOS Prototipo: es posible declarar un determinado subprograma sin necesidad de definirlo expĺıcitamente. Define la cabecera del subprograma, sin necesidad de definir su cuerpo (punto y coma). Permite invocar a un determinado subprograma desde cualquier punto dentro del ámbito de visibilidad de dicho prototipo, sin necesidad de que el subprograma haya sido definido previamente. El subprograma deberá ser definido en algún otro lugar del programa. // -- Prototipos ---- void Sub2 (int z); // Prototipo de Sub2 // -- Subalgoritmos ---- void Sub1 (int m, int& i) Sub2(m + 3); // Invocación a Sub2 // Definición de Sub2 void Sub2 (int z) //... Programación I 35 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 36 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

DECLARACIONES LOCALES Y GLOBALES Variables locales son aquellas cuyo ámbito de visibilidad se restringe exclusivamente al cuerpo del algoritmo en el que han sido declaradas. Variables globales son aquellas cuyo ámbito de visibilidad se extiende al cuerpo de varios algoritmos. Se denonima efecto lateral al intercambio de información entre dos algoritmos realizado a través de variables globales (es decir, sin utilizar el interfaz). En nuestra metodología de programación, la utilización de variables globales y efectos laterales esta prohibida. Programación I 37 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

#include <iostream> #include <string> using namespace std; // -- Constantes ------- const int MAX = 30; // VARIABLES GLOBALES (PROHIBIDAS EN LA ASIGNATURA) int vble_global; // -- Subalgoritmos ---- void Sub1 () int vble_local; vble_local = vble_global * MAX; // EFECTO LATERAL (PROHIBIDO EN LA ASIGNATURA) vble_global = vble_local + MAX; // EFECTO LATERAL (PROHIBIDO EN LA ASIGNATURA) // -- Principal -------- int main () int i,j; vble_global = 5; Sub1(); cout << vble_global << endl; Programación I 38 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 39 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Depuración. Corrección de Errores Detección de errores Asertos. Enunciados que deben ser ciertos. La prueba (ejecución) correcta no garantiza la ausencia de errores. La prueba (ejecución) errónea sí garantiza que los errores existen. Pruebas de casos ĺımite y normal. Pruebas de cada camino de ejecución. Verificación formal. Búsqueda de errores Los asertos indican el número de ĺınea donde se detecta el error. Los mensajes de depuración ayudan a encontrar donde se produce el error. Es necesario un análisis del código y su comprensión, así como una explicación lógica del error según el código y el comportamiento del programa. Corrección de errores Corrección sólo cuando se comprende el código y la naturaleza del error. Los cambios aleatorios no corrigen el error, sólo introducen nuevos errores. Programación I 40 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 41 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

ÁREAS DE MEMORIA Áreas de Memoria durante la ejecución de un programa: Memoria global (estática): almacena constantes y datos globales, con un tiempo de vida que coincide con el tiempo de ejecución del programa. Memoria automática (stack pila de ejecución): almacena los parámetros y variables locales que se crean y destruyen durante la invocación a subprogramas. Gestionada automáticamente por el compilador y el flujo de ejecución del programa. Memoria dinámica (heap montículo): almacena datos cuyo tiempo de vida está gestionado dinámicamente por el programador, y cuyo acceso se realiza a través de punteros. Programación I 42 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

MEMORIA AUTOMÁTICA: La Pila de Ejecución EJEMPLO: IB CIMA Direcciones Relativas Direcciones Absolutas void P2 (int r, int& s) int x, y; x = 5; y = 6; void P1 (int m, int n) int j, k, z; j = 3; k = 4; z = 6; P2(j, z); P2 P1 P1 Variables Parametros Variables Parametros y 6 [IB+2] 42 x 5 [IB+1] 41 IB Anterior [33] 40 Dir Retorno 39 r 3 [IB 1 1] 38 s > [36] [IB 1 2] 37 z 6 [IB+3] 36 k 4 [IB+2] 35 j 3 IB Anterior [??] [IB+1] 34 33 Dir Retorno 32 m n 2 1 [IB 1 1] [IB 1 2] 31 30 IB CIMA Direcciones Direcciones Relativas Absolutas 37 z 6 [IB+3] 36 Variables k 4 [IB+2] 35 j 3 [IB+1] 34 IB Anterior [??] 33 Dir Retorno 32 Parametros m 2 [IB 1 1] 31 n 1 [IB 1 2] 30 Programación I 43 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS

Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS 1. Diseño Descendente. Abstracción. Interfaz 2. Subprogramas. Procedimientos y Funciones 3. Paso de Parámetros 4. Invocación a Subprogramas 5. Sobrecarga 6. Precondiciones y Postcondiciones 7. Criterios de Modularización 8. Ámbitos de Visibilidad 9. Declaraciones locales y globales. Efectos laterales 10. Depuración. Corrección de Errores 11. Áreas de Memoria 12. Bibliografía: [DALE89a], [JOYA03] Programación I 44 Tema 3: DISEÑO DESCENDENTE: SUBPROGRAMAS