Está en la página 1de 14

#include "AgViajes.

hpp"

namespace bblProgII{

//Destruye el objeto, liberando todos los recursos asociados.

AgViajes::~AgViajes(){

destruir_paquetes();

destruir_clientes();

//Construye un objeto por defecto, donde tanto la información de paquetes como la de


clientes

//estarán vacías.

AgViajes::AgViajes():paquetes(nullptr), clientes(nullptr){}

//Construye un objeto copiando (duplicando) la información contenida en el objeto

//recibido como parámetro. Nótese que en el nuevo objeto construido, los enlaces a los
paquetes reservados por

//los clientes deberán ser reajustados a la nueva lista de paquetes duplicada en el nuevo
objeto.

AgViajes::AgViajes(const AgViajes& o):paquetes(duplicar_paquetes(o.paquetes)),


clientes(duplicar_clientes(o.clientes)){}

//Inicialmente libera los recursos asociados al objeto actual, y asigna

//nueva información copiando (duplicando) la información contenida en el objeto recibido


como parámetro.

//Nótese que en la nueva información del objeto, los enlaces a los paquetes reservados por
los clientes deberán

//ser reajustados a la nueva lista de paquetes duplicada.

AgViajes& AgViajes::operator=(const AgViajes& o){

if(this!=&o){

destruir_clientes();

destruir_paquetes();

duplicar_paquetes(paquetes);
duplicar_clientes(clientes);

return *this;

//Lee la información del fichero de paquetes

//cuyo nombre recibe como parámetro y la almacenará en la estructura interna del objeto.
El formato del fichero

//es como se indicó anteriormente. Si el fichero no pudo abrirse o se produjeron errores de


formato en la lectura

//de datos, entonces ok tomará el valor false, en otro caso tomará el valor true. Si el número
de plazas o el precio

//de un determinado paquete es negativo, entonces dicho paquete no será almacenado en


la estructura de datos,

//pero se continuará con el procesamiento del fichero y no afectará al valor de ok.

void AgViajes::leer_paquetes(const std::string& fich_paquetes, bool& ok){

destruir_paquetes();

ok=false;

ifstream fent;

fent.open(fich_paquetes.c_str());

if(!fent.fail()){

string id, opinion;

int n_p, price, n_opiniones;

getline(fent, id, ' ');

while(!fent.eof()){

fent>>n_p;

fent>>price;

fent>>n_opiniones;

int i=0;

if(n_p>=0 && price>=0){

nuevo_paquete(id, n_p, price, ok);


fent.ignore();

while(i<n_opiniones){

getline(fent, opinion, '\n');

nuevo_comentario(id, opinion, ok);

i++;

}else{

fent.ignore();

while(i<n_opiniones){

getline(fent, opinion, '\n');

i++;

getline(fent, id, ' ');

ok=true;

fent.close();

//Lee la información del fichero de clientes cuyo

//nombre recibe como parámetro y la almacenará en la estructura interna del objeto. El


formato del fichero es

//como se indicó anteriormente. Si el fichero no pudo abrirse o se produjeron errores de


formato en la lectura de

//datos, entonces ok tomará el valor false, en otro caso tomará el valor true. Si el dinero de
un determinado

//cliente es negativo, entonces dicho cliente no será almacenado en la estructura de datos,


pero se continuará con

//el procesamiento del fichero y no afectará al valor de ok.

void AgViajes::leer_clientes(const string& fich_clientes, bool& ok){

destruir_clientes();
ok=false;

ifstream fent;

fent.open(fich_clientes.c_str());

if(!fent.fail()){

string id, reserva;

int money, n_reservas;

getline(fent, id, ' ');

while(!fent.eof()){

fent>>money;

fent>>n_reservas;

if(money>=0){

int i=0;

nuevo_cliente(id, money, ok);

fent.ignore();

while(i<n_reservas){

if(i==n_reservas-1){

i++;

getline(fent, reserva, '\n');

nueva_reserva(id, reserva, ok);

}else{

i++;

getline(fent, reserva, ' ');

nueva_reserva(id, reserva, ok);

getline(fent, id, ' ');

ok=true;

fent.close();
}

//Guarda la información de paquetes

//alamcenada en el fichero de paquetes cuyo nombre recibe como parámetro. El formato


del fichero es como se

//indicó anteriormente. Si el fichero no pudo abrirse o se produjeron errores en la escritura


de datos, entonces ok

//tomará el valor false, en otro caso tomará el valor true.

void AgViajes::guardar_paquetes(const string& fich_paquetes, bool& ok){

ofstream fsal;

ok=false;

fsal.open(fich_paquetes);

if(!fsal.fail()){

ok=true;

PNodo1 p=paquetes;

while(p!=NULL){

fsal<<p->paquete.obtener_codigo()<<" "<<p->paquete.obtener_plazas()<<" "<<p-


>paquete.obtener_precio()<<endl;

fsal<<p->opiniones.size()<<endl;

for(unsigned i=1;i<=p->opiniones.size();i++){

fsal<<p->opiniones[i-1]<<endl;

p=p->sig;

fsal.close();

//Guarda la información de clientes almacenada


//en el fichero de clientes cuyo nombre recibe como parámetro. El formato del fichero es
como se indicó

//anteriormente. Si el fichero no pudo abrirse o se produjeron errores en la escritura de


datos, entonces ok tomará

//el valor false, en otro caso tomará el valor true.

void AgViajes::guardar_clientes(const string& fich_clientes, bool& ok){

ofstream fsal;

ok=false;

fsal.open(fich_clientes);

if(!fsal.fail()){

ok=true;

PNodo2 c=clientes;

while(c!=NULL){

fsal<<c->cliente.obtener_nombre()<<" "<<c->cliente.obtener_dinero()<<" "<<c-


>reservas.size()<<" ";

for(unsigned i=0; i<c->reservas.size();i++){

if(i==c->reservas.size()-1){

fsal<<c->reservas[i]->paquete.obtener_codigo()<<"\n";

}else{

fsal<<c->reservas[i]->paquete.obtener_codigo()<<" ";

c=c->sig;

fsal.close();

//Recibe un nombre de cliente

//y un código de paquete (cod) como parámetros, y si ambos existen, entonces añadirá (a
continuación de las ya

//existentes) al cliente una nueva reserva para dicho paquete y ok tomará el valor true. Si no
existe un cliente
//con dicho nombre, o no existe dicho paquete turístico, entonces ok tomará el valor false.

void AgViajes::nueva_reserva(const string& nombre, const string& cod, bool& ok){

ok=false;

PNodo1 p=paquetes;

PNodo2 c=clientes;

bool existe_c=existe_cliente(nombre, c), existe_p=existe_paquete(cod, p);

if(existe_c && existe_p){

c->reservas.push_back(p);

c->num_reservas++;

ok=true;

//Recibe un nombre de

//cliente como parámetro, y si existe, comprueba si tiene reservado el paquete turístico


recibido como parámetro

//(cod), y en ese caso, eliminará dicha reserva y ok tomará el valor true. Si no existe un
cliente con dicho nombre,

//o no tiene dicho paquete reservado, entonces ok tomará el valor false.

void AgViajes::eliminar_reserva(const string& nombre, const string& cod, bool& ok){

ok=false;

PNodo2 c=new Nodo2;

bool existe_c=existe_cliente(nombre, c);

unsigned cont=0;

if(existe_c){

while(cont<c->reservas.size()){

if(c->reservas[cont]->paquete.obtener_codigo()==cod){

while(cont<c->reservas.size()){

c->reservas[cont]=c->reservas[cont+1];

cont++;
}

ok=true;

c->reservas.pop_back();

c->num_reservas--;

cont=clientes->reservas.size();

cont++;

//Recibe un nombre de cliente y el dinero

//destinado a viajes como parámetros, y si el cliente no existe, el nombre no es vacío y el


valor recibido como

//parámetro (dinero >= 0), entonces lo añadirá (con reservas nulas) al final de la lista de
clientes y ok tomará el

//valor true. En otro caso, entonces ok tomará el valor false.

void AgViajes::nuevo_cliente(const string& nombre, int dinero, bool& ok){

ok=false;

PNodo2 c1=clientes;

bool existe_c=existe_cliente(nombre, c1);

Cliente anyadir (nombre, dinero);

if(!existe_c && !anyadir.error()){

c1=new Nodo2;

c1->cliente=anyadir;

c1->sig=nullptr;

if(clientes==nullptr){

clientes=c1;

}else{

PNodo2 c2=clientes;

while(c2->sig!=nullptr){
c2=c2->sig;

c2->sig=c1;

c1->num_reservas=0;

ok=true;

//Recibe en el parámetro cod el

//código de identificación de un paquete, así como el número de plazas y su precio, y si


dicho paquete no existe,

//el código no es vacío y los valores recibidos como parámetros (plazas >= 0 && precio >= 0),
entonces lo

//añadirá, manteniendo la ordenación, a la lista de paquetes turísticos y ok tomará el valor


true. En otro caso,

//entonces ok tomará el valor false.

void AgViajes::nuevo_paquete(const string& cod, int plazas, int precio, bool& ok){

ok=false;

PNodo1 p=paquetes;

bool existe=existe_paquete(cod, p);

Paquete anyadir(cod, plazas, precio);

if(!existe && !anyadir.error()){

p=new Nodo1;

p->paquete=anyadir;

p->sig=NULL;

if(paquetes==NULL || paquetes->paquete.obtener_codigo()>cod){

p->sig=paquetes;

paquetes=p;

}else{
PNodo1 anterior=paquetes, act=anterior->sig;

while(act!=NULL && act->paquete.obtener_codigo()<=cod){

anterior=act;

act=act->sig;

p->sig=act;

anterior->sig=p;

ok=true;

//Recibe un nombre de cliente como parámetro, y si

//existe, lo eliminará de la lista de clientes y ok tomará el valor true. Si no existe un cliente


con dicho nombre,

//entonces ok tomará el valor false.

void AgViajes::eliminar_cliente(const string& nombre, bool& ok){

ok=false;

PNodo2 c1=new Nodo2;

bool existe_c=existe_cliente(nombre, c1);

if(existe_c){

PNodo2 c2=clientes;

if(clientes->cliente.obtener_nombre()==nombre){

clientes=clientes->sig;

delete c2;

ok=true;

}else{

PNodo2 c1=clientes, c2=clientes->sig;

while(c2!=NULL && c2->cliente.obtener_nombre()!=nombre){


c1=c2;

c2=c2->sig;

if(c2!=NULL){

c1->sig=c2->sig;

delete c2;

ok=true;

//Recibe en el parámetro

//cod el código de identificación de un paquete, y si dicho paquete existe, entonces se añade


el comentario a la

//cola de comentarios y ok tomará el valor true. En otro caso, entonces ok tomará el valor
false.

void AgViajes::nuevo_comentario(const string& cod, const string& comentario, bool& ok){

ok=false;

PNodo1 p=paquetes;

bool existe_p=existe_paquete(cod, p);

if(existe_p){

p->opiniones.push_back(comentario);

ok=true;

void AgViajes::destruir_paquetes(){

while(paquetes!=nullptr){

PNodo1 p=paquetes;

paquetes=paquetes->sig;
delete p;

void AgViajes::destruir_clientes(){

while(clientes!=nullptr){

PNodo2 p=clientes;

clientes=clientes->sig;

delete p;

AgViajes::PNodo1 AgViajes::duplicar_paquetes(PNodo1 lista){

PNodo1 copia=nullptr;

if(lista!=nullptr){

copia=new Nodo1;

copia->paquete=lista->paquete;

copia->opiniones=lista->opiniones;

PNodo1 p=lista->sig;

PNodo1 u=copia;

while(p!=nullptr){

u->sig=new Nodo1;

u->sig->paquete=p->paquete;

u->sig->opiniones=p->opiniones;

u=u->sig;

p=p->sig;

u->sig=nullptr;

return copia;

}
AgViajes::PNodo2 AgViajes::duplicar_clientes(PNodo2 lista){

PNodo2 copia=nullptr;

if(lista!=nullptr){

copia=new Nodo2;

copia->cliente=lista->cliente;

copia->num_reservas=lista->num_reservas;

copia->reservas=lista->reservas;

PNodo2 p=lista->sig;

PNodo2 u=copia;

while(p!=nullptr){

u->sig=new Nodo2;

u->sig->cliente=p->cliente;

u->sig->num_reservas=p->num_reservas;

u->sig->reservas=p->reservas;

u=u->sig;

p=p->sig;

u->sig=nullptr;

return copia;

bool AgViajes::existe_paquete(string codigo, PNodo1 &p){

while(p!=nullptr && p->paquete.obtener_codigo()!=codigo){

p=p->sig;

if(p==nullptr){

return false;

}else{
return true;

bool AgViajes::existe_cliente(string nombre, PNodo2 &c){

c=clientes;

while(c!=nullptr && c->cliente.obtener_nombre()!=nombre){

c=c->sig;

if(c==nullptr){

return false;

}else{

return true;

También podría gustarte