软件工程课程设计_图书管理系统.doc
课程设计 图书馆管理系统一、可行性研究报告1、引言背景资料图书馆是为我们的学习工作提供服务的地方。图书馆里存放着大量的书籍资料,对这些书籍信息的有效的归类整理与管理将大大提高图书馆的运作效率,降低图书馆工作人员的劳动强度,同时可以对图书馆的整个运作过程做到明细化,透明化,为各项工作有条不紊的进行提供保障。报告目的 本报告旨在研究分析图书馆管理系统开发的可行性,为此软件的开发人员提供可行性的验证与编写方法的指导。软件信息 软件名称:图书馆管理系统 开发平台:Turbo C 2.0 用户: 图书馆工作人员2、可行性研究的前提 主要功能:通过计算机完成图书馆在库书籍的管理,用计算机高效、安全的完成对图书的信息处理,将工作人员从繁琐的数据处理中解放。 性能要求: a、书籍信息的录入,将图书名,库存数量输入系统,建立系统数据库。 b、书籍信息的查询,输入书名,显示此图书的有关信息,包括库存总量、借出数目、剩余数目。 c、书籍借出与归还,输入借出或归还图书的书名与数量后,对库存信息进行相应修改。 d、书籍信息的插入与删除,新书到库时或清除库存时,在数据库内增加或删减相应信息。 e、书籍信息的备份,将现有数据库信息存档,以备不时之需。 f、书籍信息的读入,输入文件名,从相应文件中把信息读入数据库。 g、权限问题,进入系统之前输入密码,密码不正确则退出系统。 开发目标:要求系统具有良好的可操作性,数据稳定性以及安全性,可以长期使用。3、对现有系统的分析 现用的管理系统在安全性,数据的读入功能方面存在不同程度的缺陷,有必要进行改进4、所建议的系统使用基本方法:该系统具有简单易用的特点,只需按照菜单功能行操作。系统流程图:6、投资及效益分析该系统投资成本小,使用方法简单易懂。该系统有效地提高图书馆工作人员的工作效率,节约人力物力。同时可以根据用户的特殊需要,增添功能。具有成本低,功能强大,使用灵活的特点。7、社会因素方的可行性法律方面: 本系统的开发不会侵犯他人、集体或国家的利益,不违背当地法律法规。使用方面: 本系统可以满足图书馆管理的要求,而且对使用本软件人员的计算机水平要求不高,只需了解软件操作流程就可以使用本软件,无需培训。8、结论 该系统在各个方面的均具有可行性,可以立即开始进行。二、需求规格说明书1、引言编写目的: 为软件开发者提供开发依据,在软件的开发过程中起指向性功能。本说明书的读者为此软件的开发者。项目背景: 该软件由学生自行编写,由个人全权负责。本软件独立于其它管理软件。参考资料: 万晓东 施玉霞 等著软件技术基础教程09年7月 2、任务概述目标: 本软件旨在为学校的图书馆管理人员提供一个可以方便管理库存图书的系统。可以对库存图书进行录入、借还、查询、修改功能。减少操作时间,提高工作效率。 该软件适用于一般规模的图书馆管理操作。用户特点: 本系统的操作对象为图书馆管理人员。对管理人员的计算机水平不需要很高的要求。条件与限制:本次开发工作无经费投入,开发期限为40小时。3、数据描述:静态数据: 系统密码,书籍名称,库存总数,剩余数,借出数。动态数据: 使用者输入的信息,包括添加的书籍信息,查询关键字。数据库描述:系统数据库采用TXT文档。数据流图:数据字典:数据流名:图书别 名:图书馆库存图书组 成:书名+库存总数+剩余数+借出数备 注:无4、功能要求:功能划分 录入功能浏览功能信息查询功能 借出归还功能 插入与删除功能 信息的备份与读入功能 设置访问权限功能功能描述录入功能: 输入相关数据浏览功能: 以列表方式列出所有记录信息信息查询功能: 根据书名匹配查询,并将查询结果列出借出归还功能: 根据借出与归还的书籍信息修改相应数据插入与删除功能: 插入一条新的图书信息,删除某图书的信息信息的备份与读入功能:将输入文件进行备份和从指定文件读入数据设置访问权限功能:只有输入正确密码才可以进行操作 否则无权操作5、性能要求 数据精确度: 查询时要确保查全率与查准率 时间特性: 系统运行时间应该在用户能够接受的范围内 适应性: 本软件属于小型软件,对不同的运行环境适应性很强,可以能够满足使用需求。6、运行需求 用户界面:在Turbo C 2.0界面运行 硬件接口:普通PC机 软件接口:运行于装有Turbo C 2.0的操作系统 故障处理:如果在使用过程中出现程序出错,重新运行即可恢复三、概要设计说明书1、引言编写目的:设计一图书馆管理系统以代替现有的管理管理系统。本说明书读者为软件设计者。项目背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件独立于其它软件系统。参考资料: 万晓东 施玉霞 等著软件技术基础教程09年7月 谭浩强 著C语言程序设计 第三版 张志航 王珊珊等著程序设计语言C 07年9月2、概要设计:需求规定:本软件提供一个既可以存储信息,同时又具有浏览、插入、查询、修改、删除功能,供使用者轻松管理图书馆的库存图书。数据库信息由使用者进行输入。运行环境: 硬件 普通PC机 支持环境 WINDOWS操作系统,Turbo C 2.0软件基本设计概念:本系统由主单函数调用各个子函数(功能函数)来实现各项操作。功能函数包括插入函数,删除函数,显示函数,文件读入函数,文件读出函数,借出函数,归还函数,退出函数函数调用关系图如下图所示:系统结构模块划分与功能需求关系模块编号模块名称功能M1身份验证模块输入验证信息M2主菜单模块输入选择的功能M3插入模块插入相关信息M4删除模块删除指定信息M5查询模块查询指定信息M6显示模块以列表方式显示所有信息M7借出模块实现书籍借出M8归还模块实现书籍归还M9读入模块从外部文件读入信息M10备份模块备份文件信息M11退出模块退出程序 保存文件人工处理过程:数据的录入工作需人工完成3、接口设计用户接口:用户输入信息按 “书名”(空格)“库存数量” 的格式输入。TXT文件也按上述格式保存。外部接口:用户界面:DOS界面软件接口:运行于Win95以上版本,且要求安装Turbo C 2.04、运行设计运行控制:系统运行后先进行身份验证,验证通过后,登录,并调用M2,进入服务选择模块,由用户选择的信息选择激活M3M10等模块,最后根据用户输入的接受信息退出程序,关闭系统。运行时间:各模块运行时间控制在1秒内。5系统数据结构设计书名char name 剩余数量 int sum6、系统出错处理设计出错信息 出错类型处理方法用户输入无效字符提示出错,重新输入借出数量过大提示出错,重新输入维护设计本软件必须按照软件产品设计规范的步骤进行开发,充分考虑软件的可维护性,以便于未来版本开发及移植等二次开发。在编写过程中如果发现有的模块没有必要,或者实现比较困难,可以由开发者提出修改意见,决定是否修改。四、详细设计说明书1、引言编写目的:设计一图书馆管理系统以代替现有的管理管理系统。本说明书读者为软件设计者。项目背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件独立于其它软件系统。参考资料: 万晓东 施玉霞等著软件技术基础教程 09年7月 谭浩强 著C语言程序设计 第三版 张志航 王珊珊等著程序设计语言C 07年9月2、总体设计需求概述录入功能: 输入相关数据浏览功能: 以列表方式列出所有记录信息信息查询功能: 根据书名匹配查询,并将查询结果列出借出归还功能: 根据借出与归还的书籍信息修改相应数据插入与删除功能:插入一条新的图书信息,删除某图书的信息信息的备份与读入功能:将输入文件进行备份和从指定文件读入数据设置访问权限功能:只有输入正确密码才可以进行操作 否则无权操作系统结构图3、程序描述M1身份验证·功能:验证身份·性能:·输入项:预设密码·输出项:欢迎语句·算法: int keyword=111,a; printf("Please input keyword:"); scanf("%d",&a); if(a!=keyword) exit(0); else printf("Welcome!");·测试要求:运行正常。M2主菜单模块·功能:选择功能·性能:·输入项:数字0-9·输出项:对应功能项·算法: int Display_MainMenu() /*显示菜单的函数*/char x; do system("cls"); printf("*n"); printf("1.Create BookListn"); printf("2.Display All Booksn"); printf("3.Insert a BookInformationn"); printf("4.Delete a Bookn"); printf("5.Borrow a Bookn"); printf("6.Return a Bookn"); printf("7.Queryn"); printf("8.Add Records From a Filen"); printf("9.Write to a Filen"); printf("0.Goodbyen"); printf("*n"); printf("Please choose from 0-9:"); printf("n"); x=getchar(); while(x<'0'|x>'9'); return(x-'0');·测试要求:运行正常。M3插入模块·功能:插入新信息·性能:·输入项:书名 数量·输出项:成功提示·算法: Book *Insert(Book *head,Book *s) /*插入结点的函数*/ Book *p0,*p1,*p2; p1=head;p0=s; /*使p1指向第一个结点,p0指向要插入的结点*/ if(head=NULL) /*原来的链表是空表*/ head=p0;p0->next=NULL; /*使p0作为首结点*/ while(strcmp(p0->Name,p1->Name)>0&&(p1->next!=NULL) p2=p1; p1=p1->next; if(strcmp(p0->Name,p1->Name)<=0) p0->next=p1; if(head=p1) head=p0; else p2->next=p0; elsep1->next=p0;p0->next=NULL; return(head);Book *Insert_a_record(Book *head) Book *newrecord; newrecord=(Book *)malloc(LEN); /*动态分配存储空间*/ scanf("%s%d",newrecord->Name,&newrecord->all); newrecord->borrow=0; newrecord->left=newrecord->all; head=Insert(head,newrecord); printf("Insert successfullyn"); /*输出插入成功的信息*/ return(head);·测试要求:运行正常。删除模块·功能:删除信息·性能:·输入项:所删书名·输出项:成功提示·算法: Book *Delete(Book *head,char *name) Book *p1,*p2; if(head=NULL) printf("Sorry No record!n"); p1=head; while(strcmp(p1->Name,name)!=0&&p1->next!=NULL) /*p1不是要找的结点,且后面还有结点*/ p2=p1;p1=p1->next; /*p1后移一个结点*/ if(strcmp(p1->Name,name)=0) /*找到了*/ if(p1=head)head=p1->next; /*若p1为首指针,使下一结点为首指针*/ else p2->next=p1->next; /*否则将下一结点地址赋给前一结点地址*/ printf("delete %s successfullyn",name); /*输出删除成功的信息*/ return(head);Book *Delete_a_record(Book *head) char name20,ch; Book *p; scanf("%s",name); getchar(); /*接收回车*/ p=Query(head,name); if(p=NULL) printf("Cannot Find %sn",name); /*找不到结点*/ else printf("Delete %s, Y/N?n",name); ch=getchar(); system("pause"); if(ch='y'|ch='Y') while(p!=NULL) head=Delete(head,name); /*删除所有与输入相同的记录*/ p=Query(head,name); return(head);·测试要求:运行正常。M5查询模块·功能: 查询功能·性能:·输入项:查询书名·输出项:相应书籍信息·算法: Book *Query(Book *head,char *name) Book *p; p=head; while(strcmp(name,p->Name)!=0&&p->next!=NULL) p=p->next; if(strcmp(name,p->Name)=0) /*找到了,返回结点地址*/ return(p); else /*找不到返回空指针*/ return(NULL);void Query_a_record(Book *head) char name20; Book *p; scanf("%s",name); p=Query(head,name); if(p!=NULL) /*找到了*/ printf("Find successfullyn%s total:%d left:%d borrow:%dn", p->Name,p->all,p->left,p->borrow); else printf("Can't find the records of %sn",name); /*找不到*/·测试要求:运行正常。M6显示功能·功能: 显示所有信息·性能:·输入项:相应的菜单序号·输出项:所有书籍信息·算法: void Display(Book *head) Book *p; int i; p=head; printf("Num BookName Total Left Borrown"); for(i=1;p!=NULL;i+) printf("%-5d%-14s%-10d%-10d%-5dn", i,p->Name,p->all,p->left,p->borrow); p=p->next; if(i%10=0) system("pause"); /*按回车翻页显示*/ printf("Num BookName total left borrown"); ·测试要求:运行正常。M7借出模块·功能:借出书籍·性能:·输入项:所借书名 数量·输出项:成功信息·算法: Book *Borrow_a_Book(Book *head) char name20,ch; int n; Book *p; scanf("%s%d",name,&n); getchar(); /*接收回车*/ p=Query(head,name); if(p=NULL) printf("Cannot Find %sn",name); /*找不到结点*/ else printf("Are you sure to borrow? %s, Y/N?n",name); ch=getchar(); system("pause"); if(ch='y'|ch='Y') head=Borrow(head,name,n); return(head);·测试要求:运行正常。M8归还模块·功能:归还书籍·性能:·输入项:所换书名 数量·输出项:成功提示·算法: Book *Return_a_Book(Book *head) char name20,ch; int n; Book *p; scanf("%s%d",name,&n); getchar(); /*接收回车*/ p=Query(head,name); if(p=NULL) printf("Cannot Find %sn",name); /*找不到结点*/ else printf("Are you sure to return? %s, Y/N?n",name); ch=getchar(); system("pause"); if(ch='y'|ch='Y') head=Return(head,name,n); return(head);Book *Return(Book *head,char *name,int sum) Book *p1; p1=head; while(strcmp(p1->Name,name)!=0&&p1->next!=NULL) /*p1不是要找的结点,且后面还有结点*/ p1=p1->next; /*p1后移一个结点*/ if(strcmp(p1->Name,name)=0) /*找到了*/ p1->borrow=p1->borrow-sum; p1->left=p1->left+sum; return(head);·测试要求:运行正常。M9读入模块·功能:从文件读入信息·性能:·输入项:文件名·输出项:成功提示·算法: Book *AddfromText(Book *head,char *filename) FILE *fp; int n,i; if(fp=fopen(filename,"r")=NULL) printf("Cannot find file:%sn",filename); /*打不开所指定文件*/ return(head); fscanf(fp,"%d",&n); /*待插入记录个数*/ for(i=0;i<n;i+) Book *p; p=(Book *)malloc(LEN); fgetc(fp); /*读取换行符*/ fscanf(fp,"%s%d%d%d",p->Name,&p->all,&p->left,&p->borrow); head=Insert(head,p); /*插入结点*/ printf("Add from %s successfullyn",filename); fclose(fp);return(head);测试要求:运行正常。M10备份模块·功能:数据备份·性能:·输入项:所建文档名·输出项:成功提示·算法: Book *WritetoText(Book *head,char *filename)FILE *fp;Book *p; if(head=NULL) printf("No Record!n"); return(head); fp=fopen(filename,"w"); /*打开文件*/ p=head; while(p!=NULL) fprintf(fp,"%-14s%-10d%-10d%-10dnn",p->Name,p->all,p->left,p->borrow); /*文件输出*/ p=p->next; printf("Write to %s successfullyn",filename); /*输出写到文件完毕的信息*/ fclose(fp); return(head);·测试要求:运行正常。M11退出模块·功能:退出程序·性能:·输入项:数字0·输出项:再见语句·算法: void Quit(Book *head)Book *p,*p1,*p2;FILE *fp; char filename="last" p2=p1=head; if(head!=NULL) fp=fopen(filename,"w"); /*打开文件*/ p=head; while(p!=NULL) fprintf(fp,"%s %d %d %dn",p->Name,p->all,p->left,p->borrow); /*文件输出*/ p=p->next; printf("Write to %s successfullyn",filename); /*输出写到文件完毕的信息*/ fclose(fp); while(p1!=NULL) /*p1指向的结点不是空指针*/ p2=p1->next; free(p1); /*释放存储空间*/ p1=p2; /*p1后移一个结点*/ ·测试要求:运行正常。五、测试报告1、引言编写目的:测试图书馆管理系统软件的各项功能是否符合预期要求。本报告读者为软件设计者。项目背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件独立于其它软件系统。参考资料: 万晓东 施玉霞 等著软件技术基础教程09年7月 谭浩强 著C语言程序设计 第三版 张志航 王珊珊等 著程序设计语言C 07年9月2、测试计划执行情况权限功能·测试数据:输入正确密111·测试结果:成功进入主界面,说明本模块功能正常插入功能·测试数据:无·测试结果:菜单显示正常。本模块功能正常。插入功能·测试数据:history 100·测试结果:调用显示函数显示结果。本模块功能正常。删除操作·测试数据:history ·测试结果调用显示函数显示结果:输出结果正确,说明本模块功能正常。查询模块·测试数据:预输入数据 history 100 physics 200 查询history·测试结果:显示结果 history 100 0 0说明本模块运行正常。显示模块·上述过程已经对本功能进行了测试。·结果:显示模块运行正常。借出模块·测试数据:预输入数据 history 100 physics 200 调用借出函数借 history 50 maths 100·测试结果 调用显示函数显示结果:归还模块·测试数据:预输入数据 history 100 physics 200 调用归还函数还 history 50 ·测试结果:文件读入模块·测试数据:文本文档 a.txt·测试结果:调用显示函数显示结果测试结果正确。文件备份模块·测试数据: 测试数据采用上一步写入的数据·测试结果退出模块·测试数据: 无·测试结果 成功退出程序 并生自动成备份文件 last.txt 退出模块运行正常。3、评价结果软件能力: 软件各项功能复合预期,各子程序运行正常缺陷和限制:每次登陆后必须手工调入上一次的备份文件以恢复系统数据,给操作者带来不便建议: 完善系统的数据库功能,提供安全可靠的数据保存功能。测试结论: 本软件测试通过。附源程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>#define NULL 0#define LEN sizeof(Book)struct A char Name20; int all,left,borrow; struct A *next; ;typedef struct A Book;int Display_Main_Menu(); /*主菜单显示*/Book *Create(); /*功能函数声明*/ void Display(Book *head);Book *Insert(Book *head,Book *s);Book *Insert_a_record(Book *head);Book *Delete(Book *head,char *name);Book *Delete_a_record(Book *head);Book *Borrow(Book *head,char *name,int sum);Book *Borrow_a_Book(Book *head);Book *Return(Book *head,char *name,int sum);Book *Return_a_Book(Book *head);Book *Query(Book *head,char *name); void Query_a_record(Book *head);Book *AddfromText(Book *head,char *filename);Book *WritetoText(Book *head,char *filename); void Quit(Book *head);void main() /*主函数部分*/Book *head; /*定义变量*/ char filename20; int keyword=111,a; printf("Please input keyword:"); scanf("%d",&a); if(a!=keyword) exit(0); else printf("Welcome!"); head=NULL; /*置首指针为空*/ for(;) switch(Display_MainMenu() case 1:printf("1.Create BookListn"); /*调用Create函数创建链表*/ head=Create(); system("pause"); break; case 2:printf("Display All Booksn"); Display(head); /*调用Display函数显示所有*/ system("pause");break; case 3:printf("Insert a Recordn"); head=Insert_a_record(head);/*调用Insert_a_record函数插入*/ system("pause");break; case 4:printf("Delete a Bookn"); head=Delete_a_record(head);/*调用Delete_a_record函数删除*/ system("pause");break; case 5:printf("Borrow a BooknInput BookName and sum you borrow:"); head=Borrow_a_Book(head); system("pause");break; case 6:printf("Return a BooknInput BookName and sum you return:"); head=Return_a_Book(head); system("pause");break; case 7:printf("QuerynInput the BookName you want:"); Query_a_record(head);/*调用查询函数*/ system("pause");break; case 8:printf("Input the name of Text Filen"); scanf("%s",filename);/*输入文件名*/ head=AddfromText(head,filename); system("pause");break; case 9:printf("Input the name of the NewText Filen"); scanf("%s",filename);/*输入要写入的文件名*/ head=WritetoText(head,filename); system("pause");break; case 0:printf("Goodbyen"); Quit(head); exit(0); int Display_MainMenu() /*显示菜单的函数*/char x; do system("cls"); printf("*n"); printf("1.Cr