新书入库: 图书信息包括书名、书号、库存量、现存量共4项。首先输入3本书的信息,并将其存入文件“book.dat”中。当有新书入库时, 先判断文件中是否有此书( 即比较书名 ), 假设有则修改库存量, 现存量的信息; 假设无此书, 则将该书的信息添加到文件中.
图书查询: 输入一个书号,在文件中查找此书,假设找到则输出此书的全部信息; 假设找不到则输出查找失败的信息。
借阅管理
每个读者的信息包括、 编号, 1张借书卡( 限借一本书 ), 输入3个读者的信息存入文件“reader.dat”中。
添加借阅者
借书登记: 输入读者的,所借图书的书号,先判断是否在文件”reader.dat” 中, 假设有则将书号存入一张借书卡上( 注: 初始时借书卡的信息都为零,借书后借书卡的信息改为所借书的书号), 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量。假设”reader.dat”无此, 则应提示错误。
还书管理: 输入读者的, 所还图书的书号, 将借书卡的信息置为零, 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量.
输出全部图书信息和全部读者信息
退出系统。
/**
* 1. 新书入库: 图书信息包括书名、书号、库存量、现存量共4项。首先输入3本书的信息,并将其存入文件“book.dat”中。
* 当有新书入库时, 先判断文件中是否有此书( 即比较书名 ), 假设有则修改库存量, 现存量的信息; 假设无此书, 则将该书的信息添加到文件中.
* 2. 图书查询: 输入一个书号,在文件中查找此书,假设找到则输出此书的全部信息; 假设找不到则输出查找失败的信息。
* 3. 借阅管理
* 1. 每个读者的信息包括、 编号, 1张借书卡( 限借一本书 ), 输入3个读者的信息存入文件“reader.dat”中。
* 2. 添加借阅者
* 3. 借书登记: 输入读者的,所借图书的书号,先判断是否在文件”reader.dat” 中, 假设有则将书号存入一张借书卡上( 注: 初始时借书卡的信息都为零,借书后借书卡的信息改为所借书的书号),
* 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量。假设”reader.dat”无此, 则应提示错误。
* 4. 还书管理: 输入读者ID, 所还图书的书号, 将借书卡的信息置为零, 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量.
* 4. 输出全部图书信息和全部读者信息
* 5. 退出系统。
*/
#include
#include
#include
#include
#define READER_DATA_PATH "reader.dat"
#define BOOK_DATA_PATH "book.dat"
using namespace std;
struct Book {
char BookName[256]; /// 书名
char ISBN[18]; /// 书号 ISBN
unsigned StoreNum; /// 库存量
unsigned NowNum; /// 现存量
};
struct Reader {
char Id[11]; /// 读者编号, 十位,由字母和数字组成
char ISBN[18]; /// ISBN
bool IsBorrow; /// 是否已经借阅
};
struct BookList {
Book Book;
BookList *Next;
};
struct ReaderList {
Reader ReaderInfo;
ReaderList* Next;
};
/// 打印图书信息
void printBook(Book *bk) {
cout << "=========================\n";
cout << " 图书名: 《" << bk->BookName << "》\n";
cout << " ISBN: " << bk->ISBN << "\n";
cout << " 库存量: " << bk->StoreNum << "\n";
cout << " 现存量: " << bk->NowNum << "\n";
cout << "=========================\n";
}
/// 打印读者信息
void printReader(Reader *rd) {
cout << "=========================\n";
cout << " ID: " << rd->Id << "\n";
cout << " 借阅信息:\n";
if(rd->IsBorrow) {
cout << " 所借图书: " << rd->ISBN << "\n";
}
else {
cout << " 无借阅信息\n";
}
cout << "=========================\n";
}
ReaderList *ReaderListHeadPtr = nullptr;
ReaderList *ReaderListTailPtr = nullptr;
BookList *BookListHeadPtr = nullptr;
BookList *BookListTailPtr = nullptr;
void addBook(Book *bk) {
if(BookListHeadPtr == nullptr) {
BookListHeadPtr = new BookList();
BookListHeadPtr->Next = nullptr;
BookListHeadPtr->Book = *bk;
BookListTailPtr = BookListHeadPtr;
}
else {
BookListTailPtr->Next = new BookList();
BookListTailPtr = BookListTailPtr->Next;
BookListTailPtr->Next = nullptr;
BookListTailPtr->Book = *bk;
}
}
void addReader(Reader *rd) {
if(ReaderListHeadPtr == nullptr) {
ReaderListHeadPtr = new ReaderList();
ReaderListHeadPtr->Next = nullptr;
ReaderListHeadPtr->ReaderInfo = *rd;
ReaderListTailPtr = ReaderListHeadPtr;
}
else {
ReaderListTailPtr->Next = new ReaderList();
ReaderListTailPtr = ReaderListTailPtr->Next;
ReaderListTailPtr->Next = nullptr;
ReaderListTailPtr->ReaderInfo = *rd;
}
}
/// 将读者信息和图书信息从文件中读取出来
void readMsgFormDatFile() {
std::ifstream reader_stream(READER_DATA_PATH);
std::ifstream book_stream(BOOK_DATA_PATH);
Reader rd;
Book bk;
if(!reader_stream.is_open()) {
cout << "无法打开读者数据文件" << READER_DATA_PATH << endl;
exit(1);
}
if (reader_stream.peek() == std::ifstream::traits_type::eof()) {
reader_stream.close();
}
else {
while(reader_stream.read((char*)&rd, sizeof(Reader))) {
addReader(&rd);
}
reader_stream.close();
}
if(!book_stream.is_open()) {
cout << "无法打开图书数据文件" << BOOK_DATA_PATH << endl;
exit(-1);
}
if (book_stream.peek() == std::ifstream::traits_type::eof()) {
book_stream.close();
}
else {
while(book_stream.read((char*)&bk, sizeof(Book))) {
addBook(&bk);
}
book_stream.close();
}
}
/// 将读者信息和图书信息写入文件中
void writeMsgToDatFile() {
std::ofstream reader_stream;
std::ofstream book_stream;
reader_stream.open(READER_DATA_PATH, ios::out | ios::trunc);
if(!reader_stream.is_open()) {
cout << "无法打开读者数据文件" << READER_DATA_PATH << endl;
exit(-1);
}
while(ReaderListHeadPtr != nullptr) {
reader_stream.write((char*)&ReaderListHeadPtr->ReaderInfo, sizeof(Reader));
ReaderListHeadPtr = ReaderListHeadPtr->Next;
}
book_stream.open(BOOK_DATA_PATH, ios::out | ios::trunc);
if(!book_stream.is_open()) {
cout << "无法打开图书数据文件" << BOOK_DATA_PATH << endl;
exit(-1);
}
while(BookListHeadPtr != nullptr) {
book_stream.write((char*)&BookListHeadPtr->Book, sizeof(Book));
BookListHeadPtr = BookListHeadPtr->Next;
}
reader_stream.close();
book_stream.close();
}
/// isbn is xxx-x-xxxx-xxxx-x
bool isbnCheck(char *isbn) {
if(strlen(isbn) != 17) return false;
if(isbn[3] != '-' && isbn[5] != '-' && isbn[10] != '-' && isbn[15] != '-') return false;
for(int i = 0; i < 17; i++) {
if(isbn[i] != '-' && isbn[i] - '0' < 0 && isbn[i] - '9' > 0) return false;
}
return true;
}
int checkHasThisBook(Book *bk) {
BookList *tmp = BookListHeadPtr;
int com1, com2;
while(tmp != nullptr) {
com1 = strcmp(bk->ISBN, tmp->Book.ISBN);
com2 = strcmp(bk->BookName, tmp->Book.BookName);
if(!com1 && !com2) {
tmp->Book.StoreNum = bk->StoreNum;
tmp->Book.NowNum = bk->NowNum;
return 0;
}
else if(com1 && com2){
tmp = tmp->Next;
}
else {
return -1;
}
}
return 1;
}
/// 打印主菜单信息
void printMainMenu() {
cout << "==============图书管理系统=============\n";
cout << "1. 新书入库\n";
cout << "2. 图书查询\n";
cout << "3. 借阅管理\n";
cout << "4. 输出全部图书信息和全部读者信息\n";
cout << "5. 退出系统\n";
cout << "=====================================\n";
cout << "请输入选择: ";
cout.flush();
}
/// 打印借阅管理菜单信息
void printBorrowMenu() {
cout << "==============借阅管理=============\n";
cout << "1. 读者添加\n";
cout << "2. 图书归还\n";
cout << "3. 图书借阅\n";
cout << "==================================\n";
cout << "请输入选择: ";
cout.flush();
}
/// 新书入库
void addNewBook() {
static Book bk = {};
cout<<"图书名:" ;
std::cin >> bk.BookName;
cout << "ISBN:";
std::cin >> bk.ISBN;
cout << "库存量:";
std::cin >> bk.StoreNum;
cout << "现存量:";
std::cin >> bk.NowNum;
if(!isbnCheck(bk.ISBN)) {
cout << "请输入正确的ISBN!\n";
}
else {
int res = checkHasThisBook(&bk);
if(res < 0) {
cout << "您输入的图书名与ISBN不符,请重新输入!\n";
}
else if(res > 0) {
addBook(&bk);
}
}
}
/// 图书查询
void searchBook() {
static char BookNameOrISBN[256];
cout<<"请输入图书名或ISBN:" ;
std::cin >> BookNameOrISBN;
BookList *tmp = BookListHeadPtr;
while(tmp) {
if(!strcmp(tmp->Book.BookName, BookNameOrISBN) || !strcmp(tmp->Book.ISBN, BookNameOrISBN)) break;
tmp = tmp->Next;
}
if(tmp != nullptr) {
printBook(&tmp->Book);
}
else {
cout << "未查询到图书信息!" << endl;
}
}
/// 检查读者ID是否合法
bool checkId(char *id) {
if(strlen(id) != 10) {
cout << "请输入正确格式的读者ID!" << endl;
return false;
}
for(int i = 0 ; i < 10 ; i++) {
if(!isdigit(id[i]) && !isalnum(id[i])){
cout << "请输入正确格式的读者ID!" << endl;
return false;
}
}
return true;
}
/// 检查读者是否存在
Reader* searchReader(char *id) {
ReaderList *tmp = ReaderListHeadPtr;
while(tmp) {
if(!strcmp(tmp->ReaderInfo.Id, id)) return &tmp->ReaderInfo;
tmp = tmp->Next;
}
return nullptr;
}
/// 读者添加
void addReader() {
static Reader rd = {};
cout << "请输入读者ID: ";
cin >> rd.Id;
rd.IsBorrow = false;
if(!checkId(rd.Id)) {return;}
else {
if(searchReader(rd.Id)) {
cout << "读者已经存在!";
}
else {
addReader(&rd);
}
}
}
/// 图书借阅
void borrowBook() {
static char Id[11];
static char BookNameOrISBN[256];
cout << "请输入读者ID: ";
cin >> Id;
Reader *reader = searchReader(Id);
if(!checkId(Id)) {return;}
if(!reader) {
cout << "未查询到读者信息" << endl;
return;
}
if(reader->IsBorrow) {
cout << "该读者无法借阅书籍!" << endl;
return;
}
cout<<"请输入图书名或ISBN:" ;
std::cin >> BookNameOrISBN;
BookList *tmp = BookListHeadPtr;
while(tmp) {
if(!strcmp(tmp->Book.BookName, BookNameOrISBN) || !strcmp(tmp->Book.ISBN, BookNameOrISBN)) break;
tmp = tmp->Next;
}
if(tmp != nullptr) {
if(tmp->Book.NowNum == 0) {
cout << "图书已全部借出!,无法借阅!" << endl;
return;
}
cout << "借阅成功!" << endl;
strcpy_s(reader->ISBN, tmp->Book.ISBN);
tmp->Book.NowNum--;
reader->IsBorrow = true;
}
else {
cout << "未查询到图书信息!" << endl;
}
}
/// 图书归还
void backBook() {
static char Id[11];
static char BookNameOrISBN[256];
cout << "请输入读者ID: ";
cin >> Id;
Reader *reader = searchReader(Id);
if(!checkId(Id)) {return;}
if(!reader) {
cout << "未查询到读者信息" << endl;
return;
}
if(!reader->IsBorrow) {
cout << "该读者未借阅任何书籍!" << endl;
return;
}
BookList *tmp = BookListHeadPtr;
while(tmp) {
if(!strcmp(tmp->Book.BookName, BookNameOrISBN) || !strcmp(tmp->Book.ISBN, reader->ISBN)) break;
tmp = tmp->Next;
}
if(tmp != nullptr) {
cout << "归还成功!" << endl;
tmp->Book.NowNum++;
reader->IsBorrow = false;
}
else {
cout << "非法操作!" << endl;
}
}
/// 借阅管理, 借书和还书
void bookBorrowAndReturn() {
static int choice;
printBorrowMenu();
cin >> choice;
switch(choice) {
case 1: {
addReader();
} break;
case 2: {
backBook();
} break;
case 3: {
borrowBook();
} break;
default:{
cout << "非法输入!" << choice << endl;
}
}
}
/// 输入全部读者和图书信息
void printBookAndReadersMsg() {
ReaderList *rdp = ReaderListHeadPtr;
BookList *bkp = BookListHeadPtr;
cout << "图书信息:\n";
while(bkp) {
printBook(&bkp->Book);
bkp = bkp->Next;
}
cout << "读者信息:\n";
while(rdp) {
printReader(&rdp->ReaderInfo);
rdp = rdp->Next;
}
}
/**
* 图书管理系统主函数
*/
int main() {
readMsgFormDatFile();
int choice;
while(true) {
printMainMenu();
std::cin >> choice;
switch (choice) {
case 1: {
addNewBook();
} break;
case 2: {
searchBook();
} break;
case 3: {
bookBorrowAndReturn();
} break;
case 4: {
printBookAndReadersMsg();
} break;
case 5: {
writeMsgToDatFile();
cout << ">>>> 系统已退出 <<<<\n";
return 0;
}
default: {
cout << "非法输入!" << choice << endl;
}
}
cout << "按任意健继续";
system("pause");
system("cls");
}
}