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

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

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

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第1张图片

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

一、题目描述

H大学图书馆

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

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

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

三、图书信息包含:

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第2张图片

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

1)管理员模式:

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

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

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

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

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

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第3张图片

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

  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()成员函数

         HNU程序设计-图书馆信息管理系统设计以及实验报告_第4张图片

二、用户模式

        显示用户功能菜单

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

        HNU程序设计-图书馆信息管理系统设计以及实验报告_第5张图片

1.修改密码

 直接在main函数中进行修改

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第6张图片

2.搜索图书

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

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

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

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

1.题名搜索

             HNU程序设计-图书馆信息管理系统设计以及实验报告_第7张图片

               

2.ISBN/ISNN搜索

HNU程序设计-图书馆信息管理系统设计以及实验报告_第8张图片

3.作者搜索

HNU程序设计-图书馆信息管理系统设计以及实验报告_第9张图片

4.分类号搜索

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第10张图片

HNU程序设计-图书馆信息管理系统设计以及实验报告_第11张图片

HNU程序设计-图书馆信息管理系统设计以及实验报告_第12张图片2.借图书

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

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

          HNU程序设计-图书馆信息管理系统设计以及实验报告_第13张图片

3.还图书

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第14张图片

4.查看借阅记录

           显示某个用户的借阅记录

HNU程序设计-图书馆信息管理系统设计以及实验报告_第15张图片

         

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

5.退出登录

        通过goto返回上一级

        HNU程序设计-图书馆信息管理系统设计以及实验报告_第16张图片

三、管理员模式

        显示用户功能菜单

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第17张图片

1.管理用户账号HNU程序设计-图书馆信息管理系统设计以及实验报告_第18张图片

1.添加用户账号

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第19张图片

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

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第20张图片

2.删除用户账号

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第21张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第22张图片

3.重置用户密码

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第23张图片

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第24张图片

4.初始化用户密码

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第25张图片

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第26张图片

0.返回上级目录

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第27张图片

 2.修改图书信息

HNU程序设计-图书馆信息管理系统设计以及实验报告_第28张图片

  1. 添加图书信息

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第29张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第30张图片

2.删除图书信息

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第31张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第32张图片

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第33张图片

3.修改图书信息

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第34张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第35张图片

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

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第36张图片

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第37张图片

 HNU程序设计-图书馆信息管理系统设计以及实验报告_第38张图片

0.返回上一级目录 

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第39张图片

 3.搜索图书信息

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第40张图片

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

4.查看借阅情况     

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第41张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第42张图片

 5.查看馆藏图书列表  

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第43张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第44张图片

 6.查看用户列表

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第45张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第46张图片

0.退出登录       

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第47张图片

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第48张图片

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第49张图片

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

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

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

例如user目录下的default语句

HNU程序设计-图书馆信息管理系统设计以及实验报告_第50张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第51张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第52张图片

再如管理员模式的default语句

HNU程序设计-图书馆信息管理系统设计以及实验报告_第53张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第54张图片

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

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

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第55张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第56张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第57张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第58张图片

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

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

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第59张图片

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第60张图片

六、关于颜色的处理

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

HNU程序设计-图书馆信息管理系统设计以及实验报告_第61张图片

4、分析与总结

1.实验分析

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

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

3.读写文件在本次实验中显得十分重要,为了使程序每次运行都能保留数据,需要用到的读写文件知识。做到这点使我们初步体验到了程序员的成就感,更是这种沟通“黑屏”内外的力量给我们带来惊喜。能够在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
#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<<"退出登录成功,即将返回登录界面"<

2.library.cpp

#include"library.h"
using namespace std;
//用于做显示的界面 
void library::zongmenu(){
cout<<"********************************"<

3.library.h

#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

4.books.h

#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;
     } 
}

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<=0;i--){
	 	if(recordarray[i].ownerid==id){
	 	sum++;
	 	cout<

6.login_check.h

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

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<<"文件不存在"<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();
}

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<<"用户规模已经达到上限,请先删除部分用户"<>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<<"修改成功"<

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<<"该书的题名:"<

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

你可能感兴趣的:(c++程序设计大作业,c++)