Programación 1 Tema II. Diseño de programas elementales Lección 7. Diseño modular y descendente de programas 1 Objetivos de la lección : • Aprender qué es un diseño modular de un programa • Aprender a diseñar módulos de biblioteca en C++ • Diseñar programas dirigidos por menú aplicando lo aprendido en la asignatura sobre diseño modular y diseño descendente 2 1. Un programa dirigido por menú MENU DE OPERACIONES =================== 0 – Finalizar 1 ‐ Calcular el numero de cifras de un entero 2 ‐ Sumar las cifras de un entero 3 ‐ Extraer una cifra de un entero 4 ‐ Calcular la imagen especular de un entero 5 ‐ Comprobar si un entero es primo Seleccione una operacion [0‐5]: 4 Escriba un numero entero : 8802361 El numero imagen especular del 8802361 es el 1632088 . . . 3 . . . MENU DE OPERACIONES =================== 0 – Finalizar 1 ‐ Calcular el numero de cifras de un entero 2 ‐ Sumar las cifras de un entero 3 ‐ Extraer una cifra de un entero 4 ‐ Calcular la imagen especular de un entero 5 ‐ Comprobar si un entero es primo Seleccione una operacion [0‐5]: 5 Escriba un numero entero : 103 El número 103 es primo . . . 4 . . . MENU DE OPERACIONES =================== 0 – Finalizar 1 ‐ Calcular el numero de cifras de un entero 2 ‐ Sumar las cifras de un entero 3 ‐ Extraer una cifra de un entero 4 ‐ Calcular la imagen especular de un entero 5 ‐ Comprobar si un entero es primo Seleccione una operacion [0‐5]: 7 Operacion desconocida . . . 5 . . . MENU DE OPERACIONES =================== 0 – Finalizar 1 ‐ Calcular el numero de cifras de un entero 2 ‐ Sumar las cifras de un entero 3 ‐ Extraer una cifra de un entero 4 ‐ Calcular la imagen especular de un entero 5 ‐ Comprobar si un entero es primo Seleccione una operacion [0‐5]: 0 La ejecución del programa concluye al seleccionar la operación 0 6 2. Estructura modular del programa Un programa C++ puede constar de varios módulos: • • Módulo principal, y obligatorio, en el que se define, al menos, la función main(). Se almacena en un fichero con sufijo .cc o .cpp Módulos de biblioteca en los que se definen recursos puestos a disposición de otros módulos (tipos de datos, datos constantes y variables, funciones, etc.). La definición de cualquiera de estos módulos consta de dos ficheros que almacenan: • La interfaz del módulo: en él se declaran las especificaciones de los recursos visibles fuera del módulo. La especificación de una función se limita a tres elementos: el tipo del dato devuelto, su nombre y, en su caso, sus parámetros. La interfaz se almacena en un fichero de cabecera, un fichero con sufijo .h • La implementación del módulo: contiene el código de las funciones visibles y, en su caso, elementos auxiliares no visibles u ocultos para los restantes módulos del programa. Se almacena en un fichero con sufijo .cc o .cpp 7 El programa C++ a desarrollar se va a diseñar con una estructura modular aplicando una metodología descendente: • • Módulo principal en el fichero calculadoraEnteros.cc, gestiona la interacción con el operador y presenta un comportamiento iterativo: 1. Plantea el menú de opciones (operaciones disponibles) 2. Lee la opción seleccionada por el operador 3. Si la opción es diferente a 0 procede a ejecutarla y, tras ello, vuelve al punto 1; si la opción es 0 el programa no ejecuta ninguna instrucción adicional y, por lo tanto, termina Módulo de biblioteca calculos en el que se definen siete funciones que podrán ser visibles desde otros módulos. Realizan cálculos con enteros y analizan determinadas propiedades de los enteros: numCifras(n), sumaCifras(n), cifra(n,i), imagen(n), factorial(n), esPrimo(n) y mcd(a,b) Observación: no todas las funciones de este módulo van a ser utilizadas en este programa; la idea es que este módulo pueda ser reutilizado en otros programas que sí puedan hacer uso de ellas. 8 Diseño descendente del programa. Estructura del programa: #include <iostream> #include "calculos.h" // Módulo calculos de biblioteca using namespace std; /* Pre: ‐‐‐ * Post: Presenta el menú de opciones disponibles … */ void presentarMenu () { . . . } /* Pre: ‐‐‐ * Post: Ejecuta las acciones asociadas a la orden … */ void ejecutarOrden (int operacion) { . . . } /* Plantea al operador de forma reiterada un menú con … */ int main () { . . . } 9 Diseño descendente del programa. Primer nivel: /* * Plantea al operador de forma reiterada un menú con … */ int main () { presentarMenu(); int operacion; cout << "Seleccione una operacion [0‐5]: " << flush; cin >> operacion; // lectura de la primera operación while (operación != 0) { ejecutarOrden(operacion); presentarMenu(); cout << endl << "Seleccione una operacion [0‐5]: " << flush; cin >> operacion; // lectura de una nueva operación } } 10 Diseño descendente del programa. Segundo nivel: /* * Pre: ‐‐‐ * Post: Presenta el menú de opciones disponibles */ void presentarMenu () { cout << endl; cout << "MENU DE OPERACIONES" << endl; cout << "===================" << endl; cout << "0 ‐ Finalizar" << endl; cout << "1 ‐ Calcular el numero de cifras de un entero" << endl; cout << "2 ‐ Sumar las cifras de un entero" << endl; cout << "3 ‐ Extraer una cifra de un entero" << endl; cout << "4 ‐ Calcular la imagen especular de un entero" << endl; cout << "5 ‐ Comprobar si un entero es primo" << endl << endl; } 11 Diseño descendente del programa. Segundo nivel: /* * Pre: ‐‐‐ * Post: Ejecuta las acciones asociadas a la orden cuyo código es * [operacion] */ void ejecutarOrden (int operacion) { if (operación == 1) { // Ejecuta la 1ª operación (sumar cifras) int numero; cout << "Escriba un numero entero : " << flush; cin >> numero; cout << "El numero " << numero << " tiene " << numCifras(numero) << " cifras" << endl; } else if (operación == 2) { … } . . . else if (operación == 5) { … } else { … } } 12 Diseño descendente del programa. Tercer nivel: A este nivel están las funciones visibles del módulo de biblioteca calculos: /* Fichero calculos.h de interfaz del módulo calculos */ /* * Pre: ‐‐‐ * Post: Devuelve el número de cifras de [n] cuando este número se * escribe en base 10 */ int numCifras (int n); /* * Pre: ‐‐‐ * Post: Devuelve la suma de las cifras de [n] cuando éste se * escribe en base 10 */ int sumaCifras (int n); . . . 13 Diseño descendente del programa. Tercer nivel: A este nivel están las funciones visibles del módulo de biblioteca calculos: /* Fichero calculos.cc de implementación del módulo calculos */ /* * Pre: ‐‐‐ * Post: Devuelve el número de cifras de [n] cuando este número se * escribe en base 10 */ int numCifras (int n) { int cuenta = 1; // número de cifras identificadas n = n / 10; // elimina la cifra menos significativa while (n != 0) { cuenta = cuenta + 1; // número de cifras identificadas n = n / 10; // elimina la cifra menos significativa } return cuenta; } . . . 14 15