资源描述
软件工程汇报
图书管理系统
需求性分析
姓名:蒋维佳
学号:
班级:应数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运行环境
Windows 98//XP/操作系统下,安装并配置软件Microsoft SQL Server 数据库管理系统。
作者用是windows XP操作系统,理论上能够在windows 98//下运行。
2.3条件和限制
因现在配有windows98和windows操作系统电脑较少,不易找到,所以在这两种操作系统上试验比较困难。
3、数据描述
3.1静态数据
图书:图书编码,书名,书号,图书类别,作者,出版社,出版时间,单价
管理员:用户名,密码,权限,姓名
读者:借书卡号,姓名,性别,读者类别,所属系部,部门或班级
3.2动态数据
输入数据:鼠标对按钮点击,查询方法,查询关键字,新建图书项,新建读者项,图书项、读者项统计修改,图书借还和注销操作时输入信息,受限操作所需密码等。
输出数据:查询关键字所确定数据库子集,统计结果,操作成功或失败消息,图书借还和注销操作时结果信息。
3.3数据库描述
数据库采取SQL Server数据库。
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.新书入库
数据库
1.3
处 理
入 库
1.2
更新书 刊
库存清 单
1.1
接 受
事 务
图 书
管理员
D1 库存清单
D2
b.图书借阅 D1 库存清单
处 理
借 阅
数据库
进行借 阅
登 记
借 阅 者
C.过期提醒
处 理
通知信 息
显示器
进行日期处 理
图书
管理员
d.借阅查询
显示器
2
产 生
汇 总
1.1
操 作
事 务
借阅者
1.2
处 理
查 询
D1 借阅查询清单
e.还书处理
数据库
1.3
处 理
归 还
1.2
更新图 书
库存清 单
1.1
接 受
事 务
图书
管理员
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.数据结构设计
typedef struct BookList
{ char num[10];
char name[20];
char author[20];
int total;
int leavings;
struct BookList *next;
}Book;
采取链表结构来进行数据操作,一本书数据包含:书号、书名、作者、库存总量、现存量和指针区域。
2.算法设计
(1)关键算法设计思绪描述
在构思图书馆管理系统结构时,我将整个程序划分为五个模块,分别定义了五个函数来实现管理系统功效,除此之外在对程序界面设计上加入了部分动画效果。在数据结构上采取单链表结构方法,这么在读取文件中数据时候能够节省内存空间。
设计主菜单时,用while(1)和switch()来实现功效选择和运行一项功效后返回主菜单。
在整个程序中,统一采取了以输入0方法返回或退出,并在模块有需要键盘输入地方加入了防错误输入功效,预防输入错误造成程序错误运行,此功效采取判定输入值ASCII码或字符串比较。
入库模块:首先判定数据文件是否存在,如存在以追加方法打开,如不存在以写入方法打开。输入图书具体数据(在输入过程中,如输入书号为0则返回主菜单)、存盘,判定存盘成功则打印“成功添加”,如存盘失败打印“添加失败”。最终返回入起始界面(入库模块)。
清除模块:进入清除模块则将文件中全部数据用单链表结构读入内存,提醒输入要删除书号,在内存中寻求并删除,删除后能够立即存盘或是直到全部删除完成后再选择操作,在预防操作后忘记存盘,在程序中加入了自动判定操作过数据是否己经进行过存盘功效。
查询模块:本模块分为三个子模块:以书号方法查询、以书名方法查询、以作者方法查询。前两个查询功效只要找到符合条件数据时就停止,以作者方法因为考虑到一个作者不止一本作品,所以对全部数据进行查找,并打印出全部符合条件数据。假如未找到则打印“没有找到”,最终返回子功效模块起始,直到输入0返回上一级。
借出、还书模块:这两个功效思绪完全一样,不一样是对数据中现存量运算。两个功效全部是先建立一个图书类型数据指针,逐条将文件中数据读入内存,并和输入数据进行比较,假如一致则先对内存中数据进行操作,再将文件中fp指针后退sizeof(Book)个字节,将内存中经过修改过数据写入文件。完成一条操作后,提醒进行下一条操作,输入0时返回主菜单。
(2)程序结构及模块名称描述
主程序
界面初始化
入 库
清 除
查 询
借 出
归 还
书号 查询
书名 查询
作者 查询
全部 列表
a ) void main() //主程序
b ) void s(long) //时间延迟函数
c ) void sta() //界面初始效果
d ) void wel() //界面初始效果
e ) void bookadd() //入库
f ) void sa_ve(sqtype) //清除函数中保留文件函数
g ) void del() //清除
h ) void r() //查询
j ) void s_1() //查询功效中以书号方法查询
k ) void s_2() //以书名方法查询
l ) void s_3() //以作者方法查询
m ) void readall() //列出全部图书
n ) void borrow() //借出
o ) void back() //归还
p ) void bye() //退出效果
(3)关键模块算法描述
/*添加*/
void bookadd() /*添加图书*/
{
FILE *fp; Book finger; char temp[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);
else break;
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("-----------------------------------------------------------------------------");
}
else printf("对不起,数据写入文件错误!");
}
fclose(fp);
clrscr();
}
/*删除*/
del() /*删除功效函数*/
{ FILE *fp;Book *head,*p,*q,*temp;char a[10],s;int flag=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")) goto del_end;
else if(!strcmp(a,"00"))
{ if(flag==0) {gotoxy(50,24);textcolor(4);cprintf("您还未进行任何删除操作!");textcolor(7);getch();clreol
();goto del_re;}
else {flag3+=sa_ve(head);goto del_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();goto del_re;}
else {temp->next=p->next;flag++;flag2=1;gotoxy(35,13);printf("删除成功!");getch();goto del_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();}
else b=getchar();goto del_end2;
}
else goto del_end;
}
del_end2: fclose(fp);
}
/*查找(按书号查找)*/
s_1() /*查找子函数中按书号查询功效*/
{
char temp_num[10];
Book finger; int flag;
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);goto s_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();}
goto s_1re;
s_1end: b=getchar();
}
/*借书功效*/
borrow() {
FILE *fp;char a[10];int flag;
Book n;
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")) goto borrow_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();}
goto borrow_re;
borrow_end: fclose(fp);
}
四、源程序清单:(见源程序文件名:____lib.c_____)
五、测试数据及测试结果:
(一)添加
输入数据: 书号 书名 作者 库存
1001 h1 li 8
1002 h2 ki 8
1003 h3 fd 9
1004 h4 li 10
1005 h5 sdfs 11
1006 h6 ed 9
1007 h7 tio 7
(二)清除
输入清除书号:1006
提醒删除成功,运行查询功效中查询全部功效,确定1006己被删除
(三)查询
1.书号查询,输入:1005
输出:1005 h5 sdfs 11
2.书名查询,输入:h7
输出:1007 h7 tio 7
3.作者查询,输入:li
输出:1001 h1 li 8
1004 h4 li 10
(四)借出
输入:1004
输出:借出成功
运行查询功效中查询全部功效,显示:
书号 书名 作者 库存 现存
1004 h4 li 10 9
(五)归还
输入:1004
输出:归还成功
运行查询功效中查询全部,显示:
书号 书名 作者 库存 现存
1004 h4 li 10 10
六、心得体会:
编写整个模拟图书馆管理程序历时五天,五个功效模块中入库和查询模块因为定义函数名和C语言中自带函数名冲突,到发觉原因并修改,期间耗时三天。在三天期间,在不知道冲突原因之前,我在多个论坛上发贴,有回贴竟没人知道原因,以后偶然灵机一动,将函数名更改,程序顺利运行。我还从网上下了一本C语言函数电子书,经查确实是因为函数名冲突。所以,我们在定义函数时候,在注意函数名是否和C语言自带函数冲突。
因为我比较喜爱有应用性程序,所以挑选图书馆来做,不过在确定所用数据结构方面,构思时考虑不足,忽略了图书馆内书数据量,一直到入库和查询两个模块完成,我还是采取次序表结构来进行数据操作,不过在编写清除模块时候,忽然间发觉将文件数据全部读出时,假如采取次序链表就必需欲先定制一个足够大空间,所以我又将数据结构改成单链表以节省内存空间。
在编写入库和查询模块时,用知识全部只是大一所学C语言老师教过,如打开文件fopen命令,读取文件fread命令,写入文件fwrite命令等等。对文件其它具体操作一无所知,如读取时文件fp指针位置,怎样让fp指针在文件中定位等等。不过我在编写借出,归还和清除三个模块时,恰恰得用到这些知识,所以借用ftell()命令,自己慢慢探索出部分门道。如:在借出和归还模块里,我采取方法是,定义一个图书类型结构体指针,一次从文件里只读取一个数据,将它关键字符段和输入数据进行比较,假如一致则将文件指针fp往后移动sizeof(Listtype)个字节,然后将经过这个修改后数据写入文件。之所以采取这个方法,我是考虑到它在内存中只占用了sizeof(Listtype)字节个空间,而且也只需向文件中写入一次。假如用链表全部读取、修改后再保留文件,一是占用了很大内存空间,二是要向文件中写入全部数据。不过,假如要进行数次借出操作时候,用链表读取只需要全部操作完后一次对修改后数据进行写入,期间操作只需在内存中进行。而用我方法,借一次就必需打开文件,逐条读取,修改写入。所以至于哪种方法愈加好,我自己具体也弄不清,还请老师多多指点一下。
因为在整个程序中,我在主函数和五个功效函数中全部用到了无限循环体 while(1)以实现操作结束后仍然停留在这个功效模块,直到输入0以退出。因为这种结构,在编写和测试过程中碰到了种种问题而造成程序运行错误或是死循环,于是我采取隔数行打印部分字符方法以判定是哪一个步骤犯错,这个方法即使是麻烦一点但能达成一定效果。
删除功效函数是最终编写,在编写时思绪也经过改变,原本思绪是:一次从文件中读取一条和输入数据比较,找到符合条件数据后,记住此时文件指针fp位置,将fp后面直到文件结束数据读入链表中,最终将fp指针移到要删除数据位置前,将内存中数据写入文件。这么便将要删除数据在文件中覆盖。可是在具体测试中,功效实现很不稳定,有时候会出现写入错误而导至读取时出现乱码。所以最终不得不放弃这种思绪,将方法改成以wb+方法打开文件,将文件中数据全部读入链表,在链表中进行删除操作,全部操作结束后写入文件。
再者是编写三个效果,一个是模拟windowsXP开机,一个是用类似百叶窗效果打印字符画,另外一个是程序结束时离别画面。这三个无非是用while,gotoxy等命令实现,纯粹是因为好玩,增强程序趣味性,不过这些效果因为每台机子CPU运算速度不一样,所以在不一样机子上运行速度不一样。总而言之,经过专周收获还是蛮多,重在实践。
4、8 性能需求
1)精度需求
在精度需求上,依据使用需求,在各项数据输入,输出及传输过程中,能够满足多种精度需求。
2)时间需求
在软件方面,响应时间,更新处理时间全部比较快且快速,完全满足用户要求。
3)灵活性
当用户需求,如操作方法,运行环境,结果精度,数据结构和其它软件接口等发生改变时,设计软件要做合适调整,灵活性很大。
4)故障处理
内部故障处理:在开发阶段能够随即修改数据库里对应内容。
外部故障:对编辑程序进行重装载时,第一次装载认为错,修改。第二次运行,在需求调用时犯错,有错误提醒,重试。
4.2 属性
1)保密性
本软件作为教学管理辅助设备,它规模比较小,不需要保密技术,先顶一个程序中一些区域规约,给不一样模块分配不一样功效。
2)可维护性
本软件组成程序组构较为简单,直观意义上较独立。所以,给电子化所组成硬件简单可维护特点,决定了该软件简单;。她和文件系统
4.3 其它需求
1)数据库
数据库是实现有组织,动态存放大量关联数据,方便多用户访问计算机软硬自愿组成系统。她和文件系统关键区分时数据充足共享,交叉访问,和应用程序高度独立性。
因为本软件整体结构比较简单,所包含数据相对来说也比较少,组成文件最小单位是统计。
2)操作
a.初始化操作
b. 数据处理功效较强
c.后援和恢复操作
4.
5.1数据正确度
该系统中,数据除日期之外,其它全部是整型数据。包含计算只有过期罚款计算。对数据正确度要求低。
5.2时间特征
该系统不是很大,响应时间,更新时间,数据处理时间,传输时间,运行时间等基础能够近似0处理。
5.3适应性
该程序关键是和SQL sever连接,只要是装了windows操作系统,全部应该能够比较简单连接上。另外操作比较简单,很轻易上手。
5. 运行需求
5.1 用户界面
用户界面应该简单美观,轻易上手,用户轻易了解。
5.2 硬件接口
5.3 软件接口
5.4 故障处理
6. 其它需求
暂无。
展开阅读全文