Download - 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

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