软件工程图书管理系统需求分析报告报告材料.docx
《软件工程图书管理系统需求分析报告报告材料.docx》由会员分享,可在线阅读,更多相关《软件工程图书管理系统需求分析报告报告材料.docx(32页珍藏版)》请在冰豆网上搜索。
软件工程图书管理系统需求分析报告报告材料
软件工程报告
图书管理系统
需求性分析
姓名:
蒋维佳
学号:
20122018
班级:
应数01班
1.引言
1.1编写目的
此规格说明书是为了对图书馆管理系统做一个概要的说明,是软件的大概的分析过程,对最终的软件加以说明。
主要的读者为软件设计人员,程序编写员,以及老师。
1.2项目背景
该项目作为计算机学院05级的软件课程设计题目,学生应该在规定的时间之内完成,时间是第七周(4月7日)到第十二周(5月16日),学生应该在这个时间之内做好需求规格说明书,概要设计说明书,详细设计说明书,以及做好程序,并在最后加以用户操作手册等一系列详细的设计要求。
1.3定义
1.4参考资料
《实用软件工程》第二版郑人杰殷人昆陶永雷等主编清华大学出版社
《delphi程序员成长攻略》蒙祖强龚涛等编著中国水利水电出版社
《delphi7开发实例完全剖析》王志强编著中国电力出版社
《精通delphi数据库设计与实例开发》陈润编著中国青年出版社
2.任务概述
2.1目标
通过该系统可以实现最基本的图书馆的一系列的操作流程,其中包括:
图书的借阅,图书的查找,图书的退还,借书证的申请,图书的上架处理,图书的过期未还的处罚等等功能。
这些功能要用delphi以及后台的数据库SQL来实现。
2.2运行环境
Windows98/2000/XP/2003操作系统下,安装并配置软件MicrosoftSQLServer2000数据库管理系统。
作者用的是windowsXP操作系统,理论上可以在windows98/2000/2003下运行的。
2.3条件与限制
因现在配有windows98与windows2003的操作系统的电脑较少,不易找到,所以在这两种操作系统上实验比较困难。
3、数据描述
3.1静态数据
图书:
图书编码,书名,书号,图书类别,作者,出版社,出版时间,单价
管理员:
用户名,密码,权限,姓名
读者:
借书卡号,姓名,性别,读者类别,所属系部,部门或班级
3.2动态数据
输入数据:
鼠标对按钮的点击,查询方式,查询关键字,新建图书项,新建读者项,图书项、读者项记录的修改,图书借还以及注销操作时的输入信息,受限操作所需的密码等。
输出数据:
查询关键字所确定的数据库子集,统计结果,操作成功或失败的消息,图书借还以及注销操作时的结果信息。
3.3数据库描述
数据库采用SQLServer数据库。
3.4数据流图与数据字典
1、数据流图
(1)顶层数据流图
(2)0层数据流图
(3)1层数据流图
∙1.读者信息管理
∙2.图书信息管理
∙3.图书借还管理
ER图:
3.4数据词典(DD)
高级管理员(帐号,姓名)
一般管理员(帐号,姓名)
普通用户(帐号,姓名,班级,性别,组号)
登录用户(帐号,密码,权限)
图书类别(类别,类名)
图书(图书编号,类别,书名,作者,出版日期,出版社,定价,总数量,剩下数量,备注)
借阅(用户帐号,图书编号,借书日期,到期日期,数量,还书日期)
3.5数据采集
数据通过事先的录入,形成最基本的管理人员帐号,通过管理人员的管理,可以实现相应的数据的添加,删减。
比如,管理员可以添加用户的相关信息(通过办理借书证)还可以添加图书(通过新书上架)来办理。
3.功能需求
4.1功能划分
图书管理系统主要实现以下七方面的功能:
a.查询b.图书借还c.图书入库d.图书维护
e.图书超期提示f.环境管理
4.2功能描述
图书管理包括查询、借还、入库、维护、超期提示、环境管理七方面功能。
图书入库,主要实现入库登记。
图书借阅,用户需凭相应证件到图书馆进行借书,并由图书管理员进行相应的登记记录档案。
查询,当用户要查询自己的借阅情况时,可以进行借阅查询。
用户可以通过此系统进行图书的查询和读者查询(即用户自己的相关信息查询)。
图书超期提示,当借阅者在已到借书期限时仍未归还图书,提示其尽快办理归还手续。
并由系统计算相应的处罚。
图书维护,图书管理员可以通过此系统进行相应的图书的维护计算。
4.3数据流图(DFD)
a.新书入库
D1库存清单
D2
b.图书借阅D1库存清单
C.过期提示
d.借阅查询
D1借阅查询清单
e.还书处理
D1库存清单
借书:
还书:
新书上架:
4、4需求规定
在图书管理系统中,管理员要为每个读者建立借阅账户,并給读者发放不同类别的借阅卡(借阅卡可提供卡号、读者姓名),账户内存储读者的个人信息和借阅记录信息。
持有借阅卡的读者可以通过管理员(作为读者的代理人与系统交互)借阅、归还图书,不同类别的读者可借阅图书的范围、数量和期限不同,可通过互联网或图书馆内查询终端查询图书信息和个人借阅情况,以及续借图书(系统审核符合续借条件)。
借阅图书时,先输入读者的借阅卡号,系统验证借阅卡的有效性和读者是否可继续借阅图书,无效则提示其原因,有效则显示读者的基本信息(包括照片),供管理员人工核对。
然后输入要借阅的书号,系统查阅图书信息数据库,显示图书的基本信息,供管理员人工核对。
最后提交借阅请求,若被系统接受则存储借阅纪录,并修改可借阅图书的数量。
归还图书时,输入读者借阅卡号和图书号(或丢失标记号),系统验证是否有此借阅纪录以及是否超期借阅,无则提示,有则显示读者和图书的基本信息供管理员人工审核。
如果有超期借阅或丢失情况,先转入过期罚款或图书丢失处理。
然后提交还书请求,系统接受后删除借阅纪录,并登记并修改可借阅图书的数量。
图书管理员定期或不定期对图书信息进行入库、修改、删除等图书信息管理以及注销(不外借),包括图书类别和出版社管理。
为系统维护人员提供权限管理、数据备份等通用功能。
4、5功能分类
4、6具体需求
系统的总体图见图
第一层图:
(1):
登陆子系统
(2)管理子模块
(3)查询模块
第二层图:
(1):
处理新书购入
1)规格说明
输入新书的全部信息。
2)引言
为了输入新书的全部信息(包括:
分类目录号,流水号书名,作者,内容摘要,价格和购书日期等)。
3)输入
新书的全部信息。
4)处理
通过图书管理系统写入图书目录文件。
5)输出
新书的全部信息。
(2)处理学生借书
1)规格说明
查询读者借书的相关信息。
2)引言
为了查询读者借书的相关信息。
3)输入
借书信息的关键字。
4)处理
利用关键字在借书文件中找到此流水号图书的相关信息。
5)输出
借书相关信息。
(3):
处理学生还书
1)规格说明
输入读者还书信息。
2)引言
为了把读者还书的相关信息(包括:
图书分类号,流水号,读者号,借阅日期和还书日期等)写入还书文件中。
3)输入
读者还书信息。
4)处理
通过图书管理系统写入还书文件中。
5)输出
读者还书信息的全部内容。
(4):
处理图书注销
1)规格说明
注销图书的相关内容。
2)引言
为了注销图书的相关信息。
3)输入
图书信息的关键字(图书分类号或书名)。
4)处理
利用关键字在图书目录文件中找到此图书分类号或书名图书的相关信息。
5)输出
图书的注销信息。
(5)处理学生信息查询
1)规格说明
读者登记,即读者的具体信息。
2)引言
为了把读者的具体信息(包括:
读者编号,姓名,学院,专业,年级等)写入读者目录文件中。
3)输入
读者具体信息。
4)处理
通过图书管理系统写入读者目录文件中。
5)输出
读者具体信息。
(6)处理图书信息查询
1)规格说明
查询图书的相关内容。
2)引言
为了查找图书的相关信息。
3)输入
图书信息的关键字(图书分类号或书名)。
4)处理
利用关键字在图书目录文件中找到此图书分类号或书名图书的相关信息。
5)输出
图书的相关信息。
4、7.数据结构的设计
typedefstructBookList
{charnum[10];
charname[20];
charauthor[20];
inttotal;
intleavings;
structBookList*next;
}Book;
采用链表的结构来进行数据操作,一本书的数据包括:
书号、书名、作者、库存总量、现存量以及指针区域。
2.算法的设计
(1)关键算法设计思路描述
在构思图书馆管理系统的结构时,我将整个程序划分为五个模块,分别定义了五个函数来实现管理系统的功能,除此之外在对程序的界面设计上加入了一些动画效果。
在数据结构上采用单链表的结构方式,这样在读取文件中数据的时候能够节省内存空间。
设计主菜单时,用while
(1)和switch()来实现功能的选择以及运行一项功能后返回主菜单。
在整个程序中,统一采用了以输入0的方式返回或退出,并在模块有需要键盘输入地方加入了防错误输入的功能,防止输入错误导致程序错误运行,此功能采用判断输入值的ASCII码或字符串的比较。
入库模块:
首先判断数据文件是否存在,如存在以追加的方式打开,如不存在以写入的方式打开。
输入图书的具体数据(在输入过程中,如输入的书号为0则返回主菜单)、存盘,判断存盘成功则打印“成功添加”,如存盘失败打印“添加失败”。
最后返回入起始界面(入库模块)。
清除模块:
进入清除模块则将文件中的全部数据用单链表的结构读入内存,提示输入要删除的书号,在内存中寻找并删除,删除后可以马上存盘或是直到全部删除完成后再选择操作,在防止操作后忘记存盘,在程序中加入了自动判断操作过的数据是否己经进行过存盘的功能。
查询模块:
本模块分为三个子模块:
以书号方式查询、以书名的方式查询、以作者的方式查询。
前两个查询功能只要找到符合条件的数据时就停止,以作者方式因为考虑到一个作者不止一本作品,所以对全部的数据进行查找,并打印出所有符合条件的数据。
如果未找到则打印“没有找到”,最后返回子功能模块起始,直到输入0返回上一级。
借出、还书模块:
这两个功能的思路完全一样,不同的是对数据中的现存量的运算。
两个功能都是先建立一个图书类型的数据指针,逐条将文件中的数据读入内存,并与输入的数据进行比较,如果一致则先对内存中的数据进行操作,再将文件中的fp指针后退sizeof(Book)个字节,将内存中的经过修改过的数据写入文件。
完成一条操作后,提示进行下一条操作,输入0时返回主菜单。
(2)程序结构及模块名称描述
a)voidmain()//主程序
b)voids(long) //时间延迟函数
c)voidsta() //界面初始效果
d)voidwel() //界面初始效果
e)voidbookadd() //入库
f)voidsa_ve(sqtype) //清除函数中保存文件函数
g)voiddel() //清除
h)voidr() //查询
j)voids_1() //查询功能中以书号方式查询
k)voids_2() //以书名方式查询
l)voids_3() //以作者方式查询
m)voidreadall()//列出全部图书
n)voidborrow() //借出
o)voidback() //归还
p)voidbye() //退出效果
(3)主要模块算法描述
/*添加*/
voidbookadd()/*添加图书*/
{
FILE*fp;Bookfinger;chartemp[10];
fp=fopen("blist.db","rb");/*读方式打开文件*/
if(fp==NULL)
fp=fopen("blist.db","wb");/*写方式打开文件*/
else/*如果有书就添加*/
{
fclose(fp);
fp=fopen("blist.db","ab");/*追加方式打开文件*/
}
clrscr();
while
(1)
{
printf("\n请输入数据:
\n");/*逐个输入新图书的资料*/
printf("请输入书号(输入0结束添加):
");
gets(temp);
if(strcmp(temp,"0"))strcpy(finger.num,temp);
elsebreak;
printf("请输入书名:
");
scanf("%s",finger.name);
printf("请输入书的作者:
");
scanf("%s",finger.author);
printf("请输入书的总数:
");
scanf("%d",&finger.total);b=getchar();
finger.leavings=finger.total;
finger.next=NULL;
if(fwrite(&finger,sizeof(Book),1,fp))/*块写*/
{
printf("-----------------------------------------------------------------------------\n");
printf("己成功添加:
\n书号:
%s书名:
%s作者:
%s库存总量:
%d现存量:
%d\n",finger.num,finger.name,finger.author,finger.total,finger.leavings);
printf("-----------------------------------------------------------------------------");
}
elseprintf("对不起,数据写入文件错误!
");
}
fclose(fp);
clrscr();
}
/*删除*/
del()/*删除功能函数*/
{FILE*fp;Book*head,*p,*q,*temp;chara[10],s;intflag=0,flag2,flag3=0;
fp=fopen("blist.db","rb");
head=p=q=(Book*)malloc(sizeof(Book));
fread(p,sizeof(Book),1,fp);
while(!
feof(fp))
{q=p;p=(Book*)malloc(sizeof(Book));
fread(p,sizeof(Book),1,fp);q->next=p;
}
p->next=NULL;
del_re:
flag2=0;clrscr();
gotoxy(1,3);textcolor(4);cprintf("提示:
");
textcolor(7);gotoxy(6,4);printf("您可以逐次操作后存盘,也可以完成全部");
gotoxy(6,5);printf("操作后退出时存盘,不进行存盘您所有删");gotoxy(6,6);printf("除操作对文件无效!
");
gotoxy(1,23);printf("请输入要删除的书号(0退出,00存盘):
");gets(a);
if(!
strcmp(a,"0"))gotodel_end;
elseif(!
strcmp(a,"00"))
{if(flag==0){gotoxy(50,24);textcolor(4);cprintf("您还未进行任何删除操作!
");textcolor(7);getch();clreol
();gotodel_re;}
else{flag3+=sa_ve(head);gotodel_re;}
}
p=head;
while(p!
=q->next)
{if(!
strcmp(a,p->num))
if(p==head){head=p->next;flag++;flag2=1;gotoxy(35,13);printf("删除成功!
");getch();gotodel_re;}
else{temp->next=p->next;flag++;flag2=1;gotoxy(35,13);printf("删除成功!
");getch();gotodel_re;}
temp=p;
p=p->next;
}
if(flag2==0){gotoxy(50,24);textcolor(4);cprintf("对不起没有找到你要删除的数据!
");textcolor(7);getch();clreol();goto
del_re;}
del_end:
if(flag>flag3)
{gotoxy(22,13);clreol();printf("您还有删除操作未存盘,是否存盘(Y/N):
");s=getchar();
if(s==78||s==89||s==110||s==121)
{if(s==89||s==121){gotoxy(1,13);clreol();sa_ve(head);b=getchar();}
elseb=getchar();gotodel_end2;
}
elsegotodel_end;
}
del_end2:
fclose(fp);
}
/*查找(按书号查找)*/
s_1()/*查找子函数中的按书号查询功能*/
{
chartemp_num[10];
Bookfinger;intflag;
FILE*fp;fp=fopen("blist.db","rb");
s_1re:
flag=0;gotoxy(1,25);printf("请输入书号(输入0返回):
");
scanf("%s",temp_num);
if(!
strcmp(temp_num,"0")){fclose(fp);gotos_1end;}
while(!
feof(fp))
{
fread(&finger,sizeof(Book),1,fp);
if(!
strcmp(finger.num,temp_num))
{clrscr();
textcolor(4);cprintf("书号");gotoxy(17,1);cprintf("书名");
gotoxy(33,1);cprintf("作者");gotoxy(47,1);cprintf("总库存");
gotoxy(63,1);cprintf("现存量\r\n");textcolor(7);
printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",finger.num,finger.name,finger.author,finger.total,finger.leavings);
flag=1;rewind(fp);break;
}
}
if(flag==0){clrscr();gotoxy(28,12);printf("没有找到您要查询的书!
");rewind(fp);getch();clrscr();}
gotos_1re;
s_1end:
b=getchar();
}
/*借书功能*/
borrow(){
FILE*fp;chara[10];intflag;
Bookn;
fp=fopen("blist.db","rb+");
clrscr();
borrow_re:
flag=0;
gotoxy(1,13);clreol();gotoxy(1,24);clreol();
gotoxy(1,23);printf("请输入要借的书号(输入0返回):
");clreol();
gets(a);if(!
strcmp(a,"0"))gotoborrow_end;
fread(&n,sizeof(Book),1,fp);
while(!
feof(fp))
{
if(!
strcmp(a,n.num))/*一样的话*/
{
if(n.leavings==0)printf("对不起,此书全部借出.\n");
else
{--n.leavings;
fseek(fp,-56L,1);
fwrite(&n,sizeof(Book),1,fp);
gotoxy(35,13);printf("借出成功!
");flag=1;getch();
}
rewind(fp);break;
}
fread(&n,sizeof(Book),1,fp);
}
if(flag==0){gotoxy(35,13);printf("借书失败!
");rewind(fp);getch();}
gotoborrow_re;
borrow_end:
fclose(fp);
}
四、源程序清单:
(见源程序文件名:
____lib.c_____)
五、测试数据及测试结果:
(一)添加
输入数据:
书号书名作者库存
1001h1li8
1002h2ki8
1003h3fd9
1004h4li10
1005h5sdfs11
1006h6ed9
1007h7tio7
(二)清除
输入清除的书号:
1006
提示删除成功,运行查询功能中的查询全部功能,确认1006己被删除
(三)查询
1.书号查询,输入:
1005
输出:
1005h5sdfs11
2.书名查询,输入:
h7
输出:
1007h7tio7
3.作者查询,输入:
li
输出:
1001h1li8
1004h4li10
(四)借出
输入:
1004
输出:
借出成功
运行查询功能中的查询全部功能,显示:
书号 书名 作者 库存 现存
1004h4li109
(五)归还
输入:
1004
输出:
归还成功
运行查询功能中查询全部,显示:
书号 书名 作者 库存 现存
1004h4li1010
六、心得体会:
编写整个模拟图书馆管理程序历时五天,五个功能模块中的入库与查询模块由于定义函数名与C语言中自带函数名冲突,到发现原因并修改,期间耗时三天。
在三天期间,在不知道冲突原因之前,我在几个论坛上发贴,有回贴的竟没人知道原因,后来偶然的灵机一动,将函数名更改,程序顺利运行。
我还从网上下了一本C语言函数的电子书,经查确实是由于函数名冲突。
所以,我们在定义函数的时候,在注意函数名是否与C语言自带的函数冲突。
因为我比较喜欢有应用性的程序,所以挑选图书馆来做,但是在确定所用数据结构方面,构思时考虑不足,忽略了图书馆内书的数据量,一直到入库与查询两个模块完成,我还是采用顺序表的结构来进行数据