软件工程课程设计图书管理系统.docx
软件工程课程设计图书馆治理系统1一、可行性争论报告1、引言1 背景资料图书馆是为我们的学习工作供给效劳的地方。图书馆里存放着大量的书籍资料,对这些书籍信息的有效的归类整理与治理将大大提高图书馆的运作效率,降低图书馆工作人员的劳动强度,同时可以对图书馆的整个运作过程做到明细化,透亮化,为各项工作有条不紊的进展供给保障。2 报告目的本报告旨在争论分析图书馆治理系统开发的可行性,为此软件的开发人员供给可行性的验证与编写方法的指导。3 软件信息软件名称:图书馆治理系统开发平台:Turbo C 2.0用户:图书馆工作人员2、可行性争论的前提1 主要功能:通过计算机完成图书馆在库书籍的治理,用计算机高效、安全的完成对图书的信息处理,将工作人员从繁琐的数据处理中解放。2 性能要求: a、书籍信息的录入,将图书名,库存数量输入系统,建立系统数据库。b、书籍信息的查询,输入书名,显示此图书的有关信息, 包括库存总量、借出数目、剩余数目。c、书籍借出与归还,输入借出或归还图书的书名与数量后, 对库存信息进展相应修改。d、书籍信息的插入与删除,书到库时或去除库存时,在数据库内增加或删减相应信息。e、书籍信息的备份,将现有数据库信息存档,以备不时之需。f、书籍信息的读入,输入文件名,从相应文件中把信息读入数据库。g、权限问题,进入系统之前输入密码,密码不正确则退出系统。3 开发目标:要求系统具有良好的可操作性,数据稳定性以及安全性,可以长期使用。3、对现有系统的分析现用的治理系统在安全性,数据的读入功能方面存在不同程度的缺陷,有必要进展改进4、所建议的系统1 使用根本方法:该系统具有简洁易用的特点,只需依据菜单功能行操作。2 系统流程图:6、投资及效益分析该系统投资本钱小,使用方法简洁易懂。该系统有效地提高图书馆工作人员的工作效率,节约人力物力。同时可以依据用户的特别需要,增加功能。具有本钱低,功能强大,使用敏捷的特点。7、社会因素方的可行性1 法律方面:本系统的开发不会侵害他人、集体或国家的利益,不违反当地法律法规。2 使用方面:本系统可以满足图书馆治理的要求,而且对使用本软件人员的计算机水平要求不高,只需了解软件操作流程就可以使8、结论用本软件,无需培训。该系统在各个方面的均具有可行性,可以马上开头进展。4二、需求规格说明书1、引言1 编写目的: 为软件开发者供给开发依据,在软件的开发过程中起指向性功能。本说明书的读者为此软件的开发者。2 工程背景: 该软件由学生自行编写,由个人全权负责。本软件独立于其它治理软件。3 参考资料: 万晓东 施玉霞 等著软件技术根底教程09 年 7 月2、任务概述1 目标:本软件旨在为学校的图书馆治理人员供给一个可以便利管理库存图书的系统。可以对库存图书进展录入、借还、查询、修改功能。削减操作时间,提高工作效率。该软件适用于一般规模的图书馆治理操作。2 用户特点: 本系统的操作对象为图书馆治理人员。对治理人员的计算机水平不需要很高的要求。3 条件与限制:本次开发工作无经费投入,开发期限为 40 小时。3、数据描述:1 静态数据: 系统密码,书籍名称,库存总数,剩余数,借出数。2 动态数据: 使用者输入的信息,包括添加的书籍信息,查询关键字。3 数据库描述:系统数据库承受TXT 文档。4 数据流图:5数据流名:图书别名:图书馆库存图书组成:书名+库存总数+剩余数+借出数备注:无录入功能扫瞄功能信息查询功能65 数据字典:4、功能要求:1 功能划分借出归还功能 插入与删除功能信息的备份与读入功能设置访问权限功能2 功能描述录入功能:输入相关数据扫瞄功能:以列表方式列出全部记录信息信息查询功能:依据书名匹配查询,并将查询结果列出 借出归还功能:依据借出与归还的书籍信息修改相应数据插入与删除功能: 插入一条的图书信息,删除某图书的信息信息的备份与读入功能:将输入文件进展备份和从指定文件读入数据设置访问权限功能:只有输入正确密码才可以进展操作否则无权操作5、性能要求1 数据准确度: 查询时要确保查全率与查准率2 时间特性:系统运行时间应当在用户能够承受的范围内73 适应性:本软件属于小型软件,对不同的运行环境适应性很强, 可以能够满足使用需求。6、运行需求1 用户界面:在Turbo C 2.0 界面运行2 硬件接口:一般PC 机3 软件接口:运行于装有Turbo C 2.0 的操作系统4 故障处理:假设在使用过程中消灭程序出错,重运行即可恢复三、概要设计说明书1、引言1 编写目的:设计一图书馆治理系统以代替现有的治理治理系统。本说明书读者为软件设计者。2 工程背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件独立于其它软件系统。3 参考资料: 万晓东 施玉霞 等著软件技术根底教程09 年 7 月谭浩强著C 语言程序设计 第三版张志航 王珊珊等著程序设计语言C 07 年 9 月2、概要设计:1 需求规定:本软件供给一个既可以存储信息,同时又具有扫瞄、插入、查询、修改、删除功能,供使用者轻松治理图书馆的库存图书。数据库信息由使用者进展输入。2 运行环境: 硬件一般PC 机支持环境WINDOWS 操作系统,Turbo C 2.0 软件3 根本设计概念:本系统由主单函数调用各个子函数功能函数来实现各项操作。功能函数包括插入函数,删除函数,显示函数,文件读入函数,文件读出函数,借出函数,归还函数,退出函数函数调用关系图如以下图所示:4 系统构造95 模块划分与功能需求关系模块编号模块名称功能M1身份验证模块输入验证信息M2主菜单模块输入选择的功能M3插入模块插入相关信息M4删除模块删除指定信息M5查询模块查询指定信息M6显示模块以列表方式显示全部信息M7借出模块实现书籍借出M8归还模块实现书籍归还M9读入模块从外部文件读入信息M10备份模块备份文件信息M11退出模块退出程序 保存文件6 人工处理过程:数据的录入工作需人工完成3、接口设计1 用户接口:用户输入信息按“书名”空格“库存数量” 的格式输入。TXT 文件也按上述格式保存。2 外部接口:用户界面:DOS 界面软件接口:运行于Win95 以上版本,且要求安装Turbo C 2.04、运行设计1 运行掌握:系统运行后先进展身份验证,验证通过后,登录,并调用 M2,进入效劳选择模块,由用户选择的信息选择激活 M3M10 等模块,最终依据用户输入的承受信息退出程序,关闭系统。2 运行时间:各模块运行时间掌握在 1 秒内。105 系统数据构造设计书名char name剩余数量 int sum6、系统出错处理设计1 出错信息出错类型处理方法用户输入无效字符提示出错,重输入借出数量过大提示出错,重输入2 维护设计本软件必需依据软件产品设计标准的步骤进展开发,充分考虑软件的可维护性,以便于将来版本开发及移植等二次开发。在编写过程中假设觉察有的模块没有必要,或者实现比较困难,可以由开发者提出修改意见,打算是否修改。四、具体设计说明书1、引言1 编写目的:设计一图书馆治理系统以代替现有的治理治理系统。本说明书读者为软件设计者。2 工程背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件独立于其它软件系统。3 参考资料: 万晓东 施玉霞等著软件技术根底教程 09 年 7 月谭浩强著C 语言程序设计 第三版张志航 王珊珊等著程序设计语言C 07 年 9 月2、总体设计1 需求概述录入功能:输入相关数据扫瞄功能:以列表方式列出全部记录信息信息查询功能: 依据书名匹配查询,并将查询结果列出借出归还功能: 依据借出与归还的书籍信息修改相应数据插入与删除功能:插入一条的图书信息,删除某图书的信息信息的备份与读入功能:将输入文件进展备份和从指定文件读入数据设置访问权限功能:只有输入正确密码才可以进展操作否则无权操作2 系统构造图3、程序描述1 M1 身份验证·功能:验证身份·性能:·输入项:预设密码·输出项:欢送语句·算法: int keyword=111,a;printf(“Please input keyword:“); scanf(“%d“,&a); if(a!=keyword) exit(0);else printf(“Welcome!“);·测试要求:运行正常。2 M2 主菜单模块·功能:选择功能13·性能:·输入项:数字 0-9·输出项:对应功能项·算法: int Display_MainMenu/*显示菜单的函数*/char x; dosystem(“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 aFilen“); printf(“9.Write to aFilen“); printf(“0.Goodbyen“); printf(“*n“); printf(“Please choose from 0-9:“); printf(“n“);x=getchar;while(x<”0”|x>”9”);return(x-”0”);·测试要求:运行正常。3 M3 插入模块·功能:插入信息·性能:·输入项:书名 数量·输出项:成功提示14·算法: 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);/*动态安排存储空间*/*输出插入成功的信息*/·测试要求:运行正常。4 删除模块·功能:删除信息·性能:·输入项:所删书名·输出项:成功提示·算法: 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);·测试要求:运行正常。5 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%stotal:%dleft:%dborrow:%dn“, p->Name,p->all,p->left,p->borrow);elseprintf(“Can”t find the records of %sn“,name);/*找不到*/·测试要求:运行正常。6 M6 显示功能·功能:显示全部信息·性能:·输入项:相应的菜单序号·输出项:全部书籍信息·算法: void Display(Book *head) Book *p; int i; p=head;printf(“NumBookNameTotalLeftBorrown“); 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(“NumBookNametotalleftborrown“);·测试要求:运行正常。7 M7 借出模块·功能:借出书籍·性能:·输入项:所借书名 数量·输出项:成功信息·算法: Book *Borrow_a_Book(Book *head) char name20,ch; intn;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);·测试要求:运行正常。8 M8 归还模块·功能:归还书籍·性能:·输入项:所换书名 数量·输出项:成功提示·算法: Book *Return_a_Book(Book *head) char name20,ch; intn;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);·测试要求:运行正常。9 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);测试要求:运行正常。10 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);·测试要求:运行正常。11M11 退出模块·功能:退出程序·性能:·输入项:数字 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、引言1 编写目的:测试图书馆治理系统软件的各项功能是否符合预期要求。本报告读者为软件设计者。2 工程背景:该软件由学生个人设计,无开发部门和主管部门,主要供学生练习使用。该软件独立于其它软件系统。3 参考资料: 万晓东 施玉霞 等著软件技术根底教程09 年 7 月谭浩强著C 语言程序设计 第三版张志航 王珊珊等 著程序设计语言C 07 年 9 月2、测试打算执行状况1 权限功能·测试数据:输入正确密 111·测试结果:成功进入主界面,说明本模块功能正常222 插入功能·测试数据:无·测试结果:菜单显示正常。本模块功能正常。3 插入功能·测试数据:history100·测试结果:调用显示函数显示结果。本模块功能正常。4 删除操作23·测试数据:history·测试结果调用显示函数显示结果:输出结果正确,说明本模块功能正常。5 查询模块·测试数据:预输入数据history100physics200查询history24·测试结果:显示结果 history10000说明本模块运行正常。6 显示模块·上述过程已经对本功能进展了测试。·结果:显示模块运行正常。7 借出模块·测试数据:预输入数据history100physics200调用借出函数借 history50maths100·测试结果25调用显示函数显示结果:8 归还模块·测试数据:预输入数据history100physics200调用归还函数还 history5026·测试结果:9 文件读入模块·测试数据:文本文档 a.txt·测试结果:调用显示函数显示结果27测试结果正确。10文件备份模块·测试数据: 测试数据承受上一步写入的数据·测试结果11 退出模块·测试数据: 无·测试结果成功退出程序 并生自动成备份文件 last.txt3、评价结果退出模块运行正常。281 软件力量: 软件各项功能复合预期,各子程序运行正常2 缺陷和限制:每次登陆后必需手工调入上一次的备份文件以恢复系统数据,给操作者带来不便3 建议:完善系统的数据库功能,供给安全牢靠的数据保存功能。4 测试结论: 本软件测试通过。附源程序代码:#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #define NULL 0#define LEN sizeof(Book) struct Achar 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);29void 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; dosystem(“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 aFilen“); printf(“9.Write to aFilen“); printf(“0.Goodbyen“); printf(“*n“); printf(“Please choose from 0-9:“); printf(“n“);x=getchar;while(x<”0”|x>”9”);return(x-”0”);