#include <iostream>
#include <cstring>
#include <cstdlib>
#include <fstream>
using namespace std;
class CasaEditrice{
char* nominativo;
int telefono;
int fax;
int iva;
int codice;
char* indirizzo;
public:
CasaEditrice(){
nominativo=NULL;
telefono=0;
fax=0;
iva=0;
codice=0;
indirizzo=NULL;
};
CasaEditrice(char* a, int b, int c, int d, int e, char* f){ nominativo = new char [strlen(a)+1];
if(!nominativo){ cout<<"Errore!";
exit(1);
};
strcpy(nominativo,a);
telefono = b;
fax = c;
iva = d;
codice = e;
indirizzo = new char [strlen(f)+1];
if(!indirizzo){ cout<<"Errore!";
exit(1);
};
strcpy(indirizzo,f);
return;
};
CasaEditrice(const CasaEditrice &obj) { nominativo= new char[strlen(obj.nominativo)+1];
if(!nominativo){ cout<<"Errore!";
exit(1);
};
strcpy(nominativo, obj.nominativo);
telefono=obj.telefono;
fax = obj.fax;
iva = obj.iva;
codice = obj.codice;
indirizzo = new char[strlen(obj.indirizzo) + 1];
if(!indirizzo) { cout<<"Errore!";
exit(1);
};
strcpy(indirizzo, obj.indirizzo);
return;
};
friend ostream& operator << (ostream& stream, CasaEditrice obj);
friend istream& operator >> (istream& stream, CasaEditrice &obj);
};
class Volume: public CasaEditrice{
char* titolo;
char* w1;
char* w2;
char* w3;
float prezzo;
public:
int ISBN;
Volume():CasaEditrice(){
titolo=NULL;
w1=NULL;
w2=NULL;
w3=NULL;
prezzo=0;
};
Volume(char* a, int b, int c, int d, int e, char* f,char* g, char* h, char* i, char* l, float m, int n) : CasaEditrice(a,b,c,d,e,f){
titolo = new char[strlen(g)+1];
if(!titolo){ cout<<"Errore!";
exit(1);
};
strcpy(titolo,g);
w1 = new char[strlen(h) + 1];
if(!w1) { cout<<"Errore!";
exit(1);
};
strcpy(w1,h);
w2= new char[strlen(i) + 1];
if(!w2) { cout<<"Errore!";
exit(1);
};
strcpy(w2,i);
w3 = new char[strlen(l) + 1];
if(!w3) { cout<<"Errore!";
exit(1);
};
strcpy(w3,l);
prezzo = m;
ISBN = n;
return;
};
Volume(const CasaEditrice obj,const Volume& ob): CasaEditrice(obj){
titolo = new char[strlen(ob.titolo)+1];
if(!titolo){ cout<<"Errore di allocazione nel titolo";
exit(1);
};
strcpy(titolo,ob.titolo);
w1=new char[sizeof(ob.w1)+1];
if(!w1){ cout<<"Errore!";
exit(1);
}
strcpy(w1,ob.w1);
w2=new char[sizeof(ob.w2)+1];
if(!w2){ cout<<"Errore!";
exit(1);
}
strcpy(w2,ob.w2);
w3=new char[sizeof(ob.w3)+1];
if(!w3){ cout<<"Errore!";
exit(1);
}
strcpy(w3,ob.w3);
prezzo = ob.prezzo;
ISBN = ob.ISBN;
return;
};
friend ostream& operator<<(ostream& stream, Volume obj);
friend istream& operator>>(istream& stream, Volume &obj);
};
ostream& operator<<(ostream& stream, CasaEditrice obj)
{
stream<<"CASA EDITRICE: "<<'\n';
stream<<"Nominativo: "<<obj.nominativo<<'\n';
stream<<"Numero di Telefono: "<<obj.telefono<<'\n';
stream<<"FAX: "<<obj.fax<<'\n';
stream<<"Partita IVA: "<<obj.iva<<'\n';
stream<<"Codice: "<<obj.codice<<'\n';
stream<<"Indirizzo: "<<obj.indirizzo<<'\n';
return stream;
};
istream& operator>>(istream& stream, CasaEditrice& obj)
{
cout<<"Inserire casa editrice: "<<'\n';
cout<<"Inserire nominativo: ";
stream>>obj.nominativo;
cout<<"Inserire numero di Telefono: ";
stream>>obj.telefono;
cout<<"Inserire FAX: ";
stream>>obj.fax;
cout<<"Inserire Partita IVA: ";
stream>>obj.iva;
cout<<"Inserire codice: ";
stream>>obj.codice;
cout<<"Inserire indirizzo: ";
stream>>obj.indirizzo;
return stream;
};
ostream& operator<<(ostream& stream, Volume obj)
{
CasaEditrice* pointer;
pointer = &obj;
stream<<(*pointer)<<'\n';
stream<<"Volume "<<'\n';
stream<<"Titolo: "<<obj.titolo<<'\n';
stream<<"Parola chiave 1: "<<obj.w1<<'\n';
stream<<"Parola chiave 2: "<<obj.w2<<'\n';
stream<<"Parola chiave 3: "<<obj.w3<<'\n';
stream<<"Prezzo: "<<obj.prezzo<<'\n';
stream<<"Codice ISBN: "<<obj.ISBN<<'\n';
return stream;
};
istream& operator>>(istream& stream, Volume& obj)
{
CasaEditrice* pointer;
pointer=&obj;
stream>>(*pointer);
cout<<"Inserire Volume: "<<'\n';
cout<<"Inserire titolo: ";
stream>>obj.titolo;
cout<<"Inserire parola chiave 1: ";
stream>>obj.w1;
cout<<"Inserire parola chiave 2: ";
stream>>obj.w2;
cout<<"Inserire parola chiave 3: ";
stream>>obj.w3;
cout<<"Inserire prezzo: ";
stream>>obj.prezzo;
cout<<"Inserire codice ISBN: ";
stream>>obj.ISBN;
return stream;
};
struct VolumeConQuantitaeDisposizione{
Volume* vol;
int quantita;
int coll;
};
template <int Q> class Biblioteca{
VolumeConQuantitaeDisposizione ob[Q];
public:
Biblioteca() {
for(int i=0;i<Q;i++) ob[i].quantita = 0;
}
Biblioteca& operator+ (VolumeConQuantitaeDisposizione& obj){
int i=0;
int adv=0;
while(i<Q){
if(obj.vol->ISBN == ob[i].vol->ISBN){
ob[i].quantita ++;
adv=1;
};
};
if(adv){
return *this;
};
i=0;
while(i<Q && ob[i].quantita!=0) {i++;};
if (i>=Q){
cout<<"\nImpossibile allocare libri in bibloteca!";
return *this;
}
else{
ob[i].vol=obj.vol;
ob[i].quantita=obj.quantita;
ob[i].coll=obj.coll;
};
return *this;
};
Biblioteca& prestito(int num, int cod){
int i;
for(i=0;i<Q;i++)
{
if (cod== ob[i].vol.ISBN){
if(ob[i].quantita >=num){
ob[i].quantita=ob[i].quantita - num;
if(ob[i].quantita==0){
cout<< "Volumi di questo tipo ESAURITI";
};
return *this;
};
if(ob[i].quantita <num){
cout<<"Numero libri non disponibili.";
return *this;
};
};
cout<<"\nVolume non presente in biblioteca" ;
return *this;
};
};
};
istream& operator>>(istream& stream, VolumeConQuantitaeDisposizione& obj)
{
cout<<"Inserisci Volume con quantita' e disposizione: ";
stream>>*(obj.vol);
cout<<"Inserisci quantita: "<<'\n';
stream>>obj.quantita;
cout<<"Inserisci collocazione: "<<'\n';
stream>>obj.coll;
return stream;
};
ostream& operator<< (ostream& stream, VolumeConQuantitaeDisposizione obj){
cout<<"Volume: \n";
stream<<*(obj.vol);
cout<<"\n";
cout<<"Quantita: \n";
stream<<obj.quantita;
cout<<"Collocazione: \n";
stream<<obj.coll;
return stream;
};
int main()
{
ofstream out("Registro_biblioteca");
Biblioteca <10> Bib;
Volume ob1,ob2;
cin >> ob1;
cin>>ob2;
cout<<ob1;
cout<<ob2;
out<<ob1;
out<<ob2;
_sleep(5000);
VolumeConQuantitaeDisposizione x;
cin>>x;
cout<<x;
system("pause");
_sleep(5000);
Biblioteca<10> bib;
bib = Bib + x;
out.close();
return 0;
};