基于C++实现的图书管理信息系统

Prettygirl

发布日期: 2021-04-01 16:09:03 浏览量: 223
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 概述

1.1 需求描述

  • 用户交互所有插入、更新、删除、查询操作的设计与实现,主要是myOperate的代码实现

  • 文件存储机制的设计与实现,包括以64KB为单位存储的构想,主要是FileReader、Unit、BookManager(与D)的代码实现

  • 总体设计和数据处理,协调各个类与方法的协调关系,编写Java程序从互联网抓取并处理图书信息数据,设计ImportBook、ImportCategory类实现批量导入数据

  • 书籍管理和书籍类别管理的设计与实现,主要是BookManager(查询与排序部分)、CategoryManager的代码实现

  • 处理汇总的文档;修改其中部分的语法错误;将字体、格式等处理成老师所要求的文档格式,并适当的美化,使文档看起来协调一致,结构清晰

1.2 编写目的

庞大而全面的图书索引,是现代高校图书馆提供师生必备的服务之一。建好这个系统关键问题在于两点:一方面要有强大的图书数据库支撑;另一方面要有高效而且人性化的索引方式。本项目着力于这两个问题的解决。

1.3 开发环境与技术

  • 操作系统:windows 7

  • 开发环境:Visual Studio 2008 专业版

  • 开发语言:C++

  • 数据采集与处理语言:Java

1.4 系统架构设计

我们初步构想是,此程序应支撑超过10 000条数据的检索,其中必有有繁琐的数据处理,因此将此项目切分为两部分:一部分专注需求中的图书管理业务实现,这只专注与用户交互,不关心数据的在内存中的管理,更不关心文件存储的结构;另一部分提供图书的插入、更新、删除、查询等数据操作的支撑,这则专注管理内存数据中、文件存储,不关心如何与用户交互。

建立好图书的插入、更新、删除、查询等数据操作的统一接口后,存储数据也可以使用两种方式:一是采用现有的数据库,如Access、MySQL、SQL2005;一是使用文件操作管理存储数据。考虑到使用C++连接现有数据库,需要配置额外的插件或是源代码,而且在短时间内比较难理解其内部实现机理,会增加调试的负担。况且若自己设计的文件管理数据,既能提高对数据管理协调的能力与编程能力,又能有的放矢,提高访问效率。依此我们又设计了独立的文件存储机制。

整个项目中各个类之间的关系:

  • FileReader:响应读写文件请求的方法类。读写的文件内容均封装在Unit类中

  • Unit:读取文件的最小结构单元的类。为频繁读写文件而降低效率,每次以64KB大小为单位从文件中读写数据

  • Book:存储图书信息的类

  • Category:存储图书类别的类

  • BookManager:管理图书的方法类

  • CategoryManager:管理图书类别的方法类

  • ImportBook:导入图书的方法类

  • ImportManager:导入图书类别的方法类

  • myOperate:提供用户交互的方法类

2 系统需求描述

2.1 系统需求概要

该图书馆管理系统,是以文件存储的形式来实现图书资料的读取和保存。主要是以用户的表现形式来展现系统功能。 图书的信息主要包括: 书名,作者,出版社, ISBN, 年月,检索号,价格,是否可借,关键字,主题,类别(计算机,通信,医疗,人文,财经等)。

2.2 系统需求细分

  • 添加图书信息

  • 删除图书信息:先显示所有的图书信息,按ISBN号删除图书信息之后,再显示目前所有的图书信息

  • 查询图书信息:可以按图书信息中的各条记录查询

  • 显示图书信息:按年月顺序显示,按书名顺序显示,按作者顺序显示,按检索号顺序显示,按ISBN顺序显示

  • 修改图书信息

  • 借阅和归还图书

  • 统计图书信息:统计某一价格段的图书信息,统计某一类图书的平均价格,统计图书馆每日可借书籍的数量和比例,以及分布。统计某一时段内图书的借阅状况等等

2.3 数据储存实现

数据的保存形式是保存在文本文件,读取和写入文件。我们写入文件是以二进制的格式来读取和写入的。我们几个人要分工合作,需要不同的逻辑层来完成此次任务,其中包括文件层(读取和写入),数据层(操作文件基础层在需要读取和写入的地方读取和显示数据),最后是表现层(把所有的函数及数据以用户交互的方式展现给用户,实现人性化的程序)。

3 模块说明

3.1 FileReader类的声明

  1. class FileReader
  2. {
  3. public:
  4. FileReader(string); //打开数据文件
  5. Unit * read(int); //以64KB为一个区,把一个区的数据的读入内存
  6. int write(Unit&,int); //把Unit的数据写入文件中的某一区
  7. bool close(); //关闭文件读写
  8. };

3.2 Unit类的声明

  1. class Unit
  2. {
  3. public :
  4. Unit(int); //构造函数,传入参量表示区数
  5. template <class type> //定义模板, 如(int,bool,char,float,double)
  6. bool get(type *value); //从缓存中提取数据,数据类型必须是基本类
  7. string getString(int); //从缓存中提取string类型
  8. template <class type> //定义模板, 如(int,bool,char,float,double)
  9. bool write(type value); //向缓存中写入数据,数据类型必须是基本类
  10. bool writeString(string,int); //从缓存中写入string类型
  11. bool seekg(int); //设置在缓存中指针的位置
  12. int tellg(); //读取在缓存中指针的位置
  13. };

3.3 CategoryManager类的声明

  1. class CategoryManager
  2. {
  3. public :
  4. CategoryManager(string); //加载图书类别信息,保存在类的链表中
  5. ~CategoryManager(); //将链表中信息写入文件,关闭文件,销毁占有的内存
  6. int getCategoryCount(); //返回图书类别数目
  7. int getId(string); //根据图书类别名称查询其ID(类别数据主键)
  8. string getName(int); //根据图书类别ID查询其类别名称
  9. bool insert(const Category &); //若ID不存在,新增图书类别
  10. bool update(const Category &); //根据图书类别ID,更新图书类别名称
  11. bool remove(int); //根据图书类别ID,删除图书类别信息
  12. void flush(); //将私有链表中图书类别信息写入文件中
  13. };

3.4 BookManager类的声明

  1. class BookManager
  2. {
  3. public :
  4. BookManager(string); //打开文件,加载图书信息,保存在类的私有链表中
  5. ~BookManager(); //将链表中信息写入文件,关闭文件,销毁占有的内存空间
  6. int getBookCount(); //返回图书数目
  7. bool insert(const Book &); //若插入图书的ISBN不存在,则插入图书信息
  8. bool update(const Book &); //根据图书的ISBN找到图书,更新图书信息
  9. bool remove(string); //根据ISBN,从链表中删除该图书信息
  10. /* 将私有链表中信息以二进制的形式写入文件,这种显式调用的方式将影响程序运行效率,除非有非常重要的数据需要保存而且接下来可能有意想不到的中断的情况下才使用,一般不建议使用*/
  11. void flush();
  12. /* 筛选数据,筛选string语句结构,个字段用‘|’隔开 */
  13. void select(vector<Book> &,string);
  14. /* 筛选价格在low和high之间的书籍信息 */
  15. void selectBetween(vector<Book> &,float low,float high);
  16. /* 排序,fieldNum指根据book结构中的第几个字段排序(从0开始),orderBy为0时顺序排,其他为逆序排 */
  17. void sort(vector<Book> &,int fieldNum,int orderBy);
  18. /* 算出某一类型的平均价格,传入参数为类型号 */
  19. float averagePrice(int);
  20. };

3.5 BookManager类的声明

  1. /* 继承BookManager */
  2. class ImportBook:public BookManager
  3. {
  4. public:
  5. void flush(); //重写BookManager此方法,提高效率
  6. };

3.6 CategoryManager类的声明

  1. /* 继承CategoryManager */
  2. class ImportCategory:public CategoryManager
  3. {
  4. public:
  5. void flush(); //重写CategoryManager此方法,提高效率
  6. };

3.7 myOperate类的声明

  1. class myOperate
  2. {
  3. public:
  4. void insertBook(); //插入图书,调用文件存储基类
  5. /*查询图书函数,用于查询特定条件的图书,可以根据书名,作者名,isbn,出版社等一些特定条件来进行查询 */
  6. void selectBook();
  7. void deleteBook(); //删除图书函数,根据isbn查询到相应图书并删除
  8. /*借阅图书函数,根据特定的isbn查询到要借阅的书本,查看是否可借,可借的话可以借阅,每次借阅图书书目会减一。也可以根据特定isbn来归还早期借阅的图书*/
  9. void borrowBook();
  10. /* 修改图书信息函数,根据isbn查询到待修改的图书,并根据提示操作修改书名或其他,修改完成系统提示操作完成 */
  11. void modifyBook();
  12. /*统计图书函数,根据特定的条件,例如某一价格区段的图书书目,或某一种类的图书平均价格等等 */
  13. void statBook();
  14. };

4 系统功能设计

加载数据,由于数据量较大,显示加载进度

馆内图书种类和图书数目

添加书籍,按提示输入信息后显示添加成功

按书名查询,输入书名即可查到刚添加的书籍信息

按索书号查询

借阅归还,借阅读书后,剩余图书数目减少一本

归还书籍再查询则剩余图书数目增加一本

输入查询书名“操作系统”

输入查询出版社“电子工业出版社”,可得到2355条记录(未打印)

支持模糊多字段查询(未打印)

支持查询作者

统计价格60-61元的图书

统计图书类别ID为400的全部图书的平均价格

5 总结

本设计方案实现了图书信息的添加、删除、查询、显示、统计等重要功能,基本完成了短学期的任务。

本次课题最大的难点在于利用C++语言实现信息的存储和海量数据的处理以及团队分工,由于时间、水平、经验有限,许多方面还有待改进。

  • 基础知识的欠缺:此前几乎没有接触文件流的相关知识,导致初期浪费了大量时间补习

  • 起初总体规划脱离实际:本来踌躇满志,想在课题的基础上实现更多功能,可是后来发现难度太大,而截止日期迫在眉睫,于是不得不截掉复杂的通用数据存储模块,采用较为简单但通用性不强设计方法

  • 团队合作仍需磨合:整个项目缺少一个清晰且可操作性强的总体框架,每个人的代码风格迥异,分工不够明确,一度造成停滞局面

上传的附件 cloud_download 基于C++实现的图书管理信息系统.7z ( 5.53mb, 9次下载 )
error_outline 下载需要8点积分

发送私信

一个月总有那么三十几天不想上班

12
文章数
7
评论数
最近文章
eject