前言
前不久看了B站黑马教程的通讯管理系统,正好Java老师让我们做一个图书管理的小demo,尝试用c++(其实不算是,主要思想还是面向过程)实现一下吧,可以练习一下结构体的使用。语言表达有限望理解。
具体实现
结构体设计
做这个案例首先要设计足够好的结构体,就像打地基一样,如果地基打的乱七八糟,想必你写到一半就会写不下去或者代码到处出错崩溃掉。
我的结构体主要是三个部分:
首先是一个图书列表的结构体,该结构体包含一个图书列表的数组和记录该数组长度(一共有多少种书)的size。
其次是一个图书的结构体,包含图书的名称,作者,编号,以及该书的数量。下来是一个记录该书的借阅名单的数组及借阅的人数p_size。
最后是一个人员的结构体,包含两个内容,人员名称和借出该书的本数。
如果还比较蒙圈,可以看一下下边的绘图,可以一目了然了。
#define MAX 100
struct person {
string p_name;
//这个人借了多少本
int borrowCount;
};
struct book {
string name;
string author;
//编号
string num;
int count;
//谁借了这本书
struct person personArray[MAX];
int p_size;
};
struct bookList {
//都有哪些书
struct book bookArray[MAX];
int size;
};
main()函数实现
首先简单敲一个菜单。
main()部分,创建一个bookList结构体变量bl,初始化书本列表为0。
接下来就是展示菜单,收集用户输入的选项,根据用户输入,跳转到不同功能函数的入口。这部分用一个死循环while(true){}包裹起来。因为我们不能只允许用户输入一次选项就让整个程序跑完,这肯定是不合理的。但什么时候跳出这个循环让程序结束,设置case 0 退出的选项,直接return 0;程序结束。如果用户输入非法的选项,我们也要提醒一下让重新输入。
//显示菜单
void showMenu() {
cout << "********************" << endl;
cout << "**** 1.添加图书 ****" << endl;
cout << "**** 2.图书列表 ****" << endl;
cout << "**** 3.查找图书 ****" << endl;
cout << "**** 4.借阅图书 ****" << endl;
cout << "**** 5.归还图书 ****" << endl;
cout << "**** 6.删除图书 ****" << endl;
cout << "**** 0.退出系统 ****" << endl;
cout << "********************" << endl;
}
int main() {
//初始化一个图书列表
bookList bl;
bl.size = 0;
//用户输入的选项
int select = 0;
while (true) {
//展示菜单
showMenu();
cout << "请输入您的选项" << endl;
cin >> select;
switch (select)
{
case 1:
//添加图书
addBook(&bl);
break;
case 2:
//展示所有图书列表
showBook(&bl);
break;
case 3:
//查找某一本图书
findBook(&bl);
break;
case 4:
//借阅图书
borrowBook(&bl);
break;
case 5:
//返还图书
returnBook(&bl);
break;
case 6:
//删除某一个图书
deleteBook(&bl);
break;
case 0:
{
system("pause");
return 0;
}
break;
default:
cout << "输入有误,重新输入" << endl;
system("pause");
system("cls");
break;
}
}
system("pause");
return 0;
}
添加图书函数实现
效果展示
我们要传入刚开始创建的结构体变量bl。其他的函数也类似,我们的所有操作都基于这个结构体变量bl,都是在增删改查这个bl里的数据。
做这个函数之前,我们先实现一个用于判断图书馆列表中有没有某种书的函数,如果有就返回这个书籍在bookArray里的下标,如果没有返回-1。。为什么要做这个函数,如果你要添加这本书本来图书馆就有了,那么你如果只是做一个简单的追加在bookArray结尾,是不是会出现书籍重复的现象。所以我们要先把bookArray过滤一遍,如果要添加的书本来就有了,则提醒用户"该书已存在,请输入要增添的本数",然后修改count即可。这个函数用一个for循环即可,循环次数正好pbl->size次,逐一检查我们已经添加书籍中有没有名字和参数传入的名字相等的。
函数结果用flag接收一下,如果flag值为-1,说明图书馆里没有这本书,则我们在bookArray这个数组后面追这个新的书,让用户依次输入这本书的信息,同时初始化该书借阅列表personArray的长度即p_size为0。这里有一个小技巧,pbl->size本来是记录图书列表bookArray数组的长度,但是同时也是bookArray这个数组最后一个元素再往后一个元素的下标,这让我们的操作就很方便了。添加后记得让pbl->size++。
如果flag值不为-1,则是这本书在图书列表bookArray中的下标。我们需要用户输入增添几本,并把这本书的数量修改一下即可,这里就不用pbl->size++,因为我们没有添加新的书籍,这本书本来就存在了。
最后有一个小操作,system("