Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programación
8 modular
Implementaciones alternativas 61
Calidad y reutilización del software 72
Programas multiarchivo
y compilación separada
Luis Hernández Yáñez
Ejecutable
Principal
Mó dulos del programa int main() { Bibliotecas del sistema
tLista lista;
init(lista);
cargar(lista, "bd.txt");
sort(lista);
double dato;
Lista.obj cout << "Dato: "; iostream.obj
cin >> dato;
insert(lista, dato);
cout << min(lista) << endl;
Calculos.obj cout << max(lista) << endl;
cout << sum(lista) << endl;
fstream.obj
guardar(lista, "bd.txt");
return 0;
Archivos.obj math.obj
... ...
}
Luis Hernández Yáñez
Ejecutable
Lista.cpp main.cpp
COMPILACIÓ N
Lista.obj iostream.obj
Calculos.obj
fstream.obj
Archivos.obj
main.obj
math.obj
... ...
ENLACE
Luis Hernández Yáñez
Ejecutable
Fundamentos de la programación: Programación modular Página 7
Fundamentos de la programación
Etcétera.
La implementació n de los subprogramas es eso, implementació n.
Lista.h Lista.cpp
const int N = 10; #include "Lista.h"
Mó dulo
typedef double tArray[N];
typedef struct {
tArray elem;
void init(tLista& lista) {
lista.cont = 0;
Unidad
int cont;
} tLista;
}
main.cpp
Los nombres de archivos de cabecera
#include "Lista.h"
...
propios (no del sistema) se encierran
entre dobles comillas, no entre á ngulos.
void sort(tLista&);
#include "Lista.h"
...
Lista.obj
01000010101011100101010010100
01110101011101001101010100101
01011111110101011001101010111
00001001010100101010101010110
} tTabla;
const char BD[] = "bd.txt";
...
¡Documenta bien el có digo!
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;
Luis Hernández Yáñez
return registro;
}
...
...
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;
Luis 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;
Luis Hernández Yáñez
Compilación de
programas multiarchivo
Luis Hernández Yáñez
El preprocesador
Luis Hernández Yáñez
#include "tabla.h"
#include <string> #include <string>
using namespace std; int menu(); using namespace std;
... ...
int menu();
...
typedef struct {
int codigo;
string nombre;
double sueldo;
} tRegistro;
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;
}
Luis Hernández Yáñez
tabla.cont++;
}
return ok;
}
...
int menu();
int menu() {
cout << endl;
cout << "1 - Insertar" << endl;
cout << "2 - Eliminar" << endl;
cout << "3 - Buscar" << endl;
cout << "0 - Salir" << endl;
int op;
No intentes compilar este ejemplo.
do { Tiene errores...
cout << "Elige: ";
cin >> op;
Luis Hernández Yáñez
El problema de las
inclusiones múltiples
Luis Hernández Yáñez
...
registro.h #include "registro.h"
#include "tabla2.h"
#include <string>
...
...
registro.cpp
...
#include "registro.h"
... tabla2.h
...
#include "registro.h"
...
tabla2.cpp
Luis Hernández Yáñez
...
Incluye... #include "tabla2.h"
...
int menu();
#include <string>
#include <string> using namespace std;
... using namespace std;
#include "registro.h" typedef struct {
...
const int N = 100; } tRegistro;
typedef tRegistro tLista[N]; ...
typedef struct {
Luis Hernández Yáñez
tLista registros;
int cont;
} tTabla;
...
typedef struct {
... ¡Identificador duplicado!
} tRegistro;
...
typedef struct {
int codigo;
string nombre;
double sueldo;
} tRegistro;
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;
}
Luis Hernández Yáñez
tabla.registros[i] = registro;
tabla.cont++;
}
return ok;
} ...
int menu();
int menu() {
cout << endl;
cout << "1 - Insertar" << endl;
cout << "2 - Eliminar" << endl;
cout << "3 - Buscar" << endl;
cout << "0 - Salir" << endl;
int op;
¡Ahora ya puedes compilarlo!
do {
cout << "Elige: ";
cin >> op;
Luis Hernández Yáñez
...
TABLAFIN_H no se ha definido todavía
#define REGISTROFIN_H
#include <string>
using namespace std;
typedef struct {
...
} tRegistro;
... #ifndef REGISTROFIN_H
#define REGISTROFIN_H
#define TABLAFIN_H
#include <string> #include <string>
using namespace std; using namespace std; ¡REGISTROFIN_H
#include "registrofin.h" ya se ha definido!
typedef struct {
Luis Hernández Yáñez
... ...
} tRegistro;
int menu(); ...
...
Implementaciones alternativas
Luis Hernández Yáñez
tabla.cont++;
}
return ok;
}
...
Espacios de nombres
Luis Hernández Yáñez
#endif
int menu();
int main() {
ord::tTabla tabla;
if (!ord::cargar(tabla)) {
cout << "Error al abrir el archivo!" << endl;
}
else {
Luis Hernández Yáñez
ord::mostrar(tabla);
...
O utilizar una instrucció n using namespace ord;
int menu();
int main() {
tTabla tabla;
if (!cargar(tabla)) {
cout << "Error al abrir el archivo!" << endl;
}
else {
mostrar(tabla);
...
Luis Hernández Yáñez
#include "registrofin.h"
...
} // namespace
#endif
else {
tabla.cont = 0;
int cod;
string nom;
double suel;
...
}
return ok;
}
...
Implementaciones alternativas
#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))
...
Luis Hernández Yáñez
Implementaciones alternativas
#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))
...
Luis Hernández Yáñez
Calidad y reutilización
del software
Luis Hernández Yáñez
Reconocimiento (Attribution):
En cualquier explotació n de la obra autorizada por la licencia
hará falta reconocer la autoría.
No comercial (Non commercial):
La explotació n de la obra queda limitada a usos no comerciales.
Compartir igual (Share alike):
La explotació n autorizada incluye la creació n de obras derivadas
siempre que mantengan la misma licencia al ser divulgadas.
Luis Hernández Yáñez