图书管理系统设计
题目要求
1、问题描述 :
定义图书类,属性有:书名、出版社、ISBN 号、作者、库存量、价格等信息和相关的 对属性做操作的行为。 主要完成对图书的销售、统计和图书的简单管理。
2、功能要求
(1)销售功能:
购买书籍时,输入相应的 ISBN 号,并在书库中查找该书的相关信息。 如果有库存量,输入购买的册数,进行相应计算。如果库存量不够,给出提示信息,结束购 买。
(2)图书简单管理功能:
添加功能:主要完成图书信息的添加,要求 ISBN 号唯一。当添加了重复的编号时,则提示数据添加重复并取消添加。
查询功能:可按书名、ISBN 号、作者、出版社进行查询。若存在相应信息,输出所查 询的信息,若不存在该记录,则提示“该标题不存在!”。
修改功能:可根据查询结果对相应的记录进行修改,修改时注意 ISBN 号的唯一性。
删除功能:主要完成图书信息的删除。输入要删除的 ISBN 号,根据编号删除该物品的 记录,如果该编号不在物品库中,则提示“该编号不存在”。
(3)统计功能。 输出当前书库中所有图书的总数及详细信息;可按书的价格、库存量、作者、出版社进 行统计,输出统计信息时,要按从大到小进行排序。
(4)图书存盘:将当前程序中的图书信息存入文件中。
(5)读出信息:从文件中将图书信息读入程序。
思路分析
图书管理系统肯定要定义“书”类啦~大概有这些属性叭。
再分析功能要求,大概这个系统是这样
大致将各个模块分了出来,接下来就开始实现了!
各个模块的实现
“书”类的创建
这个简单,就这几个属性,直接上代码
class Book
{
public:
Book();
~Book();
string name;
int ISBN;
int price;//价格
string writer;//作者
string publishingHouse;//出版社
int inStock; //库存
};
就把他放在Book.h 头文件吧
管理模块的创建及实现
管理权限
定义bool类函数来判断用户输入的密码是否正确,随便写一字符串就好
bool quanxian()
{
cout << "请输入密码来证明您的权限" << endl;
string c;
cin >> c;
return c == "73748156";
}
添加图书
接下来是添加一本书,先声明一个临时的Book类型变量,然后依次读入他的各个属性,一定要注意判断ISBN号是否唯一
先写一个判断ISBN号是否唯一的函数
int isExist(int isbn, vector<Book>& b)
{
for (auto& i : b) {
//遍历这个Book类vector,判断ISBN是否唯一
if (i.ISBN == isbn)return -1;
}
return 0;
}
然后写添加书籍名称的函数
void addBookName(vector<Book>& b, Book& c) {
string name;
cout << "请输入书名" << endl;
cin >> name;
c.name = name;
}
添加ISBN的函数,在其中插入判断ISBN是否唯一的函数
void addBookIsbn(vector<Book>& b, Book& c) {
int isbn;
cout << "请输入ISBN号" << endl;
while (true)
{
cin >> isbn;
if (isExist(isbn, b) == -1)cout << "ISBN号重复,请重新输入" << endl;
else break;
}
c.ISBN = isbn;
}
添加作者的函数
void addBookWriter(vector<Book>& b, Book& c) {
string writer;
cout << "请输入作者" << endl;
cin >> writer;
c.writer = writer;
}
添加出版社的函数
void addBookPublishingHouse(vector<Book>& b, Book& c) {
string chubanshe;
cout << "请输入出版社" << endl;
cin >> chubanshe;
c.publishingHouse = chubanshe;
}
添加库存的函数
void addBookInStock(vector<Book>& b, Book& c) {
int kucun;
cout << "请输入库存" << endl;
cin >> kucun;
c.inStock = kucun;
}
添加价格的函数
void addBookPrice(vector<Book>& b, Book& c) {
int jiage;
cout << "请输入价格" << endl;
cin >> jiage;
c.price = jiage;
}
最后一起调用,做添加图书的总函数
void addBook(vector<Book>& b) {
Book newbook;//声明一个Book类变量
addBookName(b, newbook);
addBookIsbn(b, newbook);
addBookWriter(b, newbook);
addBookPublishingHouse(b, newbook);
addBookInStock(b, newbook);
addBookPrice(b, newbook);
//将信息读取到newbook变量中
b.push_back(newbook);
//再将newbook添加到Book类vector中
cout << "添加成功" << endl;
}
这样就可以添加图书了
查找图书
查找图书肯定要按多种条件查找
先做一个菜单
void showMenu4()
{
cout << "*************************************" << endl;
cout << "*** 请选择您检索书籍的方式 *******" << endl;
cout << "*** 通过书名查找请按1 ******" << endl;
cout << "*** 通过IBSN号查找请按2 ******" << endl;
cout << "*** 通过作者查找请按3 ******" << endl;
cout << "*** 通过出版社查找请按4 ******" << endl;
cout << "*** 退出查找请按0 *******" << endl;
cout << "***********************************" << endl;
}
理科生整的菜单没有美感。。。。。。。
接下来需要考虑的问题是书籍信息重复问题
书名会重,一个作者会写好多本书,出版社也肯定不会只出一本书
考虑到上述情况,查找结果可能不止一本书
故在查找函数内部再声明一个Book类的vector,
将查到的书存在里边,然后再做第二次确认
还是先做查找书名的函数,参数传两个Book类的vector
void findBookName(vector<Book>& b, vector<Book>& c) {
string name;
cout << "请输入您要查找的书籍名称" << endl;
cin >> name;
for (auto& i : b) {
if (i.name == name)
{
c.push_back(i);
}
}
}
然后是查找作者的函数
void findBookWriter(vector<Book>& b, vector<Book>& c) {
string writer;
cout << "请输入您要查找的书籍作者" << endl;
cin >> writer;
for (auto& i : b) {
if (i.writer == writer)
{
c.push_back(i);
}
}
}
还有查找出版社的函数
void findBookPublishingHouse(vector<Book>& b, vector<Book>& c) {
string chubanshe;
cout << "请输入您要查找的书籍出版社" << endl;
cin >> chubanshe;
for (auto& i : b) {
if (i.publishingHouse == chubanshe)
{
c.push_back(i);
}
}
}
最后是查找ISBN的函数,ISBN肯定是唯一的
所以这种检索方式是最准确的
但是为方便后续操作
依旧传两个vector
void findBookIsbn(vector<Book>& b, vector<Book>& c) {
cout << "请输入您要查找的书籍ISBN" << endl;
int ISBN;
cin >> ISBN;
for