图书管理系统详细设计说明书
- 格式:doc
- 大小:194.00 KB
- 文档页数:30
图书管理系统详细设计说明书1.引言1.1编写目的详细设计说明书的目的是说明一个软件系统各个层次中的每一个程序(模块)的设计考虑,便于图书馆管理系统软件的详细设计和开发途径及开发方法。
1.2背景近年来,随着图书馆管理规模的不断扩大,图书数量也相应的增加,有关图书的各种信息量也成倍增加,面对着庞大的信息量,传统的人工方式管理会导致图书管理上的混乱,人力与物力过多浪费,图书馆管理费用的增加,从而使图书馆的负担过重,影响整个图书馆的运作和控制管理,因此,必须制定一套合理,有效,规范和实用的图书馆管理系统,对图书资料进行集中统一的管理。
另一方面,IT产业和INTERNET获得了飞速发展,计算机应用已渗透到了各个领域,引起信息管理的革命,实现了信息的自动化处理,提高了处理的及时性和正确性。
图书管理工作面对大量的可模块化处理信息,是当今信息革命的一个重要阵地。
我们小组开发图书馆管理系统就是采用现代化的信息管理方式代替手工管理方式,提高了图书管理工作效率,做到了信息的规范化,科学统计和快速查询,让图书馆更好的为学校,社会服务。
1.3定义详细设计说明书:详细设计说明书又称为程序设计说明,详细说明一个软件系统各个层次中的每一个程序(模块)的设计考虑。
C语言程序设计:以C语言字词为结构,最大限度的利用C语言本身的特点是一种基于计算机基础的高级程序设计语言。
图书馆管理系统:能对图书信息及读者信息进行记录和管理的软件。
1.4参考资料【1】C语言程序设计(第三版)谭浩强主编清华大学出版社【2】C语言程序设计教程汤承林姜仲秋全编天津大学出版社【3】《软件工程导论》张海著清华大学出版社2程序系统的组织结构如下图:3.程序1(结构符)设计说明3.1 程序描述通过本系统软件,能帮助人员利用计算机,快速方便的对图书的管理,输入,输出,查找以及借还书管理等所需操作。
在软件开发过程中,主要应用的关键知识点集中在选择结构,循环结构,函数,预处理,结构体和文件的综合应用上。
3.2 功能1.准备和提供统一格式的信息,使各种统计工作简化,使信息成本最低;2.及时全面地提供不同要求的,不同细度的信息以及分析解释现象最快,及时产生正确的控制;3.全面系统的保存大量的信息,并能很快的查询和综合,为组织的决策提出信息支持;4.提供了系统维护,读者管理,图书管理,图书利通以及返回主菜单;3.3 性能这是一个在微型计算机上开发的系统,在响应时间上无特殊的要求,但要求系统能处理大容量的各种信息。
3.4 输入输出项3.4.1主模块1.输入项目:操作系统传递至各种消息以及用户的输入数据。
2.输出项目:用户dos窗口显示3.4.2 读者管理模块1.输入项目:与读者管理操作子对话框有关的用户输入及系统消息。
2.输出项目:操作结果显示。
3.4.3图书管理模块1.输入项目:图书信息。
2.输出项目:相应的dos窗口3.4.4图书利通模块3.4.4.1借出图书模块1.输入项目:读者号,图书编号。
2.输出项目:读者信息,相关借书信息。
3.4.5归还管理模块1.输入项目:读者号 ,书号。
2.输出项目:相关读者信息。
3.5 输入输出总项输入项包括:读者名,读者号,图书名,图书号,图书作者,图书出版社,图书出版时间;输出项包括:相关读者信息,相关图书信息,默认还书期限,借书时间,读者姓名,读者号,图书名,图书号,图书作者,图书出版社;3.6 算法使用算法:实现图书登记的程序设计的流程图;3.8.1.用户接口本产品的用户一般需要通过终端进行操作,进入主界面后点击相应的窗口,分别进入相对应的界面。
用户对程序的维护,最好有备份。
3.8.2 软件接口WIN 2000/XP/NT/7操作系统,C语言编程系统。
3.8.3 外部接口系统同外界的所有接口的安排包括软件与硬件之间的接口,本系统与各支持软件之间的接口。
3.9 存储分配硬盘主要存储借还记录,图书信息和读者信息。
64M以上内存,10G以上硬盘,软盘驱动器一只,CD-ROM驱动器一只和SVGA 兼容模式显示器。
3.10 注释设计说明准备在本程序中安排的注释a.加载模块首部的注释b.加在各分支处的注释c.对各变量的功能,范围,缺省条件等所加注释d.对使用的逻辑所加注释3.11测试设计本软件测试方便,简洁易懂,不容易出现大的错误。
3.12 限制条件本系统的名称是图书馆管理系统,本系统使用VC来实现,图书管理员可以添加,查看,图书信息,可以完成读者查询,借书,还书的操作,无特别的条件要求和限制。
3.13 尚未解决的问题登入系统比较慢,读取读者信息慢,借还记录自动保存期限不是很长。
4.程序2(标志符)设计说明书4.1程序描述图书管理查询,读者借书还书管理程序,安排设计此程序可以方便完善图书馆管理员以及用户操作,并且使操作更加简便,本程序分为1个小模块,4个子程序,为常驻内存,可重入,无覆盖要求,并发处理。
4.2功能本系统具有图书查询,读者借书,读者信息查询,入库管理,读者借书,读者还书等基本功能。
4.3性能精度:Vchar();4.4输入项图书入库,图书查询,读者信息4.5输出项读者借书,读者还书,图书查询4.6限制条件无限制4.7尚未解决的问题市场调研需要充分。
5. 详细代码每个模块我们小组都设有相应的代码,有的模块代码虽然很长,但是比较容易可读,有的模块代码虽然很短但是很难看懂。
总的来说,代码设计其实也是软件不可缺少的一部分。
Main代码int main(){BookDbFile bdf;BnoIdxFile bif;BnameIdxFile bnif;BauthorIdxFile baif;BpressIdxFile bpif;ReaderFile rf;BborrowFile bbf;ReadFile(&bdf, &bif, &bnif, &baif, &bpif, &rf, &bbf); //读入数据文件while(1){switch(MainMenu()){case '1':Xtwh(&bdf, &bif, &bnif, &baif, &bpif, &bbf);break;case '2':Dzgl(&rf);break;case '3':Tsgl(&bdf, &bif, &bnif, &baif, &bpif);break;case '4':Tslt(&bdf, &bif ,&rf, &bbf);break;case '0':WriteFile(&bdf, &bif, &bnif, &baif, &bpif, &rf, &bbf);system("cls");printf("再见...\n");system("pause");exit(0);break;}}}Borrow代码#include "TypeDef.h"#include "Function.h"#include <string.h>#include <stdio.h>//*****借书处理************************************void BorrowBook(BookDbFile *bf, BnoIdxFile *bif, ReaderFile *rf, BborrowFile *bbf) {char rno[5];char bno[5];char choice;int bookno;printf("请输入读者号:");scanf("%s", rno);while(strlen(rno) != 4){printf("输入读者号位数不正确,请重新输入:");scanf("%s", rno);}if(ReaderFind(rf, rno) == -1){printf("您输入的读者号不存在,不能借阅图书!\n");printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}return;}printf("请输入书号:");scanf("%s", bno);while(strlen(bno) != 4){printf("输入书号位数不正确,请重新输入:");scanf("%s", bno);}if((bookno = BinSearch(bif, bno)) <= 0){printf("无此书籍!\n");printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}return;}if(bf->BookDbase[bookno].storenum - bf->BookDbase[bookno].borrownum < 0){printf("该书已全部借出,暂时无法借阅!\n");printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}return;}if(rf->ReadRec[ReaderFind(rf, rno)].bn2 >= rf->ReadRec[ReaderFind(rf, rno)].bn1) //当已借书数大于等于可借书数时{printf("您已超过借书上限,暂时无法借阅!\n");printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}return;}printf("请输入借阅时间(YYYYMMDD):");scanf("%s", bbf->Bbook[bbf->len].date1);printf("借阅成功!");bf->BookDbase[bookno].borrownum++;strcpy(bbf->Bbook[bbf->len].bno, bno);strcpy(bbf->Bbook[bbf->len].rno, rno);strcpy( bbf->Bbook[bbf->len].date2, "#");bbf->len ++;rf->ReadRec[ReaderFind(rf, rno)].bn2++; //读者已借书数加1printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}return;}//*************************************************//*****还书处理************************************void BackBook(BookDbFile *bf, BnoIdxFile *bif, ReaderFile *rf, BborrowFile *bbf) {char rno[5];char bno[5];char choice;int i;printf("请输入读者号和书号(用空格分开):");scanf("%s%s", rno, bno);for(i = 0; i < bbf->len; ++i){if(strcmp(rno, bbf->Bbook[i].rno) == 0 && strcmp(bno, bbf->Bbook[i].bno) == 0){printf("请输入还书日期(YYYYMMDD):");scanf("%s", bbf->Bbook[i].date2);bf->BookDbase[BinSearch(bif, bno)].borrownum--;rf->ReadRec[ReaderFind(rf, rno)].bn2--; //读者已借书数减1printf("还书成功!\n");printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}return;}}printf("没有相关借阅信息,还书请求被拒绝!\n");printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}}//*************************************************CreateFile代码#include "TypeDef.h"#include "Function.h"#include <stdio.h>#include <string.h>//*****添加图书主数据库记录************************void AddDbRec(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile *bpif){char choice;int flag = 0; //是否继续输入BookRecType newBook;while(flag == 0){system("cls");printf("请输入书号(4位):");scanf("%s", newBook.bno);while(strlen(newBook.bno) != 4){printf("输入书号位数不正确,请重新输入:");scanf("%s", newBook.bno);}while(BinSearch(bif, newBook.bno) != 0){printf("您输入的书号已存在,主键不能重复,请重新输入:");scanf("%s", newBook.bno);while(strlen(newBook.bno) != 4){printf("输入书号位数不正确,请重新输入:");scanf("%s", newBook.bno);}}printf("请输入书名:");scanf("%s", newBook.bname);printf("请输入作者:");scanf("%s", newBook.author);printf("请输入出版社:");scanf("%s", newBook.press);printf("请输入分类(3位):");scanf("%s", newBook.sortno);while(strlen(newBook.sortno) != 3){printf("输入分类号位数不正确,请重新输入:");scanf("%s", newBook.sortno);}printf("请输入藏书量:");scanf("%d", &newBook.storenum);newBook.borrownum = 0;ChangeBnoIdx(&newBook, bif, bf->len + 1);ChangeBnameIdx(&newBook, bnif, bf->len + 1); ChangeBauthorIdx(&newBook, baif, bf->len + 1); ChangeBpressIdx(&newBook, bpif, bf->len + 1);bf->BookDbase[bf->len + 1] = newBook;bf->len ++;while(1){printf("是否继续添加书目?(Y/N)");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}if(choice == 'Y' || choice == 'y'){break;}else if(choice == 'N' || choice == 'n'){flag = 1;break;}}}}//*************************************************//*****修改书号索引表******************************void ChangeBnoIdx(BookRecType *newbook, BnoIdxFile *bif, int storeno){strcpy(bif->BnoIdx[bif->len].bno, newbook->bno);bif->BnoIdx[bif->len].RecNo = storeno;bif->len++;}//*************************************************//*****修改书名索引以及书名链头索引表**************void ChangeBnameIdx(BookRecType *newbook, BnameIdxFile *bnif, int storeno) {int i = 0;if(BnameFind(bnif, newbook->bname) > 0) //已存在同名的书{for(i = 0; i < bnif->len; ++i){if(strcmp(newbook->bname, bnif->BnameIdx[i].bname)){newbook->namenext = bnif->BnameIdx[i].head;bnif->BnameIdx[i].head = storeno;bnif->BnameIdx[i].RecNum++;break;}}}else //不存在同名的书{strcpy(bnif->BnameIdx[bnif->len].bname, newbook->bname);bnif->BnameIdx[bnif->len].RecNum = 1;bnif->BnameIdx[bnif->len].head = storeno;newbook->namenext = 0;bnif->len++;}}//*************************************************//*****修改作者索引以及作者链头索引表**************void ChangeBauthorIdx(BookRecType *newbook, BauthorIdxFile *baif, int storeno) {int i = 0;if(BauthorFind(baif, newbook->author) > 0) //已存在同作者的书{for(i = 0; i < baif->len; ++i){if(strcmp(newbook->author, baif->BauthorIdx[i].author) == 0){newbook->authnext = baif->BauthorIdx[i].head;baif->BauthorIdx[i].head = storeno;baif->BauthorIdx[i].RecNum++;break;}}}else //不存在同作者的书{strcpy(baif->BauthorIdx[baif->len].author, newbook->author);baif->BauthorIdx[baif->len].RecNum = 1;baif->BauthorIdx[baif->len].head = storeno;newbook->authnext = 0;baif->len++;}}//*************************************************//*****修改出版社索引以及出版社链头索引表**********void ChangeBpressIdx(BookRecType *newbook, BpressIdxFile *bpif, int storeno) {int i = 0;if(BpressFind(bpif, newbook->press) > 0) //已存在同出版社的书{for(i = 0; i < bpif->len; ++i){if(strcmp(newbook->press, bpif->BpressIdx[i].press) == 0){newbook->prenext = bpif->BpressIdx[i].head;bpif->BpressIdx[i].head = storeno;bpif->BpressIdx[i].RecNum++;break;}}}else //不存在同出版社的书{strcpy(bpif->BpressIdx[bpif->len].press, newbook->press);bpif->BpressIdx[bpif->len].RecNum = 1;bpif->BpressIdx[bpif->len].head = storeno;newbook->prenext = 0;bpif->len++;}}//*************************************************Reader代码#include "TypeDef.h"#include "Function.h"#include <stdio.h>#include <stdlib.h>void AddReader(ReaderFile *rf){int flag = 0;char choice;while(flag == 0){ReaderRecType rr;system("cls");printf("请输入读者号(4位):");scanf("%s", rr.rno);while(strlen(rr.rno) != 4){printf("输入读者号位数不正确,请重新输入:");scanf("%s", rr.rno);}while(ReaderFind(rf, rr.rno) != -1){printf("您输入的读者号已存在,主键不能重复,请重新输入:");scanf("%s", rr.rno);while(strlen(rr.rno) != 4){printf("输入读者号位数不正确,请重新输入:");scanf("%s", rr.rno);}}printf("请输入读者姓名:");scanf("%s", );printf("请输入可借书数:");scanf("%d", &rr.bn1);rr.bn2 = 0;rf->ReadRec[rf->len] = rr;rf->len++;while(1){printf("是否继续添加读者?(Y/N)");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}if(choice == 'Y' || choice == 'y'){break;}else if(choice == 'N' || choice == 'n'){flag = 1;break;}}}}ReadFile代码#include "TypeDef.h"#include <stdio.h>void ReadFile(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile* bpif, ReaderFile *rf, BborrowFile *bbf){//读图书主文件,书号索引链头文件,书名索引链表文件,作者索引链表文件,出版社索引链表文件,读者文件,读借还书文件FILE *fp = NULL;int idx = 1, i = 0;//*****读入图书主文件*************************fp = fopen("BookDbFile.yangq", "r");if(fp == NULL){printf("Error : The BookDbFile.yangq is not exsit.\n");return;}while(!feof(fp)){fscanf(fp, "%d", &idx);fscanf(fp, "%s%s%d%s%d%s%d%s%d%d",bf->BookDbase[idx].bno,bf->BookDbase[idx].bname,&bf->BookDbase[idx].namenext,bf->BookDbase[idx].author,&bf->BookDbase[idx].authnext,bf->BookDbase[idx].press,&bf->BookDbase[idx].prenext,bf->BookDbase[idx].sortno,&bf->BookDbase[idx].storenum,&bf->BookDbase[idx].borrownum);i++;}bf->len = i;fclose(fp);//*******************************************//*****读入书名索引文件***********************i = 0;fp = NULL;fp = fopen("BnameIdxFile.yangq", "r");if(fp == NULL){printf("Error : The BnameIdxFile.yangq is not exsit.\n");return;}while(!feof(fp)){fscanf(fp, "%s%d%d", bnif->BnameIdx[i].bname, &bnif->BnameIdx[i].head, &bnif->BnameIdx[i].RecNum);i++;}bnif->len = i;fclose(fp);//*******************************************//*****读入作者索引文件**********************i = 0;fp = NULL;fp = fopen("BauthorIdxFile.yangq", "r");if(fp == NULL){printf("Error : The BauthorIdxFile.yangq is not exsit.\n");return;}while(!feof(fp)){fscanf(fp, "%s%d%d", baif->BauthorIdx[i].author, &baif->BauthorIdx[i].head, &baif->BauthorIdx[i].RecNum);i++;}baif->len = i;fclose(fp);//*******************************************//*****读入出版社索引文件********************i = 0;fp = NULL;fp = fopen("BpressIdxFile.yangq", "r");if(fp == NULL){printf("Error : The BpressIdxFile.yangq is not exsit.\n");return;}while(!feof(fp)){fscanf(fp, "%s%d%d", bpif->BpressIdx[i].press, &bpif->BpressIdx[i].head, &bpif->BpressIdx[i].RecNum);i++;}bpif->len = i;fclose(fp);//*******************************************//*****读入读者文件**************************i = 0;fp = NULL;fp = fopen("ReaderFile.yangq", "r");if(fp == NULL){printf("Error : The ReaderFile.yangq is not exsit.\n");return;}while(!feof(fp)){fscanf(fp, "%s%s%d%d", rf->ReadRec[i].rno, rf->ReadRec[i].name, &rf->ReadRec[i].bn1, &rf->ReadRec[i].bn2);i++;}rf->len = i;fclose(fp);//********************************************//*****读入书号索引文件***********************i = 0;fp = NULL;fp = fopen("BnoIdxFile.yangq", "r");if(fp == NULL){printf("Error : The BnoIdxFile.yangq is not exsit.\n");return;}while(!feof(fp)){fscanf(fp, "%d%s", &bif->BnoIdx[i].RecNo, bif->BnoIdx[i].bno);i++;}bif->len = i;fclose(fp);//*******************************************//*****读入借还书文件************************i = 0;fp = NULL;fp = fopen("BborrowFile.yangq", "r");if(fp == NULL){printf("Error : The BborrowFile.yangq is not exsit.\n");return;}while(!feof(fp)){fscanf(fp, "%s%s%s%s",bbf->Bbook[i].rno,bbf->Bbook[i].bno,bbf->Bbook[i].date1,bbf->Bbook[i].date2);i++;}bbf->len = i;fclose(fp);//*******************************************}Search代码#include "TypeDef.h"#include "Function.h"#include <string.h>#include <stdlib.h>#include <stdio.h>//*****书号查询*****用二分查找实现书号查询算法***int BinSearch(BnoIdxFile *bif, char key[]){int i,j,k;int l = 0;int h = bif->len;int m = (h + l) / 2;BnoRecType temp;//选择排序for(i = 0; i < bif->len - 1; ++i){for(j = i; j < bif->len; ++j){if(strcmp(bif->BnoIdx[i].bno, bif->BnoIdx[j].bno) > 0){k = j;}else{k = i;}}if(i != k){temp = bif->BnoIdx[k];bif->BnoIdx[k] = bif->BnoIdx[i];bif->BnoIdx[i] = temp;}}while(l < m && h > m){if(strcmp(bif->BnoIdx[m].bno, key) > 0){h = m;m = (l + h) / 2;}else if(strcmp(bif->BnoIdx[m].bno, key) < 0){l = m;m = (l + h) / 2;}else{return bif->BnoIdx[m].RecNo;}}return 0;//折半查找}//***********************************************//*****书名查询********************************** int BnameFind(BnameIdxFile *bnif, char key[]){int i;for(i = 0; i < bnif->len; ++i){if(strcmp(bnif->BnameIdx[i].bname, key) == 0){return bnif->BnameIdx[i].head;}}return 0;}//***********************************************//*****作者查询********************************** int BauthorFind(BauthorIdxFile *baif, char key[]){int i;for(i = 0; i < baif->len; ++i){if(strcmp(baif->BauthorIdx[i].author, key) == 0){return baif->BauthorIdx[i].head;}}return 0;}//***********************************************//*****出版社查询******************************** int BpressFind(BpressIdxFile *bpif, char key[]){int i;for(i = 0; i < bpif->len; ++i){if(strcmp(bpif->BpressIdx[i].press, key) == 0){return bpif->BpressIdx[i].head;}}return 0;}//***********************************************//*****输出一条图书主数据库********************** void ShowRec(BookDbFile *bf, int i){printf("%-6d %-4s %-10s %-8s %-10s %-4s %-6d %d\n",i,bf->BookDbase[i].bno,bf->BookDbase[i].bname,bf->BookDbase[i].author,bf->BookDbase[i].press,bf->BookDbase[i].sortno,bf->BookDbase[i].storenum,bf->BookDbase[i].borrownum);}//***********************************************//*****图书查询控制程序**************************void SearchBook(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile *bpif){char key[12];int result;int i = 0;char choice = '\0';int next = 0;while(1){switch(SearchMenu()){case 'a':printf("请输入书号:");scanf("%s", key);while(strlen(key) != 4){printf("输入书号位数不正确,请重新输入:");scanf("%s", key);}if((result = BinSearch(bif, key)) <= 0){printf("查无此书!\n");}else{system("cls");printf("记录号书号书名作者出版社分类藏书量借出数\n");ShowRec(bf, result);}printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}break;case 'b':printf("请输入书名:");scanf("%s", key);if((result = BnameFind(bnif, key)) == 0){printf("查无此书!\n");}else{system("cls");printf("记录号书号书名作者出版社分类藏书量借出数\n");next = result;while(bf->BookDbase[next].namenext != 0){ShowRec(bf, next);next = bf->BookDbase[next].namenext;}ShowRec(bf, next);}printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}break;case 'c':printf("请输入作者:");scanf("%s", key);if((result = BauthorFind(baif, key)) == 0){printf("查无此书!\n");}else{system("cls");printf("记录号书号书名作者出版社分类藏书量借出数\n");next = result;while(bf->BookDbase[next].authnext != 0){ShowRec(bf, next);next = bf->BookDbase[next].authnext;}ShowRec(bf, next);}printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}break;case 'd':printf("请输入出版社:");scanf("%s", key);if((result = BpressFind(bpif, key)) == 0){printf("查无此书!\n");}else{system("cls");printf("记录号书号书名作者出版社分类藏书量借出数\n");next = result;while(bf->BookDbase[next].prenext != 0){ShowRec(bf, next);next = bf->BookDbase[next].prenext;}ShowRec(bf, next);}printf("\n按任意键返回...");choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}break;case 'e':return;}}}//***********************************************//*****查询菜单**********************************char SearchMenu(){char choice;system("cls");printf("\n\t\t查询菜单\n");printf("=========================\n");printf("\ta.按书号查找\n");printf("\tb.按书名查找\n");printf("\tc.按作者查找\n");printf("\td.按出版社查找\n");printf("\te.返回上一级菜单\n");printf("=========================\n");printf("请选择a—e:");while(1){choice = getchar();if(choice == 10) //判断接收的是否为回车符{choice = getchar();}if(choice < 'a' || choice > 'e'){printf("\n\t输入错误,重选a—e:");}else{break;}}return choice;}//***********************************************//*****查找读者**********************************int ReaderFind(ReaderFile *rf, char key[]){int i;for(i = 0; i < rf->len; ++i){if(strcmp(rf->ReadRec[i].rno, key) == 0){return i;}}return -1;}//***********************************************WriteFile代码#include "TypeDef.h"#include <stdio.h>void WriteFile(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile *bpif, ReaderFile *rf, BborrowFile *bbf){FILE *fp = NULL;int i = 0;//*****写入图书主文件*************************fp = fopen("BookDbFile.yangq", "w");if(fp == NULL){printf("Error : The BookDbFile.yangq is not exsit.\n");return;}for(i = 1; i <= bf->len; ++i){fprintf(fp, "\n%d\t%s\t%s\t%d\t%s\t%d\t%s\t%d\t%s\t%d\t%d",i,bf->BookDbase[i].bno,bf->BookDbase[i].bname,bf->BookDbase[i].namenext,bf->BookDbase[i].author,bf->BookDbase[i].authnext,bf->BookDbase[i].press,bf->BookDbase[i].prenext,bf->BookDbase[i].sortno,bf->BookDbase[i].storenum,bf->BookDbase[i].borrownum);}fclose(fp);//*******************************************//*****写入书名索引文件***********************fp = NULL;fp = fopen("BnameIdxFile.yangq", "w");if(fp == NULL){printf("Error : The BnameIdxFile.yangq is not exsit.\n");return;}for(i = 0; i < bnif->len; ++i){fprintf(fp, "\n%s\t%d\t%d", bnif->BnameIdx[i].bname, bnif->BnameIdx[i].head, bnif->BnameIdx[i].RecNum);}fclose(fp);//*******************************************//*****写入作者索引文件**********************fp = NULL;fp = fopen("BauthorIdxFile.yangq", "w");if(fp == NULL){printf("Error : The BauthorIdxFile.yangq is not exsit.\n");return;}for(i = 0; i < baif->len; ++i){fprintf(fp, "\n%s\t%d\t%d", baif->BauthorIdx[i].author, baif->BauthorIdx[i].head, baif->BauthorIdx[i].RecNum);}fclose(fp);//*******************************************//*****写入出版社索引文件********************fp = NULL;fp = fopen("BpressIdxFile.yangq", "w");if(fp == NULL){printf("Error : The BpressIdxFile.yangq is not exsit.\n");return;for(i = 0; i < bpif->len; ++i){fprintf(fp, "\n%s\t%d\t%d", bpif->BpressIdx[i].press, bpif->BpressIdx[i].head, bpif->BpressIdx[i].RecNum);}fclose(fp);//*******************************************//*****写入读者文件**************************fp = NULL;fp = fopen("ReaderFile.yangq", "w");if(fp == NULL){printf("Error : The ReaderFile.yangq is not exsit.\n");return;}for(i = 0; i < rf->len; ++i){fprintf(fp, "\n%s\t%s\t%d\t%d", rf->ReadRec[i].rno, rf->ReadRec[i].name, rf->ReadRec[i].bn1, rf->ReadRec[i].bn2);}fclose(fp);//********************************************//*****写入书号索引文件***********************fp = NULL;fp = fopen("BnoIdxFile.yangq", "w");if(fp == NULL){printf("Error : The BnoIdxFile.yangq is not exsit.\n");return;}for(i = 0; i < bif->len; ++i){fprintf(fp, "\n%d\t%s", bif->BnoIdx[i].RecNo, bif->BnoIdx[i].bno);}fclose(fp);//*******************************************//*****写入借还书文件************************fp = NULL;fp = fopen("BborrowFile.yangq", "w");if(fp == NULL)printf("Error : The BborrowFile.yangq is not exsit.\n");return;}for(i = 0; i < bbf->len; ++i){fprintf(fp, "\n%s\t%s\t%s\t%s",bbf->Bbook[i].rno,bbf->Bbook[i].bno,bbf->Bbook[i].date1,bbf->Bbook[i].date2);}fclose(fp);//*******************************************}Function.h代码#ifndef FUNCTION#define FUNCTION//CreateFile.cvoid AddDbRec(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile *bpif);void ChangeBnoIdx(BookDbFile *bf, BnoIdxFile *bif);void ChangeBnameIdx(BookRecType *newbook, BnameIdxFile *bnif, int storeno);void ChangeBauthorIdx(BookRecType *newbook, BauthorIdxFile *baif, int storeno);void ChangeBpressIdx(BookRecType *newbook, BpressIdxFile *bpif, int storeno);//Search.cint BinSearch(BnoIdxFile *bif, char key[]);int BnameFind(BnameIdxFile *bnif, char key[]);int BauthorFind(BauthorIdxFile *baif, char key[]);int BpressFind(BpressIdxFile *bpif, char key[]);void ShowRec(BookDbFile *bf, int i);void SearchBook(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile *bpif);char SearchMenu();int ReaderFind(ReaderFile *rf, char key[]);//Reader.cvoid AddReader(ReaderFile *rf);//Borrow.cvoid BorrowBook(BookDbFile *bf, BnoIdxFile *bif, ReaderFile *rf, BborrowFile *bbf);void BackBook(BookDbFile *bf, BnoIdxFile *bif, ReaderFile *rf, BborrowFile *bbf);//ReadFile.cvoid ReadFile(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile* bpif, ReaderFile *rf, BborrowFile *bbf);//WriteFile.cvoid WriteFile(BookDbFile *bf, BnoIdxFile *bif, BnameIdxFile *bnif, BauthorIdxFile *baif, BpressIdxFile *bpif, ReaderFile *rf, BborrowFile *bbf);#endifTypeDef.h代码#ifndef TYPE //头文件卫士#define TYPE#define BOOKSIZE 1000#define READERNUM 1000//*****主数据库文件*****************typedef struct{char bno[5]; //书号char bname[21]; //书名int namenext; //书名指针链(用记录号)char author[9]; //作者int authnext; //作者链指针(用记录号)char press[11]; //出版社int prenext; //出版社链指针(用记录号)char sortno[4]; //分类号int storenum; //库存数int borrownum; //借出数}BookRecType; //数据库记录类型typedef struct{BookRecType BookDbase[BOOKSIZE];int len; //文件当前的长度}BookDbFile;//***********************************//*****书号索引文件******************typedef struct{char bno[5]; //书号int RecNo; //记录指针}BnoRecType; //索引文件记录类型typedef struct{。