最新图书馆管理系统说明书.docx
- 文档编号:23403864
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:18
- 大小:171.95KB
最新图书馆管理系统说明书.docx
《最新图书馆管理系统说明书.docx》由会员分享,可在线阅读,更多相关《最新图书馆管理系统说明书.docx(18页珍藏版)》请在冰豆网上搜索。
最新图书馆管理系统说明书
衡水学院
课程设计报告
题目:
图书管理管理系统
院系:
数学与计算机科学系
专业班级:
计算机科学与技术一班
学号:
201240405120
学生姓名:
刘子健
指导教师:
刘璐
2014年1月04日
课程设计报告
1.
(1)需求分析
(2)系统设计(包括详细设计和界面设计)
(3)程序流程图
(4)程序运行结果
(5)测试记录(测试各项功能的正确性、容错性)
(6)课程设计总结
(7)问题答辩
(8)附录(主要功能函数)
一、需求分析
图书馆管理系统是一个高度集成的图书信息处理系统,通过将图书馆的各种功能进行
整合,从而达到显示检索信息,提高工作效率,降低管理成本等目的。
一个典型的图书馆管理系统应该能够管理所有的图书种类,图书信息以及读者信息,还要提供各种图书信息的检索查询功能。
该系统还需要能够对图书的借阅,归还进行管理,并对读者的罚款进行自动计算。
通过该系统的自动化管理,能够大大减少图书馆管理人员,还能减少管理人员的工作任务,从而降低管理开销和成本
二、系统设计。
1)新书入库功能:
新到书籍入库包含几方面的操作:
查询该书名的书籍在图书馆信息中是否已经存在,若存在,则增加可借数量和书籍总量,若不存在,则新增加概述信息,从界面输入书籍的编号(0~999999的长整型)、书名(字符串类型)、该书作者名(字符串类型)、该书出版社信息(字符串类型)、出版日期(长整型)、该书的现存量(整型)、该书的总量(整型)。
输入该信息之后,将该节点插入到书籍信息链表中去。
该节点的插入位置根据查找,找到合适的位置插入,这样可以保证整个数据都是有序的,方便查找。
2)读者注册功能
没有账号和密码读者和管理员都不能登录系统,本系统默认第一个注册系统的是系统管理员,借阅号为1000,权限是1,并输入自己基本信息,默认可借本数为10,并将所借书信息区全部置零。
不是第一个注册的读者,借阅号从1000往后顺延,自己设置密码,权限为0.,其余信息与管理员相同,但是登陆之后的界面,管理员可以看到“入库”菜单选项,普通读者不能看到该选项。
3)借阅功能
书籍借阅主要涉及存书库和读者信息库双方的更新。
用户首先登陆系统,查询(3种查询方式)该书是否存在,该书的剩余数量是否大于零,最后查询该读者是否已经借满书籍。
若以上条件都满足,则将该书编号存入该读者的借阅信息区,将该读者的可借书数量减一,该存书的可借数量减一。
4)归还功能
读者登录后按书名号来归还所借书籍,若书名号正确并且确认归还该书籍,则从读者的借书区删除该书籍,读者的课结束数量加一,将该书的可借数量增加一,然后返回。
5)信息查询功能
信息查询分为读者信息查询和书籍信息查询,读者信息查询是在读者登录之后,可以显示本人的基本信息以及借书状况(所借书的本数、可借书本书以及所借书的信息),还可查询书籍信息,可根据书籍的编号来查找书籍、根据书名来查找书籍、根据作者名来查询书籍。
查询到该书籍后显示是否借阅该书籍。
数据结构描述
根据所给信息,可以采用线性链表来实现该问题。
现在分别给予描述。
1)读者
读者有很多信息需要使用,其中包含读者的姓名、性别、密码、权限、所借书信息。
这里我们定义一个结构体来描述他。
定义的结构体代码如下:
typedefstructREADER{
longnumber;//借阅号
charname[15];//读者姓名
charsex;//读者性别
charpassword[16];//读者的密码
intresidue;//读者的剩余可借书籍数量
longborrowed[10];//读者已经借阅的书籍编号
intlimit;//读者权限
structREADER*next;//该结构体作为线性链表的一部分用来链接下一个节点的指针
}reader;
2)书籍
同读者信息一样,书籍也有很多信息需要描述,其中包含书籍的编码、书名、书籍作者、书籍的总量、书籍的可借数量、出版社信息、出版日期,整个全部我们定义一个reader类型的结构体,该结构体定义的代码如下:
typedefstructBOOK{
longnumber;//书籍编号
charname[30];//书名
charauthor[30];//作者
charpress[30];//出版社信息
longpresstime;//出版日期
intexist;//在库数量
inttotal;//总数量
structBOOK*next;//指向写一个节点的指针
}book;
3)数据链接
数据通过每个节点的“next”指针来链接,是单线性链表,只可以从头部查询数据,所以要记录好该链表的头结点位置,不要拿该节点的头结点参与运算,否则在程序中可能会修改该链表的头结点的信息,导致后续程序无法运行。
4)查询
查询书籍分为按书名查询、按书号查询和按作者查询。
按书名查询到的书籍我们设定为是唯一的,及整个书库中只有一种叫该名的书籍。
根据输入的书籍名,从书籍信息链表的首元节点开始遍历,若查找到则返回该书籍的指针,若没找到,则返回NULL。
按作者查询的书籍可能不止一种,一样从头结点开始遍历数据,每查到一个,则输出该书信息,并且继续往下查询,该函数没有返回者,读者可以根据查询到的数据,记下编号或者书名来进一步确认该书籍信息,然后借阅该书籍。
按书号查询,书号作为KEY值,在书籍里面是独一无二的,我们建立一个索引表,每两个key之间有5本书籍,这样根据所查书籍的书号可以确认该书在那个大概的区段,但后从该区段的首地址往下搜索最多5次便可确认该书的位置或者确认该书是否存在于该书库中。
查询读者信息读者登录之后可以查阅自己信息,从读者头结点开始往下查询,若查询到该读者,则返回该读者指针,并且显示该读者信息,若没有查找到,则返回NULL。
A、借阅模块:
函数声明:
voidborrow(reader*temp,book*Bhead);//借书
说明:
Temp是该读者的指针,Bhead是该书籍链表的头指针。
该函数的流程图如下:
B、归还模块
函数声明:
voidreturnbook(book*bhead,reader*temp);//还书
说明:
bhead是书籍链表的头指针,temp是借阅者的指针。
流程图如下:
C、插入模块
函数声明:
voidinsert(book*bhead);//入库
说明:
bhead是书籍链表的头指针,流程图如下:
N
N
Y
Y
一、算法设计
1、读者信息存储
读者信息采用线性单链表存储,设置头结点,头结点不存储数据,初始化时头结点->next设置为空,然后每从文件中读取一组数据,则将该数据存入新开辟的空间,链接到读者信息链表中,再将该数据的next置空。
2、书籍信息存储
书籍信息存储采用单链表存储,设置头结点,头结点不存储数据,头结点的next为空,初始化时,从文件中读取一个格式化的数据,则将该数据存入新开辟的空间,并将该节点链接到链表中去,将next置空。
3、查找
查找分按书名查找、按作者查找和按书号查找。
按书名查找是采用遍历线性链表的方式,从首元结点开始向下遍历,检查输入的书名和已存的书名是否匹配,如果匹配,则将该书籍的指针返回,然后查找结束。
若直到最后也没找到,则返回空。
按作者查找则根据输入的作者名,从书籍链表的首元结点开始遍历,检查记录中的读者信息和输入的是否匹配,若找到匹配的,则输出该书籍信息,然后继续向下遍历,直到链表尾部,查找结束。
按书号查找则是根据建立的索引表来查找记录。
索引表是一个线性单链表,每个索引节点包含3个内容:
该索引的key值、该key值指向的书籍节点、该索引节点的下一个索引节点所在的位置。
设定书籍链表中每5本书籍取一个key值,从书籍链表的首元结点开始。
索引链表的头结点也为空,首元结点存储书籍链表的第一个记录的书号、第一个节点的位置和下一个索引节点的位置。
然后按书号查找时,先查找索引表,找到最近的入口,再从索引节点进入书籍节点,查找到该书籍,返回该书籍的指针。
按索引表在较大的数据查询时可以用空间换时间的方式减少查询时间,达到提高效率的结果。
但是这样分配新的节点需要占用空间,而且每次有新增书籍需要重新生成索引表,这样需要删除源节点空间,以免造成内存浪费。
二、详细程序清单
1、头文件定义
头文件library.h定义了3个结构体:
书籍结构体、读者结构体和索引表结构体,其中书籍结构体和索引表结构体已经给出,这里不再赘述,索引表结构体的定义如下:
typedefstructKEY{//索引表结点
longkey;
book*adress;
structKEY*next;
}keynode;
头文件还包含一些系统头文件的声明:
#include"stdio.h"
#include"string.h"
#include"conio.h"
#include"windows.h"
还有一些函数的声明,用#ifndef、#endif来包含,以免重复包含。
2、插入部分
插入部分分为书籍入库、读者注册、登陆3大块,分3个函数,声明如下:
voidinsert(book*bhead);//入库
voidreg(reader*head);//注册
reader*login(reader*rhead,book*bhead);//登陆
这3个函数分别实现新书入库、读者注册、登陆等功能,入库功能只有管理员才能调用,其余函数均可以调用,在主函数界面就可以。
3、读写模块
此模块主要实现向文件写入、读取数,主要是2个文件:
reader.txt、book.txt,分为4个函数:
读者读、写函数,书籍读、写函数。
定义如下:
book*Bload();//书籍链表读取
reader*Rload();//读者链表读入
voidBsave(book*Bhead);//书籍信息链表写入
voidRsave(reader*Rhead,book*bhead);//读者信息链表写入
读者和书籍链表的初始化就由读取函数完成,若文件为空则返回空指针,若不为空,则将文件里面的信息写入到链表中,每读出一个数据,分配一个空间,将该信息输入。
4、查找模块
查找模块分书籍查找模块、读者查找模块,书籍查找模块分线性链
遍历查询、索引表查询,读者查询直接遍历读者链表,查找该读者,若存在,返回指针,不存在则返回NULL。
查找模块的定义如下:
book*S_name(book*head,charname[]);//按书籍名查找函数
voidS_author(book*head);//按作者查找
keynode*initindex(book*head);//初始化建立索引表
book*S_number(longnum,book*bhead);//按书号查找
reader*S_reader(reader*rhead,longnum);//查找读者
5、显示模块
根据给出的节点指针,显示该节点所包含的信息,显示分为读者显示和书籍信息显示,读者信息显示包含书籍信息显示,以便显示读者所借书的信息。
这两个函数的声明如下:
voidshowR(reader*tr,book*bhead);//显示读者信息函数
voidshowB(book*p);//显示书籍信息函数
这个模块还有2个小函数,用于将存入的性别y’、’n’转化成汉字,将存的权限“1”、“0”转化成“管理员”、“读者”输出,这两个函数的定义如下:
char*sc(charp)
{
if(p=='y'||p=='y')
return"女";
else
return"男";
}
char*lc(inti)
{
if(i==1)
return"管理员";
else
return"读者";
}
6.密码保护函数
这个函数可以保护输入的密码不显示在界面上,不被别人看到,这个函数的定义如下:
voidintpsd(char*psd)//密码保护函数
{inti=0;charc;
while((c=getch())!
=13)/*用getch()读入的回车值为13*/
{if(c!
='\b'&&c!
='\t'&&i<20)
{psd[i]=c;putchar('*');i++;}
if(c=='\b'&&i>0)
{printf("\b\b");i--;}/*输出内容为退格,空格,退格;擦掉一个字符*/
}
psd[i]='\0';
return;
}
这个模块还有几个菜单界面,不再赘述。
三、程序流程图
四、测试记录
测试中出现的问题包括:
未注册用户是否可以登陆、管理员的权限是否完整,图书入库功能是否能正确运行。
测试注册时密码长度要求,以及是否以星号显示已输入密码。
五、程序运行结果
a)登陆界面
b)入库界面
c)借阅界面
d)还书界面
六心得体会
这个程序设计作业,难度有点高,主要是使用了一些数据的处理方法,在数据的存储、调用、查找、排序灯方面都得到了充分的锻炼,巩固了数据结构的基本知识,加深了对C语言知识的巩固,并尝试了一些新的想法和思路,在整个程序设计过程中收获颇多。
在处理数据和程序代码方面都得到了很大的锻炼。
这次课程设计使我看到了很多不足,主要是对语言还理解不够透彻,一知半解等现象,也没有做出很漂亮的界面来支撑程序,而且个人感觉有些凌乱再经过请教了杜文婉同学和张倩同学后解决了一些界面美化问题。
经过三个星期的实习,。
在此期间我也失落过,也曾一度热情高涨。
从开始时满富盛激情到最后汗水背后的复杂心情,点点滴滴无不令我回味无长。
生活就是这样,汗水预示着结果也见证收获。
劳动是人类生存生活永恒不变的话题。
通过实习,我才真正领略到“艰苦奋斗”这一词的真正含义,我才意识到老一辈测绘为我们的社会付出。
我想说,测绘确实有些辛苦,但苦中也有乐,在如今的世界,很少有机会能与大自然亲密接触,但我们可以,而且测绘也是一个团队的任务,一起的工作可以让我们有说有笑,相互帮助,配合默契,多少人间欢乐在这里洒下,大学里一年的相处还赶不上这十来天的实习,我感觉我和同学们之间的距离更加近了;我想说,测绘确实很累,但当我们所测的数据制成成果时,心中也不免产生兴奋;正所谓“三百六十行,行行出状元”。
我们同样可以为社会做我们应该做的一切,这有什么不好?
我不断的反问自己。
也许有人不喜欢野外的工作,也许有人认为测绘的工作环境不好,但我认为无论干什么,只要人生活的有意义就可。
社会需要我们,我们也可以为社会而工作。
既然如此,那还有什么必要失落呢?
于是我决定沿着自己的测绘路,执着的走下去。
社会需要我们,我们也可以为社会而工作。
既然如此,那还有什么必要失落呢?
于是我决定沿着自己的测绘路,执着的走下去。
同时我认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。
某个人的离群都可能导致整项工作的失败。
实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。
团结协作是我们实习成功的一项非常重要的保证。
而这次实习也正好锻炼我们这一点,这也是非常宝贵的。
对我而言,知识上的收获重要,精神上的丰收更加可喜。
挫折是一份财富,经历是一份拥有。
这次实习必将成为我人生旅途上一个非常美好的回忆!
七、问题答辩
1、有关于密码保护函数中星号代替密码显示是怎么实现的?
通过密码保护函数:
voidintpsd(char*psd)//密码保护函数
{inti=0;charc;
while((c=getch())!
=13)/*用getch()读入的回车值为13*/
{if(c!
='\b'&&c!
='\t'&&i<20)
{psd[i]=c;putchar('*');i++;}
if(c=='\b'&&i>0)
{printf("\b\b");i--;}/*输出内容为退格,空格,退格;擦掉
当输入密码时用星号代替密码输出。
2、如何按书号查找书籍用什么方法查找?
按书号查询,书号作为KEY值,在书籍里面是独一无二的,我们建立一个索引表,每两个key之间有5本书籍,这样根据所查书籍的书号可以确认该书在那个大概的区段,但后从该区段的首地址往下搜索最多5次便可确认该书的位置或者确认该书是否存在于该书库
3、怎样控制密码长度?
限制密码最多为五位:
while
(1)
{
printf("\n请输至少五位密码:
");
intpsd(t1);
if(strlen(t1)<=4)
printf("\n密码过于简单,请重新设置:
");
else
break;
}
限制密码多为20位
{inti=0;charc;
while((c=getch())!
=13)/*用getch()读入的回车值为13*/
{if(c!
='\b'&&c!
='\t'&&i<20)
{psd[i]=c;putchar('*');i++;}
if(c=='\b'&&i>0)
{printf("\b\b");i--;}/*输出内容为退格,空格,退格;擦掉一个字符*/
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 图书馆 管理 系统 说明书