// Programación en C++ para Ingenieros, Ed. Thomson Paraninfo, 2006
// Capítulo 8: Diseño descendente

// Ejemplo: El museo
// fichero: ElMuseo.cpp

//Número máximo de piezas
const int PIEZAS = 2000;
//Número máximo de pabellones
const int PABELLONES = 10;

//Número máximo de autores
const int AUTORES = 1000;

//Número máximo para la tabla de caracteres,
//30 posiciones según el enunciado del problema
//y una más para el centinela.
//Total 31
const int L = 31;

//Tipo enumerado para los distintos temas de
//los cuales el museo expone piezas.
enum tTema {barroco, renacentista, medieval};

//Tabla para guardar el nombre.
typedef char tCadena[L];

//Tupla para la fecha de nacimiento y defunción
//del autor
struct tFecha{
    int dia,mes,anyo;
};

//Tupla para las medidas de las piezas.
struct tMedidas{
    float alto, ancho;
};

//Tupla para los datos del pabellón.
struct tPabellon{
    int codigo, numSalas;
    tCadena nombre;
    tTema tema;
};

//Tupla para la información de la pieza.
//El campo dniAutor permite relacionar a una
//pieza con los datos de su autor a través del campo
//dniAutor en la estructura de datos que guarda la información
//de todos los autores: tListaAutores (véase más abajo).
struct tPieza{
    int codigo;
    tCadena nombre;
    float valor;
    long dniAutor;
    tMedidas medidas;
    tTema tema;
    bool original;
};

//Tupla para la información del autor.
//El campo dni permite relacionar a un
//autor con todas sus piezas a través de campo dniAutor
//la estructura de datos que guarda la información
//de todos las piezas: tListaPiezas (véase más abajo)
struct tAutor{
    long dni;
    tCadena nombre;
    tCadena nacionalidad;
    int numPiezas;
    tFecha fecNacimiento;
    tFecha fecDefuncion;
};

//Tabla para la información de todas las piezas
//expuestas en el museo
typedef tPieza tListaPiezas[PIEZAS];

//Tupla que almacena las piezas
//expuestas en el museo
//piezas contiene la lista y
//numPiezas el número de
//posiciones ocupadas
struct tPiezas{
    tListaPiezas piezas;
    int numPiezas;
};

//Tabla para la información de todos los autores
//que exponen en el museo.
typedef tAutor tListaAutores[AUTORES];

//Tupla que almacena los
//datos de los autores que
//exponen en el museo
struct tAutores{
    tListaAutores autores;
    int numAutores;
};

//Tabla para la información de todos los pabellones
//del museo. Esta tabla no forma parte de una tupla
//como pasa con autores o piezas porque en el enunciado
//del problema se dice que hay 20 y que aunque no sea
//de forma explícita se considera que todos tienen datos.
typedef tPabellon tListaPabellones[PABELLONES];

//Tupla para guardar toda la información, es decir,
//pabellones, piezas y autores
struct tMuseo{
    tListaPabellones pabellones;
    tPiezas piezas;
    tAutores autores;
};