6图书管理系统.docx
《6图书管理系统.docx》由会员分享,可在线阅读,更多相关《6图书管理系统.docx(61页珍藏版)》请在冰豆网上搜索。
![6图书管理系统.docx](https://file1.bdocx.com/fileroot1/2023-2/23/c47ed960-7963-497c-99b7-4bbdc3775509/c47ed960-7963-497c-99b7-4bbdc37755091.gif)
6图书管理系统
实验课程名称数据结构课程设计
专业班级计算机科学与技术10级1班
学生姓名10410901019
学号罗泽丽
指导教师冯韵
2012至201学年第一学期第一至二周
目录
1概述3
1.1现状分析3
1.2存在的问题3
1.3实现意义3
2系统分析4
3概要设计4
3.1设计要求4
3.2流程图4
3.2.1系统管理图4
3.2.2系统维护图5
3.2.3图书管理图5
3.2.4图书查询子系统图5
3.2.5图书流通图6
3.3总流程图6
4详细设计7
4.1主数据库文件7
4.2输入图书记录建立相关文件9
4.2.1添加图书主数据记录9
4.2.2修改书号索引9
4.2.3修改书名索引和表10
4.2.4修改作者索引和表11
4.2.5修改出版社索引和表12
4.2.6建立图书多重表主索和表12
4.3查询信息13
4.3.1按书号查询13
4.3.2按书名查询13
4.3.3按作者查询14
4.3.4按出版社查询14
4.3.5输出图书主数据库记录14
4.3.6输出图书主数据库记录15
4.4借还书处理16
4.4.1借书处理16
4.2还书处理17
4.5读者管理子系统18
4.6文件写盘18
4.7读入盘中文件19
5运行与测试21
5.1图书管理系统21
5.2系统初始化22
5.3读者管理22
5.4图书管理23
5.5图书查询23
5.5.1按书号查询23
5.5.2按作者名查询24
5.5.2按出版社查询24
5.5.3按书名查询24
5.6借书处理24
5.7还书处理25
6总结和心得25
7参考文献25
8附录26
1概述
1.1现状分析
图书馆每天都有很多的人借书还书,而且书的编号,种类都是不一样的,但是,完全是人工操作,不仅增大了工作量,还浪费了大量的时间,既浪费时间也浪费精力。
1.2存在的问题
以往的图书馆管理完全手工操做,通过卡片记录信息,既浪费时间,又浪费人工、纸张,而且书籍和读者的信息查询比较麻烦,也会存在着许多的差错,查找起来也不方便,不能提供需要的各种信息如本馆各种资料分布及借阅情况,让管理者查找起来相当的不方便。
从而带来了许多的麻烦。
1.3实现意义
1.图书馆管理系统可以大大地提高工作效率。
2.减少工作中可能出现的错误。
3.节约借书,还书的时间。
4.更加的方便,快捷。
2系统分析
1.系统维护它又包含初始化和读盘。
2.读者管理。
3.图书管理包括图书信息输入和图书信息查询。
4.图书查询子系统分别按照书号,书名,作者,出版社进行查询。
5.图书流通里面包含借书处理。
6.图形界面要简单,明了,人性化。
3概要设计
3.1设计要求
1.建立一个图书信息数据库文件,输入若干种书的记录,建立一个以书号为关键字的索引文件;在主数据库文件中建立以书名,作者以及出版社作为次关键字的索引以及对应的索引链头文件。
2.建立关于书号,书名,作者及出版社的图书查询。
3.实现图书的借还子系统,包括建立读者文件,借还文件,读者管理及图书借还等相关的处理。
3.2流程图
3.2.1系统管理图
3.2.2系统维护图
3.2.3图书管理图
3.2.4图书查询子系统图
3.2.5图书流通图
3.3总流程图
4详细设计
4.1主数据库文件
typedefstruct
{
charbno[5];//书号
charbname[21];//书名
intnamenext;
charauthor[9];//作者
intauthnext;//作者链指针(用记录号)
charpress[11];//出版社
intprenext;//出版社链指针(用记录号)
charsortno[4];//分类号
intstorenum;//藏书量
intborrownum;//借出数
}BookRecType;//数据库记录类型
typedefstruct
{
BookRecTypeBookDbase[BookSize];
intlen;//文件当前长度
}BookDbaseFile;//定义图书数据库文件类型
typedefstruct
{
charbno[5];//书号
intRecNo;//记录指针
}BidxRecType;
typedefstruct
{
BidxRecTypeBnoIdx[BookSize];
intlen;//当前记录个数
}BnoIdxFile;//书号索引文件类型
/*书名链头索引文件*/
typedefstruct
{
charbname[21];//书名
intlhead;//链头指针
intRecNum;//长度
}BNRecType;//书名链头文件记录类型
typedefstruct
{
BNRecTypeLHFrec1[BLHnum];
intlen1;//链头文件当前长度
}LHFile1;//书名链头文件类型
typedefstruct
{
charauthor[9];//作者
intlhead;//链头指针
intRecNum;//长度
}BARecType;//作者链头文件记录类型
typedefstruct
{
BARecTypeLHFrec2[BLHnum];
intlen2;
}LHFile2;//作者链头文件类型
typedefstruct
{
charpress[11];//出版社
intlhead;//链头指针
intRecNum;//长度
}BPRecType;//出版社链头文件记录类型
typedefstruct
{
BPRecTypeLHFrec3[BLHnum];
intlen3;
}LHFile3;//出版社链头文件类型
typedefstruct
{
charrno[4];//读者号
charname[8];//读者名
intbn1;//可借书数
intbn2;//已借书数
}RRecType;//读者文件类型
typedefstruct
{
RRecTypeReadRec[RRnum];
intlen;//当前读者数
}ReFile;//读者文件类型
typedefstruct
{
charrno[4];//读者号
charbno[5];//书号
chardate1[9];//借书日期
chardate2[9];//还书日期
}BbookRecType;//借还书文件记录类型
typedefstruct
{
BbookRecTypeBbook[BookSize];
intlen;
}BookFile;//借还书文件类型4.2通讯录建立模块设
4.2输入图书记录建立文件
4.2.1添加图书记录
voidAppDBaseRec(BookDbaseFile&df)//追加一条图书主数据库记录
{
inti;
i=++df.len;//图书主数据库长度加1
printf("书号书名作者名出版社分类藏书量\n");
scanf("%s%s",df.BookDbase[i].bno,df.BookDbase[i].bname);
scanf("%s%s",df.BookDbase[i].author,df.BookDbase[i].press);
scanf("%s%d",df.BookDbase[i].sortno,&df.BookDbase[i].storenum);
df.BookDbase[i].borrownum=0;//借出置0
}
4.2.2修改书号索引
(voidAppDBaseRec(BookDbaseFile&df)//追加一条图书主数据库记录
{
inti;
i=++df.len;//图书主数据库长度加1
printf("书号书名作者名出版社分类藏书量\n");
scanf("%s%s",df.BookDbase[i].bno,df.BookDbase[i].bname);
scanf("%s%s",df.BookDbase[i].author,df.BookDbase[i].press);
scanf("%s%d",df.BookDbase[i].sortno,&df.BookDbase[i].storenum);
df.BookDbase[i].borrownum=0;//借出置0
}
voidChangeBnoIdxF(BookDbaseFile&df,BnoIdxFile&bif)//修改书号索引表
{
inti,j,k;
charsh[4];
i=df.len;//图书主文件的当前长度,也就是要处理的当前记录号
strcpy(sh,df.BookDbase[i].bno);//取记录中书号送至变量sh中
j=bif.len;
k=1;
while(j>=1)
{//查找插入位置
if(strcmp(sh,bif.BnoIdx[j].bno)>0)
{
k=j+1;
break;
}
j--;
}
if(bif.len>0)//有序表的插入
for(j=bif.len;j>=k;j--)
bif.BnoIdx[j+1]=bif.BnoIdx[j];//记录后移
strcpy(bif.BnoIdx[k].bno,sh);
bif.BnoIdx[k].RecNo=i;
bif.len++;//表长度加1
}
4.2.3修改书名索引和表
voidChangeLinkHeadF1(BookDbaseFile&df,LHFile1&lhf1)
{
inti,j,k,m;
charsm[20];
i=df.len;//图书主文件的当前长度,也就是要处理的当前记录号
strcpy(sm,df.BookDbase[i].bname);//取记录中书名送至变量sm中
j=1;
k=0;
while(j<=lhf1.len1)
{//查找与次关键字相等的记录
if(strcmp(sm,lhf1.LHFrec1[j].bname)==0)
{
k=j;
break;
}
j++;
}
if(k!
=0)
{
df.BookDbase[i].namenext=lhf1.LHFrec1[k].lhead;
lhf1.LHFrec1[k].lhead=i;//主文件的当前记录号(假定为指针)
lhf1.LHFrec1[k].RecNum++;
}
else
{
m=++lhf1.len1;//索引关键字个数加1
df.BookDbase[i].namenext=0;//用头插法建立链表,指针置空
lhf1.LHFrec1[m].lhead=i;//i为主文件的当前记录号(假定为指针)
lhf1.LHFrec1[m].RecNum=1;//计数器置1
strcpy(lhf1.LHFrec1[m].bname,sm);
}
}
4.2.4修改作者索引和表
voidChangeLinkHeadF2(BookDbaseFile&df,LHFile2&lhf2)//修改作者索引以及作者链头索引表
{
inti,j,k,m;
charzz[8];
i=df.len;//图书主文件的当前长度,也就是要处理的当前记录号
strcpy(zz,df.BookDbase[i].author);//取记录中书名送至变量zz中
j=1;
k=0;
while(j<=lhf2.len2)
{//查找与次关键字相等的记录
if(strcmp(zz,lhf2.LHFrec2[j].author)==0)
{
k=j;
break;
}
j++;
}
if(k!
=0)
{
df.BookDbase[i].authnext=lhf2.LHFrec2[k].lhead;
lhf2.LHFrec2[k].lhead=i;//主文件的当前记录号(假定为指针)
lhf2.LHFrec2[k].RecNum++;
}
else
{
m=++lhf2.len2;//索引关键字个数加1
df.BookDbase[i].authnext=0;//用头插法建立链表,指针置空
lhf2.LHFrec2[m].lhead=i;//i为主文件的当前记录号(假定为指针)
lhf2.LHFrec2[m].RecNum=1;//计数器置1
strcpy(lhf2.LHFrec2[m].author,zz);
}
}
4.2.5修改出版社索引和表
voidChangeLinkHeadF3(BookDbaseFile&df,LHFile3&lhf3)//修改出版社索引以及出版社链头索引表
{
inti,j,k,m;
charcbs[10];
i=df.len;//图书主文件的当前长度,也就是要处理的当前记录号
strcpy(cbs,df.BookDbase[i].press);//取记录中书名送至变量cbs中
j=1;
k=0;
while(j<=lhf3.len3)
{//查找与次关键字相等的记录
if(strcmp(cbs,lhf3.LHFrec3[j].press)==0)
{
k=j;
break;
}
j++;
}
if(k!
=0)
{
df.BookDbase[i].prenext=lhf3.LHFrec3[k].lhead;
lhf3.LHFrec3[k].lhead=i;//主文件的当前记录号(假定为指针)
lhf3.LHFrec3[k].RecNum++;
}
else
{
m=++lhf3.len3;//索引关键字个数加1
df.BookDbase[i].prenext=0;//用头插法建立链表,指针置空
lhf3.LHFrec3[m].lhead=i;//i为主文件的当前记录号(假定为指针)
lhf3.LHFrec3[m].RecNum=1;//计数器置1
strcpy(lhf3.LHFrec3[m].press,cbs);
}
}
4.2.6建立图书多重表主索和表
voidcreateBook(BookDbaseFile&df,BnoIdxFile&bif,LHFile1&lhf1,LHFile2&lhf2,LHFile3&lhf3)
{
charyn='y';
while(yn=='y'||yn=='Y')
{
AppDBaseRec(df);//输入记录
ChangeBnoIdxF(df,bif);//修改书号索引文件
ChangeLinkHeadF1(df,lhf1);//修改书名索引文件
ChangeLinkHeadF2(df,lhf2);//修改作者索引文件
ChangeLinkHeadF3(df,lhf3);//修改出版社索引文件
printf("继续输入吗?
y/n:
\n");
scanf("%s",&yn);
}
}
4.3查询信息
4.3.1按书号查询
intBinSearch(BnoIdxFilebif,charkey[])//按书号查询法
{
intlow,high,mid;
low=1;
high=bif.len;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(key,bif.BnoIdx[mid].bno)==0)
returnbif.BnoIdx[mid].RecNo;
elseif(strcmp(key,bif.BnoIdx[mid].bno)<0)
high=mid-1;
elselow=mid+1;
}
return0;
}
4.3.2按书名查询
intBnameFile(LHFile1lhf1,charkey[])//按书名查询法
{
inti,k=0;
for(i=1;i{
if(strcmp(key,lhf1.LHFrec1[i].bname)==0)
{
k=lhf1.LHFrec1[i].lhead;
break;
}
}
returnk;
}
4.3.3按作者查询
intBauthFile(LHFile2lhf2,charkey[])//按作者查询法
{
inti,k=0;
for(i=1;i{
if(strcmp(key,lhf2.LHFrec2[i].author)==0)
{
k=lhf2.LHFrec2[i].lhead;
break;
}
}
returnk;
}
4.3.4按出版社查询
intBpressFile(LHFile3lhf3,charkey[])//按出版社查询法
{
inti,k=0;
for(i=1;i{
if(strcmp(key,lhf3.LHFrec3[i].press)==0)
{
k=lhf3.LHFrec3[i].lhead;
break;
}
}
returnk;
}
4.3.5输出图书主数据库记录
voidShowRec(BookDbaseFiledf,inti)
{
printf("书号书名作者名出版社分类号\n");
printf("=================================================\n");
printf("%-6s%20s",df.BookDbase[i].bno,df.BookDbase[i].bname);
printf("%8s%10s",df.BookDbase[i].author,df.BookDbase[i].press);
printf("%-6s\n",df.BookDbase[i].sortno);
printf("=================================================\n");
}
4.3.6输出图书主数据库记录
voidSearchBook(BookDbaseFiledf,BnoIdxFilebif,LHFile1f1,LHFile2f2,LHFile3f3)
{
charsh[4],sm[20],zz[8],cbs[10];
inti,j,k,choose=1;
while(choose>=1&&choose<=5)
{
printf("图书查询子系统\n");
printf("1.书号2.书名3.作者4.出版社5.退出\n");
printf("请选择:
\n");
scanf("%d",&choose);
switch(choose)
{
case1:
printf("输入书号:
\n");
scanf("%s",sh);
k=BinSearch(bif,sh);//调用书号查询算法
if(k==0)
{
printf("没有要查找的图书,请检查是否输入有错\n");
break;
}
ShowRec(df,k);
break;
case2:
printf("输入书名:
\n");
scanf("%s",sm);
k=BnameFile(f1,sm);//调用书名查询算法
if(k==0)
{
printf("没有要查找的图书,请检查是否输入有错\n");
break;
}
for(i=k;i;i=df.BookDbase[i].namenext)
ShowRec(df,i);//输出查找的图书记录
break;
case3:
printf("输入作者名:
\n");
scanf("%s",zz);
k=BauthFile(f2,zz);//调用作者名查询算法
if(k==0)
{
printf("没有要查找的图书,请检查是否输入有错\n");
break;
}
for(i=k;i;i=df.BookDbase[i].authnext)
ShowRec(df,i);//输出查找的图书记录
break;
case4:
printf("输入出版社:
\n");
scanf("%s",cbs);
k=BpressFile(f3,cbs);//调用出版社查询算法
if(k==0)
{
printf("没有要查找的图书,请检查是否输入有错\n");
break;
}
for(i=k;i;i=df.BookDbase[i].authnext)
ShowRec(df,i);//输出查找的图书记录
break;
case5:
return;
}
}
}
4.4借还书处理
4.4.1借书处理
voidBorrowBook(BookDbaseFile&bf,BnoIdxFilebif,BookFile&bbf,ReFile&rf)//借书处理
{
chardzh[8],sh[4],jyrq[8];
inti,j,k=0;
printf("输