本题为某大学大一的程序设计大作业,最后的得分为86分/100分。
作者认为可以将它发出来,为有需要的同学,特别是该大学该门科目的后继者提供帮助与解答。
由于作者水平有限,所用思想很朴素,写法很基础,代码很普通。请大佬海涵。
完成者:Eliack & Arcticwolf (特别感谢Eliack的主要贡献)
如图,改了好多个版本呜呜,小蒟蒻的摸索之路远啊。
H大学图书馆
H大学图书馆邀请你建立一个图书馆信息管理系统。请使用面向对象思想完成该问题,具体要求如下:
一、设计一款文字式交互的图书管理系统;
三、图书信息包含:
四、图书馆系统提供两种用户模式,请为他们设计不同的用户类:
1)管理员模式:
2)学校用户模式(学校用户超过5千人):
五、设计图书馆类,包含馆藏图书列表、用户列表等成员、在馆记录、用户借阅记录等。
六、图书馆系统提供根据任一信息的搜索图书功能:
在以上每一级时,均会出现该级所有数目,字典排序,按页显示;
不明白意思的同学,可以自行登入学校图书馆系统,进入搜索书目功能中,点击分类导航选项,然后进入每级分类的页面看看
七、加分项(总分不超过100分)
(1)支持大数据,比如书籍记录突破百万,用户数量突破万级规模;
(2)贴近实际的图书馆管理系统,新增若干功能等;
(3)实现文件的创建、读、写等操作;
(4)考虑用户体验,如使用方便度等;
(5)搜索时性能考察,调查、思考、设计加强搜索性能的方式,此项仅适合学有余力的同学;
八、完成进度建议和自查评分
1、第一阶段,需要完成一万的图书存储;该功能需要至少设计并完成图书类与图书馆系统类的相关部分(包括相关实验报告、代码和测试);
2、第二阶段,完成两种用户模式,欠搜索功能(包括相关实验报告、代码和测试);
3、第三阶段,搜索功能(包括相关实验报告、代码和测试);知识点:文件、排序。
九、验收安排
1、第16周小班课上小组汇报,15周周五之前向助教申请,若无申请则随机指定,每班不超过4组。
2、未在课上进行汇报的,请于第16周内和助教预约验收时间与方式。
封面
目录
图书管理系统
1、 问题描述
2、 分析设计
思路分析及原理
数据结构的定义
函数设计、参数规格以及返回类型:
1. 全局变量部分
2. 类
1. book类
2. user类
3. administrator类
4. record类
5. library类
3、运行测试
一、登录页面
二、用户模式
1. 修改密码
2. 搜索图书
3. 借图书
4. 还图书
5. 查看借阅记录
0. 退出登录
三、管理员模式
1. 管理用户账号
2. 修改图书信息
3. 搜索图书信息
4. 查看借阅情况
5. 查看馆藏图书列表
6. 查看用户列表
0. 退出登录
四、 小彩蛋-开发者信息展示
五、 关于谬误输入性息的处理
1、switch分支的谬误输入性息处理
2、 关于不存在的账户、书籍信息的处理
3、 关于重置密码时的验证
六、 关于颜色的处理
4、分析与总结
1. 实验分析
2. 遇到的问题
3. 解决的办法
4. 学习到的新知识点
H大学图书馆邀请你建立一个图书馆信息管理系统。请使用面向对象思想完成该问题,具体要求如下:
一、设计一款文字式交互的图书管理系统;
二、图书馆必须支持至少10000册书存储,如果可实现书籍可动态增长,加分
三、图书信息包含:
四、图书馆系统提供两种用户模式,请为他们设计不同的用户类:
1)管理员模式:
2)学校用户模式(学校用户超过5千人):
五、设计图书馆类,包含馆藏图书列表、用户列表等成员、在馆记录、用户借阅记录等。
六、图书馆系统提供根据任一信息的搜索图书功能:
七、加分项(总分不超过100分)
(1)支持大数据,比如书籍记录突破百万,用户数量突破万级规模;
(2)贴近实际的图书馆管理系统,新增若干功能等;
(3)实现文件的创建、读、写等操作;
(4)考虑用户体验,如使用方便度等;
(5)搜索时性能考察,调查、思考、设计加强搜索性能的方式,此项仅适合学有余力的同学;
要建立一个图书馆信息管理系统。自然有图书book类,用户user类,管理员administrator类。为了将他们统一,还得有一个图书馆library大类
图书馆要实现两种用户模式和一系列功能。开始时需要有一个菜单供使用者选择,显示这个菜单的功能作为library类中的一个成员函数。选择不同的模式则通过switch,case的结构来实现。
当选择某种模式时,会出现账号密码登录的界面,代码直接写在main函数中。
登陆后要提示使用者该种模式的各种功能。选择不同的功能同样使用switch,case结构。
当修改数据结构中的某个数据时或者添加某个新数据时,需要将数据保存到txt中,因此要用到读文件和写文件,为了不混淆各种类的读文件和写文件,则每个类都有读文件和写文件函数
当执行功能时,融合清屏,暂停等操作实现界面的整洁;通过goto可以随时返回到执行的上一页。
均定义在library的大类中
(规模可达到10万及以上)
在main函数所在cpp中,main函数外定义了一个图书馆library类的全局变量hnu.。
1.类
1.book类
属性:题目string topic、ISBN/ISSN string type、作者 string writer、分类号
string category、借出状态int state、借阅者账号 long ownerid。
2.user类
属性:账号long account、密码string password。
成员函数:void usermenu() 显示用户功能菜单
3.administrator类
属性:账号long account、密码string password。
成员函数:void administratormenu() 显示管理员功能菜单
void manage_accountmenu() 显示管理用户系列功能菜单
void modify_bookmenu() 显示管理图书系列功能菜单
void book_management_menu();显示修改图书信息界面菜单
4.record类
属性:账号long ownerid、题目string topic、作者string writer、借阅状态 int
state.。
5.library类
属性:书的数量 int booksnum、借阅记录的数量int recordnum、用户的数量int usernum、管理员的数量int adminnum、书类数组book booksarray[10000]、用户类数组user userarray[8000]、管理员类数组administrator adminarray[100]、借阅记录类数组record recordarray[10000]。
成员函数:(选择类内声明,类外定义分文件编写)
//user.h
library(); 构造函数
void iniuser(); 从文件中读用户信息函数
void save(); 从文件中写用户信息函数
//library.cpp
void signmenu(); 显示登录界面菜单
void zongmenu(); 显示用户模式菜单
void checkmenu(); 显示检索信息种类菜单
void xinxitypemenu(); 显示检索信息种类菜单
//void developerinfor();显示开发者函数
//books.h
int getbooksnum(); 获取图书数量函数
void inibooks(); 从文件中读图书信息函数
void booksave(); 从文件中写图书信息函数
void showbook(book Book); 展示图书信息函数
void search(); 图书搜索函数
void borrowbook(long); 借图书函数
void givebook(long); 还图书函数
//borrowrecord.h
void userborrowrecord(long); 显示特点借阅者的借阅记录
void allborrowrecord(); 显示所有借阅记录函数
void recordsave(book); 从文件中写借阅记录函数
void inirecord(); 从文件中读借阅记录函数
int getrecordnum(); 获取借阅记录数量函数
//login_check.h
int login_user(int account,string password);
判定用户是否登陆成功,否则返回错误类型
int login_admin(int account,string password);
判定管理员是否登陆成功,否则返回错误类型
//admin.h
void admin_save(); 从文件中写管理员信息函数
void iniadmin(); 从文件中读管理员信息函数
void addaccount(); 添加新用户函数
void deleteaccount(); 删除某用户函数
void modifypassword(); 修改用户信息函数
void resetpassword(); 恢复默认账号密码函数
void addbook(); 添加图书函数
void deletebook(); 删除图书函数
void modifybook(); 修改图书信息函数
显示登录菜单
使用library类中的signmenu()成员函数
显示用户功能菜单
使用library类中的usermenu()成员函数
直接在main函数中进行修改
修改好后使用usersave()函数进行保存
并且返回上一级用户模式功能目录
使用library中search()成员函数进行搜索
其中要用到显示信息种类xinxitype()函数提示搜索所用到的的信息、
提醒输入不同的数字以代表不同的搜索信息。
搜索后返回用户功能界面。
1.题名搜索
2.ISBN/ISNN搜索
3.作者搜索
4.分类号搜索
这里要用到三级分类号搜索,由于分类号的格式是固定的且在txt中是一个字符串,所以需要提取各个位置的字符串以分离各级分类号,这里写了一个函数以分离各级分类号,在搜索中依次检索各级分类号,并且搜索到的书籍若大于10,又融合清屏等操作模拟了翻页。
同样是四种信息来搜索图书从而借图书,而在借图书中通过四种信息来借图书都是类似的,这里只放一个代码。
当用户输入书的编号选择借书时,会判断书籍是否已经被借阅,如果已经借阅则会提示,借阅后返回用户功能界面。
首先要显示该用户已经借阅的书籍,然后会提示归还书籍
还图书后会返回用户功能界面。
显示某个用户的借阅记录
查看完后会返回用户功能界面。
通过goto返回上一级
显示用户功能菜单
使用library类中的administratormenu()成员函数
1.添加用户账号
在上级目录“管理用户账号”下选择该功能后,自动调用addaccount函数,实现后返回清屏并返回上级目录“管理用户账号”。
首先需要判断用户规模是否已达上限,达到上限后将不能添加;
然后有一个账号查重的问题,如果即将要添加的账户与已经存在的账户重复,需要提示并让管理员重新添加;
若都无问题,则提示管理员输入密码并保存进现行数组,并及时保存至txt文件内;
2.删除用户账号
在上级目录“管理用户账号”下选择该功能后,自动调用deleteaccount函数,实现后返回清屏并返回上级目录“管理用户账号”。
首先需要判断该账户是否存在,如果该账户不存在,则输出“未找到该账户”,并返回上级目录;若该账户存在,则将该账户的account值赋为0表示该账户已经被删除。
3.重置用户密码
在上级目录“管理用户账号”下选择该功能后,自动调用modifypassword函数,实现后返回清屏并返回上级目录“管理用户账号”。
首先搜索需要重置的账号,若账户不存在,则输出“未找到该账号”并返回;
找到该账户后需要两次读入新密码,若两次读入的新密码不一致,则修改失败,需要重新进行该操作,若两次读入的密码一致则表示修改成功,先存储该密码,并保存至本地txt,然后返回上级目录
4.初始化用户密码
在上级目录“管理用户账号”下选择该功能后,自动调用resetpassword函数,实现后返回清屏并返回上级目录“管理用户账号”。
初始化用户密码的作用是将所有的用户密码全部重置为初始密码123456,若需要局部初始密码,在修改账户密码界面单独修改即可。
步骤比较简单,容易理解。
0.返回上级目录
在“管理用户账号”下选择该功能后,自动返回上级目录“管理员模式主菜单界面”。
在上级目录“修改图书信息”下选择该功能后,自动调用addbook函数,实现后返回清屏并返回上级目录“修改图书信息”。
按照格式,将书籍信息分条读入,再保存至本地txt即可
2.删除图书信息
在上级目录“修改图书信息”下选择该功能后,自动调用deletebook函数,实现后返回清屏并返回上级目录“修改图书信息”。
首先要找到该图书,然后再进行删除的操作
支持使用多种方式(共4种信息种类)查询该图书,下面仅以“标题”信息类为例,其余几种类别实现方式大致相同。
在搜索成功之后询问是否确定删除,若否则退出操作,若确定删除则将该书的各类信息赋为空,表示该图书已经被删除。
3.修改图书信息
在上级目录“修改图书信息”下选择该功能后,自动调用modifybook函数,实现后返回清屏并返回上级目录“修改图书信息”。
首先要找到该图书,然后再进行修改的操作。
支持使用多种方式(共4种信息种类)查询该图书,下面仅以“标题”信息类为例,其余几种类别实现方式大致相同。
在搜索成功之后询问是否确定修改,若否则退出操作,若确定则还需读入需要修改的信息的种类。
以下这段代码实现了上述的过程
在确定了修改信息的种类之后需要读入修改信息的结果并完成修改,即现在现行数组进行修改,再保存至本地txt。
以下这段代码实现了上述的过程
0.返回上一级目录
在“修改图书信息”下选择该功能后,自动返回上级目录“管理员模式主菜单界面”。
以下代码实现了调用search函数来搜索特定图书的功能,功能完成后将返回上级目录。
由于在search的功能上,管理员所需要的功能与用户的功能大致相同,所以该函数将直接跳转至用户模块的搜索函数,具体代码以及过程详解详见用户模块。
以下代码实现了调用allborrowrecord函数来展现所有已经被借阅的图书的功能,功能完成后将返回上级目录。
以下代码实现了输出借阅日志(也就是所有借阅的记录)的功能
该功能可以查看本馆的所有藏书,进入该功能后,将调用showbooklist函数来展示所有书籍的信息,展示完毕后将返回上一级目录。
以下代码实现了管理员状态下所有书籍的信息的展示。
该功能可以查看本馆的所有用户,进入该功能后,将调用showuserlist函数来展示所有用户的信息,展示完毕后将返回上一级目录。
以下代码实现了管理员状态下所有用户的信息的展示。
该功能可以注销管理员的登录状态,返回统一登陆界面。
以下代码将实现前往开发者信息界面
以下为开发者信息的主界面
为保护隐私,作者相关信息已做打码处理
因为涉及到按键选择功能,所以本系统不可避免地涉及到许多分支,在这些分支的统筹上,采取switch语句来操作,但不可避免地有可能输入在允许范围之外的其他数字,此时我们设置了default语句并让程序返回该层初始状态,提示输入格式错误,并让操作者重新输入。
例如user目录下的default语句
又如管理员模式-账号设置下的default语句
再如管理员模式-书籍信息设置下的default语句
再如管理员模式的default语句
再如初始登录界面下的default语句
这些default语句保证了程序的可延续性,避免了因操作不当产生的bug使程序轻易地崩溃,从而给用户带来不好的体验。
输入的该类信息首先将被纳入搜索中,如果在记录中没有成功搜索到,将返回相关的信息,避免用户不知情而继续产生错误的操作。
如在借书过程中未能成功搜索到该书
又如在管理员模式下搜索账户时未能成功找到目标账户
再如在用户与管理员登陆时输入的账户或者密码出现问题
这种情况下,我们设置了如下的两个函数来进行判断,分别对应不同的错误类型返回不同的值,再将操作者的错误种类输出,提示操作者改正。
设置密码时,习惯上需要输入密码与确认密码,以保证密码的绝对准确性。但由于给出了初始密码,所以该步仅需要在重置密码时完成。
如管理员修改用户密码时的确认输入密码是否准确
又如用户在重置密码时需要确认密码输入是否正确
在原程序的主函数上加上如下代码可以实现变色的效果。
1.本次综合实验我觉得理清思路,框架后其实并不难,与一些考数学的编程题不同,本次图书管理系统更注重将平时所学到的编程知识应用到实践中。
2.本次实验我们选择的数据结构是数组,复杂性不及链表等其他数据结构。但是对于本次所实现的相对较简单的功能来说,我认为使用数组已经游刃有余,十分简便,同时也便于维护、易于理解。
3.读写文件在本次实验中显得十分重要,为了使程序每次运行都能保留数据,需要用到
4.封装的思想是十分重要的,在本次工程编写中,会遇到许多可能有交集的、思想重复的代码,如果没有之前编写的代码的封装化与直接调用,代码量将大大加大,这对程序的实现与维护是大大不利的。同时结构体与类的大量运用,使数据与过程紧密结合,同时规范化,形式化,将相关的一类结合在一起,便于维护与代码的修改。
1.fstream读写文件
2.提取一个字符串里某个区域之间的字符串
(三级分类搜索图书时要用到)
3.system相关操作指令system(“pause”)和system(“cls”)
这些操作是必要的,在显示方面对用户比较友好。
4.“goto sign1”与“sign1:”,这种代码中跳跃的方式虽然不推荐在平时的课内学习中使用,但真的用在实践中是十分方便的。不然没法解决返回上一级目录的问题。
5.HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);实现变色的效果。
#include
#include"library.h"
#include"books.h"
#include"borrowrecord.h"
#include"user.h"
#include"admin.h"
#include"login_check.h"
#include"showlist.h"
#include
using namespace std;
void colour(int x)
{
HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(h,x);
}
library hnu;
int main(){
colour(11);
sign: //登录界面
hnu.signmenu();
int signselect;//选择登录方式
cin>>signselect;
user a;
administrator b;
string tempstr1,tempstr2;
switch(signselect)
{
case 1://用户模式
cout<<"请输入账号:"<>a.account;
cout<<"请输入密码:"<>a.password;
cin.get();
//(a.account>=20210000&&a.account<=20214999)&&a.password==hnu.userarray[a.account-20210000].password
if(hnu.login_user(a.account,a.password)==1){
system("cls");
cout<<"登录成功"<>userselect;
switch(userselect)
{
case 1://修改密码
again:
system("cls");
cout<<"请输入新密码:"<>tempstr1;
cout<<"请确认你的新密码:"<>tempstr2;
if (tempstr1==tempstr2)
{
hnu.userarray[temp_account].password=tempstr1;
}
else goto again;
hnu.save();
cout<<"修改成功"<>temp4;
if (temp4==1)
{
cout<<"退出登录成功,即将返回登录界面"<>b.account;
cout<<"请输入密码:"<>b.password;
if (hnu.login_admin(b.account,b.password)==1)
{
system("cls");
cout<<"登录成功"<>adminselect;
system("cls");
switch(adminselect)
{
case 1:
accountmenufunc://第二级目录
hnu.adminarray[b.account].manage_accountmenu();
int temp;
cin>>temp;
switch(temp)
{
case 1:
hnu.addaccount();
system("pause");
system("cls");
goto accountmenufunc;//返回第二级目录
break;
case 2:
hnu.deleteaccount();
system("pause");
system("cls");
goto accountmenufunc;//返回第二级目录
break;
case 3:
hnu.modifypassword();
system("pause");
system("cls");
goto accountmenufunc;//返回第二级目录
break;
case 4:
hnu.resetpassword();
system("pause");
system("cls");
goto accountmenufunc;//返回第二级目录
break;
case 0:
cout<<"即将返回上级目录"<>temp5;
switch(temp5)
{
case 1:
hnu.addbook();
system("pause");
system("cls");
goto bookmanagement;//返回第二级目录
break;
case 2:
hnu.deletebook();
system("pause");
system("cls");
goto bookmanagement;//返回第二级目录
break;
case 3:
hnu.modifybook();
system("pause");
system("cls");
goto bookmanagement;//返回第二级目录
break;
case 0:
cout<<"即将返回上级目录"<>temp3;
if (temp3==1)
{
cout<<"退出登录成功,即将返回登录界面"<
#include"library.h"
using namespace std;
//用于做显示的界面
void library::zongmenu(){
cout<<"********************************"<
#include
#ifndef Library_H
#define Library_H
#include
#define FILENAME "empFile.txt"
#define FILEname "books.txt"
#define filename "borrowrecord.txt"
#define a_acount "adminaccount.txt"
using namespace std;
class book{
public:
string topic;
string type;
string writer;
string category;
int state;
long ownerid;
};
class user{
public:
long account;
string password;
void usermenu();
};
class administrator{
public:
long account;
string password;
void administratormenu();
void manage_accountmenu();
void book_management_menu();
};
class record{
public:
long ownerid;
string topic;
string writer;
string category;
int state;
};
class library{
public:
int booksnum;
int recordnum;
int usernum;
int adminnum;
book booksarray[100000];
user userarray[8000];
administrator adminarray[100];
record recordarray[100000];
//user.cpp
void iniuser();
void save();
library();
void iniadmin();
//library.cpp
void zongmenu();
void checkmenu();
void signmenu();
void xinxitypemenu();
void allborrowrecord();
void showbooklist();
void showuserlist();
//books.cpp
int getbooksnum();
void inibooks();
void booksave();
void showbook(book Book);
void search();
void borrowbook(long);
void givebook(long);
//borrowrecord.cpp
void userborrowrecord(long);//new
void recordsave(book);
void inirecord();
int getrecordnum();
//login_check
int login_user(int account,string password);
int login_admin(int account,string password);
//admin.h
void admin_save();
void admin_out();
//account
void addaccount();
void deleteaccount();
void modifypassword();
void resetpassword();
//developerinfor
void developerinfor();
//book_manage
void addbook();
void deletebook();
void modifybook();
};
#endif
#include"library.h"
#include
#include
#include
using namespace std;
string match(string s,int begin,int end){
string temp="";
for(int i=begin;i>topic1&&ifs>>type1&&ifs>>writer1&&ifs>>category1&&ifs>>state1&&ifs>>ownerid1){
num++;
}
return num;
}
void library::inibooks() {//读文件
ifstream ifs;
ifs.open(FILEname,ios::in);
string topic1;
string type1;
string writer1;
string category1;
int state1;
long ownerid1;
int i = 0;
while (ifs>>topic1&&ifs>>type1&&ifs>>writer1&&ifs>>category1&&ifs>>state1&&ifs>>ownerid1) {
booksarray[i].topic=topic1;
booksarray[i].type=type1;
booksarray[i].writer=writer1;
booksarray[i].category=category1;
booksarray[i].state=state1;
booksarray[i].ownerid=ownerid1;
i++;
}
ifs.close();
return;
}
//写文件
void library::booksave(){
ofstream ofs;
ofs.open(FILEname,ios::out);//用输出的方式打开文件--写文件
//将每个人的数据写入到文件中
for (int i = 0; ibooksnum; i++){
ofs<xinxitypemenu();
cout<<"输入信息的种类"<>xinxitype;
if(xinxitype==1){
cout<<"请输入题名"<>topic_;
int i=0;
for(;ibooksnum;i++){
if(topic_==this->booksarray[i].topic){
this->showbook(this->booksarray[i]);
return;
}
}
cout<<"找不到该书"<>type_;
int i=0;
for(;i<=this->booksnum;i++){
if(type_==this->booksarray[i].type){
this->showbook(this->booksarray[i]);
return;
}
}
cout<<"找不到该书"<>writer_;
int i=0;
int sum1=0;
for(;i<=this->booksnum;i++){
if(writer_==this->booksarray[i].writer){
sum1++;
cout<showbook(this->booksarray[i]);
}
}
if(sum1==0){
cout<<"找不到该作者的书籍"<>onecategory_;
onesearch:int sum1=0;
for(int i=0;i<=this->booksnum;i++){
if(onecategory_[0]==this->booksarray[i].category[0]){
sum1++;
cout<showbook(this->booksarray[i]);
if(sum1%10==0){
cout<>select;
if(select==1){a1=1;system("pause");system("cls");goto search2;}
if(select==2){a1=2;system("pause");system("cls");goto search2;}
if(select==3){system("pause");system("cls");}
}
}}
if(sum1==0){cout<<"没有找到书籍"<>a1;
search2: if(a1==1){
system("cls");
cout<<"请输入二级分类号"<>twocategory_;
twosearch:int sum2=0;
for(int i=0;i<=this->booksnum;i++){
int end1=booksarray[i].category.find("/");
string p=match(booksarray[i].category,1,end1);
if(onecategory_[0]==this->booksarray[i].category[0]&&twocategory_==p){
sum2++;
cout<showbook(this->booksarray[i]);
if(sum2%10==0){
cout<>select;
if(select==1){a2=1;system("pause");system("cls");goto search3;}
if(select==2){a2=2;system("pause");system("cls");goto search3;}
if(select==3){a2=3;system("pause");system("cls");goto search3;}
if(select==4){system("pause");system("cls");}
}
}}
if(sum2==0){cout<<"没有找到书籍"<>a2;
search3: if(a2==1){
system("cls");
cout<<"请输入三级分类号"<>threecategory_;
threesearch:int sum3=0;
for(int i=0;i<=this->booksnum;i++){
int begin=booksarray[i].category.find("/")+1;
int end=booksarray[i].category.size();
string p1=match(booksarray[i].category,1,begin-1);
string p2=match(booksarray[i].category,begin,end);
if(onecategory_[0]==this->booksarray[i].category[0]&&twocategory_==p1&&threecategory_==p2){
sum3++;
cout<<1<<".";
this->showbook(this->booksarray[i]);
}}
if(sum3==0){cout<<"没有找到书籍"<>a3;
if(a3==1) goto twosearch;
else if(a3==2) return;
else{
system("cls");
goto threesearch;
}
}else if(a2==2) goto onesearch;
else if(a2==3) return;
else{
system("cls");
goto twosearch;
}
}else if(a1==2){
return;
}else{
system("cls");
goto onesearch;
}
}else{
goto searchfunc;
}}
//借图书
void library::borrowbook(long id){
borrowfunc: system("cls");
cout<<"你要借出哪本图书?请搜索"<xinxitypemenu();
cout<<"输入信息的种类"<>xinxitype;
if(xinxitype==1){
cout<<"请输入题名"<>topic_;
int i=0;
for(;ibooksnum;i++){
if(topic_==this->booksarray[i].topic){
cout<<"搜索成功"<showbook(this->booksarray[i]);
if(this->booksarray[i].state==1){
cout<<"你确定要借该书吗? 借书请输入1,否则输入0"<>borrow;
if(borrow){
cout<<"你已成功借出"<<"《"<booksarray[i].topic<<"》"<booksarray[i].state=0;
this->booksarray[i].ownerid=id;
this->booksave();
recordarray[recordnum].ownerid=id;
recordarray[recordnum].topic=booksarray[i].topic;
recordarray[recordnum].writer=booksarray[i].writer;
recordarray[recordnum].category=booksarray[i].category;
recordarray[recordnum].state=0;
recordnum++;
this->recordsave(booksarray[i]);
return;
}else{
cout<<"你已取消本次操作"<booksarray[i].state==0){
cout<<"已借出,你不可借阅"<>type_;
int i=0;
for(;i<=this->booksnum;i++){
if(type_==this->booksarray[i].type){
cout<<"搜索成功"<showbook(this->booksarray[i]);
if(this->booksarray[i].state==1){
cout<<"你确定要借该书吗? 借书请输入1,否则输入0"<>borrow;
if(borrow){
cout<<"你已成功借出"<<"《"<booksarray[i].topic<<"》"<booksarray[i].state=0;
this->booksarray[i].ownerid=id;
this->booksave();
recordarray[recordnum].ownerid=id;
recordarray[recordnum].topic=booksarray[i].topic;
recordarray[recordnum].writer=booksarray[i].writer;
recordarray[recordnum].category=booksarray[i].category;
recordarray[recordnum].state=0;
recordnum++;
this->recordsave(booksarray[i]);
return;
}else{
cout<<"你已取消本次操作"<booksarray[i].state==0){
cout<<"已借出,你不可借阅"<>writer_;
int sum1=0;
for(int i=0;i<=this->booksnum;i++){
if(writer_==this->booksarray[i].writer){
//cout<<"搜索成功"<showbook(this->booksarray[i]);
cout<<" 该书的编号:"<>bianhao;
if(this->booksarray[bianhao].state==1&&this->booksarray[bianhao].writer==writer_){
cout<<"你确定要借书吗? 借书请输入1,否则输入0"<>borrow;
if(borrow){
cout<<"你已成功借出"<<"《"<booksarray[bianhao].topic<<"》"<booksarray[bianhao].state=0;
this->booksarray[bianhao].ownerid=id;
this->booksave();
recordarray[recordnum].ownerid=id;
recordarray[recordnum].topic=booksarray[bianhao].topic;
recordarray[recordnum].writer=booksarray[bianhao].writer;
recordarray[recordnum].category=booksarray[bianhao].category;
recordarray[recordnum].state=0;
recordnum++;
this->recordsave(booksarray[bianhao]);
return;
}else{
cout<<"你已取消本次操作"<booksarray[bianhao].state==0){
cout<<"已借出,你不可借阅"<>category_;
int i=0;
for(;i<=this->booksnum;i++){
if(category_==this->booksarray[i].category){
cout<<"搜索成功"<showbook(this->booksarray[i]);
if(this->booksarray[i].state==1){
cout<<"你确定要借该书吗? 借书请输入1,否则输入0"<>borrow;
if(borrow){
cout<<"你已成功借出"<<"《"<booksarray[i].topic<<"》"<booksarray[i].state=0;
this->booksarray[i].ownerid=id;
this->booksave();
recordarray[recordnum].ownerid=id;
recordarray[recordnum].topic=booksarray[i].topic;
recordarray[recordnum].writer=booksarray[i].writer;
recordarray[recordnum].category=booksarray[i].category;
recordarray[recordnum].state=0;
recordnum++;
this->recordsave(booksarray[i]);
return;
}else{
cout<<"你已取消本次操作"<booksarray[i].state==0){
cout<<"已借出,你不可借阅"<booksnum;i++){
if(this->booksarray[i].ownerid==id){
sum++;
cout<booksarray[i].topic<booksarray[i].type<booksarray[i].writer<booksarray[i].category<>bookid;
cout<<"你已成功归还"<<"《"<booksarray[bookid].topic<<"》"<booksarray[bookid].state=1;
this->booksarray[bookid].ownerid=0;
this->booksave();
sum--;
if(sum>0){
cout<<"请问你是否需要继续归还?1-是 2-否"<>select;
if(select==1)
goto borrowfunc;
else return;}
else return;
}
}
#include"library.h"
using namespace std;
int library::getrecordnum(){//统计记录的数量
ifstream ifs;
ifs.open(filename,ios::in);
long ownerid1;
string topic1;
string writer1;
int state1;
string category1;
int num=0;
while(ifs>>ownerid1&&ifs>>topic1&&ifs>>writer1&&ifs>>category1) {
num++;
}
return num;
}
void library::inirecord(){//读文件
ifstream ifs;
ifs.open(filename,ios::in);
long ownerid1;
string topic1;
string writer1;
int state1;
string category1;
int i = 0;
while(ifs>>ownerid1&&ifs>>topic1&&ifs>>writer1&&ifs>>category1){
recordarray[i].ownerid=ownerid1;
recordarray[i].topic=topic1;
recordarray[i].writer=writer1;
recordarray[i].category=category1;
i++;
}
ifs.close();
return;
}
//写文件
void library::recordsave(book Book){
ofstream ofs;
ofs.open(filename,ios::out|ios::app);//用输出的方式打开文件--写文件
//将每次借阅的数据写入到文件中
ofs<=0;i--){
if(recordarray[i].ownerid==id){
sum++;
cout<
#include
#include"library.h"
using namespace std;
int library::login_user(int account,string password)//用户登录处理
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
long account1;
string password1;
while (ifs >> account1 && ifs >> password1) {
if (account1==account)
{
if (password1==password) {return 1;/*账号、密码正确*/ }
else {return 3;/*账号正确,但密码错误*/ }
}
}
return 2; /*账号格式错误*/
ifs.close();
}
int library::login_admin(int account,string password)//管理员登录处理
{
ifstream ifs;
ifs.open(a_acount, ios::in);
long account1;
string password1;
while (ifs >> account1 && ifs >> password1) {
if (account1==account)
{
if (password1==password) {return 1;/*账号、密码正确*/ }
else {return 3;/*账号正确,但密码错误*/ }
}
}
return 2; /*账号格式错误*/
ifs.close();
}
#include"library.h"
using namespace std;
void library::save() {//写文件
ofstream ofs;
ofs.open(FILENAME, ios::out);//用输出的方式打开文件--写文件
//将每个人的数据写入到文件中
for (int i = 0; i < usernum; i++) {
ofs << userarray[i].account << " "
<< userarray[i].password << endl;
}
ofs.close();
}
void library::iniuser(){//读文件
ifstream ifs;
ifs.open(FILENAME, ios::in);
long account1;
string password1;
int i = 0;
while (ifs >> account1 && ifs >> password1) {
userarray[i].account = account1;
userarray[i].password = password1;
i++;
}
usernum=i;
ifs.close();
return;
}
library::library()//构造函数
{
booksnum=getbooksnum();
recordnum=getrecordnum();
//1、文件不存在
int flag=0;
ifstream ifs;
ifs.open(FILENAME,ios::in);
if(!ifs.is_open()){
flag++;
cout<<"文件不存在"<save();
}
ifstream ifs2;
ifs2.open(a_acount,ios::in);
if(!ifs2.is_open()){
flag++;
cout<<"文件不存在"<admin_save();
}
if(flag==2) return;
文件存在且数据为空
//char ch;
//ifs>>ch;
//if(ifs.eof()){
//cout<<"文件为空"<save();
//ifs.close();}
//3.文件存在,并且记录数据
cout<<"读取文件"<iniuser();
this->inibooks();
this->inirecord();
this->iniadmin();
}
#include"library.h"
using namespace std;
void library::admin_save() {//写文件
ofstream ofs;
ofs.open(a_acount, ios::out);//用输出的方式打开文件--写文件
//将每个人的数据写入到文件中
for (int i = 0; i < 50; i++) {
ofs << adminarray[i].account << " "
<< adminarray[i].password << endl;
}
ofs.close();
}
void library::iniadmin(){//读admin文件
ifstream ifs;
ifs.open(a_acount, ios::in);
long account1;
string password1;
int i = 0;
while (ifs >> account1 && ifs >> password1) {
adminarray[i].account = account1;
adminarray[i].password = password1;
i++;
}
ifs.close();
return;
}
void library::addaccount()//管理员权限::添加账号
{
system("cls");
usernum++;
if (usernum>7999) //处理越界问题
{
cout<<"用户规模已经达到上限,请先删除部分用户"<>userarray[usernum-1].account;
for (int i=0;i<=usernum-2;i++)//处理添加账户重复问题
{
if (userarray[usernum-1].account==userarray[i].account){
cout<<"要添加的账号重复,请重新输入"<>userarray[usernum-1].password;
ofstream ofs;
ofs.open(FILENAME,ios::out|ios::app);
ofs<>temp_account;
for (int i=0;i<=usernum-1; i++)
{
if (userarray[i].account==temp_account)
{
userarray[i].account=0;
this->save();
cout<<"删除成功"<>temp_account;
repasswordfunc:
cout<<"请输入要重置的密码:"<> temp_password;
cout<<"请确认要重置的密码:"<> temp2_password;
if (temp_password!=temp2_password)
{
cout<<"密码不一致,请重新输入密码"<save();
cout<<"修改成功"<save();
ifs.close();
cout<<"初始化所有用户密码成功"<>booksarray[booksnum-1].topic;
cout<<"请输入ISBN/ISSN:"<>booksarray[booksnum-1].type;
cout<<"请输入作者:"<>booksarray[booksnum-1].writer;
cout<<"请输入分类号:"<>booksarray[booksnum-1].category;
booksarray[booksnum-1].state=1;
booksarray[booksnum-1].ownerid=0;
ofstream ofs;
ofs.open(FILEname,ios::out|ios::app);
ofs<xinxitypemenu();
cout<<"输入信息的种类"<>xinxitype;
if(xinxitype==1){
cout<<"请输入题名"<>topic_;
int i=0;
for(;ibooksnum;i++){
if(topic_==this->booksarray[i].topic){
cout<<"搜索成功"<showbook(this->booksarray[i]);
if(this->booksarray[i].state==1){
cout<<"你确定要删除该书吗? 确认请输入1,取消请输入0"<>borrow;
if(borrow){
cout<<"你已成功删除"<<"《"<booksarray[i].topic<<"》"<booksarray[i].topic="";
this->booksarray[i].type="";
this->booksarray[i].writer="";
this->booksarray[i].category="";
this->booksarray[i].state=2;
this->booksarray[i].ownerid=0;
this->booksave();
return;
}else{
cout<<"你已取消本次操作"<>type_;
int i=0;
for(;i<=this->booksnum;i++){
if(type_==this->booksarray[i].type){
cout<<"搜索成功"<showbook(this->booksarray[i]);
if(this->booksarray[i].state==1){
cout<<"你确定要删除该书吗? 确认请输入1,取消请输入0"<>borrow;
if(borrow){
cout<<"你已成功删除"<<"《"<booksarray[i].topic<<"》"<booksarray[i].topic="";
this->booksarray[i].type="";
this->booksarray[i].writer="";
this->booksarray[i].category="";
this->booksarray[i].state=2;
this->booksarray[i].ownerid=0;
this->booksave();
return;
}else{
cout<<"你已取消本次操作"<>writer_;
int sum1=0;
for(int i=0;i<=this->booksnum;i++){
if(writer_==this->booksarray[i].writer){
//cout<<"搜索成功"<showbook(this->booksarray[i]);
cout<<" 该书的编号:"<>bianhao;
if(booksarray[bianhao].writer==writer_){
cout<<"你确定要删除该书吗? 确认请输入1,取消请输入0"<>borrow;
if(borrow){
cout<<"你已成功删除"<<"《"<booksarray[bianhao].topic<<"》"<booksarray[bianhao].topic="";
this->booksarray[bianhao].type="";
this->booksarray[bianhao].writer="";
this->booksarray[bianhao].category="";
this->booksarray[bianhao].state=2;
this->booksarray[bianhao].ownerid=0;
this->booksave();
return;
}else{
cout<<"你已取消本次操作"<xinxitypemenu();
cout<<"输入信息的种类"<>xinxitype;
if(xinxitype==1){
cout<<"请输入题名"<>topic_;
int i=0;
for(;ibooksnum;i++){
if(topic_==this->booksarray[i].topic){
cout<<"搜索成功"<showbook(this->booksarray[i]);
cout<<"你确定要修改该书吗? 确认请输入1,取消请输入0"<>borrow;
if(borrow){
modifyfunc1:
cout<<"信息格式:"<>option;
system("cls");
switch(option)
{
case 1:
cout<<"请输入题名(书名):"<>booksarray[i].topic;
this->booksave();
cout<<"修改成功"<>booksarray[i].type;
this->booksave();
cout<<"修改成功"<>booksarray[i].writer;
this->booksave();
cout<<"修改成功"<>booksarray[i].category;
this->booksave();
cout<<"修改成功"<booksarray[i].topic<<"》"<booksave();
return;
}else{
cout<<"你已取消本次操作"<>type_;
int i=0;
for(;i<=this->booksnum;i++){
if(type_==this->booksarray[i].type){
cout<<"搜索成功"<showbook(this->booksarray[i]);
cout<<"你确定要修改该书吗? 确认请输入1,取消请输入0"<>borrow;
if(borrow){
modifyfunc2:
cout<<"信息格式:"<>option;
system("cls");
switch(option)
{
case 1:
cout<<"请输入题名(书名):"<>booksarray[i].topic;
this->booksave();
cout<<"修改成功"<>booksarray[i].type;
this->booksave();
cout<<"修改成功"<>booksarray[i].writer;
this->booksave();
cout<<"修改成功"<>booksarray[i].category;
this->booksave();
cout<<"修改成功"<>writer_;
int sum1=0;
for(int i=0;i<=this->booksnum;i++){
if(writer_==this->booksarray[i].writer){
//cout<<"搜索成功"<showbook(this->booksarray[i]);
cout<<" 该书的编号:"<>bianhao;
if(booksarray[bianhao].writer==writer_){
cout<<"你确定要修改该书吗? 确认请输入1,取消请输入0"<>borrow;
if(borrow){
modifyfunc3:
cout<<"信息格式:"<>option;
system("cls");
switch(option)
{
case 1:
cout<<"请输入题名(书名):"<>booksarray[bianhao].topic;
this->booksave();
cout<<"修改成功"<>booksarray[bianhao].type;
this->booksave();
cout<<"修改成功"<>booksarray[bianhao].writer;
this->booksave();
cout<<"修改成功"<>booksarray[bianhao].category;
this->booksave();
cout<<"修改成功"<>category_;
int i=0;
for(;i<=this->booksnum;i++){
if(category_==this->booksarray[i].category){
cout<<"搜索成功"<showbook(this->booksarray[i]);
if(this->booksarray[i].state==1){
cout<<"你确定要修改该书吗? 确定请输入1,取消输入0"<>borrow;
if(borrow){
modifyfunc4:
cout<<"信息格式:"<>option;
system("cls");
switch(option)
{
case 1:
cout<<"请输入题名(书名):"<>booksarray[i].topic;
this->booksave();
cout<<"修改成功"<>booksarray[i].type;
this->booksave();
cout<<"修改成功"<>booksarray[i].writer;
this->booksave();
cout<<"修改成功"<>booksarray[i].category;
this->booksave();
cout<<"修改成功"<
#include"library.h"
using namespace std;
void library::showbooklist()//管理员权限::展示所有书籍信息
{
for (int i=0;i<=booksnum;i++)
{
book Book;
Book=booksarray[i];
if (Book.topic!="")
{
cout<<"该书的题名:"<
再次感谢您能用心看完,如果感觉还可以,请给我点个赞,谢谢。