Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres...

39
10/04/2014 1 8 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Luis Hernández Yáñez Facultad de Informática Universidad Complutense Fundamentos de la programación 20132014 Luis Hernández Yáñez Página 1 Fundamentos 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

Transcript of Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres...

Page 1: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 2: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 3: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

...... ......

Page 4: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 5: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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)

Page 6: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 7: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 8: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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!

Page 9: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 10: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 11: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 12: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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.

Page 13: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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();...

Page 14: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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.

Page 15: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 16: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 17: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 18: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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;...

Page 19: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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!

Page 20: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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.

Page 21: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 22: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 23: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 24: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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!

Page 25: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 26: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 27: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 28: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 29: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 30: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 31: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 32: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 33: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 34: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 35: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 36: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 37: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 38: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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

Page 39: Fundamentos de la programación 2013 2014 8 · Implementaciones alternativas 48 Espacios de nombres 52 Implementacionesalternativas 61 Calidad y reutilización del software 72. 10/04/2014

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.