#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;
class Book;
//************************************************ BorrowerRecord ************************************************
class BorrowerRecord
{
private:
string name;
list <Book*> BorrowedBook;
public:
//Getters & Setters
string getName();
void setName(string aName);
//Constructor
BorrowerRecord(string aName);
//Display
void display();
//Attach Book
void attachBook(Book *aBook);
//Detach Book
void detachBook(Book *aBook);
};
//Getters & Setters
//Get Name
string BorrowerRecord::getName()
{
return this->name;
}
//Set Name
void BorrowerRecord::setName(string aName)
{
this->name = aName;
}
//Constructors
BorrowerRecord::BorrowerRecord(string aName)
{
this->name = aName;
}
//Display
void BorrowerRecord::display()
{
cout << "Borrower Name: " << this->getName() << endl;
}
//Attach Book
void BorrowerRecord::attachBook(Book *aBook)
{
this->BorrowedBook.push_back(aBook);
}
//Detach Book
void BorrowerRecord::detachBook(Book* aBook)
{
this->BorrowedBook.remove(aBook);
}
//************************************************ Book ************************************************
class Book
{
private:
string number;
string author;
string title;
BorrowerRecord * borrower;
public:
//Getters & Setters
string getNumber();
void setNumber(string aNumber);
string getAuthor();
void setAuthor(string anAuthor);
string getTitle();
void setTitle(string aTitle);
BorrowerRecord *getBorrower();
//Constructors
Book(string aNumber, string aTitle, string anAuthor);
//Display
void display();
//Attach Borrower
void attachBorrower(BorrowerRecord *aBorrower);
//Detach Borrower
void detachBorrower();
};
//Getters & Setters
//Get Number
string Book::getNumber()
{
return this->number;
}
//Set Number
void Book::setNumber(string aNumber)
{
this->number = aNumber;
}
//Get Title
string Book::getTitle()
{
return this->title;
}
//Set Title
void Book::setTitle(string aTitle)
{
this->title = aTitle;
}
//Get Author
string Book::getAuthor()
{
return this->author;
}
//Set Author
void Book::setAuthor(string anAuthor)
{
this->author = anAuthor;
}
//Get Borrower
BorrowerRecord* Book::getBorrower()
{
return this->borrower;
}
//Constructors
Book::Book(string aNumber, string aTitle, string anAuthor)
{
this->setNumber(aNumber);
this->setTitle(aTitle);
this->setAuthor(anAuthor);
this->borrower = NULL;
}
//Attach Borrower
void Book::attachBorrower(BorrowerRecord *aBorrower)
{
this->borrower = aBorrower;
}
//Detach Borrower
void Book::detachBorrower()
{
if (this->borrower != NULL)
{
//(this->borrower)->detachBook(this);
this->borrower = NULL;
}
}
//Display
void Book::display()
{
cout << "Number: " << this->getNumber() << endl;
cout << "Title: " << this->getTitle() << endl;
cout << "Author: " << this->getAuthor() << endl;
if (this->getBorrower() != NULL)
{
cout << "Borrower Name: " << this->getBorrower()->getName() << endl;
}
}
//************************************************ Library ************************************************
class Library
{
private:
string name;
vector <Book *> stock;
vector <BorrowerRecord *> borrowers;
public:
//Getters & Setters
string getName();
void setName(string aName);
//Constructors
Library(string aName);
//Destructor
~Library();
//Display
void display();
//Register One Borrower
void registerOneBorrower(string aName);
//Add One Book
void addOneBook(Book *aBook);
//Lend One Book
void lendOneBook(string aNumber, string aName);
//Display Books Available For Loan
void displayBooksAvailableForLoan();
//Display Books On Loan
void displayBooksOnLoan();
//Return One Book
void returnOneBook(string aNumber);
};
//Getters & Setters
//Get Name
string Library::getName()
{
return this->name;
}
//Set Name
void Library::setName(string aName)
{
this->name = aName;
}
//Constructors
Library::Library(string aName)
{
this->setName(aName);
}
//Destructors
Library::~Library()
{
for (auto borrower : this->borrowers)
{
delete borrower;
}
this->borrowers.clear();
}
//Display
void Library::display()
{
cout << "Library: " << this->getName() << endl;
cout << endl;
cout << "Stocks: " << endl;
for (auto book : this->stock)
{
book->display();
}
cout << "Borrower: " << endl;
for (auto br : this->borrowers)
br->display();
}
//Register One Borrower
void Library::registerOneBorrower(string aName)
{
this->borrowers.push_back(new BorrowerRecord(aName));
}
//Add One Book
void Library::addOneBook(Book* aBook)
{
this->stock.push_back(aBook);
}
//Lend One Book
void Library::lendOneBook(string aNumber, string aName)
{
BorrowerRecord * borrower = NULL;
for (auto br : this->borrowers)
{
if (br->getName() == aName)
{
borrower = br;
break;
}
}
if (borrower == NULL)
{
cout << "Cannot find the Borrower Name: " << aName << endl;
return;
}
Book *book = NULL;
for (auto b : this->stock)
{
if (b->getNumber() == aNumber)
{
book = b;
break;
}
}
if (book == NULL)
{
cout << "Cannot find the Book Number: " << aNumber << endl;
return;
}
book->attachBorrower(borrower);
borrower->attachBook(book);
}
//Display Books Available For Loan
void Library::displayBooksAvailableForLoan()
{
cout << "Books Available For Loan:" << endl;
for (auto book : this->stock)
{
if (book->getBorrower() == NULL)
{
book->display();
}
}
}
//Display Books On Loan
void Library::displayBooksOnLoan()
{
cout << "Books On Loan:" << endl;
for (auto book : this->stock)
{
if (book->getBorrower() != NULL)
{
book->display();
}
}
}
//Return One Book
void Library::returnOneBook(string aNumber)
{
Book* b = NULL;
for (auto book : this->stock)
{
if (book->getNumber() == aNumber)
{
b = book;
break;
}
}
if (b == NULL)
{
cout << "Cannot find the Book Number: " << aNumber << endl;
return;
}
if (b->getBorrower() == NULL)
{
cout << "The book " << aNumber << " is not on loan" << endl;
return;
}
BorrowerRecord *borrower = b->getBorrower();
b->detachBorrower();
borrower->detachBook(b);
b->display();
cout << "The book has been returned" << endl;
}
//******************************************************************************************************
int main()
{
//Create a new book
Book a("001", "Ly thuyet do do va xac suat", "Dang Duc Trong");
Book b("002", "Toan roi rac nang cao", "Tran Ngoc Danh");
Book c("003", "Ly thuyet thong ke", "Dang Duc Trong");
//Create a Library
Library lib("HCMUS Library");
//lib.display();
//Add Book
lib.addOneBook(&a);
lib.addOneBook(&b);
lib.addOneBook(&c);
lib.registerOneBorrower("Tran Duy An");
lib.registerOneBorrower("Tran Quoc Danh");
//Lend Book
lib.lendOneBook("001", "Tran Duy An");
lib.lendOneBook("002", "Tran Quoc Danh");
//lib.returnOneBook("003");
cout << endl;
lib.displayBooksAvailableForLoan();
cout << endl;
lib.displayBooksOnLoan();
cout << endl;
//Return Book
lib.returnOneBook("001");
lib.returnOneBook("003");
cout << endl;
lib.displayBooksAvailableForLoan();
cout << endl;
lib.displayBooksOnLoan();
cout << endl;
//lib.display();
return 0;
}