Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres...
Transcript of Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres...
10/04/2014
1
8
GradoenIngenieríaInformáticaGradoenIngenieríadelSoftware
GradoenIngenieríadeComputadores
LuisHernándezYáñez
FacultaddeInformáticaUniversidadComplutense
Fundamentos de la programación 2013‐2014
Luis Hernández Yáñez
Página 1Fundamentos de la programación: Programación modular
Programas multiarchivo y compilación separada 2
Interfaz frente a implementación 7
Uso de módulos de biblioteca 13
Ejemplo: Gestión de una tabla de datos ordenada I 12
Compilación de programas multiarchivo 22
El preprocesador 24
Cada cosa en su módulo 26
Ejemplo: Gestión de una tabla de datos ordenada II 27
El problema de las inclusiones múltiples 33
Compilación condicional 38
Protección frente a inclusiones múltiples 39
Ejemplo: Gestión de una tabla de datos ordenada III 40
Implementaciones alternativas 48
Espacios de nombres 52
Implementaciones alternativas 61
Calidad y reutilización del software 72
10/04/2014
2
Luis Hernández Yáñez
Página 2Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
ProgramasmultiarchivoElcódigofuentedelprogramasereparteentrevariosarchivos(módulos),cadaunoconlasdeclaracionesylossubprogramasquetienenrelación.
Módulos:archivosdecódigofuentecondeclaracionesysubprogramasdeunaunidadfuncional:unaestructuradedatos,unconjuntodeutilidades,...
Página 3Fundamentos de la programación: Programación modular
const int N = 10;typedef double tArray[N];typedef struct {tArray elem;int cont;
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
int size(tLista);
void sort(tLista&);
ListaLista
bool cargar(tLista&, string);
bool guardar(tLista, string);
bool mezclar(string, string);
int size(string);
bool exportar(string);
ArchivosArchivos
double mean(tLista);
double min(tLista);
double max(tLista);
double desv(tLista);
int minIndex(tLista);
int maxIndex(tLista);
double sum(tLista);
CálculosCálculos
int main() {tLista lista;init(lista);cargar(lista, "bd.txt");sort(lista);double dato;cout << "Dato: ";cin >> dato;insert(lista, dato);cout << min(lista) << endl; cout << max(lista) << endl;cout << sum(lista) << endl;guardar(lista, "bd.txt");
return 0;}
PrincipalPrincipal
EjecutableEjecutable
10/04/2014
3
Luis Hernández Yáñez
CompilaciónseparadaCadamódulosecompilaacódigofuentedeformaindependiente:
Página 4Fundamentos de la programación: Programación modular
const int N = 10;typedef double tArray[N];typedef struct {tArray elem;int cont;
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
int size(tLista);
void sort(tLista&);
ListaLista
bool cargar(tLista&, string);
bool guardar(tLista, string);
bool mezclar(string, string);
int size(string);
bool exportar(string);
...
ArchivosArchivos
double mean(tLista);
double min(tLista);
double max(tLista);
double desv(tLista);
int minIndex(tLista);
int maxIndex(tLista);
double sum(tLista);
...
CálculosCálculos
00101110101011001010010010101001010100101010111110101010001010010101010101001010101010101100101010101010101010101001010101010101000001010101011010100101010101010100001010101111001010101010111100110010101011010101010100100101010011110010101010100101010010101001010100101010100101000010011110100101010110010101010010101001010101010101001010100101010101000010101011100101010010100011101010111010011010101001010101111111010101100110101011100001001010100101010101010110
Lista.objLista.obj
01011001010010010101001010100101010111110101010001010010101010101001010101010101100101010101010101010101001010101010101000001010101011010100101010101010100001010101111001010101010111100110010101011010101010100100101010011110010101010100101010010101001010100101010100101000010011110100101010110010101010010101001010101010101001010100101010101000010101011100101010010100011101010111010011010101001010101111111010101100110101011100001001010100101010101010110001111010
Calculos.objCalculos.obj
11101010110010100100101010010101001010101111101010100010100101010101010010101010101011001010101010101010101010010101010101010000010101010110101001010101010101000010101011110010101010101111001100101010110101010101001001010100111100101010101001010100101010010101001010101001010000100111101001010101100101010100101010010101010101010010101001010101010000101010111001010100101000111010101110100110101010010101011111110101011001101010111000010010101001010101010101101111
Archivos.objArchivos.obj
Luis Hernández Yáñez
CompilaciónseparadaAlcompilarelprogramaprincipal,seadjuntanlosmóduloscompilados:
Página 5Fundamentos de la programación: Programación modular
int main() {tLista lista;init(lista);cargar(lista, "bd.txt");sort(lista);double dato;cout << "Dato: ";cin >> dato;insert(lista, dato);cout << min(lista) << endl; cout << max(lista) << endl;cout << sum(lista) << endl;guardar(lista, "bd.txt");
return 0;}
PrincipalPrincipal
Lista.obj
Calculos.obj
Archivos.obj
iostream.obj
fstream.obj
math.obj
MódulosdelprogramaMódulosdelprograma BibliotecasdelsistemaBibliotecasdelsistema
EjecutableEjecutable
...... ......
10/04/2014
4
Luis Hernández Yáñez
Compilaciónseparada¡Sólolosarchivosdecódigofuentemodificadosnecesitanserrecompilados!
Página 6Fundamentos de la programación: Programación modular
PrincipalPrincipal
Lista.obj
Calculos.obj
Archivos.obj
iostream.obj
fstream.obj
math.obj
EjecutableEjecutable
main.cppLista.cpp
main.obj
COMPILACIÓNCOMPILACIÓN
ENLACEENLACE
...... ......
Luis Hernández Yáñez
Página 7Fundamentos de la programación: Programación modular
10/04/2014
5
Luis Hernández Yáñez
CreacióndemódulosdebibliotecaEnelcódigodeunprogramadeunúnicoarchivotenemos:
Definicionesdeconstantes.
Declaracionesdetiposdedatos.
[Quizás,variablesglobales.Mejorevitartenervariablesglobales.]
Prototiposdelossubprogramas.
Implementacióndelossubprogramas.
Implementacióndelafunciónmain().
Lasconstantes,tipos[,variables]yprototiposdesubprogramasquetienenqueverconalgunaunidadfuncionalindicancómoseusa ésta:interfaz.
Estructuradedatosconlossubprogramasquelagestionan. Conjuntodeutilidades(subprogramas)deusogeneral. Etcétera.
Laimplementacióndelossubprogramaseseso,implementación.
Página 8Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
CreacióndemódulosdebibliotecaInterfaz:Definicionesydeclaracionesdedatosysubprogramas(prototipos).
¡Estodoloqueelusuariodeesaunidadfuncionalnecesitasaber!Implementación:Códigodelossubprogramasquehaceneltrabajo.
Nonecesitaconocerseparautilizarlo:¡Sedaporsentadoqueescorrecto!
Separamoslainterfazylaimplementaciónendosarchivosseparados:
Archivodecabecera:Definicionesydeclaracionesdedatosysubprogramas.
Archivodeimplementación:Implementacióndelossubprogramas.
Archivosdecabecera:extensión.h
Archivosdeimplementación:extensión.cpp
Extraemoslasdefinicionesydeclaracionesdedatosysubprogramasdelaunidadfuncionalylascolocamosenunarchivodecabecera.
Extraemoslasimplementacionesdeesossubprogramasyloscolocamosenelarchivodeimplementacióndeesearchivodecabecera.
Página 9Fundamentos de la programación: Programación modular
Mismonombre(x.h /x.cpp)Mismonombre(x.h /x.cpp)
10/04/2014
6
Luis Hernández Yáñez
CreacióndemódulosdebibliotecaInterfaz frenteaimplementación
Siotromódulo(oelprogramaprincipal)quiereusaralgodeesabiblioteca:Deberáincluirelarchivodecabecera.
Página 10Fundamentos de la programación: Programación modular
const int N = 10;typedef double tArray[N];typedef struct {tArray elem;int cont;
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
int size(tLista);
void sort(tLista&);
Lista.hLista.h
#include "Lista.h"
void init(tLista& lista) {lista.cont = 0;
}
bool insert(tLista& lista, double valor) {if (lista.cont == N)return false;
else {lista.elem[lista.cont] =
valor;lista.cont++;
}}
Lista.cppLista.cpp
#include "Lista.h"...
main.cppmain.cpp
MóduloUnidadBiblioteca
MóduloUnidadBiblioteca
Losnombresdearchivosdecabecerapropios(nodelsistema)seencierranentredoblescomillas,noentreángulos.
Losnombresdearchivosdecabecerapropios(nodelsistema)seencierranentredoblescomillas,noentreángulos.
Luis Hernández Yáñez
CreacióndemódulosdebibliotecaInterfaz
Elarchivodecabecera(.h)tienetodoloquenecesitaconocercualquierotromódulo(oprogramaprincipal)quequierautilizarlosservicios(subprogramas)deesemódulodebiblioteca.
Ladirectiva#include añadelasdeclaracionesdelarchivodecabeceraenelcódigodelmódulo(preprocesamiento):
Estodoloquesenecesitasaberparacomprobarsielcódigodemain.cpphaceunusocorrectodelalista(declaracionesyllamadasafunciones).
Página 11Fundamentos de la programación: Programación modular
const int N = 10;typedef double tArray[N];typedef struct {tArray elem;int cont;
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
int size(tLista);
void sort(tLista&);
Lista.hLista.h
#include "Lista.h"...
main.cppmain.cpp
const int N = 10;typedef double tArray[N];typedef struct {tArray elem;int cont;
} tLista;
void init(tLista&);
bool insert(tLista&, double);
bool delete(tLista&, int);
int size(tLista);
...
main.cppmain.cpp
PreprocesadorPreprocesador
10/04/2014
7
Luis Hernández Yáñez
CreacióndemódulosdebibliotecaImplementación
Compilarelmódulosignificacompilarsuarchivodeimplementación(.cpp).
Tambiénnecesitaconocersuspropiasdeclaraciones:
Cuandosecompilaelmódulosegeneraelcódigoobjeto.
Mientrasnosemodifiqueelcódigofuentenohaynecesidadderecompilarelmódulo.
Códigoqueusaelmódulo:
Necesitasóloelarchivodecabeceraparacompilar.
Seadjuntaelcódigoobjetodelmóduloduranteelenlace.
Página 12Fundamentos de la programación: Programación modular
#include "Lista.h"
void init(tLista& lista) {lista.cont = 0;
}
bool insert(tLista& lista, double valor) {if (lista.cont == N)return false;
else {lista.elem[lista.cont] =
valor;lista.cont++;
}}
Lista.cppLista.cpp
00101110101011001010010010101001010100101010111110101010001010010101010101001010101010101100101010101010101010101001010101010101000001010101011010100101010101010100001010101111001010101010111100110010101011010101010100100101010011110010101010100101010010101001010100101010100101000010011110100101010110010101010010101001010101010101001010100101010101000010101011100101010010100011101010111010011010101001010101111111010101100110101011100001001010100101010101010110
Lista.objLista.obj
#include "Lista.h"...
Lista.cppLista.cpp
Luis Hernández Yáñez
Página 13Fundamentos de la programación: Programación modular
10/04/2014
8
Luis Hernández Yáñez
UsodemódulosdebibliotecaEjemplo:Gestióndeunatabladedatosordenada(Tema7)
Todoloquetengaqueverconlatablaensíestaráensupropiomódulo.
Ahoraelcódigoestarárepartidoentresarchivos:
tabla.h:archivodecabeceradelmódulodetabladedatos
tabla.cpp:archivodeimplementacióndelmódulodetabladedatos
bd.cpp:programaprincipalqueusaelmódulodetabladedatos
Tantotabla.cpp comobd.cpp debenincluiralprincipiotabla.h.
Comoesunmódulopropiodelaaplicación,enladirectiva#includeusamosdoblescomillas:
#include "tabla.h"
Losarchivosdecabeceradelasbibliotecasdelsistemasiempreseencierranentreángulosynotienennecesariamentequellevarextensión.h.
Página 14Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
Módulo:GestióndeunatabladedatosordenadaI#include <string>
using namespace std;
const int N = 100;
typedef struct {
int codigo;
string nombre;
double sueldo;
} tRegistro;
typedef tRegistro tLista[N];
typedef struct {
tLista registros;
int cont;
} tTabla;
const char BD[] = "bd.txt";
...
Página 15Fundamentos de la programación: Programación modular
tabla.htabla.h
Archivo de cabeceraArchivo de cabecera
¡Documentabienelcódigo!¡Documentabienelcódigo!
10/04/2014
9
Luis Hernández Yáñez
void mostrarDato(int pos, tRegistro registro);
void mostrar(const tTabla &tabla);
bool operator>(tRegistro opIzq, tRegistro opDer);
bool operator<(tRegistro opIzq, tRegistro opDer);
tRegistro nuevo();
bool insertar(tTabla &tabla, tRegistro registro);
bool eliminar(tTabla &tabla, int pos); // pos = 1..N
int buscar(tTabla tabla, string nombre);
bool cargar(tTabla &tabla);
void guardar(tTabla tabla);
Cadaprototipoiráconuncomentarioqueexpliquelautilidaddelsubprograma,losdatosdeE/S,particularidades,...(Aquíseomitenporcuestióndeespacio.)
Página 16Fundamentos de la programación: Programación modular
Archivo de cabeceraArchivo de cabeceraLuis Hernández Yáñez
Módulo:GestióndeunatabladedatosordenadaI#include <iostream>#include <string>#include <fstream>using namespace std;#include <iomanip>#include "tabla.h"
tRegistro nuevo() {tRegistro registro;cout << "Introduce el codigo: ";cin >> registro.codigo;cout << "Introduce el nombre: ";cin >> registro.nombre;cout << "Introduce el sueldo: ";cin >> registro.sueldo;return registro;
}
...
Página 17Fundamentos de la programación: Programación modular
tabla.cpptabla.cpp
Archivo de implementaciónArchivo de implementación
10/04/2014
10
Luis Hernández Yáñez
bool insertar(tTabla &tabla, tRegistro registro) {bool ok = true;if (tabla.cont == N)
ok = false; // Tabla llenaelse {int pos = 0;bool enc= false;//búsqueda asimétricawhile ((pos < tabla.cont) && !enc){if(tabla.registros[pos] > registro) enc= true;else pos++;
}
for (int j = tabla.cont; j > pos; j‐‐) // Desplazamos una posición a la derechatabla.registros[j] = tabla.registros[j‐1];
tabla.registros[pos] = registro;tabla.cont++;
}return ok;
}...
Página 18Fundamentos de la programación: Programación modular
Archivo de implementaciónArchivo de implementaciónPedro J. M
artín de la Calle
Pedro J. M
artín de la Calle
Luis Hernández Yáñez
bool eliminar(tTabla &tabla, int pos) { // pos = 1..bool ok = true;if ((pos < 1) || (pos > tabla.cont))
ok = false; // Posición inexistenteelse {
pos‐‐; // Pasamos a índice del arrayfor (int i = pos + 1; i < tabla.cont; i++)
// Desplazamos una posición a la izquierdatabla.registros[i ‐ 1] = tabla.registros[i];
tabla.cont‐‐;}return ok;
}
int buscar(tTabla tabla, string nombre) {// Devuelve ‐1 si no se ha encontrado
int ini = 0, fin = tabla.cont ‐ 1, mitad;bool encontrado = false;while ((ini <= fin) && !encontrado) {
...
Página 19Fundamentos de la programación: Programación modular
Archivo de implementaciónArchivo de implementación
10/04/2014
11
Luis Hernández Yáñez
Módulo:GestióndeunatabladedatosordenadaI#include <iostream>using namespace std;#include "tabla.h"
int menu();
int menu() {cout << endl;cout << "1 ‐ Insertar" << endl;cout << "2 ‐ Eliminar" << endl;cout << "3 ‐ Buscar" << endl;cout << "0 ‐ Salir" << endl;int op;do {
cout << "Elige: ";cin >> op;
} while ((op < 0) || (op > 3));return op;
}...
Página 20Fundamentos de la programación: Programación modular
bd.cppbd.cpp
Programa principalPrograma principalLuis Hernández Yáñez
int main() {tTabla tabla;if (!cargar(tabla))
cout << "Error al abrir el archivo!" << endl;else {
mostrar(tabla);int op;do {
op = menu();if (op == 1) {
tRegistro registro = nuevo();if (!insertar(tabla, registro))
cout << "Error: tabla llena!" << endl;else
mostrar(tabla);}else if (op == 2) {
int pos;cout << "Posicion: ";cin >> pos;if (!eliminar(tabla, pos))
cout << "Error: Posicion inexistente!" << endl;...
Página 21Fundamentos de la programación: Programación modular
Programa principalPrograma principal
10/04/2014
12
Luis Hernández Yáñez
Página 22Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
CompilacióndeprogramasmultiarchivoG++
Siestántodoslosarchivosdecabeceraydeimplementaciónenelmismodirectoriosimplementelistamostodoslos.cppenlaordeng++:D:\FP\Tema9>g++ ‐o bd.exe tabla.cpp bd.cpp
Recuerdaquesólosecompilanlos.cpp.
VisualC++/Studio
Muestralosarchivosdecabeceraydeimplementacióninternamenteorganizadosengruposdistintos:
Página 23Fundamentos de la programación: Programación modular
Alosarchivosdecabeceralosllamadeencabezado.
ConlaopciónGenerar soluciónsecompilantodoslos.cpp.
Alosarchivosdecabeceralosllamadeencabezado.
ConlaopciónGenerar soluciónsecompilantodoslos.cpp.
10/04/2014
13
Luis Hernández Yáñez
Página 24Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
#include <string>using namespace std;
const int N = 100;
typedef struct {int codigo;string nombre;double sueldo;
} tRegistro;
typedef tRegistro tLista[N];
typedef struct {tLista registros;int cont;
} tTabla;
...
ElPreprocesadorDirectivas:#...
Antesderealizarlacompilaciónseponeenmarchaelpreprocesador.
Interpretalasdirectivasygeneraunúnicoarchivotemporalcontodoelcódigodelmódulooprogramaprincipal.Comoenlainclusión(directiva#include):
Página 25Fundamentos de la programación: Programación modular
#include "tabla.h"
int menu();
...
#include <string>using namespace std;
const int N = 100;
typedef struct {int codigo;string nombre;double sueldo;
} tRegistro;
typedef tRegistro tLista[N];
typedef struct {tLista registros;int cont;
} tTabla;
...
int menu();...
10/04/2014
14
Luis Hernández Yáñez
Página 26Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
DistribuirlafuncionalidaddelprogramaenmódulosUnmóduloencapsulaunconjuntodesubprogramasquetienenrelaciónentresí.
Larelaciónpuedevenirdadaporunaestructuradedatossobrelaquetrabajan.Oporsertodossubprogramasdeundeterminadocontextodeaplicación(bibliotecasdefuncionesmatemáticas,defecha,etcétera).
Amenudolasestructurasdedatoscontienenotrasestructuras:const int N = 100;typedef struct {
int codigo;string nombre;double sueldo;
} tRegistro;
typedef tRegistro tLista[N];typedef struct {
tLista registros;int cont;
} tTabla;
Página 27Fundamentos de la programación: Programación modular
Unatablaesunalistaderegistros.
EstructuratRegistro
EstructuratTabla(contienedatosdetipotRegistro)
Lagestióndecadaestructura,ensumódulo.
Unatablaesunalistaderegistros.
EstructuratRegistro
EstructuratTabla(contienedatosdetipotRegistro)
Lagestióndecadaestructura,ensumódulo.
10/04/2014
15
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaII#include <string>using namespace std;
typedef struct {int codigo;string nombre;double sueldo;
} tRegistro;
void mostrarDato(int pos, tRegistro registro);
bool operator>(tRegistro opIzq, tRegistro opDer);
bool operator<(tRegistro opIzq, tRegistro opDer);
tRegistro nuevo();
Página 28Fundamentos de la programación: Programación modular
registro.hregistro.h
Archivo de cabeceraArchivo de cabeceraLuis Hernández Yáñez
GestióndeunatabladedatosordenadaII#include <iostream>#include <string>using namespace std;#include <iomanip>#include "registro.h"
tRegistro nuevo() {tRegistro registro;cout << "Introduce el codigo: ";cin >> registro.codigo;cout << "Introduce el nombre: ";cin >> registro.nombre;cout << "Introduce el sueldo: ";cin >> registro.sueldo;return registro;
}
bool operator>(tRegistro opIzq, tRegistro opDer) {
return opIzq.nombre > opDer.nombre;
}
...
Página 29Fundamentos de la programación: Programación modular
registro.cppregistro.cpp
Archivo de implementaciónArchivo de implementación
10/04/2014
16
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaII#include <string>
using namespace std;
#include "registro.h"
const int N = 100;
typedef tRegistro tLista[N];
typedef struct {
tLista registros;
int cont;
} tTabla;
const char BD[] = "bd.txt";
void mostrar(const tTabla &tabla);
bool insertar(tTabla &tabla, tRegistro registro);
bool eliminar(tTabla &tabla, int pos); // pos = 1..N
int buscar(tTabla tabla, string nombre);
bool cargar(tTabla &tabla);
void guardar(tTabla tabla);
Página 30Fundamentos de la programación: Programación modular
tabla2.htabla2.h
Archivo de cabeceraArchivo de cabeceraLuis Hernández Yáñez
GestióndeunatabladedatosordenadaII#include <iostream>
#include <fstream>
using namespace std;
#include "tabla2.h"
bool insertar(tTabla& tabla, tRegistro registro) {
bool ok = true;
if (tabla.cont == N)
ok = false; // tabla llena
else {int pos = 0;bool enc= false;//búsqueda asimétricawhile ((pos < tabla.cont) && !enc){
if(tabla.registros[pos] > registro) enc= true;else pos++;
}
for (int j = tabla.cont; j > pos; j‐‐) tabla.registros[j] = tabla.registros[j‐1];
tabla.registros[pos] = registro;tabla.cont++;
}return ok;
}
...
Página 31Fundamentos de la programación: Programación modular
tabla2.cpptabla2.cpp
Archivo de implementaciónArchivo de implementación
Pedro J. M
artín de la Calle
Pedro J. M
artín de la Calle
10/04/2014
17
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaII#include <iostream>using namespace std;#include "registro.h"#include "tabla2.h"
int menu();
int menu() {cout << endl;cout << "1 ‐ Insertar" << endl;cout << "2 ‐ Eliminar" << endl;cout << "3 ‐ Buscar" << endl;cout << "0 ‐ Salir" << endl;int op;do {
cout << "Elige: ";cin >> op;
} while ((op < 0) || (op > 3));return op;
}...
Página 32Fundamentos de la programación: Programación modular
bd2.cppbd2.cpp
Nointentescompilaresteejemplo.
Tieneerrores...
Nointentescompilaresteejemplo.
Tieneerrores...
Programa principalPrograma principalLuis Hernández Yáñez
Página 33Fundamentos de la programación: Programación modular
10/04/2014
18
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaII2módulosyelprogramaprincipal:
Página 34Fundamentos de la programación: Programación modular
#include <string>...
registro.hregistro.h
...#include "registro.h"...
registro.cppregistro.cpp
...#include "registro.h"...
tabla2.htabla2.h
...#include "tabla2.h"...
tabla2.cpptabla2.cpp
...#include "registro.h"#include "tabla2.h"...
bd2.cppbd2.cpp
Incluye...Incluye...
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaIIPreprocesamientode#include:#include <iostream>using namespace std;
#include "registro.h"
#include "tabla.h"
int menu();
...
Página 35Fundamentos de la programación: Programación modular
#include <string>using namespace std;#include "registro.h"
const int N = 100;typedef tRegistro tLista[N];typedef struct {
tLista registros;int cont;
} tTabla;...
#include <string>using namespace std;
typedef struct {...
} tRegistro;...
#include <string>using namespace std;
typedef struct {...
} tRegistro;...
10/04/2014
19
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaIIPreprocesamientode#include:#include <iostream>using namespace std;
#include <string>using namespace std;
typedef struct {...
} tRegistro;...
#include "tabla.h"
int menu();
...
Página 36Fundamentos de la programación: Programación modular
#include <string>using namespace std;#include <string>using namespace std;
typedef struct {...
} tRegistro;...
const int N = 100;typedef tRegistro tLista[N];typedef struct {
tLista registros;int cont;
} tTabla;...
SustituidoSustituido
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaIIPreprocesamientode#include:
Página 37Fundamentos de la programación: Programación modular
#include <iostream>using namespace std;
#include <string>using namespace std;
typedef struct {...
} tRegistro;...
#include <string>using namespace std;#include <string>using namespace std;
typedef struct {...
} tRegistro;...
const int N = 100;typedef tRegistro tLista[N];typedef struct {
tLista registros;int cont;
} tTabla;...
int menu();
...
¡Identificadorduplicado!¡Identificadorduplicado!
10/04/2014
20
Luis Hernández Yáñez
CompilacióncondicionalDirectivas#ifdef,#ifndef,#else y#endif.
Seusanenconjunciónconladirectiva#define.
#define X #define X
#ifdef X #ifndef X
... // Código if ... // Código if
[#else [#else
... // Código else ... // Código else
] ]
#endif #endif
Ladirectiva#define,comosunombreindica,defineunsímbolo(identificador).
Enelcasodelaizquierdasecompilaráel"Códigoif"ynoel"Códigoelse",encasodequelohaya.Enelcasodeladerecha,alrevés,onadasinohayelse.
Lascláusulaselsesonopcionales.
Directivasútilesparaconfigurardistintasversiones.
Página 38Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
Protecciónfrenteainclusionesmúltiplestabla.cpp incluyeregistro.h ybd2.cpp tambiénincluyeregistro.h ¡Identificadoresduplicados!
Cadamódulodebeincluirseunaysólounavez.
Protecciónfrenteainclusionesmúltiples:
#ifndef X
#define X
... // Código del módulo
#endif
Laprimeravezqueseencuentraesecódigoelpreprocesador,incluyeelcódigodelmódulopornoestardefinidoelsímboloX,peroalmismotiempodefineesesímbolo.Deestaforma,lasiguientevezqueseencuentreese#ifndef yanovuelveaincluirelcódigodelmódulo,puesyahasidodefinidoelsímboloX.
ParacadamóduloelegimoscomosímboloX elnombredelarchivo,sustituyendoelpuntoporunsubrayado:REGISTRO_H,TABLA_H,...
Página 39Fundamentos de la programación: Programación modular
ElsímboloX debeserúnicoparacadamódulo.ElsímboloX debeserúnicoparacadamódulo.
10/04/2014
21
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaIII#ifndef REGISTROFIN_H
#define REGISTROFIN_H
#include <string>
using namespace std;
typedef struct {
int codigo;
string nombre;
double sueldo;
} tRegistro;
void mostrarDato(int pos, tRegistro registro);
bool operator>(tRegistro opIzq, tRegistro opDer);
bool operator<(tRegistro opIzq, tRegistro opDer);
tRegistro nuevo();
#endif
Página 40Fundamentos de la programación: Programación modular
registrofin.hregistrofin.h
Archivo de cabeceraArchivo de cabeceraLuis Hernández Yáñez
GestióndeunatabladedatosordenadaIII#include <iostream>#include <string>using namespace std;#include <iomanip>#include "registrofin.h"
tRegistro nuevo() {tRegistro registro;cout << "Introduce el codigo: ";cin >> registro.codigo;cout << "Introduce el nombre: ";cin >> registro.nombre;cout << "Introduce el sueldo: ";cin >> registro.sueldo;return registro;
}
bool operator>(tRegistro opIzq, tRegistro opDer) {
return opIzq.nombre > opDer.nombre;
}
...
Página 41Fundamentos de la programación: Programación modular
registrofin.cppregistrofin.cpp
Archivo de implementaciónArchivo de implementación
10/04/2014
22
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaIII#ifndef TABLAFIN_H#define TABLAFIN_H#include <string>using namespace std;#include "registrofin.h"
const int N = 100;typedef tRegistro tLista[N];typedef struct {
tLista registros;int cont;
} tTabla;const char BD[] = "bd.txt";
void mostrar(const tTabla &tabla);bool insertar(tTabla &tabla, tRegistro registro);bool eliminar(tTabla &tabla, int pos); // pos = 1..Nint buscar(tTabla tabla, string nombre);bool cargar(tTabla &tabla);void guardar(tTabla tabla);#endif
Página 42Fundamentos de la programación: Programación modular
tablafin.htablafin.h
Archivo de cabeceraArchivo de cabeceraLuis Hernández Yáñez
GestióndeunatabladedatosordenadaIII#include <iostream>#include <fstream>using namespace std;#include "tablafin.h"
bool insertar(tTabla &tabla, tRegistro registro) {bool ok = true;if (tabla.cont == N)
ok = false; // tabla llenaelse {
int pos = 0;bool enc= false;//búsqueda asimétricawhile ((pos < tabla.cont) && !enc){
if(tabla.registros[pos] > registro) enc= true;else pos++;
}
for (int j = tabla.cont; j > pos; j‐‐) tabla.registros[j] = tabla.registros[j‐1];
tabla.registros[pos] = registro;tabla.cont++;
}return ok;
} ...
Página 43Fundamentos de la programación: Programación modular
tablafin.cpptablafin.cpp
Archivo de implementaciónArchivo de implementación
Pedro J. M
artín de la Calle
Pedro J. M
artín de la Calle
10/04/2014
23
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaIII#include <iostream>using namespace std;#include "registrofin.h"#include "tablafin.h"
int menu();
int menu() {cout << endl;cout << "1 ‐ Insertar" << endl;cout << "2 ‐ Eliminar" << endl;cout << "3 ‐ Buscar" << endl;cout << "0 ‐ Salir" << endl;int op;do {
cout << "Elige: ";cin >> op;
} while ((op < 0) || (op > 3));return op;
}...
Página 44Fundamentos de la programación: Programación modular
bdfin.cppbdfin.cpp
¡Ahorayapuedescompilarlo!¡Ahorayapuedescompilarlo!
Programa principalPrograma principalLuis Hernández Yáñez
GestióndeunatabladedatosordenadaIIIPreprocesamientode#include enbdfin.cpp:#include <iostream>using namespace std;
#include "registrofin.h"
#include "tablafin.h"
int menu();
...
Página 45Fundamentos de la programación: Programación modular
#ifndef REGISTROFIN_H
#define REGISTROFIN_H
#include <string>using namespace std;
typedef struct {...
} tRegistro;...
REGISTROFIN_HnosehadefinidotodavíaREGISTROFIN_Hnosehadefinidotodavía
10/04/2014
24
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaIIIPreprocesamientode#include enbdfin.cpp:#include <iostream>using namespace std;
#define REGISTROFIN_H#include <string>using namespace std;
typedef struct {...
} tRegistro;...
#include "tablafin.h"
int menu();
...
Página 46Fundamentos de la programación: Programación modular
#ifndef TABLAFIN_H#define TABLAFIN_H#include <string>using namespace std;#include "registrofin.h"
const int N = 100;typedef tRegistro tLista[N];typedef struct {
tLista registros;int cont;
} tTabla;...
TABLAFIN_HnosehadefinidotodavíaTABLAFIN_Hnosehadefinidotodavía
Luis Hernández Yáñez
GestióndeunatabladedatosordenadaIIIPreprocesamientode#include enbdfin.cpp:#include <iostream>using namespace std;
#define REGISTROFIN_H#include <string>using namespace std;
typedef struct {...
} tRegistro;...
#define TABLAFIN_H#include <string>using namespace std;#include "registrofin.h"
...
int menu();
...
Página 47Fundamentos de la programación: Programación modular
#ifndef REGISTROFIN_H
#define REGISTROFIN_H
#include <string>using namespace std;
typedef struct {...
} tRegistro;... ¡REGISTROFIN_H
yasehadefinido!¡REGISTROFIN_Hyasehadefinido!
10/04/2014
25
Luis Hernández Yáñez
Página 48Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
Mismainterfaz,implementaciónalternativa
Página 49Fundamentos de la programación: Programación modular
#include <string>using namespace std;#include "registrofin.h"
const int N = 100;typedef tRegistro tLista[N];typedef struct {
tLista registros;int cont;
} tTabla;
bool insertar(tTabla &tabla, tRegistro registro);
bool insertar(tTabla &tabla, tRegistro registro) {bool ok = true;if (tabla.cont == N) ok = false; // tabla llenaelse {
int pos = 0;bool enc= false;while ((pos < tabla.cont) && !enc){
if(tabla.registros[pos] > registro) enc= true;else pos++;
}for (int j = tabla.cont; j > pos; j‐‐)
tabla.registros[j] = tabla.registros[j‐1]; tabla.registros[pos] = registro;tabla.cont++;
}return ok;
}
bool insertar(tTabla &tabla, tRegistro registro) {bool ok = true;if (tabla.cont == N) ok = false; // tabla llenaelse {
tabla.registros[tabla.cont] = registro;tabla.cont++;
}return ok;
}
ListaordenadaLista
ordenadaLista
noordenadaLista
noordenada
tabla.htabla.h
Pedro J. M
artín de la Calle
Pedro J. M
artín de la Calle
10/04/2014
26
Luis Hernández Yáñez
Mismainterfaz,implementaciónalternativa
Página 50Fundamentos de la programación: Programación modular
...#include "tabla.h"
bool insertar(tTabla &tabla, tRegistro registro) {bool ok = true;if (tabla.cont == N) ok = false; // tabla llenaelse {
int pos = 0;bool enc= false;while ((pos < tabla.cont) && !enc){
if(tabla.registros[pos] > registro) enc= true;else pos++;
}for (int j = tabla.cont; j > pos; j‐‐)
tabla.registros[j] = tabla.registros[j‐1]; tabla.registros[pos] = registro;tabla.cont++;
}return ok;
}...
...#include "tabla.h"
bool insertar(tTabla &tabla, tRegistro registro) {bool ok = true;if (tabla.cont == N) ok = false; // tabla llenaelse {
tabla.registros[tabla.cont] = registro;tabla.cont++;
}return ok;
}...
tablaORD.cpp:ListaordenadatablaORD.cpp:Listaordenada
tablaDES.cpp:ListanoordenadatablaDES.cpp:Listanoordenada
Pedro J. M
artín de la Calle
Pedro J. M
artín de la Calle
Luis Hernández Yáñez
Mismainterfaz,implementaciónalternativaAlcompilar,incluimosunarchivodeimplementaciónuotro:
¿Programacontablaordenadaocontabladesordenada?
g++ ‐o programa.exe registrofin.cpp tablaORD.cpp ...
Incluyelaimplementacióndelatablaconordenación.
g++ ‐o programa.exe registrofin.cpp tablaDES.cpp ...
Incluyelaimplementacióndelatablasinordenación.
Página 51Fundamentos de la programación: Programación modular
10/04/2014
27
Luis Hernández Yáñez
Página 52Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
AgrupacioneslógicasdedeclaracionesUnespaciodenombres permite agruparentidades(tipos,variables,funciones)bajounnombredistintivo.Sepuedeconsiderarqueelámbito globaldelprogramacompletoestádividoensubámbitos,cada unocon su propionombre.
Formadeunespaciodenombres:namespace nombre {// Declaraciones (entidades)
}
Porejemplo:namespace miEspacio {
int i;double d;
}
Sedeclaranlasvariablesi yd dentrodelespaciodenombresmiEspacio.
Página 53Fundamentos de la programación: Programación modular
10/04/2014
28
Luis Hernández Yáñez
AccesoamiembrosdeunespaciodenombresParaaccederalasentidadesdeclaradasdentrodeunespaciodenombreshayqueutilizareloperadorderesolucióndeámbito (::).
Porejemplo,paraaccederalasvariablesdeclaradasenelespaciodenombresmiEspacio cualificamosesosidentificadoresconelnombredelespacioyeloperadorderesolucióndeámbito:miEspacio::imiEspacio::d
Los espaciosdenombresresultanútiles en aquellos casosenlosquepuedahaberentidadesconelmismoidentificadorendistintosmódulosoenámbitosdistintosdeunmismomódulo.
Encerraremoscadadeclaraciónenunespaciodenombresdistinto:namespace primero { namespace segundo {
int x = 5; double x = 3.1416;} }
Ahorasedistingueentreprimero::x ysegundo::x.
Página 54Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
usingLa palabraclaveusing seutiliza paraintroducir unelementode un espaciodenombresen elámbitodedeclaracionesactual:#include <iostream> using namespace std; namespace primero {
int x = 5; int y = 10;
} namespace segundo {
double x = 3.1416; double y = 2.7183;
} int main() {
using primero::x; using segundo::y; cout << x << endl; // x es primero::xcout << y << endl; // y es segundo::ycout << primero::y << endl; // espacio de nombres explícitocout << segundo::x << endl; // espacio de nombres explícitoreturn 0;
}
Página 55Fundamentos de la programación: Programación modular
5
2.7183
10
3.1416
5
2.7183
10
3.1416
10/04/2014
29
Luis Hernández Yáñez
using namespaceLa instrucciónusing namespace seutiliza paraintroducir todosloselementosde un espaciodenombresen elámbitodedeclaracionesactual:#include <iostream> using namespace std;
namespace primero { int x = 5; int y = 10;
} namespace segundo {
double x = 3.1416; double y = 2.7183;
} int main() {
using namespace primero; cout << x << endl; // x es primero::xcout << y << endl; // y es primero::ycout << segundo::x << endl; // espacio de nombres explícitocout << segundo::y << endl; // espacio de nombres explícitoreturn 0;
}
Página 56Fundamentos de la programación: Programación modular
5
10
3.1416
2.7183
5
10
3.1416
2.7183
using [namespace]sólotieneefectoen el bloqueenque seencuentra.
Luis Hernández Yáñez
Ejemplodeusodeespaciosdenombres
#ifndef TABLAEN_H
#define TABLAEN_H
#include "registrofin.h"
namespace ord {// Tabla ordenada
const int N = 100;
typedef tRegistro tLista[N];
typedef struct {
tLista registros;
int cont;
} tTabla;
const char BD[] = "bd.txt";
void mostrar(const tTabla &tabla);
bool insertar(tTabla &tabla, tRegistro registro);
bool eliminar(tTabla &tabla, int pos); // pos = 1..N
int buscar(tTabla tabla, string nombre);
bool cargar(tTabla &tabla);
void guardar(tTabla tabla);
} // namespace
#endif
Página 57Fundamentos de la programación: Programación modular
10/04/2014
30
Luis Hernández Yáñez
Archivodeimplementación#include <iostream>#include <fstream>using namespace std;#include "tablaEN.h"
// IMPLEMENTACIÓN DE LAS FUNCIONES DEL ESPACIO DE NOMBRES ord
bool ord::insertar(tTabla &tabla, tRegistro registro) { // ...}
bool ord::eliminar(tTabla &tabla, int pos) { // ...}
int ord::buscar(tTabla tabla, string nombre) { // ...}
void ord::mostrar(const tTabla &tabla) { // ...}
bool ord::cargar(tTabla &tabla) { // ...}
void ord::guardar(tTabla tabla) { // ...}
Página 58Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
UsodelespaciodenombresCualquiermóduloqueutilicetablaEN.h debecualificarcadanombredeesabibliotecaconelnombredelespaciodenombresenqueseencuentra:#include <iostream>using namespace std;#include "registrofin.h"#include "tablaEN.h"
int menu();
int main() {ord::tTabla tabla;
if (!ord::cargar(tabla)) {cout << "Error al abrir el archivo!" << endl;
}else {
ord::mostrar(tabla);...
Outilizarunainstrucciónusing namespace ord;
Página 59Fundamentos de la programación: Programación modular
10/04/2014
31
Luis Hernández Yáñez
Usodeespaciosdenombres#include <iostream>using namespace std;#include "registrofin.h"#include "tablaEN.h"using namespace ord;
int menu();
int main() {tTabla tabla;
if (!cargar(tabla)) {cout << "Error al abrir el archivo!" << endl;
}else {
mostrar(tabla);...
Página 60Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
ImplementacionesalternativasDistintosespaciosdenombresparadistintasimplementaciones.¿Tablaordenadaotabladesordenada?namespace ord { // Tabla ordenada
const int N = 100;typedef tRegistro tLista[N];...void mostrar(const tTabla& tabla);bool insertar(tTabla& tabla, tRegistro registro);...
} // namespace
namespace des { // Tabla desordenadaconst int N = 100;typedef tRegistro tLista[N];...void mostrar(const tTabla& tabla);bool insertar(tTabla& tabla, tRegistro registro);...
} // namespace
Página 61Fundamentos de la programación: Programación modular
10/04/2014
32
Luis Hernández Yáñez
ImplementacionesalternativasTodoloqueseacomúnpuedeestarfueradelaestructuranamespace:#ifndef TABLAEN_H#define TABLAEN_H
#include "registrofin.h"
const int N = 100;
typedef tRegistro tLista[N];typedef struct {
tLista registros;int cont;
} tTabla;
void mostrar(const tTabla &tabla);bool eliminar(tTabla& tabla, int pos); // pos = 1..N
...
Página 62Fundamentos de la programación: Programación modular
tablaEN.htablaEN.h
Archivo de cabeceraArchivo de cabeceraLuis Hernández Yáñez
Implementacionesalternativasnamespace ord { // Tabla ordenada
const char BD[] = "bd.txt";bool insertar(tTabla &tabla, tRegistro registro);int buscar(tTabla tabla, string nombre);bool cargar(tTabla &tabla);void guardar(tTabla tabla);
} // namespace
namespace des { // Tabla desordenadaconst char BD[] = "bddes.txt";
bool insertar(tTabla &tabla, tRegistro registro);int buscar(tTabla tabla, string nombre);bool cargar(tTabla &tabla);void guardar(tTabla tabla);
} // namespace
#endif
Página 63Fundamentos de la programación: Programación modular
cargar() yguardar() sedistinguenporqueusansupropiaBD,peroseimplementanexactamenteigualcargar() yguardar() sedistinguenporqueusansupropiaBD,peroseimplementanexactamenteigual
10/04/2014
33
Luis Hernández Yáñez
Implementacionesalternativas#include <iostream>#include <fstream>using namespace std;#include "tablaEN.h"
bool eliminar(tTabla &tabla, int pos) { // ...}void mostrar(const tTabla &tabla) { // ...}
// IMPLEMENTACIÓN DE LAS FUNCIONES DEL ESPACIO DE NOMBRES ordbool ord::insertar(tTabla& tabla, tRegistro registro) {
bool ok = true;if (tabla.cont == N) ok = false;else {
int pos = 0;bool enc= false;while ((pos < tabla.cont) && !enc){
if(tabla.registros[pos] > registro) enc= true;else pos++;
}for (int j = tabla.cont; j > pos; j‐‐)
tabla.registros[j] = tabla.registros[j‐1]; tabla.registros[pos] = registro;tabla.cont++;
}return ok;
} ...
Página 64Fundamentos de la programación: Programación modular
tablaEN.cpptablaEN.cpp
Archivo de implementaciónArchivo de implementaciónPedro J. M
artín de la Calle
Pedro J. M
artín de la Calle
Luis Hernández Yáñez
Implementacionesalternativasint ord::buscar(tTabla tabla, string nombre) {
int ini = 0, fin = tabla.cont ‐ 1, mitad;bool encontrado = false;while ((ini <= fin) && !encontrado) {
mitad = (ini + fin) / 2;if (nombre == tabla.registros[mitad].nombre) encontrado = true;else if (nombre < tabla.registros[mitad].nombre) fin = mitad ‐ 1;else ini = mitad + 1;
}if (encontrado) mitad++;else mitad = ‐1;return mitad;
}bool ord::cargar(tTabla &tabla) {
bool ok = true;ifstream archivo;archivo.open(BD);if (!archivo.is_open()) ok = false;else {
tabla.cont = 0;int cod;string nom;double suel;...
Página 65Fundamentos de la programación: Programación modular
10/04/2014
34
Luis Hernández Yáñez
Implementacionesalternativaswhile ((tabla.cont < N) && (archivo >> cod) && (archivo >> nom)
&& (archivo >> suel)) {tRegistro registro;registro.codigo = cod;registro.nombre = nom;registro.sueldo = suel;tabla.registros[tabla.cont] = registro;tabla.cont++;
}}return ok;
}
void ord::guardar(tTabla tabla) {ofstream salida;salida.open(BD);for (int i = 0; i < tabla.cont; i++)
salida << tabla.registros[i].codigo << " "<< tabla.registros[i].nombre << " "<< tabla.registros[i].sueldo << endl;
salida.close();}...
Página 66Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
Implementacionesalternativas// IMPLEMENTACIÓN DE LAS FUNCIONES DEL ESPACIO DE NOMBRES des
bool des::insertar(tTabla &tabla, tRegistro registro) {bool ok = true;if (tabla.cont == N) ok = false;else {
tabla.registros[tabla.cont] = registro;tabla.cont++;
}return ok;
}
int des::buscar(tTabla tabla, string nombre) {int pos = 0;bool encontrado = false;while ((pos < tabla.cont) && !encontrado) {
if (nombre == tabla.registros[pos].nombre) encontrado = true;else pos++;
}if (encontrado) pos++;else pos = ‐1;return pos;
}...
Página 67Fundamentos de la programación: Programación modular
10/04/2014
35
Luis Hernández Yáñez
Implementacionesalternativasbool des::cargar(tTabla &tabla) {
bool ok = true;ifstream archivo;archivo.open(BD);if (!archivo.is_open()) ok = false;else {
tabla.cont = 0;int cod;string nom;double suel;while ((tabla.cont < N) && (archivo >> cod) && (archivo >> nom)
&& (archivo >> suel)) {tRegistro registro;registro.codigo = cod;registro.nombre = nom;registro.sueldo = suel;tabla.registros[tabla.cont] = registro;tabla.cont++;
}}return ok;
} ...
Página 68Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
Implementacionesalternativasvoid des::guardar(tTabla tabla) {
ofstream salida;salida.open(BD);for (int i = 0; i < tabla.cont; i++)
salida << tabla.registros[i].codigo << " "<< tabla.registros[i].nombre << " "<< tabla.registros[i].sueldo << endl;
salida.close();}
Página 69Fundamentos de la programación: Programación modular
10/04/2014
36
Luis Hernández Yáñez
Implementacionesalternativas#include <iostream>using namespace std;#include "registrofin.h"#include "tablaEN.h"using namespace ord;
int menu();
int main() {tTabla tabla;...tRegistro registro = nuevo();if (!insertar(tabla, registro))...
Página 70Fundamentos de la programación: Programación modular
bdEN.cppbdEN.cppLuis Hernández Yáñez
Implementacionesalternativas#include <iostream>using namespace std;#include "registrofin.h"#include "tablaEN.h"using namespace des;
int menu();
int main() {tTabla tabla;...tRegistro registro = nuevo();if (!insertar(tabla, registro))...
Página 71Fundamentos de la programación: Programación modular
bdEN.cppbdEN.cpp
10/04/2014
37
Luis Hernández Yáñez
Página 72Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
SoftwaredecalidadElsoftwaredebeserdesarrolladoconbuenasprácticasdeingenieríadelsoftwarequeasegurenunbuenniveldecalidad.
Losdistintosmódulosdelaaplicacióndebenserprobadosexhaustivamente,tantodeformaindependientecomoensurelaciónconlosdemásmódulos.
Elprocesodepruebaydepuraciónesmuyimportanteytodoslosequiposdeberánseguirbuenaspautasparaasegurarlacalidad.
Losmódulosdebenserigualmentebiendocumentados,deformaqueotrosdesarrolladorespuedanaprovecharlosenotrosproyectos.
Página 73Fundamentos de la programación: Programación modular
10/04/2014
38
Luis Hernández Yáñez
PruebaexhaustivaElsoftwaredebeserprobadoexhaustivamenteDebemosintentardescubrirtodosloserroresposibleLoserroresdebenserdepurados,corrigiendoelcódigoPruebassobrelistas: Listainicialmentevacía Listainicialmentellena Listaconunnúmerointermediodeelementos Archivonoexistente
Etcétera...Sehandeprobartodaslasopciones/situacionesdelprogramaEnlasclasesprácticasveremoscómosedepuraelsoftware
Página 74Fundamentos de la programación: Programación modular
Luis Hernández Yáñez
NoreinventemoslaruedaDebemosdesarrollarelsoftwarepensandoensuposiblereutilización.
Unsoftwaredecalidadybiendocumentadodebepoderserfácilmentereutilizado.
Losmódulosdenuestraaplicacióndebenpoderserfácilmenteusados,quizáconmodificaciones,enotrasaplicacionesconnecesidadesparecidas.
Porejemplo,sinecesitamosunaaplicaciónquegestioneunalistadelongitudvariablederegistrosconNIF,nombre,apellidosyedad,partiríamosdelosmódulosregistro ytabla laaplicaciónanterior.Lasmodificacionesbásicamenteafectaríanalmóduloregistro.
Página 75Fundamentos de la programación: Programación modular
10/04/2014
39
Luis Hernández Yáñez
EllenguajedeprogramaciónC++ (Ediciónespecial)B.Stroustrup.Addison‐Wesley,2002
Fundamentos de la programación: Programación modular Página 76
Luis Hernández Yáñez
LicenciaCC(Creative Commons)Estetipodelicenciasofrecenalgunosderechosaterceraspersonasbajociertascondiciones.
Estedocumentotieneestablecidaslassiguientes:
Pulsaenlaimagendearribaaladerechaparasabermás.
Fundamentos de la programación: Programación modular Página 77
Reconocimiento(Attribution):Encualquierexplotacióndelaobraautorizadaporlalicenciaharáfaltareconocerlaautoría.
Nocomercial(Noncommercial):Laexplotacióndelaobraquedalimitadaausosnocomerciales.
Compartirigual(Sharealike):Laexplotaciónautorizadaincluyelacreacióndeobrasderivadassiemprequemantenganlamismalicenciaalserdivulgadas.