迷你图书管理系统
1 功能描述
模拟一个图书馆的日常工作流程,包括:
- 新用户的注册,图书的注册(同样的书籍可以有多本);
- 借、还书功能;
3) 查询特定用户(姓名关键字,用户ID)的借书情况,查询特定的再册书籍(书名关键字(支持非完整匹配));
4) 查询所有用户及所有再册书籍;
5) 查询某本书的所有借阅记录;
6) 查询某书是否可借;
7) 查询某用户的所有借阅记录;
以上为基本功能,必须实现。你可以额外实现你认为必要且合理的其他功能。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
#include<cstring>
#include<string>
#include<iomanip>
using namespace std;
const int MAXNUM = 50;
class Book
{
public:
char no[20];//书号
char book_name[20];//书名
char writer_name[20];//作者
int count;//数量
friend ostream& operator <<(ostream& out,const Book& b)
{
cout<<setw(20)<<b.no;
cout<<setw(20)<<b.book_name;
cout<<setw(20)<<b.writer_name;
cout<<setw(20)<<b.count<<endl;
return out;
}
};
class User
{
public:
char id[20];//id
char name[20];//姓名
Book book[20];//已借图书
int num;//数量
friend ostream& operator <<(ostream& out,const User& u)
{
int j;
cout<<setw(20)<<u.id;
cout<<setw(20)<<u<<endl;
if (u.num > 0)
{
cout<<setw(20)<<"书号";
cout<<setw(20)<<"书名";
cout<<setw(20)<<"作者"<<endl;
}
for (j = 0; j < u.num; j++)
{
cout<<setw(20)<<u.book[j].no;
cout<<setw(20)<<u.book[j].book_name;
cout<<setw(20)<<u.book[j].writer_name<<endl;
}
return out;
}
};
class Rec
{
public:
char id[20];//id
char name[20];//姓名
char no[20];//书号
char book_name[20];//书名
char writer_name[20];//作者
char op[10];//借还是还
};
class Admin
{
private:
string choice;
User user[MAXNUM];
int unum;
Book book[MAXNUM];
int bnum;
Rec rec[MAXNUM];
int rnum;
void AddUser();
void menu();
void SaveUser();
void LoadUser();
void SelectBook();
void AddBook();
void SaveBook();
void LoadBook();
void SelectBookName();
void BorrowBook();
void SaveRec();
void LoadRec();
void PrintAllUserBook();
void PrintUser();
void PrintUser2();
void BackBook();
void PrintBookRec();
void PrintUserRec();
public:
void Run();
Admin();
~Admin();
};
Admin::~Admin()
{
SaveUser();
SaveBook();
SaveRec();
}
Admin::Admin()
{
unum = 0;
bnum = 0;
rnum = 0;
LoadUser();
LoadBook();
LoadRec();
}
void Admin::PrintUserRec()
{
int i, flag;
string id;
system("cls");
cout << "请输入要查询的用户ID:";
cin >> id;
for (i = 0, flag = 0; i < rnum; i++)
{
if (id == rec[i].id)
{
if (flag == 0)
{
flag = 1;
cout<<setw(10)<<"ID";
cout<<setw(10)<<"姓名";
cout<<setw(20)<<"书号";
cout<<setw(20)<<"书名";
cout<<setw(10)<<"作者";
cout<<setw(10)<<"操作"<<endl;
}
cout<<setw(10)<<rec[i].id;
cout<<setw(10)<<rec[i].name;
cout<<setw(20)<<rec[i].no;
cout<<setw(20)<<rec[i].book_name;
cout<<setw(10)<<rec[i].writer_name;
cout<<setw(10)<<rec[i].op<<endl;
}
}
if (flag == 0)
cout << "该用户无借阅记录" << endl;
system("pause");
}
void Admin::PrintBookRec()
{
int i,flag;
string no;
system("cls");
cout << "请输入要查询的书号:";
cin >> no;
for (i = 0,flag=0; i < rnum; i++)
{
if (no == rec[i].no)
{
if (flag == 0)
{
flag = 1;
cout<<setw(10)<<"ID";
cout<<setw(10)<<"姓名";
cout<<setw(20)<<"书号";
cout<<setw(20)<<"书名";
cout<<setw(10)<<"作者";
cout<<setw(10)<<"操作"<<endl;
}
cout<<setw(10)<<rec[i].id;
cout<<setw(10)<<rec[i].name;
cout<<setw(20)<<rec[i].no;
cout<<setw(20)<<rec[i].book_name;
cout<<setw(10)<<rec[i].writer_name;
cout<<setw(10)<<rec[i].op<<endl;
}
}
if (flag == 0)
cout << "该书籍无借阅记录" << endl;
system("pause");
}
void Admin::BackBook()
{
int i, flag, j,k;
string id;
string no;
system("cls");
cout << "请输入要还书的用户ID:";
cin >> id;
for (i = 0, flag = 0; i < unum; i++)
{
if (id == user[i].id)
{
flag = 1;
break;
}
}
if (flag == 0)
{
cout << "无该用户!" << endl;
system("pause");
return;
}
else
{
cout<<setw(20)<<"ID";
cout<<setw(20)<<"姓名"<<endl;
cout<<user[i];
}
if (user[i].num <= 0)
{
cout << "该用户未借书" << endl;
system("pause");
return;
}
cout << "请输入要还的书籍书号:";
cin >> no;
for (j = 0, flag = 0; j < user[i].num; j++)
{
if (no == user[i].book[j].no)
{
flag = 1;
strcpy(rec[rnum].id, user[i].id);
strcpy(rec[rnum].name, user[i].name);
for (k = j; k < user[i].num; k++)
user[i].book[k] = user[i].book[k + 1];
user[i].num--;
break;
}
}
if (flag == 0)
{
cout << "无该书籍!" << endl;
system("pause");
return;
}
for (k = 0; k < bnum; k++)
{
if (no == book[k].no)
{
book[k].count++;
strcpy(rec[rnum].book_name, book[j].book_name);
strcpy(rec[rnum].no, book[j].no);
strcpy(rec[rnum].writer_name, book[j].writer_name);
strcpy(rec[rnum].op, "还书");
rnum++;
break;
}
}
cout << "还书成功!" << endl;
system("pause");
}
void Admin::PrintUser()
{
int i, flag;
string id;
string no;
system("cls");
cout << "请输入要查询的用户ID:";
cin >> id;
for (i = 0, flag = 0; i < unum; i++)
{
if (id == user[i].id)
{
flag = 1;
break;
}
}
if (flag == 0)
{
cout << "无该用户!" << endl;
system("pause");
return;
}
cout<<setw(20)<<"ID";
cout<<setw(20)<<"姓名"<<endl;
cout<<user[i];
system("pause");
}
void Admin::PrintUser2()
{
int i, flag;
string id;
string no;
system("cls");
cout << "请输入要查询的用户姓名:";
cin >> id;
for (i = 0, flag = 0; i < unum; i++)
{
if (id == user[i].name)
{
flag = 1;
cout<<setw(20)<<"ID";
cout<<setw(20)<<"姓名"<<endl;
cout<<user[i];
}
}
if (flag == 0)
{
cout << "无该用户!" << endl;
system("pause");
return;
}
system("pause");
}
void Admin::PrintAllUserBook()
{
int i;
system("cls");
if (unum > 0)
{
cout<<setw(20)<<"ID";
cout<<setw(20)<<"姓名"<<endl;
}
for (i = 0; i < unum; i++)
{
cout<<setw(20)<<user[i].id;
cout<<setw(20)<<user[i].name<<endl;
}
if (bnum > 0)
{
cout<<setw(20)<<"书号";
cout<<setw(20)<<"书名";
cout<<setw(20)<<"作者";
cout<<setw(20)<<"数量"<<endl;
}
for (i = 0; i < bnum; i++)
{
cout<<setw(20)<<book[i].no;
cout<<setw(20)<<book[i].book_name;
cout<<setw(20)<<book[i].writer_name;
cout<<setw(20)<<book[i].count<<endl;
}
system("pause");
}
void Admin::SaveRec()
{
int i;
ofstream fp("record.txt");
for (i = 0; i < rnum; i++)
{
fp.write((char*)&rec[i], sizeof(Rec));
}
fp.close();
}
void Admin::LoadRec()
{
int i;
ifstream fp("record.txt");
if (fp.is_open() == false)return;
for (i = 0; !fp.eof(); i++)
{
fp.read((char*)&rec[i], sizeof(Rec));
}
fp.close();
rnum = i-1;
}
void Admin::BorrowBook()
{
int i, flag,j;
string id;
string no;
system("cls");
cout << "请输入要借书的用户ID:";
cin >> id;
for (i = 0, flag = 0; i < unum; i++)
{
if (id==user[i].id)
{
flag = 1;
break;
}
}
if (flag == 0)
{
cout << "无该用户!" << endl;
system("pause");
return;
}
cout << "请输入要借的书籍书号:";
cin >> no;
for (j = 0, flag = 0; j < unum; j++)
{
if (no == book[j].no)
{
flag = 1;
break;
}
}
if (flag == 0)
{
cout << "无该书籍!" << endl;
system("pause");
return;
}
if (book[j].count <= 0)
{
cout << "书籍余量不足,无法借阅!" << endl;
system("pause");
return;
}
user[i].book[user[i].num] = book[j];
user[i].num++;
book[j].count--;
cout<<"借阅成功!"<<endl;
strcpy(rec[rnum].book_name, book[j].book_name);
strcpy(rec[rnum].no, book[j].no);
strcpy(rec[rnum].writer_name, book[j].writer_name);
strcpy(rec[rnum].id, user[i].id);
strcpy(rec[rnum].name, user[i].name);
strcpy(rec[rnum].op, "借书");
rnum++;
system("pause");
}
void Admin::SelectBook()
{
int i,flag;
string bookno;
system("cls");
cout << "请输入要查询的书籍书号:";
cin >> bookno;
for (i = 0,flag=0; i < bnum; i++)
{
if (book[i].no == bookno)
{
if (flag == 0)
{
flag = 1;
cout<<setw(20)<<"书号";
cout<<setw(20)<<"书名";
cout<<setw(20)<<"作者";
cout<<setw(20)<<"数量";
cout<<setw(20)<<"是否可借"<<endl;
}
if(book[i].count>0)
{
cout<<setw(20)<<book[i].no;
cout<<setw(20)<<book[i].book_name;
cout<<setw(20)<<book[i].writer_name;
cout<<setw(20)<<book[i].count;
cout<<setw(20)<<"是"<<endl;
}
else
{
cout<<setw(20)<<book[i].no;
cout<<setw(20)<<book[i].book_name;
cout<<setw(20)<<book[i].writer_name;
cout<<setw(20)<<book[i].count;
cout<<setw(20)<<"否"<<endl;
}
}
}
if (flag == 0)
cout << "无该书号信息!" << endl;
system("pause");
}
void Admin::SelectBookName()
{
int i, flag;
char bookname[20];
system("cls");
cout << "请输入要查询的书籍名称:";
cin >> bookname;
for (i = 0, flag = 0; i < bnum; i++)
{
if (strstr(book[i].book_name,bookname)!=NULL)
{
if (flag == 0)
{
flag = 1;
cout<<setw(20)<<"书号";
cout<<setw(20)<<"书名";
cout<<setw(20)<<"作者";
cout<<setw(20)<<"数量"<<endl;
}
cout<<book[i];
}
}
if (flag == 0)
cout << "无该书名信息!" << endl;
system("pause");
}
void Admin::SaveBook()
{
int i;
ofstream fp("book.txt");
for (i = 0; i < bnum; i++)
{
fp.write((char*)&book[i], sizeof(Book));
}
fp.close();
}
void Admin::LoadBook()
{
int i;
ifstream fp("book.txt");
if (fp.is_open() == false)return;
for (i = 0; !fp.eof(); i++)
{
fp.read((char*)&book[i], sizeof(Book));
}
fp.close();
bnum = i-1;
}
void Admin::AddBook()
{
system("cls");
cout << "请输入新增图书书号:";
cin >> book[bnum].no;
cout << "请输入新增图书书名:";
cin >> book[bnum].book_name;
cout << "请输入新增图书作者:";
cin >> book[bnum].writer_name;
cout << "请输入新增图书数量:";
cin >> book[bnum].count;
cout << "添加成功!" << endl;
bnum++;
system("pause");
}
void Admin::SaveUser()
{
int i;
ofstream fp("user.txt");
for (i = 0; i < unum; i++)
{
fp.write((char*)&user[i], sizeof(User));
}
fp.close();
}
void Admin::LoadUser()
{
int i;
ifstream fp("user.txt");
if (fp.is_open() == false)return;
for (i = 0; !fp.eof(); i++)
{
fp.read((char*)&user[i], sizeof(User));
}
fp.close();
unum = i-1;
}
void Admin::AddUser()
{
system("cls");
cout << "请输入新增用户ID:";
cin >> user[unum].id;
cout << "请输入新增用户姓名:";
cin >> user[unum].name;
user[unum].num = 0;
cout << "注册成功!" << endl;
unum++;
system("pause");
}
void Admin::Run()
{
do
{
menu();
if (choice == "A" || choice == "a")
{
AddUser();
}
if (choice == "B" || choice == "b")
{
AddBook();
}
if (choice == "C" || choice == "c")
{
BorrowBook();
}
if (choice == "D" || choice == "d")
{
BackBook();
}
if (choice == "E" || choice == "e")
{
PrintUser();
}
if (choice == "F" || choice == "f")
{
SelectBookName();
}
if (choice == "G" || choice == "g")
{
PrintAllUserBook();
}
if (choice == "H" || choice == "h")
{
PrintBookRec();
}
if (choice == "I" || choice == "i")
{
SelectBook();
}
if (choice == "J" || choice == "j")
{
PrintUserRec();
}
if (choice == "K" || choice == "k")
{
PrintUser2();
}
} while (choice != "Q" && choice != "q");
}
void Admin::menu()
{
system("cls");
cout << "A:新增用户" << endl;
cout << "B:新增图书" << endl;
cout << "C:用户借书" << endl;
cout << "D:用户还书" << endl;
cout << "E:查询用户" << endl;
cout << "F:查询书籍" << endl;
cout << "G:显示所有用户及书籍" << endl;
cout << "H:查询某书借阅记录" << endl;
cout << "I:查询某书是否可借" << endl;
cout << "J:查询用户借阅记录" << endl;
cout << "K:按姓名查询用户" << endl;
cout << "Q:退出" << endl;
cout << "请输入选择:";
cin >> choice;
}
int main()
{
Admin* admin= new Admin;
admin->Run();
admin->~Admin();
return 0;
}