Este documento será publicado en esta web después de impartir la

Anuncio
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
Descargar