图书管理系统程序设计.docx
- 文档编号:5116901
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:31
- 大小:87.77KB
图书管理系统程序设计.docx
《图书管理系统程序设计.docx》由会员分享,可在线阅读,更多相关《图书管理系统程序设计.docx(31页珍藏版)》请在冰豆网上搜索。
图书管理系统程序设计
1、问题定义:
要完成的任务如下:
(1)借书、还书和预约
(2)增加或删除图书
(3)查询最近借走某本图书的读者
(4)按书名或作者查询图书
(5)对过期未还图书的读者进行罚款处理
该系统还要求:
(1)一个读者共可从本系统中借5本图书
(2)有过期未还图书的读者不能从本系统借书
(3)每本图书的借阅期限为3个月
二、功能描述:
1、用户需求分析
作为图书管理系统,其主要的需求人员是借阅者,借阅者对其的要求可以大体概括如下:
1)能按各种方式,比如书名、编号、作者等查询图书馆的藏书情况;
2)能熟悉使用图书管理系统;
3)能方便地借阅图书、续借图书、归还图书;
4)能查询自己的基本资料、借阅图书情况;
5)能方便图书管理员对图书的录入登记、注销;
6)能方便对新生的登记或注销已经毕业学生的信息;
7)能及时发布一些学院学生借阅图书超期情况、馆内藏书情况等。
2、功能说明
1)、读者管理系统
(1)未注册者可以进入注册系统进行注册;
(2)已注册借阅者可按姓名、编号或身份证号登陆进入借阅者检索系统查询借阅者
情况;
(3)已注册借阅者可按书名、出版社或作者对图书信息进行检索查询或提出预约请
求;
2)、图书管理员管理系统
(1)图书管理员通过图书管理员身份认证进入图书管理员管理系统;
(2)读者可借阅在库图书;
(3)在规定期限内借阅者归还借阅图书;
(4)读者在不违规情况下可继续借阅已借阅图书;
(5)读者可以预约图书。
3)、系统管理员管理系统
(1)系统管理员通过系统管理员身份认证进入系统管理员管理系统;
(2)系统管理员可以对图书进行图书管理(如:
查询、删除、修改图书资料或图书
分类查询修改、删除管理);
(3)系统管理员可以对借阅者进行学生管理(如:
查询、删除、修改借阅者信息或
借阅者类别修改、删除管理,查询浏览借阅者详细资料,包括借阅次数,登陆次数,
最后登陆时间);
4)、罚款管理系统
(1)罚款管理员通过罚款管理员身份认证进入罚款管理系统;
(2)罚款处理可以读取借阅信息表再生成超时罚款信息表,通过超时罚款信息表可
以生成罚款单给罚款管理员;
(3)图书管理员告知罚款系统图书超时未还,经罚款管理员鉴定后,对图书进行注销处理且罚款管理员对借阅者进行罚款处理。
3、DFD顶层流程图
4、细化的数据流图
三、数据定义:
1)ER模型图
2)数据定义:
读者的基本属性:
classStudent
{
private:
inttag;
intnumber;
charname[10];
intborbook[Bor];
public:
.....
图书的基本属性:
classBook
{
private:
inttag;
intnumber;
charname[20];
intonshelf;
public:
四、总结结构和模块接口
五、程序流程图
六、测试和结果
1)单元测试:
采用白盒测试法
针对用户还书、预约、借书、查询等功能模块进行测试
(1)对于还书功能模块,模块的程序流程图如下:
判定节点为2,环形复杂度为:
2+1=3
采用路径覆盖法,测试用例为:
1、测试路径:
0-5输入条件:
retno不存在预期输出:
无该图书
2、测试路径:
0-1-4-5输入条件:
retno存在,borday>90预期输出:
接受违约惩罚
3、测试路径:
0-1-2-3输入条件:
retno存在,borday<=90预期输出:
成功还书
(2)对于预约功能模块,模块的程序流程图如下:
图中判定节点为:
2,环形复杂度为:
2+1+3
采用路径覆盖法,测试用例如下:
1、测试路径:
0-1-6-9输入条件:
borday>90预期输出:
接受违约处罚
2、测试路径:
0-1-2-7输入条件:
borday<=90,borno不存在预期输出:
不存在该图书
3、测试路径:
0-1-2-3-8输入条件:
borday<=90,borno存在,onself不存在预期输出:
图书已借出
4、测试路径:
0-1-2-3-4-5输入条件:
borday<=90,borno存在,onself存在预期输出:
预约成功
(3)对于借书功能模块,模块的程序流程图如下:
图中判定节点为4,环形复杂度为:
4+1=5
采用路径覆盖测试法,测试用例如下:
1、测试路径:
0-7输入条件:
borday>90预期输出:
接受违约惩罚
2、测试路径:
0-1-8输入条件:
borday<=90,borno>5预期输出:
超出所借数目的最大
3、测试路径:
0-1-2-3-9输入条件:
borday<=90,borno>5,bookno不存在预期输出:
所借图书编号不存在
4、测试路径:
0-1-2-3-4-10输入条件:
borday<=90,borno>5,bookno存在,onshelf不存在预期输出:
书不在架
5、测试路径:
0-1-2-3-4-5-6输入条件:
borday<=90,borno>5,bookno存在,onshelf存在预期输出:
借书成功
(4)对于查询功能模块,模块的程序流程图如下:
流程图中判定节点为2,环形复杂度为:
2+1=3
采用路径覆盖测试法,测试用例如下:
1、测试路径:
0-1-6输入条件:
bookno不存在预期输出:
要查找的图书不存在
2、测试路径:
0-1-2-3输入条件:
bookno存在,onself=1预期输出:
要查找的图书已被借走
3、测试路径:
0-1-2-4-5输入条件:
bookno存在,onself=0预期输出:
返回查找图书信息
2.)确认测试:
采用黑盒测试法测试
确认测试,主要是为了检测接口功能应对的各种非预期性输入时系统的可靠性和容错性等性能。
本小型图书管理系统将对用户和管理员与图书管理系统之间的交互接口进行测试,所以测试的主要内容有2个:
图书管理系统和管理员接口,图书管理系统和读者接口。
(1)读者与图书管理系统之间的接口
读者登陆图书管理系统,应受到系统如下的约束:
用户名需要以字母开头,后面是数字和字母组合,不能超过最大长度为10,密码长度不超过6
划分了等价类,情况如下所示:
输入条件
有效等价类
编号
无效等价类
编号
用户名开头
字母(a-z)
1
非字母
4
余下字符
数字和字母组合
2
非数字和字母
5
字符数
小于10
3
大于10
6
有效等价类的测试用例:
测试编号
输入条件
预期输出
覆盖等价类
开头
余下字符
个数
T1
a
dd32323
8
add32323
1、2、3
无效等价类的测试用例:
测试编号
输入条件
预期输出
覆盖等价类
开头
余下字符
个数
T1
2
dd32323
8
输入错误
2、3、4
T2
a
*>
5
输入错误
1、3、5
T3
a
1234567899
11
输入错误
1、2、6
(2)管理员与图书管理系统之间的接口
管理员与图书管理系统之间的接口和用户相同,所以对其测试仍然和用户与图书管理系统的测试一样的等价类和测试用例,不再详细介绍。
7、总结与展望
在此次小型图书管理系统的开发试验中,我获益匪浅。
自从上大学学习计算机来,我对编程也相对比较熟悉和了解,但是,每天编写的程序是毫无头绪和没有什么计划。
学习软件工程以来,对于软件项目的建立和开发有了一个系统的认识,软件开发分为七个方面:
问题定义,可行性分析、需求分析、总体设计、详细设计、编码、软件测试和维护。
在每一个阶段都有明确的目标和开发的过程。
本文档主要介绍了图书信息管理系统,根据学校图书馆的实际情况进行了需求分析,并对数据的结构设计进行了分析,初步设计出了系统的总体结构,此后对整个系统的功能和设计实现作出了详细的介绍。
由于设计时间仓促,对各个方面考虑的还不够全面,系统设计难免存在欠缺,有很多模块操作还不够人性化,对很多错误的信息处理还不够全面,包括数据的格式错误,数据的录入是否合乎实际要求等等。
对于一个完整的图书信息管理系统的功能实现还不够完整,很多功能还没有考虑到,还需要添加个别的功能模块,以达到系统的完整性。
由于设计时间的短暂,对于该系统的开发已经基本达到了最初的设计要求,能够基本满足用户的需求。
在以后的系统完善中还需对系统应用中遇到的错误进行处理,并检验数据的合法性,并做出相应的处理。
而且还要考虑到数据的完整性和安全性。
根据学校图书馆的实际需求再添加相应的功能模块,完成一个完整的实用的图书信息管理系统。
#include
#include
#include
#include
usingnamespacestd;
constintReader=100;
constintMaxb=100;
constintBor=5;
classStudent
{
private:
inttag;
intnumber;
charname[10];
intborbook[Bor];
public:
Student(){}
char*getname()
{
returnname;
}
intgettag()
{
returntag;
}
intgetnumber()
{
returnnumber;
}
voidsetname(char*na)
{
strcpy(name,na);
}
voiddelbook()
{
tag=1;
}
voidaddStudent(intn,char*na)
{
tag=0;
number=n;
strcpy(name,na);
for(inti=0;i borbook[i]=0; } voidborrowbook(intbookid)//借书操作 { for(inti=0;i { if(borbook[i]==0) { borbook[i]=bookid; return; } } } intretbook(intbookid)//还书操作 { for(inti=0;i { if(borbook[i]==bookid) { borbook[i]=0; return1; } } return0; } voidoutput()//读出读者信息 { cout< ["; for(inti=0;i if(borbook[i]! =0) cout< cout<<"]"< } }; classRData { private: inttop;//读者记录指针 Studentread[Reader]; public: RData()//构造函数,将Student.txt读到read[]中 { Students; top=-1; fstreamfile("Student.txt",ios: : in);//打开一个输入文件 while (1) { file.read((char*)&s,sizeof(s)); if(! file)break; top++; read[top]=s; } file.close(); } voidclear() { top=-1; } intaddStudent(intn,char*na)//查找是否存在 { Student*p=equal(n); if(p==NULL) { top++; read[top].addStudent(n,na); return1; } return0; } Student*equal(intStudentid)//按编号查找 { for(inti=0;i<=top;i++) if(read[i].getnumber()==Studentid&& read[i].gettag()==0) { return&read[i]; } returnNULL; } voidoutput() { for(inti=0;i<=top;i++) read[i].output(); } voidStudentdata();//读者库维护 ~RData()//析构函数,将read[]写到Student.txt文件中 { fstreamfile("Student.txt",ios: : out); for(inti=0;i<=top;i++) if(read[i].gettag()==0) file.write((char*)&read[i],sizeof(read[i])); file.close(); } }; voidRData: : Studentdata() { charchoice; charrname[20]; intStudentid; Student*r; while(choice! ='0') { cout<<"┏━━━━━━━━━━━━━┓\n"; cout<<"┃读者维护┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃1.新增┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃2.更改┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃3.删除┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃4.查找┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃5.显示┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃6.全删┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃0.退出┃\n"; cout<<"┗━━━━━━━━━━━━━┛\n"; //cout<< cin>>choice; switch(choice) { case'1': cout<<"输入读者编号: "; cin>>Studentid; cout<<"输入读者姓名: "; cin>>rname; addStudent(Studentid,rname); break; case'2': cout<<"输入读者编号: "; cin>>Studentid; r=equal(Studentid); if(r==NULL) { cout<<"该读者不存在"< break; } cout<<"输入新的姓名: "; cin>>rname; r->setname(rname); break; case'3': cout<<"输入读者编号: "; cin>>Studentid; r=equal(Studentid); if(r==NULL) { cout<<"该读者不存在"< break; } r->delbook(); break; case'4': cout<<"读入读者编号: "; cin>>Studentid; r=equal(Studentid); if(r==NULL) { cout<<"该读者不存在"< break; } r->output(); break; case'5': output(); break; case'6': clear(); break; default: cout<<"退出: \n";system("cls");break; } } } classBook { private: inttag; intnumber; charname[20]; intonshelf; public: Book(){} char*getname() { returnname; } intgetnumber() { returnnumber; } intgettag() { returntag; } voidsetname(charna[]) { strcpy(name,na); } voiddelbook() { tag=1; } voidaddbook(intn,char*na) { tag=0; number=n; strcpy(name,na); onshelf=1; } intborrowbook()//借书操作 { if(onshelf==1) { onshelf=0; return1; } return0; } voidretbook()//还书操作 { onshelf=1; } voidoutput()//输出图书 { cout< <<(onshelf==1? "在架": "已借")< } }; classBDatabase { private: inttop; Bookbook[Maxb];//图书记录 public: BDatabase()//构造函数,将book.txt读到book[]中 { Bookb; top=-1; fstreamfile("book.txt",ios: : in); while (1) { file.read((char*)&b,sizeof(b)); if(! file)break; top++; book[top]=b; } file.close(); } voidclear() { top=-1; } intaddbook(intn,char*na) { Book*p=equal(n); if(NULL==p) { top++; book[top].addbook(n,na); return1; } return0; } Book*equal(intbookid) { for(inti=0;i<=top;i++) if(book[i].getnumber()==bookid&&book[i].gettag()==0) { return&book[i]; } returnNULL; } voidbookdata(); voidoutput() { for(inti=0;i<=top;i++) if(book[i].gettag()==0) book[i].output(); } ~BDatabase()//析构函数,将book[]写到book.txt文件中 { fstreamfile("book.txt",ios: : out); for(inti=0;i<=top;i++) if(book[i].gettag()==0) file.write((char*)&book[i],sizeof(book[i])); file.close(); } }; voidBDatabase: : bookdata() { charchoice; charbname[40]; intbookid; Book*b; while(choice! ='0') { cout<<"┏━━━━━━━━━━━━━┓\n"; cout<<"┃图书维护┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃1.新增┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃2.更改┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃3.删除┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃4.查找┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃5.显示┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃6.全删┃\n"; cout<<"┃━━━━━━━━━━━━━┃\n"; cout<<"┃0.退出┃\n"; cout<<"┗━━━━━━━━━━━━━┛\n"; cin>>choice; switch(choice) { case'1': cout<<"输入图书编号: "< cin>>bookid; cout<<"输入图书书名: "< cin>>bname; addbook(bookid,bname); break; case'2': cout<<"输入图书编号: "< cin>>bookid; b=equal(bookid); if(b==NULL) { cout<<"该图书不存在"< break; } cout<<"输入新的书名: "< cin>>bname; b->setname(bname); break; case'3': cout<<"读入图书编号: "< cin>>bookid; b=equal(bookid); if(b==NULL) { cout<<"该图书不存在"< break; } b->delbook(); break; case'4': co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 管理 系统 程序设计