图书信息管理系统

这是之前数据结构的大作业~大家将就着看吧~

 

图书信息管理系统 

by Sandy

 

目录

一、         问题分析... 2

1.1问题阐述... 2

1.2 数据结构的选取... 2

1.2.1 二叉查找树BST. 2

1.2.2 链表... 2

1.3 方法的选取:... 2

1.3.1 方法描述... 2

1.3.2 优点... 3

1.3.3 问题... 3

二、         模块设计... 4

2.1模块图... 4

2.2模块介绍... 4

2.2.1 管理控制模块... 4

2.2.2 文件管理模块... 4

2.2.3 数据结构模块... 4

2.2.4 辅助模块... 5

三、         程序运行结果... 6

3.1 图书搜索... 6

3.2 借阅与归还... 7

3.3 书库管理... 8

3.4 读者注册... 9

3.5 界面设计考虑... 9

四、         使用说明... 10

五、         感想... 11

 

一、   问题分析

1.1问题阐述

某校图书馆需要一套图书信息管理系统,图书管理员用此系统记录和处理图书、作者和出版社信息。(注:一本图书可以有多个作者,一个作者可以编写多本图书)。需存储的信息包括:图书号、图书名;作者号、作者姓名;出版社号、出版社名;现存量和总库存量。基本业务活动包括:采编入库、清除库存、借阅、归还、查询图书信息、读者注册等。

1.2 数据结构的选取

1.2.1 二叉查找树BST

理由:图书馆的书数目很大,搜索速度一定要有保障,如果顺序搜索的话,真不知道要搜到何年何月。所以选择了树结构,把关键字和在存储文件的位置记录下来,相当于索引树,这样搜索的效率就会提高。其实如果够时间的话,我会用红黑树或者AVL树,这样效率会更高。但是由于时间比较紧,我就用了比较熟悉的BST。

1.2.2 链表

理由:这个程序实现了比较简单的模糊搜索,所以搜到的书可能不止一本。于是我用链表记录搜到书记录的存储位置,节点的插入按所存位置从小到大,然后根据这个位置读取文件信息,在界面上显示搜索结果。其实只是个辅助的数据结构。

1.3 方法的选取:

1.3.1 方法描述

由于其他功能的实现基本上是文件的读取和写入,没有什么算法可言,所以这里描述的主要是搜索的方法。这个程序用了三个BST,命名分别为nameTree, authorTree和pubTree,分别存储书名的关键字和位置,作者名字和位置,出版社名和位置。位置的计算方法与图书号有关,这个书的号码是多少,就是第几条记录,这样比较方便。

每插入一本书,程序会把书名“分词”,这是我在网上搜“模糊检索”时看到的词(虽然有查过,不过这个程序采用的模糊检索方法基本都是自己的想法),这里采用的分词方法比较简单,只是每4个字节分为一个关键词。分词后,把这些关键词以及对应记录的存储位置插入nameTree里(当关键词为空时则不插入)。而作者名字和出版社名则完整地分别插入authorTree和pubTree中。

搜索的时候,分3种情况。 第一种情况是:有提供书名(这里可以不是完整的书名),程序则把这个书名分词,逐个在nameTree里搜索,把搜索到的书的存储位置都存到链表里(按存储位置从小到大插入链表,相同则不插入),此时如果有提供作者名或者出版社名的话,用另一个链表存储搜到作者名或者出版社名的记录位置,由于这里用到的链表都是从小到大排列的,所以逐一对比搜索nameTree得到的链表和搜索authorTree或者pubTree得到的链表,在搜索nameTree得到的链表里剔除另一个链表没有的,这样就实现了联合搜索。 第二种情况是:没提供书名但有提供作者名,方法与第一种情况有点类似,先搜索authorTree得到链表,此时如果有出版社名,则按第一种情况里面剔除方法,把搜索authorTree得到的链表中剔除搜索pubTree得到的链表内不包含的节点。 第三种情况是:没提供书名和作者名,只提供的出版社名,则直接在pubTree中搜索该出版社名,得到最终结果。

1.3.2 优点

最显著的优点是,实现了模糊检索,虽然比较简单,但也是自己异想天开的想法。另一个优点是,提高了搜索效率:假设书的数目为n的话,把长度为20的书名分成5个关键词,则搜索nameTree效率大概为log(5n),搜索authorTree和pubTree的效率分别大概为log(n),得到链表的长度也不会很长,此处忽略,这样加起来,搜索的效率大概为log(5)+3log(n),也就是Θlog(n)的效率,也算是很高了。

1.3.3 问题

上面的计算是建立在BST左右比较平衡的情况下,如果极不平衡的话,树的使用就没有意义了,所以如果优化的话,应该使用红黑树或者AVL树,至于现在为什么不用,看本文1.2.1就知道了。如果书名关键词出现得比较多,这样链表的长度就会很长,联合搜索时剔除的时间就不可以忽略了。

<返回目录>

 

二、   模块设计

2.1模块图

2.2模块介绍

2.2.1 管理控制模块

构成:包含Management类,里面是系统初始化、插入书记录、删除书记录、借阅、归还、搜索、读者注册等等的方法。

功能:核心类。实现所有图书信息管理系统的功能。

特殊技巧:应用的BST实现搜索,实现了比较简单的模糊搜索。

2.2.2 文件管理模块

构成:包含Book、Reader、BookFile、ReaderFile四个类。Book和Reader类分别包含着图书、读者的信息,BookFile里面包含了与图书信息有关的文件流的一切属性和操作,ReaderFile里面包含了与读者信息有关的文件流的一切属性和操作。

功能:实现图书和读者的信息存储、读取和更新。相当于数据库的管理(除去搜索)。

特殊技巧:用图书号作为图书存储位置的信息,简化操作。把文件流封装起来,方便测试。

2.2.3 数据结构模块

构成:包含SearchNode、SearchTree、PosNode、PosList四个类。SearchNode是个BST,每个节点存储了关键字和对应书记录的存储位置。而PosList是个动态链表,每个节点存储了书记录的存储位置。

功能:实现搜索要使用的数据结构以及相关操作。

特殊技巧:节点只存储记录的存储位置,相当于索引,节省内存空间。

2.2.4 辅助模块

构成:包含WordPartition和Compare两个类。WordPartition类包含分词的方法。Compare类包含固定长度char*字符串的比较方法。

功能:辅助系统的实现。

特殊技巧:之所以另起这样一个模块,是为了便于以后扩展。这里实现的分词相对简单,可以用这个接口来实现更加优化的分词。

<返回目录>

 

三、   程序运行结果

3.1 图书搜索

比较简单的模糊搜索:

 

联合搜索:

 

3.2 借阅与归还

借阅:

 

归还:

 

3.3 书库管理

查看所有图书:

 

图书入库:

 

清除库存:这里也包含着模糊搜索的功能,以免删错。

 

3.4 读者注册

 

3.5 界面设计考虑

之所以采用4个分页的结构,除了用来区分功能和优化界面以外,还考虑到各种功能的权限问题,以后拓展的时候可以加上输入密码等权限限制,来区分管理员和读者的权限。

<返回目录>

四、   使用说明

l  点击LibraryMIS.exe使用时,bookInfo.txt和readerInfo.txt一定要放在同一目录下。

l  所有书名、作者名、出版社和读者名不能超过20个字节,超过会自动忽略后面的内容。

l  借阅和归还图书时,图书号和读者号都不能空

 

l  图书入库时,书名和入库数量不能为空

 

l  读者注册时,读者名字不能为空

 

<返回目录>

五、   感想

使用平台:Visual Studio 2008

使用语言:C++

用时:5天

本来想着2天就搞定的程序居然用了5天,不过实现了还是很激动!期间,试过熬夜编程,编得兴奋得时候甚至忘了吃饭,呵呵~或许自己太久没编过像样的程序,是这个程序让我重温了编程的兴奋感,蛮不错的。

模糊搜索的算法是自己想的,虽然这种分词方法很猥琐,但至少也算是个比较异想天开的想法吧。是那天写文件流纠结时,下去足球场跑步放松的时候突然想到的。

老师说过,好的系统应该是便于拓展的。所以,在这个方面,我特意把分词的方法独立放在一个类里。把界面分成4个子界面,便于以后权限的加入。

最终给自己的评价是,还算过得去。

<返回目录>

下载请点击 https://files.cnblogs.com/sandywong/%e5%9b%be%e4%b9%a6%e4%bf%a1%e6%81%af%e7%ae%a1%e7%90%86%e7%b3%bb%e7%bb%9f.rar

posted @ 2010-12-30 00:28  free_swallow  阅读(1323)  评论(0编辑  收藏  举报