西文图书管理系统1.问题描述图书管理基本业务活动包括:对一本书的采编入库、清除库存、借阅和归还等等。试设计一个图书管理系统,将上述业务活动借助于计算机系统完成。要求:1)每种书的登记内容至少包括书号、书名、著者、现存量和总库存量等五项。2)作为演示系统,不必使用文件,全部数据可以都在内存存放。要用B-树(4阶树)对书号建立索引,以获得高效率。3)系统应有以下功能:采编入库、清除库存、借阅、归还、显示(以凹入表的形式显示)等。2.需求分析2.1规定程序功能改程序能实现对一本书的采编入库、清除库存、借阅和归还等等。系统拥有的功能有:采编入库、清除库存、借阅、归还、显示(以凹入表的形式显示)等。2.2输入和输出形式模拟图书管理系统,会给出目录,输入则按照目录提示进行,在采编入库函数中,输出只有采编入库是否成功。在清除库存、借阅、归还、显示等函数模块中,输入按照信息提示进行逐步输入,该程序输出编号、书名、作者、该书库存总量、该书现存量等信息以及所进行的操作是否成功。3.概要设计3.1数据结构的设计根据题目的要求:作为演示系统,不必使用文件,全部数据可以都在内存存放。要用B-树(4阶树)对书号建立索引,以获得高效率。所以采用的数据结构为4阶B-树。3.2算法的设计除主函数外,包括了六个主要模块,分别是:菜单、图书采编入库、图书清除、借书、还书、显示。各模块之间的关系图如下:菜单采编入库图书清除借书还书显示每个模块函数为:voidmenu()菜单voidinsert()图书采编入库voidclear()图书清除库存voidborrow()借书voidgiveback()还书voidshow()显示3.3抽象数据类型的设计首先是一本书,它包含许多信息,所以定义为结构体。typedefstruct//图书信息结构体{intbooknum;//图书编号charbookname[50];//书名charwriter[20];//作者intnow;//该书现存量inttotal;//该书的总库存量intflag;//flag的值代表该书的状态.flag=0代表已删除;flag=1代表未删除;}book;然后该程序用的数据结构为B-树,所以还要定义关于B-树的结构体。typedefstructBTNode//结点结构体{intkeynum;structBTNode*parent;//双亲结点指针KeyTypekey[m+1];//key[0]不用structBTNode*ptr[m+1];//孩子结点指针}BTNode,*BTree;typedefstruct{BTNode*pt;inti;//位置inttag;//某结点是否存在的标志}Result;4.详细设计4.1算法的主要思想根据题目的要求进行每步的安排。当一本书进行采编入库时,按步骤输入书号、书名、著者、现存量和总库存量等五项,并且将其以结点编入B-树。清除库存则按照B-树的删除方式进行删除。借书、还书和显示则都依照相同的方式来进行。4.2算法的实现①菜单函数voidmenu(){printf(\n\n图书管理系统菜单\n);printf(\n═══════════\n);printf(\n※1采编入库\n);printf(\n※2清除库存\n);printf(\n※3借阅\n);printf(\n※4归还\n);printf(\n※5显示\n);printf(\n※6退出\n);printf(\n═══════════\n);printf(\n请选择功能选项(1-6):[]\b\b\b);intp;scanf(%d,&p);switch(p){case1:insert();break;case2:clear();break;case3:borrow();break;case4:giveback();break;case5:show();break;case6:exit(0);break;default:printf(\n输入错误!\n);back();}}②图书采编入库函数voidinsert()//插入函数{KeyTypea;printf(\n入库图书编号:);scanf(%d,&a.booknum);printf(\n入库图书名称:);scanf(%s,a.bookname);printf(\n入库图书作者:);scanf(%s,a.writer);printf(\n入库图书数量:);scanf(%d,&a.total);a.now=a.total;a.flag=1;InsertNode(booktree,a);totalbooks=totalbooks+a.total;printf(\n图书入库成功!\n);back();}③图书清除库存函数voidclear()//删除函数{KeyTypea;Resultresult;charc;printf(\n\n请输入要删除的图书编号:);scanf(%d,&a.booknum);result=SearchBTree(booktree,a);if(result.tag==1&&result.pt-key[result.i].flag==1){printf(\n图书信息:\n);printf(编号书名作者该书库存总量该书现存量\n);printf(\n%d%s%s%d%d\n,result.pt-key[result.i].booknum,result.pt-key[result.i].bookname,result.pt-key[result.i].writer,result.pt-key[result.i].total,result.pt-key[result.i].now);printf(\n确定要删除此书?(1是2否)[]\b\b\b);c=getch();if(c==49){result.pt-key[result.i].flag=0;totalbooks=totalbooks-result.pt-key[result.i].total;printf(\n删除成功!\n);}elseprintf(\n退出删除操作,返回菜单页!\n);}elseprintf(\n该图书不存在!\n);back();}④借书函数voidborrow()//借书函数{intb;KeyTypea;Resultresult;printf(\n\n请输入您要借的图书编号:);scanf(%d,&a.booknum);result=SearchBTree(booktree,a);if(result.tag==1&&result.pt-key[result.i].flag==1){printf(\n图书信息:\n);printf(编号书名作者该书库存总量该书现存量\n);printf(\n%d%s%s%d%d\n,result.pt-key[result.i].booknum,result.pt-key[result.i].bookname,result.pt-key[result.i].writer,result.pt-key[result.i].total,result.pt-key[result.i].now);if(result.pt-key[result.i].now0){fanhui:printf(\n请输入借此书的数量:);scanf(%d,&b);if(b=result.pt-key[result.i].now){result.pt-key[result.i].now=result.pt-key[result.i].now-b;printf(\n借书成功!\n);}else{printf(\n借书数量大于现存量,借书未成功!\n);printf(\n返回重新输入!\n);gotofanhui;}}elseprintf(\n该书已全部出借!\n);}elseprintf(\n该图书不存在!\n);back();}⑤还书函数voidgiveback()//还书函数{KeyTypea;intb;Resultresult;printf(\n\n请输入您要还的图书编号:);scanf(%d,&a.booknum);result=SearchBTree(booktree,a);if(result.tag==1&&result.pt-key[result.i].flag==1){printf(\n图书信息:\n);printf(编号书名作者该书库存总量该书现存量\n);printf(\n%d%s%s%d%d\n,result.pt-key[result.i].booknum,result.pt-key[result.i].bookname,result.pt-key[result.i].writer,result.pt-key[result.i].total,result.pt-key[result.i].now);if(result.pt-key[result.i].now=0&&result.pt-key[result.i].nowresult.pt-key[result.i].total){fanhui:printf(\n请输入归还此书的数量:);scanf(%d,&b);if(b=result.pt-key[result.i].total-result.pt-key[result.i].now){result.pt-key[result.i].now=result.pt-key[result.i].now+b;printf(\n\n☆还书成功☆\n\n);}elseif(bresult.pt-key[result.i].total-result.pt-key[result.i].now){printf(\n归还数量大于出借总量,归还未成功!\n);printf(\n返回重新输入!\n);gotofanhui;}}elseif(result.pt-key[result.i].now==result.pt-key[result.i].total)printf(\n该书没有出借!\n);}elseprintf(\n该图书不存在!\n);back();}⑥显示函数voidshow()//显示函数{KeyTypea;Resultresult;printf(\n\n请输入您要查看的图书编号:);scanf(%d,&a.booknum);result=SearchBTree(booktree,a);if(result.tag==1&&result.pt-key[result.i].flag==1){printf(\n图书信息:\n);printf(编号书名作者该书库存总量该书现存量\n);printf(\n%d%s%s%d%d\n,result.pt-key[result.i].booknum,result.pt-key[result.i].bookname,result.pt-key[result.i].writer,result.pt-key[result.i].total,result.pt-key[result.i].now);}elseprintf(\n该图书不存在!\n);back();}4.3函数的调用关系图5.测试结果界面菜单采编入库三本书main()insert();clear();borrow();giveback();show();menu()InsertNode(booktree,a);SearchBTree(booktree,a);返回菜单后,出来的界面即第一幅截图,因此后面的省略其截图。清除库存借书检查一下,原来3本,借出2本后,还剩一本。还书检查一下目录输入错误的情况借书超过总库存量的情况还书超过总库存量的情况查阅的书籍信息不存在的情况