实现的是一个小型图书馆的程序,功能包括增加新书,以及读者借书和还书等。
代码如下:
#include <iostream>
#include <string>
#include <list>
#include <algorithm>
#include <cstring>
using namespace std;
class Patron;
class Book
{
public:
Book(){patron = 0;}
bool operator==(const Book &bk) const{
return strcmp(title, bk.title) == 0;
}
private:
char *title;
Patron *patron;
ostream &printBook(ostream &) const;
friend ostream &operator<<(ostream &out, const Book &bk){
return bk.printBook(out);
}
friend class CheckOutBook;
friend class Patron;
friend void includeBook(); //友元函数
friend void checkOutBook();
friend void returnBook();
};
class Author
{
public:
Author(){ }
bool operator==(const Author & ar) const{
return strcmp(name, ar.name) == 0;
}
private:
char *name;
list<Book> books;
ostream &printAuthor(ostream &) const;
friend ostream &operator<<(ostream &out, const Author &ar){
return ar.printAuthor(out);
}
friend void includeBook();
friend void checkOutBook();
friend void returnBook();
friend class CheckOutBook;
friend class Patron;
};
class CheckOutBook
{
public:
//CheckOutBook(list<Author>::iterator ar = 0, list<Book>::iterator bk = 0){
CheckOutBook(list<Author>::iterator ar, list<Book>::iterator bk){
author = ar;
book = bk;
}
bool operator==(const CheckOutBook &bk) const{
return strcmp(author->name, bk.author->name) == 0 && strcmp(book->title, bk.book->title) == 0;
}
private:
list<Author>::iterator author;
list<Book>::iterator book;
friend void checkOutBook();
friend void returnBook();
friend class Patron;
};
class Patron
{
public:
Patron(){ }
bool operator==(const Patron &pn) const{
return strcmp(name, pn.name) == 0;
}
private:
char *name;
list<CheckOutBook> books;
ostream &printPatron(ostream &) const;
friend ostream &operator<<(ostream &out, const Patron &pn){
return pn.printPatron(out);
}
friend void checkOutBook();
friend void returnBook();
friend class Book;
};
list<Author> catalog['Z' + 1]; //作家数组
list<Patron> people['Z' + 1]; //顾客数组
//三个成员函数
ostream &Author::printAuthor(ostream &out) const
{
out << name << endl;
list<Book>::const_iterator ref = books.begin();
for( ; ref != books.end(); ref++){
out << *ref;
}
return out;
}
ostream &Book::printBook(ostream &out) const
{
out << " * " << title;
if(patron != 0)
out << " - check out to "<< patron->name;
out << endl;
return out;
}
ostream &Patron::printPatron(ostream &out) const
{
out <<name;
if(!books.empty()){
out << "has the following books:\n";
list<CheckOutBook>::const_iterator bk = books.begin();
for( ; bk != books.end(); bk++)
out << " * " << bk->author->name << ", " << bk->book->title << endl;
}
else
out << "has no books.\n";
return out;
}
//三个被调用的函数
template <typename T> //重载<<的模板函数
ostream &operator<<(ostream &out, const list<T> &lst)
{
typename list<T>::const_iterator ref = lst.begin();
for( ; ref != lst.end(); ref++)
out << *ref;
return out;
}
char *getString(char *msg)
{
char s[82], i, *destin;
cout << msg;
cin.get(s, 80);
while(cin.get(s[81]) && s[81] != '\n');
destin = new char[strlen(s) + 1];
for(i = 0; destin[i] = toupper(s[i]); i++);
return destin;
}
void status()
{
int i;
cout << "Library has the following books:\n\n";
for(i = 'A'; i <= 'Z'; i++)
if(!catalog[i].empty())
cout << catalog[i];
cout << "\nThe following people are sing the library:\n\n";
for(i = 'A'; i <= 'Z'; i++)
if(!people[i].empty())
cout << people[i];
}
//友元函数
void includeBook()
{
Author newAuthor;
Book newBook;
newAuthor.name = getString("Enter author's name: ");
newBook.title = getString("Enter the title of the book: ");
list<Author>::iterator oldAuthor = find(catalog[newAuthor.name[0]].begin(), catalog[newAuthor.name[0]].end(), newAuthor); //相应首字母对应的作者目录寻找姓名
if(oldAuthor == catalog[newAuthor.name[0]].end()){ //没查到
newAuthor.books.push_front(newBook);
catalog[newAuthor.name[0]].push_front(newAuthor);
}
else
(*oldAuthor).books.push_front(newBook); //查到了
}
void checkOutBook()
{
Patron patron;
Author author;
Book book;
list<Author>::iterator authorRef;
list<Book>::iterator bookRef;
patron.name = getString("Enter the patron's name: ");
while(true){
author.name = getString("Enter the author's name: ");
authorRef = find(catalog[author.name[0]].begin(), catalog[author.name[0]].end(), author);
if(authorRef == catalog[author.name[0]].end()) //没找到
cout << "Misspelled author's name\n";
else
break;
}
while(true){
book.title = getString("Enter the title of the book: ");
bookRef = find((*authorRef).books.begin(),
(*authorRef).books.end(), book);
if(bookRef == (*authorRef).books.end())
cout << "Misspelled title\n";
else
break;
}
list<Patron>::iterator patronRef;
patronRef = find(people[patron.name[0]].begin(), people[patron.name[0]].end(), patron);
CheckOutBook checkedOutBook(authorRef, bookRef);
if(patronRef == people[patron.name[0]].end()){
patron.books.push_front(checkedOutBook);
people[patron.name[0]].push_front(patron);
(*bookRef).patron = &*people[patron.name[0]].begin();
}
else{
(*patronRef).books.push_front(checkedOutBook);
(*bookRef).patron = &*patronRef;
}
}
void returnBook()
{
Patron patron;
Author author;
Book book;
list<Author>::iterator authorRef;
list<Book>::iterator bookRef;
list<Patron>::iterator patronRef;
while(true){
patron.name = getString("Enter the patron's name: ");
patronRef = find(people[patron.name[0]].begin(), people[patron.name[0]].end(), patron);
if(patronRef == people[patron.name[0]].end()) //没找到
cout << "Misspelled patron's name\n";
else
break;
}
while(true){
author.name = getString("Enter the author's name: ");
authorRef = find(catalog[author.name[0]].begin(), catalog[author.name[0]].end(), author);
if(authorRef == catalog[author.name[0]].end()) //没找到
cout << "Misspelled author's name\n";
else
break;
}
while(true){
book.title = getString("Enter the title of the book: ");
bookRef = find((*authorRef).books.begin(), (*authorRef).books.end(), book);
if(bookRef == (*authorRef).books.end())
cout << "Misspelled title\n";
else
break;
}
CheckOutBook checkOutBook(authorRef, bookRef);
(*bookRef).patron = 0;
(*patronRef).books.remove(checkOutBook);
}
int menu()
{
int option;
cout << "\nEnter one of the following option:\n"
<< "1.Include a book in the catalog.\n2.Check out a book.\n"
<< "3.Return a book.\n4.Status.\n5.Exit\n"
<< "Your option? ";
cin >> option;
cin.get();
return option;
}
int main()
{
while(true){
switch(menu()){
case 1: includeBook(); break;
case 2: checkOutBook(); break;
case 3: returnBook(); break;
case 4: status(); break;
case 5: return 0;
default: cout << "wrong option, try again.\n";
}
}
return 0;
}
有时间进行分析