本题为某大学大一的程序设计大作业,最后的得分为86分/100分。

作者认为可以将它发出来,为有需要的同学,特别是该大学该门科目的后继者提供帮助与解答。

由于作者水平有限,所用思想很朴素,写法很基础,代码很普通。请大佬海涵。

完成者:Eliack & Arcticwolf (特别感谢Eliack的主要贡献)

如图,改了好多个版本呜呜,小蒟蒻的摸索之路远啊。

一、题目描述

H大学图书馆

H大学图书馆邀请你建立一个图书馆信息管理系统。请使用面向对象思想完成该问题,具体要求如下:

一、设计一款文字式交互的图书管理系统;

  • 图书馆必须支持至少10000册书存储,如果可实现书籍可动态增长,加分

三、图书信息包含:

  1. 题名
  2. ISBN/ISSN
  3. 作者
  4. 分类号(分类规则自定,要求有三级分类,可参考中图分类法)

四、图书馆系统提供两种用户模式,请为他们设计不同的用户类:

1)管理员模式:

  1. 系统最初提供一个默认的管理员账户以及默认密码;
  2. 管理员具备以下功能:
  • 可以使用管理员账号登录
  • 支持对学校用户的账号进行基本管理,添加、删除学校用户默认账号和密码,默认账号为学号/教师编号,密码为123456;恢复学校用户默认密码;
  • 管理员可以对图书信息进行修改
  • 管理员可以增加、删除、搜索图书

2)学校用户模式(学校用户超过5千人):

  1. 学校用户可以通过账号和密码登录,账号为学号/教师编号,密码为123456;
  2. 学校用户可以修改自己的密码
  3. 学校用户可以搜索图书
  4. 学校用户可以借、还图书
  5. 学校用户可以查看自己的借阅记录

五、设计图书馆类,包含馆藏图书列表、用户列表等成员、在馆记录、用户借阅记录等。

六、图书馆系统提供根据任一信息的搜索图书功能:

  1. 题名,精确查找到书
  2. ISBN/ISSN,精确查找到书
  3. 作者,模糊查找到该作者所有书,字典序排序
  4. 分类号,三级分类,每一级分类均可模糊查找到书,字典序排序,按页显示;如,N 自然科学总论——TP 自动化技术、计算机技术——TP3 计算机技术。

在以上每一级时,均会出现该级所有数目,字典排序,按页显示;

不明白意思的同学,可以自行登入学校图书馆系统,进入搜索书目功能中,点击分类导航选项,然后进入每级分类的页面看看

  1. 搜索不考察性能仅考察功能

七、加分项(总分不超过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. 学习到的新知识点

图书管理系统

1、 问题描述

H大学图书馆邀请你建立一个图书馆信息管理系统。请使用面向对象思想完成该问题,具体要求如下:

一、设计一款文字式交互的图书管理系统;

二、图书馆必须支持至少10000册书存储,如果可实现书籍可动态增长,加分

三、图书信息包含:

  • 题名
  • ISBN/ISSN
  • 作者
  • 分类号(分类规则自定,要求有三级分类,可参考中图分类法)

四、图书馆系统提供两种用户模式,请为他们设计不同的用户类:
1)管理员模式:

  • 系统最初提供一个默认的管理员账户以及默认密码;
  • 管理员具备以下功能:
    • 可以使用管理员账号登录
    • 支持对学校用户的账号进行基本管理,添加、删除学校用户默认账号和密码,默认账号为学号/教师编号,密码为123456;恢复学校用户默认密码;
    • 管理员可以对图书信息进行修改
    • 管理员可以增加、删除、搜索图书

2)学校用户模式(学校用户超过5千人):

  • 学校用户可以通过账号和密码登录,账号为学号/教师编号,密码为123456;
  • 学校用户可以修改自己的密码
  • 学校用户可以搜索图书
  • 学校用户可以借、还图书
  • 学校用户可以查看自己的借阅记录

五、设计图书馆类,包含馆藏图书列表、用户列表等成员、在馆记录、用户借阅记录等。

六、图书馆系统提供根据任一信息的搜索图书功能:

  • 题名,精确查找到书
  • ISBN/ISSN,精确查找到书
  • 作者,模糊查找到该作者所有书,字典序排序
  • 分类号,三级分类,每一级分类均可模糊查找到书,字典序排序,按页显示;如,N 自然科学总论——TP 自动化技术、计算机技术——TP3 计算机技术。
    在以上每一级时,均会出现该级所有数目,字典排序,按页显示;不明白意思的同学,可以自行登入学校图书馆系统,进入搜索书目功能中,点击分类导航选项,然后进入每级分类的页面看看
  • 搜索不考察性能,仅考察功能

七、加分项(总分不超过100分)
(1)支持大数据,比如书籍记录突破百万,用户数量突破万级规模;
(2)贴近实际的图书馆管理系统,新增若干功能等;
(3)实现文件的创建、读、写等操作;
(4)考虑用户体验,如使用方便度等;
(5)搜索时性能考察,调查、思考、设计加强搜索性能的方式,此项仅适合学有余力的同学;

2、 分析设计

思路分析及原理

要建立一个图书馆信息管理系统。自然有图书book类,用户user类,管理员administrator类。为了将他们统一,还得有一个图书馆library大类

图书馆要实现两种用户模式和一系列功能。开始时需要有一个菜单供使用者选择,显示这个菜单的功能作为library类中的一个成员函数。选择不同的模式则通过switch,case的结构来实现。

当选择某种模式时,会出现账号密码登录的界面,代码直接写在main函数中。

登陆后要提示使用者该种模式的各种功能。选择不同的功能同样使用switch,case结构。

当修改数据结构中的某个数据时或者添加某个新数据时,需要将数据保存到txt中,因此要用到读文件和写文件,为了不混淆各种类的读文件和写文件,则每个类都有读文件和写文件函数

当执行功能时,融合清屏,暂停等操作实现界面的整洁;通过goto可以随时返回到执行的上一页。

数据结构的定义

 均定义在library的大类中

  1. book booksarray[100000]  book类的数组代表100000储存量的图书

(规模可达到10万及以上)

  1. user userarray[8000]  user类的数组代表8000储存量的用户
  2. administrator adminarray[100] administrator类的数组代表100储存量的管理员
  3. record recordarray[100000] record类的数组代表100000储存量的图书借阅记录

函数设计、参数规格以及返回类型:

1.全局变量部分

在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(); 修改图书信息函数

3、运行测试

一、登录页面

显示登录菜单

使用library类中的signmenu()成员函数

二、用户模式

显示用户功能菜单

使用library类中的usermenu()成员函数

1.修改密码

直接在main函数中进行修改

修改好后使用usersave()函数进行保存

并且返回上一级用户模式功能目录

2.搜索图书

使用library中search()成员函数进行搜索

其中要用到显示信息种类xinxitype()函数提示搜索所用到的的信息、

提醒输入不同的数字以代表不同的搜索信息。

搜索后返回用户功能界面。

1.题名搜索

2.ISBN/ISNN搜索

3.作者搜索

4.分类号搜索

这里要用到三级分类号搜索,由于分类号的格式是固定的且在txt中是一个字符串,所以需要提取各个位置的字符串以分离各级分类号,这里写了一个函数以分离各级分类号,在搜索中依次检索各级分类号,并且搜索到的书籍若大于10,又融合清屏等操作模拟了翻页。

2.借图书

同样是四种信息来搜索图书从而借图书,而在借图书中通过四种信息来借图书都是类似的,这里只放一个代码。

当用户输入书的编号选择借书时,会判断书籍是否已经被借阅,如果已经借阅则会提示,借阅后返回用户功能界面。

3.还图书

首先要显示该用户已经借阅的书籍,然后会提示归还书籍

还图书后会返回用户功能界面。

4.查看借阅记录

显示某个用户的借阅记录

查看完后会返回用户功能界面。

5.退出登录

通过goto返回上一级

三、管理员模式

显示用户功能菜单

使用library类中的administratormenu()成员函数

1.管理用户账号

1.添加用户账号

在上级目录“管理用户账号”下选择该功能后,自动调用addaccount函数,实现后返回清屏并返回上级目录“管理用户账号”。

首先需要判断用户规模是否已达上限,达到上限后将不能添加;

然后有一个账号查重的问题,如果即将要添加的账户与已经存在的账户重复,需要提示并让管理员重新添加;

若都无问题,则提示管理员输入密码并保存进现行数组,并及时保存至txt文件内;

2.删除用户账号

在上级目录“管理用户账号”下选择该功能后,自动调用deleteaccount函数,实现后返回清屏并返回上级目录“管理用户账号”。

首先需要判断该账户是否存在,如果该账户不存在,则输出“未找到该账户”,并返回上级目录;若该账户存在,则将该账户的account值赋为0表示该账户已经被删除。

3.重置用户密码

在上级目录“管理用户账号”下选择该功能后,自动调用modifypassword函数,实现后返回清屏并返回上级目录“管理用户账号”。

首先搜索需要重置的账号,若账户不存在,则输出“未找到该账号”并返回;

找到该账户后需要两次读入新密码,若两次读入的新密码不一致,则修改失败,需要重新进行该操作,若两次读入的密码一致则表示修改成功,先存储该密码,并保存至本地txt,然后返回上级目录

4.初始化用户密码

在上级目录“管理用户账号”下选择该功能后,自动调用resetpassword函数,实现后返回清屏并返回上级目录“管理用户账号”。

初始化用户密码的作用是将所有的用户密码全部重置为初始密码123456,若需要局部初始密码,在修改账户密码界面单独修改即可。

步骤比较简单,容易理解。

0.返回上级目录

在“管理用户账号”下选择该功能后,自动返回上级目录“管理员模式主菜单界面”。

2.修改图书信息

  1. 添加图书信息

在上级目录“修改图书信息”下选择该功能后,自动调用addbook函数,实现后返回清屏并返回上级目录“修改图书信息”。

按照格式,将书籍信息分条读入,再保存至本地txt即可

2.删除图书信息

在上级目录“修改图书信息”下选择该功能后,自动调用deletebook函数,实现后返回清屏并返回上级目录“修改图书信息”。

首先要找到该图书,然后再进行删除的操作

支持使用多种方式(共4种信息种类)查询该图书,下面仅以“标题”信息类为例,其余几种类别实现方式大致相同。

在搜索成功之后询问是否确定删除,若否则退出操作,若确定删除则将该书的各类信息赋为空,表示该图书已经被删除。

3.修改图书信息

在上级目录“修改图书信息”下选择该功能后,自动调用modifybook函数,实现后返回清屏并返回上级目录“修改图书信息”。

首先要找到该图书,然后再进行修改的操作。

支持使用多种方式(共4种信息种类)查询该图书,下面仅以“标题”信息类为例,其余几种类别实现方式大致相同。

在搜索成功之后询问是否确定修改,若否则退出操作,若确定则还需读入需要修改的信息的种类。

以下这段代码实现了上述的过程

在确定了修改信息的种类之后需要读入修改信息的结果并完成修改,即现在现行数组进行修改,再保存至本地txt。

以下这段代码实现了上述的过程

0.返回上一级目录

在“修改图书信息”下选择该功能后,自动返回上级目录“管理员模式主菜单界面”。

3.搜索图书信息

以下代码实现了调用search函数来搜索特定图书的功能,功能完成后将返回上级目录。

由于在search的功能上,管理员所需要的功能与用户的功能大致相同,所以该函数将直接跳转至用户模块的搜索函数,具体代码以及过程详解详见用户模块。

4.查看借阅情况     

以下代码实现了调用allborrowrecord函数来展现所有已经被借阅的图书的功能,功能完成后将返回上级目录。

以下代码实现了输出借阅日志(也就是所有借阅的记录)的功能

5.查看馆藏图书列表  

该功能可以查看本馆的所有藏书,进入该功能后,将调用showbooklist函数来展示所有书籍的信息,展示完毕后将返回上一级目录。

以下代码实现了管理员状态下所有书籍的信息的展示。

6.查看用户列表

该功能可以查看本馆的所有用户,进入该功能后,将调用showuserlist函数来展示所有用户的信息,展示完毕后将返回上一级目录。

以下代码实现了管理员状态下所有用户的信息的展示。

0.退出登录       

该功能可以注销管理员的登录状态,返回统一登陆界面。

四、小彩蛋-开发者信息展示

以下代码将实现前往开发者信息界面

以下为开发者信息的主界面

为保护隐私,作者相关信息已做打码处理 

五、关于谬误输入性息的处理

1、switch分支的谬误输入性息处理

因为涉及到按键选择功能,所以本系统不可避免地涉及到许多分支,在这些分支的统筹上,采取switch语句来操作,但不可避免地有可能输入在允许范围之外的其他数字,此时我们设置了default语句并让程序返回该层初始状态,提示输入格式错误,并让操作者重新输入。

例如user目录下的default语句

又如管理员模式-账号设置下的default语句

再如管理员模式-书籍信息设置下的default语句

再如管理员模式的default语句

再如初始登录界面下的default语句

这些default语句保证了程序的可延续性,避免了因操作不当产生的bug使程序轻易地崩溃,从而给用户带来不好的体验。

2.关于不存在的账户、书籍信息的处理

输入的该类信息首先将被纳入搜索中,如果在记录中没有成功搜索到,将返回相关的信息,避免用户不知情而继续产生错误的操作。

如在借书过程中未能成功搜索到该书

又如在管理员模式下搜索账户时未能成功找到目标账户

再如在用户与管理员登陆时输入的账户或者密码出现问题

这种情况下,我们设置了如下的两个函数来进行判断,分别对应不同的错误类型返回不同的值,再将操作者的错误种类输出,提示操作者改正。

3.关于重置密码时的验证

设置密码时,习惯上需要输入密码与确认密码,以保证密码的绝对准确性。但由于给出了初始密码,所以该步仅需要在重置密码时完成。

如管理员修改用户密码时的确认输入密码是否准确

又如用户在重置密码时需要确认密码输入是否正确

六、关于颜色的处理

在原程序的主函数上加上如下代码可以实现变色的效果。

4、分析与总结

1.实验分析

1.本次综合实验我觉得理清思路,框架后其实并不难,与一些考数学的编程题不同,本次图书管理系统更注重将平时所学到的编程知识应用到实践中。

2.本次实验我们选择的数据结构是数组,复杂性不及链表等其他数据结构。但是对于本次所实现的相对较简单的功能来说,我认为使用数组已经游刃有余,十分简便,同时也便于维护、易于理解。

3.读写文件在本次实验中显得十分重要,为了使程序每次运行都能保留数据,需要用到<fstream>的读写文件知识。做到这点使我们初步体验到了程序员的成就感,更是这种沟通“黑屏”内外的力量给我们带来惊喜。能够在txt中做出改变,永久保存数据,而不仅仅是每次打开dev都要重置,这是一个巨大的飞跃,同时也是完成大型工程的必经之路,必备经验。

4.封装的思想是十分重要的,在本次工程编写中,会遇到许多可能有交集的、思想重复的代码,如果没有之前编写的代码的封装化与直接调用,代码量将大大加大,这对程序的实现与维护是大大不利的。同时结构体与类的大量运用,使数据与过程紧密结合,同时规范化,形式化,将相关的一类结合在一起,便于维护与代码的修改。

2.遇到的问题

  1. 构造函数读文件时,无文件只能创建一个文件。(想要两个文件)
  2. 经常出现某个函数找不到定义,即无法关联的情况。
  3. 以头文件或cpp的形式在工程文件夹下创建的内容无法与工程文件本身产生关联,会报“无法找到该变量/函数”的错误。
  4. 修改完代码之后立即编译会很快通过,但并没有做出修改。
  5. 在新建.h或.cpp之后会出现没有办法调用的现象。

3.解决的办法

  1. 第一个读文件时打开文件没有关闭文件。
  2. 这是dev的bug,每次修改代码后如果只编译而没有清楚则会导致出错,因此每次修改后需要清除一下或者关闭重开(因为这个问题浪费了很多时间)学习到的新知识点。
  3. 需要在dev的project左栏中右击来创建,这样才可以正确关联与正确调用。
  4. 这是dev在偷懒,此时需要点击clean来清楚已编译的数据,让dev重新编译,再次编译成功后即可操作。(摸索这一点也花了不少时间,甚至一直怀疑这是“魔法学院”的“魔法”)
  5. 这是因为main.cpp内没有#include其他的.h文件。虽然很基础但是也着实坑了我们一把,这找不到错误的感觉令人心醉。

 4. 学习到的新知识点

1.fstream读写文件

2.提取一个字符串里某个区域之间的字符串

(三级分类搜索图书时要用到)

3.system相关操作指令system(“pause”)和system(“cls”)

这些操作是必要的,在显示方面对用户比较友好。

4.“goto sign1”与“sign1:”,这种代码中跳跃的方式虽然不推荐在平时的课内学习中使用,但真的用在实践中是十分方便的。不然没法解决返回上一级目录的问题。

5.HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);实现变色的效果。

最后附赠代码

1.main.cpp

#include<iostream>
#include"library.h"
#include"books.h"
#include"borrowrecord.h"
#include"user.h"
#include"admin.h"
#include"login_check.h"
#include"showlist.h"
#include <windows.h>
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<<"请输入账号:"<<endl;cin>>a.account;cout<<"请输入密码:"<<endl;cin>>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<<"登录成功"<<endl;long temp_account=a.account-20210000;
userfunc:hnu.userarray[temp_account].usermenu();int userselect;//选择用户模式功能 cin>>userselect;switch(userselect){case 1://修改密码 again:system("cls");cout<<"请输入新密码:"<<endl;cin>>tempstr1;cout<<"请确认你的新密码:"<<endl;cin>>tempstr2;if (tempstr1==tempstr2){hnu.userarray[temp_account].password=tempstr1;}else goto again;hnu.save();cout<<"修改成功"<<endl;system("pause");system("cls");goto userfunc; break;case 2://搜索图书 hnu.search();system("pause");system("cls");goto userfunc;break;case 3://借图书 hnu.borrowbook(a.account);system("pause");system("cls");goto userfunc;break;case 4://还图书 hnu.givebook(a.account);system("pause");system("cls");goto userfunc;break;case 5://查看借阅记录 hnu.userborrowrecord(a.account);system("pause");system("cls");goto userfunc;break;case 0://退出登录 cout<<"是否确认退出?"<<endl;cout<<"0:取消   1:确认"<<endl;int temp4;cin>>temp4;if (temp4==1){cout<<"退出登录成功,即将返回登录界面"<<endl; cout<<"欢迎下次使用"<<endl;system("pause"); system("cls");goto sign;//返回登录界面 }else{cout<<"已取消,即将返回上一级界面"<<endl; system("pause"); system("cls");goto userfunc;//返回第二级目录}break; default:goto userfunc;break;}}
else if (hnu.login_user(a.account,a.password)==2){system("cls");cout<<"账号不符合格式,请重新登录"<<endl; goto sign;//返回登陆界面 }
else if (hnu.login_user(a.account,a.password)==3){system("cls");cout<<"账号或密码错误,请重新登录"<<endl; goto sign;//返回登陆界面 }break;
case 2://管理员模式 cout<<"请输入账号:"<<endl;cin>>b.account;cout<<"请输入密码:"<<endl;cin>>b.password;if (hnu.login_admin(b.account,b.password)==1){ system("cls");cout<<"登录成功"<<endl;
administrator_menu_func://第一级目录 hnu.adminarray[b.account].administratormenu();int adminselect;//选择管理员模式功能 cin>>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<<"即将返回上级目录"<<endl;system("pause"); system("cls");goto administrator_menu_func;//返回第一级目录 break;default:cout<<"输入格式错误,请重新输入"<<endl;system("pause"); system("cls");goto accountmenufunc;//返回第二级目录 break;}break; case 2:bookmanagement://第二级目录hnu.adminarray[b.account].book_management_menu();int temp5;cin>>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<<"即将返回上级目录"<<endl;system("pause"); system("cls");goto administrator_menu_func;//返回第一级目录 break;default:cout<<"输入格式错误,请重新输入"<<endl;system("pause"); system("cls");goto bookmanagement;//返回第二级目录 break;}break; case 3:hnu.search();system("pause");system("cls");goto administrator_menu_func;//返回第一级目录 break;case 4:hnu.allborrowrecord();system("pause");system("cls");goto administrator_menu_func;//返回第一级目录 break;case 5:hnu.showbooklist();system("pause");system("cls");goto administrator_menu_func;//返回第一级目录 break;case 6:hnu.showuserlist();system("pause");system("cls");goto administrator_menu_func;//返回第一级目录 break;case 0:cout<<"是否确认退出?"<<endl;cout<<"0:取消   1:确认"<<endl;int temp3;cin>>temp3;if (temp3==1){cout<<"退出登录成功,即将返回登录界面"<<endl; system("pause"); system("cls");goto sign;//返回登录界面 }else{cout<<"已取消,即将返回上级目录"<<endl; system("pause"); system("cls");goto accountmenufunc;//返回第二级目录}break; default:cout<<"输入格式错误,请重新输入"<<endl;system("pause"); system("cls");goto administrator_menu_func;//返回第一级目录 }}else if (hnu.login_admin(b.account,b.password)==2){system("cls");cout<<"账号不符合格式,请重新登录"<<endl; goto sign;//返回登陆界面 }else if (hnu.login_admin(b.account,b.password)==3){system("cls");cout<<"账号或密码错误,请重新登录"<<endl; goto sign;//返回登陆界面 }break;
case 0:system("cls");hnu.developerinfor();system("pause");cout<<"即将返回上级目录"<<endl;system("pause");system("cls");goto sign;//返回登陆界面
default:cout<<"输入格式错误,请重新输入"<<endl;system("pause"); system("cls");goto sign;//返回登陆界面 }
}

2.library.cpp

#include"library.h"
using namespace std;
//用于做显示的界面
void library::zongmenu(){
cout<<"********************************"<<endl;
cout<<"***** 1.馆藏图书列表       *****"<<endl;
cout<<"***** 2.用户列表           *****"<<endl;
cout<<"***** 3.在馆记录           *****"<<endl;
cout<<"***** 4.用户借阅记录       *****"<<endl;
cout<<"***** 0.退出功能           *****"<<endl;
cout<<"********************************"<<endl;
}void library::checkmenu(){
cout<<"********************************"<<endl;
cout<<"***** 1.根据题名检索       *****"<<endl;
cout<<"***** 2.根据ISBN/ISSN检索  *****"<<endl;
cout<<"***** 3.根据作者检索       *****"<<endl;
cout<<"***** 4.根据分类号检索     *****"<<endl;
cout<<"***** 0.退出功能           *****"<<endl;
cout<<"********************************"<<endl;
}void library::signmenu(){
cout<<"********************************"<<endl;
cout<<"*****欢迎来到湖南大学图书馆*****"<<endl;
cout<<"*********请选择用户模式*********"<<endl;
cout<<"********************************"<<endl;
cout<<"********************************"<<endl;
cout<<"*****      1.用户模式     ******"<<endl;
cout<<"*****     2.管理员模式    ******"<<endl;
cout<<"*****   0.查看开发者信息  ******"<<endl;
cout<<"********************************"<<endl;
}void user::usermenu(){
cout<<"********************************"<<endl;
cout<<"***** 1.修改密码          *****"<<endl;
cout<<"***** 2.搜索图书          *****"<<endl;
cout<<"***** 3.借图书            *****"<<endl;
cout<<"***** 4.还图书            *****"<<endl;
cout<<"***** 5.查看借阅记录      *****"<<endl;
cout<<"***** 0.退出登录          *****"<<endl;
cout<<"********************************"<<endl;
}void library::xinxitypemenu(){cout<<"****************************"<<endl;    cout<<"***** 1.topic          *****"<<endl;cout<<"***** 2.ISBN/ISSN      *****"<<endl;cout<<"***** 3.writer         *****"<<endl;cout<<"***** 4.category       *****"<<endl;cout<<"****************************"<<endl;
}void administrator::administratormenu(){
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;
}void administrator::manage_accountmenu(){
cout<<"********************************"<<endl;
cout<<"***** 1.添加用户账号       *****"<<endl;
cout<<"***** 2.删除用户账号       *****"<<endl;
cout<<"***** 3.重置用户密码       *****"<<endl;
cout<<"***** 4.初始化用户密码     *****"<<endl;
cout<<"***** 0.返回上一级目录     *****"<<endl;
cout<<"********************************"<<endl;
}void administrator::book_management_menu(){
cout<<"********************************"<<endl;
cout<<"***** 1.添加图书信息       *****"<<endl;
cout<<"***** 2.删除图书信息       *****"<<endl;
cout<<"***** 3.修改图书信息       *****"<<endl;
cout<<"***** 0.返回上一级目录     *****"<<endl;
cout<<"********************************"<<endl;
}void library::developerinfor()
{cout<<"*************************************************"<<endl; cout<<"*****     恭喜成为第"<<1<<"位发现本系统的大佬     *****"<<endl;cout<<"*****       《某某大学图书馆管理系统》      *****"<<endl;cout<<"*****      由某某大学信息科学与工程学院     *****"<<endl;cout<<"*****     计科****班 某某、某某某 编写      *****"<<endl;cout<<"*****        某某 Eliack QQ **********      *****"<<endl;cout<<"*****        某某某 wolf QQ **********      *****"<<endl;cout<<"*****鸣谢 星空不费电 粗心大法斩IDE的波波老师*****"<<endl;cout<<"*****       和周二晚热心答疑某某某助教      *****"<<endl;cout<<"*****                                       *****"<<endl;cout<<"*****           感谢您的使用与支持          *****"<<endl;cout<<"*************************************************"<<endl;
}

3.library.h

#include<iostream>
#ifndef Library_H
#define Library_H
#include<fstream>
#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.cppvoid iniuser(); void save();library();void iniadmin();//library.cppvoid zongmenu();void checkmenu();void signmenu();void xinxitypemenu();void allborrowrecord();void showbooklist();void showuserlist();//books.cppint getbooksnum();void inibooks();void booksave();void showbook(book Book);void search();void borrowbook(long);void givebook(long); //borrowrecord.cppvoid userborrowrecord(long);//newvoid recordsave(book);void inirecord();int getrecordnum();//login_checkint login_user(int account,string password); int login_admin(int account,string password);//admin.hvoid admin_save();void admin_out();//accountvoid addaccount();void deleteaccount();void modifypassword();void resetpassword();//developerinforvoid developerinfor();//book_managevoid addbook();void deletebook();void modifybook();};#endif

4.books.h

#include"library.h"
#include<string>
#include<stdio.h>
#include<string.h>
using namespace std;
string match(string s,int begin,int end){string temp="";for(int i=begin;i<end;i++){temp+=s[i];}return temp;
}
int library::getbooksnum(){//统计书的数量 ifstream ifs;ifs.open(FILEname,ios::in);string topic1;string type1;string writer1;string category1;long ownerid1;int state1;int num=0;while(ifs>>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; i<this->booksnum; i++){ofs<<booksarray[i].topic<<" ";ofs<<booksarray[i].type<<" ";ofs<<booksarray[i].writer<<" ";ofs<<booksarray[i].category<<" ";ofs<<booksarray[i].state<<" ";ofs<<booksarray[i].ownerid<<endl;}ofs.close();
}//展示图书信息
void library::showbook(book Book){cout<<"该书的题名:"<<Book.topic<<endl;cout<<"  该书的ISBN/ISNN:"<<Book.type<<endl;cout<<"  该书的作者:"<<Book.writer<<endl;cout<<"  该书的分类号:"<<Book.category<<endl;if(Book.state==1) cout<<"  该书的借阅状况:未借出"<<endl; else if(Book.state==0){   cout<<"  该书的借阅状况:已借出"<<endl;cout<<"  该书的借阅者:"<<Book.ownerid<<endl;}}
//搜索图书
void library::search(){
searchfunc: system("cls");this->xinxitypemenu();cout<<"输入信息的种类"<<endl;int xinxitype;cin>>xinxitype;
if(xinxitype==1){cout<<"请输入题名"<<endl;string topic_;cin>>topic_;int i=0;for(;i<this->booksnum;i++){if(topic_==this->booksarray[i].topic){this->showbook(this->booksarray[i]);return;}}cout<<"找不到该书"<<endl; return; }
else if(xinxitype==2){cout<<"请输入ISBN/ISSN"<<endl;string type_;cin>>type_;int i=0;for(;i<=this->booksnum;i++){if(type_==this->booksarray[i].type){this->showbook(this->booksarray[i]);return;}}cout<<"找不到该书"<<endl; return; }
else if(xinxitype==3){cout<<"请输入作者名"<<endl;string writer_;cin>>writer_;int i=0;int sum1=0; for(;i<=this->booksnum;i++){if(writer_==this->booksarray[i].writer){sum1++;cout<<sum1<<".";this->showbook(this->booksarray[i]);}}if(sum1==0){cout<<"找不到该作者的书籍"<<endl; return;}else return;}
else if(xinxitype==4){//new string onecategory_,twocategory_,threecategory_;int a1,a2,a3;cout<<"请输入一级分类号"<<endl;cin>>onecategory_;onesearch:int sum1=0;for(int i=0;i<=this->booksnum;i++){if(onecategory_[0]==this->booksarray[i].category[0]){sum1++;cout<<sum1<<".";this->showbook(this->booksarray[i]);if(sum1%10==0){cout<<endl;cout<<"第"<<sum1/10+1<<"页已到底"<<endl;cout<<"1.继续下一级搜索"<<endl;cout<<"2.退出搜索"<<endl; cout<<"3.下一页"<<endl; int select;cin>>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<<"没有找到书籍"<<endl;return;}cout<<"1.继续搜索"<<endl;cout<<"2.退出搜索"<<endl; cin>>a1;search2:   if(a1==1){system("cls");cout<<"请输入二级分类号"<<endl;cin>>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<<sum2<<"."<<endl; this->showbook(this->booksarray[i]);if(sum2%10==0){cout<<endl;cout<<"第"<<sum1/10+1<<"页已到底"<<endl;cout<<"1.继续下一级搜索"<<endl;cout<<"2.返回上一级搜索"<<endl; cout<<"3.退出搜索"<<endl; cout<<"4.下一页"<<endl; int select;cin>>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<<"没有找到书籍"<<endl;return;}cout<<"1.继续搜索"<<endl;cout<<"2.返回上一级搜索"<<endl;cout<<"3.退出搜索"<<endl; cin>>a2;search3:      if(a2==1){system("cls");cout<<"请输入三级分类号"<<endl;cin>>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<<"没有找到书籍"<<endl;return;}cout<<"1.返回上一级搜索"<<endl;cout<<"2.退出搜索"<<endl; cin>>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<<"你要借出哪本图书?请搜索"<<endl;this->xinxitypemenu();cout<<"输入信息的种类"<<endl;int xinxitype;cin>>xinxitype;
if(xinxitype==1){cout<<"请输入题名"<<endl;string topic_;cin>>topic_;int i=0;for(;i<this->booksnum;i++){if(topic_==this->booksarray[i].topic){cout<<"搜索成功"<<endl;this->showbook(this->booksarray[i]);if(this->booksarray[i].state==1){cout<<"你确定要借该书吗? 借书请输入1,否则输入0"<<endl;bool borrow;cin>>borrow;if(borrow){cout<<"你已成功借出"<<"《"<<this->booksarray[i].topic<<"》"<<endl; this->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<<"你已取消本次操作"<<endl; return; }}else if(this->booksarray[i].state==0){cout<<"已借出,你不可借阅"<<endl;return;}}}cout<<"找不到该书"<<endl; return; }
else if(xinxitype==2){cout<<"请输入ISBN/ISSN"<<endl;string type_;cin>>type_;int i=0;for(;i<=this->booksnum;i++){if(type_==this->booksarray[i].type){cout<<"搜索成功"<<endl;this->showbook(this->booksarray[i]);if(this->booksarray[i].state==1){cout<<"你确定要借该书吗? 借书请输入1,否则输入0"<<endl;bool borrow;cin>>borrow;if(borrow){cout<<"你已成功借出"<<"《"<<this->booksarray[i].topic<<"》"<<endl; this->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<<"你已取消本次操作"<<endl; return; }}else if(this->booksarray[i].state==0){cout<<"已借出,你不可借阅"<<endl;return;}}}cout<<"找不到该书"<<endl; return; }
else if(xinxitype==3){
writersearch:    cout<<"请输入作者名"<<endl;string writer_;cin>>writer_;int sum1=0;
for(int i=0;i<=this->booksnum;i++){if(writer_==this->booksarray[i].writer){//cout<<"搜索成功"<<endl;sum1++;cout<<sum1<<".";this->showbook(this->booksarray[i]);cout<<"  该书的编号:"<<i<<endl;}
}
if(sum1==0){cout<<"请输入正确的作者名"<<endl; goto writersearch;
//}else if(sum1==1){
}else{
bianhaofunc:cout<<"请输入您要借书的编号:"<<endl;int bianhao;cin>>bianhao;if(this->booksarray[bianhao].state==1&&this->booksarray[bianhao].writer==writer_){cout<<"你确定要借书吗? 借书请输入1,否则输入0"<<endl;bool borrow;cin>>borrow;if(borrow){cout<<"你已成功借出"<<"《"<<this->booksarray[bianhao].topic<<"》"<<endl; this->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<<"你已取消本次操作"<<endl; return; }}else if(booksarray[bianhao].writer!=writer_){cout<<"请输入正确的编号"<<endl;goto  bianhaofunc;}else if(this->booksarray[bianhao].state==0){cout<<"已借出,你不可借阅"<<endl;return;}}}
else if(xinxitype==4){cout<<"请输入分类号"<<endl;string category_;cin>>category_;int i=0;for(;i<=this->booksnum;i++){if(category_==this->booksarray[i].category){cout<<"搜索成功"<<endl;this->showbook(this->booksarray[i]);if(this->booksarray[i].state==1){cout<<"你确定要借该书吗? 借书请输入1,否则输入0"<<endl;bool borrow;cin>>borrow;if(borrow){cout<<"你已成功借出"<<"《"<<this->booksarray[i].topic<<"》"<<endl; this->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<<"你已取消本次操作"<<endl; return; } }else if(this->booksarray[i].state==0){cout<<"已借出,你不可借阅"<<endl;return;}}}cout<<"找不到该书"<<endl; return;
}else{
goto borrowfunc;
}
}
//还图书
void library::givebook(long id){
borrowfunc:  cout<<"你已借阅的图书:"<<endl;int sum=0;for(int i=0;i<this->booksnum;i++){if(this->booksarray[i].ownerid==id){sum++;cout<<sum<<"."<<"该书的编号:"<<i<<endl; cout<<"  该书的题名:"<<this->booksarray[i].topic<<endl;cout<<"  该书的ISBN/ISNN:"<<this->booksarray[i].type<<endl;cout<<"  该书的作者:"<<this->booksarray[i].writer<<endl;cout<<"  该书的分类号:"<<this->booksarray[i].category<<endl;}}if(sum==0){cout<<"你还未借阅书籍"<<endl; }else{cout<<"请输入你所要还的书的编号:"<<endl;int bookid;cin>>bookid;cout<<"你已成功归还"<<"《"<<this->booksarray[bookid].topic<<"》"<<endl; this->booksarray[bookid].state=1;this->booksarray[bookid].ownerid=0;this->booksave();sum--;if(sum>0){cout<<"请问你是否需要继续归还?1-是 2-否"<<endl;int select;cin>>select;if(select==1)goto borrowfunc;else return;}else return;}
}

5.borrowrecord.h

#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<<endl;ofs<<Book.ownerid<<" ";ofs<<Book.topic<<" ";ofs<<Book.writer<<" ";ofs<<Book.category<<" ";ofs.close();
}
void library::userborrowrecord(long id){//new int sum=0;for(int i=recordnum-1;i>=0;i--){if(recordarray[i].ownerid==id){sum++;cout<<sum<<".";cout<<recordarray[i].topic<<" ";cout<<recordarray[i].writer<<" ";cout<<recordarray[i].category<<" ";for(int j=0;j<booksnum;j++){if(recordarray[i].category==booksarray[j].category){recordarray[i].state=booksarray[j].state;if(recordarray[i].state==1){cout<<"已归还"<<endl; break;}else{cout<<"未归还"<<endl;break;}} }}}if (sum==0) cout<<"您未借阅任何图书"<<endl<<"即将返回上级目录"<<endl;return;
}void library::allborrowrecord()
{for(int i=0;i<recordnum;i++){cout<<recordarray[i].ownerid<<" ";cout<<recordarray[i].topic<<" ";cout<<recordarray[i].writer<<" ";cout<<recordarray[i].category<<" ";for(int j=0;j<booksnum;j++){if(recordarray[i].category==booksarray[j].category){recordarray[i].state=booksarray[j].state;}}if(recordarray[i].state==1){cout<<"已归还"<<endl; }else{cout<<"未归还"<<endl;}}
}

6.login_check.h

#include<iostream>
#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();
}

7.user.h

#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<<"文件不存在"<<endl;usernum=5000;for(int i=0;i<usernum;i++){long temp=20210000;userarray[i].account=temp+i;userarray[i].password="123456";}ifs.close();this->save();
}ifstream ifs2; ifs2.open(a_acount,ios::in);
if(!ifs2.is_open()){flag++;cout<<"文件不存在"<<endl;for(int i=0;i<50;i++){long temp=0;adminarray[i].account=temp+i;adminarray[i].password="123456";}ifs2.close();this->admin_save();
}
if(flag==2) return;文件存在且数据为空
//char ch;
//ifs>>ch;
//if(ifs.eof()){
//cout<<"文件为空"<<endl;
//for(int i=0;i<5000;i++){
//  long temp=20210000;
//  userarray[i].account=temp+i;
//  userarray[i].password="123456";
//  }
//this->save();
//ifs.close();}//3.文件存在,并且记录数据
cout<<"读取文件"<<endl;
this->iniuser();
this->inibooks();
this->inirecord();
this->iniadmin();
}

8.admin.h

#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<<"用户规模已经达到上限,请先删除部分用户"<<endl; return;}
retry:cout<<"请输入要添加的账号:"<<endl;cin>>userarray[usernum-1].account;for (int i=0;i<=usernum-2;i++)//处理添加账户重复问题{if (userarray[usernum-1].account==userarray[i].account){cout<<"要添加的账号重复,请重新输入"<<endl;system("pause");system("cls");goto  retry;}}cout<<"请输入密码:"<<endl;cin>>userarray[usernum-1].password;ofstream ofs;ofs.open(FILENAME,ios::out|ios::app);ofs<<userarray[usernum-1].account;ofs<<" ";ofs<<userarray[usernum-1].password;ofs.close(); cout<<"添加成功"<<endl;cout<<"即将返回上级目录"<<endl;return;
}
void library::deleteaccount()//管理员权限::删除账号
{long temp_account;system("cls"); cout<<"请输入要删除的账号:"<<endl;cin>>temp_account;for (int i=0;i<=usernum-1; i++){if (userarray[i].account==temp_account){userarray[i].account=0;this->save();cout<<"删除成功"<<endl;cout<<"即将返回上级目录"<<endl;return;}}cout<<"未找到该账号"<<endl; return;
}
void library::modifypassword()//管理员权限::修改用户密码
{long temp_account;string temp_password,temp2_password;system("cls"); cout<<"请输入要重置的账号:"<<endl;cin>>temp_account;
repasswordfunc:cout<<"请输入要重置的密码:"<<endl;cin>> temp_password;cout<<"请确认要重置的密码:"<<endl;cin>> temp2_password;if (temp_password!=temp2_password) {cout<<"密码不一致,请重新输入密码"<<endl;system("pause");system("cls"); goto repasswordfunc;}for (int i=0;i<=usernum-1; i++){if (userarray[i].account==temp_account){userarray[i].password=temp_password;this->save();cout<<"修改成功"<<endl;cout<<"即将返回上级目录"<<endl; system("pause"); return;}}cout<<"未找到该账号"<<endl; return;
}
void library::resetpassword()//管理员权限::初始化用户密码
{ifstream ifs; ifs.open(FILENAME,ios::in);for(int i=0;i<usernum;i++){userarray[i].password="123456";}this->save(); ifs.close();cout<<"初始化所有用户密码成功"<<endl;cout<<"即将返回上级目录"<<endl;return;
}void library::addbook()//管理员权限::添加书籍信息
{system("cls");booksnum++;cout<<"格式:书名 ISBN/ISSN 作者 分类号"<<endl;cout<<"example:理想国 978-7-80179-793-3 (古希腊)柏拉图著;吴献书译 B502.232/23"<<endl;cout<<"请输入题名(书名):"<<endl;cin>>booksarray[booksnum-1].topic;cout<<"请输入ISBN/ISSN:"<<endl;cin>>booksarray[booksnum-1].type;cout<<"请输入作者:"<<endl;cin>>booksarray[booksnum-1].writer;cout<<"请输入分类号:"<<endl;cin>>booksarray[booksnum-1].category;booksarray[booksnum-1].state=1;booksarray[booksnum-1].ownerid=0;ofstream ofs;ofs.open(FILEname,ios::out|ios::app);ofs<<booksarray[booksnum-1].topic<<" ";ofs<<booksarray[booksnum-1].type<<" ";ofs<<booksarray[booksnum-1].writer<<" ";ofs<<booksarray[booksnum-1].category<<" ";ofs<<booksarray[booksnum-1].state<<" ";ofs<<booksarray[booksnum-1].ownerid<<endl;ofs.close(); cout<<"添加成功"<<endl;cout<<"即将返回上级目录"<<endl;return;
}void library::deletebook()//管理员权限::删除书籍信息
{
borrowfunc:  system("cls");cout<<"你要删除哪本图书?请搜索"<<endl;this->xinxitypemenu(); cout<<"输入信息的种类"<<endl;int xinxitype;cin>>xinxitype;
if(xinxitype==1){cout<<"请输入题名"<<endl;string topic_;cin>>topic_;int i=0;for(;i<this->booksnum;i++){if(topic_==this->booksarray[i].topic){cout<<"搜索成功"<<endl;this->showbook(this->booksarray[i]);if(this->booksarray[i].state==1){cout<<"你确定要删除该书吗? 确认请输入1,取消请输入0"<<endl;bool borrow;cin>>borrow;if(borrow){cout<<"你已成功删除"<<"《"<<this->booksarray[i].topic<<"》"<<endl; this->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<<"你已取消本次操作"<<endl; return; }}}}cout<<"找不到该书"<<endl; return; }
else if(xinxitype==2){cout<<"请输入ISBN/ISSN"<<endl;string type_;cin>>type_;int i=0;for(;i<=this->booksnum;i++){if(type_==this->booksarray[i].type){cout<<"搜索成功"<<endl;this->showbook(this->booksarray[i]);if(this->booksarray[i].state==1){cout<<"你确定要删除该书吗? 确认请输入1,取消请输入0"<<endl;bool borrow;cin>>borrow;if(borrow){cout<<"你已成功删除"<<"《"<<this->booksarray[i].topic<<"》"<<endl; this->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<<"你已取消本次操作"<<endl; return; }}}}cout<<"找不到该书"<<endl; return; }
else if(xinxitype==3){
writersearch:    cout<<"请输入作者名"<<endl;string writer_;cin>>writer_;int sum1=0;
for(int i=0;i<=this->booksnum;i++){if(writer_==this->booksarray[i].writer){//cout<<"搜索成功"<<endl;sum1++;cout<<sum1<<".";this->showbook(this->booksarray[i]);cout<<"  该书的编号:"<<i<<endl;}
}
if(sum1==0){cout<<"请输入正确的作者名"<<endl; goto writersearch;
//}else if(sum1==1){
}else{
bianhaofunc:cout<<"请输入您要删除的编号:"<<endl;int bianhao;cin>>bianhao;if(booksarray[bianhao].writer==writer_){cout<<"你确定要删除该书吗? 确认请输入1,取消请输入0"<<endl;bool borrow;cin>>borrow;if(borrow){cout<<"你已成功删除"<<"《"<<this->booksarray[bianhao].topic<<"》"<<endl; this->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<<"你已取消本次操作"<<endl; return; }}else if(booksarray[bianhao].writer!=writer_){cout<<"请输入正确的编号"<<endl;goto  bianhaofunc;} }}
}void library::modifybook()//管理员权限::修改书籍信息
{
borrowfunc:  system("cls");cout<<"你要修改哪本图书?请搜索"<<endl;this->xinxitypemenu();cout<<"输入信息的种类"<<endl;int xinxitype;cin>>xinxitype;
if(xinxitype==1){cout<<"请输入题名"<<endl;string topic_;cin>>topic_;int i=0;for(;i<this->booksnum;i++){if(topic_==this->booksarray[i].topic){cout<<"搜索成功"<<endl;this->showbook(this->booksarray[i]);cout<<"你确定要修改该书吗? 确认请输入1,取消请输入0"<<endl;bool borrow;cin>>borrow;if(borrow){
modifyfunc1: cout<<"信息格式:"<<endl; cout<<"example:理想国 978-7-80179-793-3 (古希腊)柏拉图著;吴献书译 B502.232/23"<<endl;cout<<"请输入你要修改的信息种类"<<endl;xinxitypemenu();cout<<"*****  0.返回上级目录  *****"<<endl;cout<<"****************************"<<endl;int option;cin>>option;system("cls");switch(option){case 1:cout<<"请输入题名(书名):"<<endl;cin>>booksarray[i].topic;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc1;break;case 2:cout<<"请输入ISBN/ISSN:"<<endl;cin>>booksarray[i].type;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc1;break;case 3:cout<<"请输入作者:"<<endl;cin>>booksarray[i].writer;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc1;break;case 4:cout<<"请输入分类号:"<<endl;cin>>booksarray[i].category;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc1;break;case 0:     cout<<"即将返回上级目录"<<endl; system("pause");return;default:cout<<"输入格式错误,请重新输入"<<endl;system("pause"); system("cls");goto modifyfunc1;break;       }cout<<"你已成功删除"<<"《"<<this->booksarray[i].topic<<"》"<<endl; this->booksave();return;}else{cout<<"你已取消本次操作"<<endl; return; }}}cout<<"找不到该书"<<endl; return; }
else if(xinxitype==2){cout<<"请输入ISBN/ISSN"<<endl;string type_;cin>>type_;int i=0;for(;i<=this->booksnum;i++){if(type_==this->booksarray[i].type){cout<<"搜索成功"<<endl;this->showbook(this->booksarray[i]);cout<<"你确定要修改该书吗? 确认请输入1,取消请输入0"<<endl;bool borrow;cin>>borrow;if(borrow){modifyfunc2: cout<<"信息格式:"<<endl; cout<<"example:理想国 978-7-80179-793-3 (古希腊)柏拉图著;吴献书译 B502.232/23"<<endl;cout<<"请输入你要修改的信息种类"<<endl;xinxitypemenu();cout<<"*****  0.返回上级目录  *****"<<endl;cout<<"****************************"<<endl;int option;cin>>option;system("cls");switch(option){case 1:cout<<"请输入题名(书名):"<<endl;cin>>booksarray[i].topic;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc2;break;case 2:cout<<"请输入ISBN/ISSN:"<<endl;cin>>booksarray[i].type;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc2;break;case 3:cout<<"请输入作者:"<<endl;cin>>booksarray[i].writer;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc2;break;case 4:cout<<"请输入分类号:"<<endl;cin>>booksarray[i].category;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc2;break;case 0:     cout<<"即将返回上级目录"<<endl; system("pause");return;default:cout<<"输入格式错误,请重新输入"<<endl;system("pause"); system("cls");goto modifyfunc2;break;      }}else{cout<<"你已取消本次操作"<<endl; return; }}}cout<<"找不到该书"<<endl; return; }
else if(xinxitype==3){
writersearch:    cout<<"请输入作者名"<<endl;string writer_;cin>>writer_;int sum1=0;
for(int i=0;i<=this->booksnum;i++){if(writer_==this->booksarray[i].writer){//cout<<"搜索成功"<<endl;sum1++;cout<<sum1<<".";this->showbook(this->booksarray[i]);cout<<"  该书的编号:"<<i<<endl;}
}
if(sum1==0){cout<<"请重新输入修改的作者名"<<endl; goto writersearch;
//}else if(sum1==1){
}else{
bianhaofunc:cout<<"请输入您要修改的编号:"<<endl;int bianhao;cin>>bianhao;if(booksarray[bianhao].writer==writer_){cout<<"你确定要修改该书吗? 确认请输入1,取消请输入0"<<endl;bool borrow;cin>>borrow;if(borrow){modifyfunc3: cout<<"信息格式:"<<endl; cout<<"example:理想国 978-7-80179-793-3 (古希腊)柏拉图著;吴献书译 B502.232/23"<<endl;cout<<"请输入你要修改的信息种类"<<endl;xinxitypemenu();cout<<"*****  0.返回上级目录  *****"<<endl;cout<<"****************************"<<endl;int option;cin>>option;system("cls");switch(option){case 1:cout<<"请输入题名(书名):"<<endl;cin>>booksarray[bianhao].topic;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc3;break;case 2:cout<<"请输入ISBN/ISSN:"<<endl;cin>>booksarray[bianhao].type;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc3;break;case 3:cout<<"请输入作者:"<<endl;cin>>booksarray[bianhao].writer;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc3;break;case 4:cout<<"请输入分类号:"<<endl;cin>>booksarray[bianhao].category;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc3;break;case 0:     cout<<"即将返回上级目录"<<endl; system("pause");return;default:cout<<"输入格式错误,请重新输入"<<endl;system("pause"); system("cls");goto modifyfunc3;break;       }}else{cout<<"你已取消本次操作"<<endl; return; }}else if(booksarray[bianhao].writer!=writer_){cout<<"请输入正确的编号"<<endl;goto  bianhaofunc;} }}
else if(xinxitype==4){cout<<"请输入分类号"<<endl;string category_;cin>>category_;int i=0;for(;i<=this->booksnum;i++){if(category_==this->booksarray[i].category){cout<<"搜索成功"<<endl;this->showbook(this->booksarray[i]);if(this->booksarray[i].state==1){cout<<"你确定要修改该书吗? 确定请输入1,取消输入0"<<endl;bool borrow;cin>>borrow;if(borrow){modifyfunc4: cout<<"信息格式:"<<endl; cout<<"example:理想国 978-7-80179-793-3 (古希腊)柏拉图著;吴献书译 B502.232/23"<<endl;cout<<"请输入你要修改的信息种类"<<endl;xinxitypemenu();cout<<"*****  0.返回上级目录  *****"<<endl;cout<<"****************************"<<endl;int option;cin>>option;system("cls");switch(option){case 1:cout<<"请输入题名(书名):"<<endl;cin>>booksarray[i].topic;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc4;break;case 2:cout<<"请输入ISBN/ISSN:"<<endl;cin>>booksarray[i].type;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc4;break;case 3:cout<<"请输入作者:"<<endl;cin>>booksarray[i].writer;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc4;break;case 4:cout<<"请输入分类号:"<<endl;cin>>booksarray[i].category;this->booksave();cout<<"修改成功"<<endl;system("pause"); goto modifyfunc4;break;case 0:     cout<<"即将返回上级目录"<<endl; system("pause");return;default:cout<<"输入格式错误,请重新输入"<<endl;system("pause"); system("cls");goto modifyfunc4;break;       }}else{cout<<"你已取消本次操作"<<endl; return; } }}}cout<<"找不到该书"<<endl; return;
}else{
goto borrowfunc;
}
}   

9.showlist.h

#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<<"该书的题名:"<<Book.topic<<endl;cout<<"  该书的ISBN/ISNN:"<<Book.type<<endl;cout<<"  该书的作者:"<<Book.writer<<endl;cout<<"  该书的分类号:"<<Book.category<<endl;if(Book.state==1) cout<<"  该书的借阅状况:未借出"<<endl; else if(Book.state==0){     cout<<"  该书的借阅状况:已借出"<<endl;cout<<"  该书的借阅者:"<<Book.ownerid<<endl;}}}return;
}void library::showuserlist()//管理员权限::展示所有用户信息
{for (int i=0;i<=usernum;i++){if (userarray[i].account!=0) cout<<userarray[i].account<<endl;}return;
}

再次感谢您能用心看完,如果感觉还可以,请给我点个赞,谢谢。

HNU程序设计-图书馆信息管理系统设计以及实验报告相关推荐

  1. java程序设计输入输出实验_20145320《Java程序设计》第五次实验报告

    20145320<Java程序设计>第五次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18: ...

  2. java实验报告 05 类与_java程序设计类与方法-java实验报告

    java程序设计类与方法-java实验报告 java程序设计类与方法-java实验报告 1. 实验内容或题目 (1) 编写Java应用程序,实现以下功能:当应用程序运行后,根据屏幕提示进行交互式输入并 ...

  3. 20145240 《Java程序设计》第四次实验报告

    20145240 <Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.26 实验 ...

  4. java坦克大战 实训报告_程序设计实训坦克大战实验报告

    <程序设计实训坦克大战实验报告>由会员分享,可在线阅读,更多相关<程序设计实训坦克大战实验报告(12页珍藏版)>请在金锄头文库上搜索. 1. 程序设计实训报告坦克大战专业班级: ...

  5. Java模式设计卖电脑实验报告_20145310《Java程序设计》第2次实验报告

    20145310<Java程序设计>第2次实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计 ...

  6. 西南交通大学高级语言程序设计(SCAI000812)第2次实验报告-学生成绩管理系统(链表版)

    背景描述: 因为苦于网上到处都找不到答案,仅有的链表版还要收费,我就自己写了一个低配版链表,将就着用,想的是帮助明年以及后年的学弟学妹们. 题目描述: 实验目的: 掌握程序设计的基本算法和简单数据结构 ...

  7. c语言程序设计编辑与调试环境实验报告,01程序设计基础实验报告_C语言程序设计基础.doc...

    01程序设计基础实验报告_C语言程序设计基础 程序设计基础 实验报告 题 目: C语言程序设计基础 院 (部): 管理工程学院 专 业: 信息管理与信息系统 班 级: 信管101 姓 名: 张三 学 ...

  8. c语言实验分支程序设计二,C语言程序实验报告分支结构的程序设计(0页).doc

    C语言程序实验报告分支结构的程序设计(0页) 数学与软件科学学院 实验报告 学期:11至12___ 第_1 学期 2011年10 月 17 日 课程名称:程序设计基础教程-C语言 专业:2010级5_ ...

  9. 程序设计语言c课程综合性实验报告,c语言综合性实验总结

    华北科技学院计算机学院综合性实验 实 验 报 告 课程名称 程序设计语言(C) 实验学期 2011 至 2012 学年 第 二 学期 学生所在学院 建筑工程学院 年级 11级 专业班级 土木B112班 ...

最新文章

  1. 生产企业开具加工费发票的问题
  2. c语言中的数字菱形,打印数字菱形,急啊,帮帮小女子啊。。。
  3. switch中case后可以是表达式吗_自学C++基础教程【流程控制语句】(switch语句 )...
  4. scala中使用特质中的抽象字段和实际字段
  5. SecureCRT出现 libpython2.7.so.1.0: cannot open shared object file
  6. 文件服务器访问权限分配,设置文件服务器的访问权限
  7. 他,是数学天才,是多复变解析函数的创始人
  8. windows11iis如何安装?
  9. Spring动态代理中有什么方法不会被代理探究
  10. macbook pro 重置 NVRAM / PRAM
  11. LaTeX插入参考文献手把手教学 | BibTeX教程
  12. vue函数@click.prevent使用纪要
  13. Sigfox的物联网生意经:弱水三千只取一瓢饮
  14. **matlab subs函数**
  15. 非常详细的STM32 CAN通信的贴子,从总线细节到编程实现
  16. 出租房安装监控摄像头的必要性
  17. android 字符串缩进换行换行,Android Textview第二行缩进/悬挂缩进
  18. 深度学习--滑动平均模型
  19. 陆奇最新演讲高清PPT下载;AI 绘画20+工具体验汇总;我愿称MOSS为全球开源界最强;思否AIGC黑客马拉松北京站 | ShowMeAI日报
  20. ICN: Integrated crosstalk noise

热门文章

  1. Day17-集合(中)Map
  2. 每周市场观察:XRP遭起诉下跌近50% 圣诞仍是牛市 | TokenInsight
  3. overlay文件系统解析
  4. Java反射机制的原理与使用(反编译)
  5. wordpress采集插件支持任意wordpress主题
  6. ros中有关欧拉角和四元数互转的python写法
  7. 表白墙网站php源码,自适应响应式表白墙网站PHP源码 带后台管理
  8. SDNFV Fest论坛成功举办 全景展现SDN/NFV测试成果
  9. ConcurrentHashMap底层详解(图解扩容)(JDK1.8)
  10. 《大话西游》你真的看懂了吗,kotlin命令行编译