数据结构课程设计图书管理系统.docx
《数据结构课程设计图书管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计图书管理系统.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构课程设计图书管理系统
数据结构课程设计图书管理系统
一需求分析
该程序是模拟图书馆管理系统,实现图书采编入库、借书、还书、查询等基本业务。
此程序规定:
(1)管理员能够向系统中输入每种书的基本信息,包括书号、书名、作者、现存量和库存量、借阅记录,并保存记录;
(2)用户(读者)能够按书号、书名、作者查询图书信息;
(3)管理员能够实现图书采编入库(新购入一本书,经分类和确定书号之后登记到图书账目中去。
如果这种书在帐中已有,则只将总库存量增加)、借阅(如果书的现存量大于0,则借出一本,登记借阅者的图书证号和归还期限)、归还(删除对借阅者的登记,改变该书的现存量)、销毁(将图书从账目中删除)等操作。
二概要设计
●系统用到的抽象数据类型定义:
1、ADTLinearList{
数据元素:
D={ai|ai∈D0,i=1,2,…,n,n≥0,D0为某一数据对象}
关系:
S={|ai,ai+1∈D0,i=1,2,…,n-1}
基本操作:
(1)InitList(L)
(2)DestroyList(L)
(3)ClearList(L)
(4)EmptyList(L)
(5)ListLength(L)
(6)Locate(L,e)
(7)GetData(L,i)
(8)InsList(L,i,e)
(9)DelList(L,i,&e)
}ADTLinearList
2、ADTString{
数据对象:
D={ai|ai∈CharacterSet,i=1,2,…,n;n≧0}
数据关系:
R={|ai-1,ai∈D,i=2,…,n;n≧0}
基本操作:
(1)StrAsign(S,chars)
(2)StrInsert(S,pos,T)
(3)StrDelete(S,pos,len)
(4)StrCopy(S,T)
(5)StrEmpty(S)
(6)StrCompare(S,T)
(7)StrLength(S)
(8)StrClear(S)
(9)StrCat(S,T)
(10)SubString(Sub,S,pos,len)
(11)StrIndex(S,pos,T)
(12)StrReplace(S,T,V)
(13)StrDestroy(S)
}ADTString
●系统中的子程序和功能说明:
InitBo(Book&boo);初始化图书信息
InitRe(lend&Lin);初始化借阅者信息
BinarySearch(Bookboo,charSearchNum[]);二分法查找比较书号
Buy(Book&boo,charBuyNum[]);新书采编入库系统
Delete(Book&boo,charDeleteNum[]);清除图书信息系统
Borrow(Book&boo,lend&Lin,charBorrowNum[],charCaNum[]);借阅图书处理系统
Return(Book&boo,lend&Lin,charReturnNum[],charBorrowerNum[]);归还图书系统
SearchByNum(Book&boo,charSeaNum[]);按书号查找系统
SearchByName(Book&boo);按书名查找系统
SearchByAuth(Book&boo);按作者查询系统
Menu();主菜单显示系统
Search();查询系统子菜单
main();主函数
●系统程序功能结构图
三详细设计
●功能实现过程
boolBinarySearch(Bookboo,charSearchNum[])//二分法查找比较书号
{
while(low<=high)
{
计算中间点;
if(查找到书号相同的)
{
返回值true;
}
if(查找书号不相同)
用二分法进一步进行查找;
}
if(库中没有所要查找的书)
返回值false;
}
voidBuy(Book&boo,charBuyNum[])/*采编入库*/
{
if(书库中有此书)
{
总库存加1;
现库存加1;
}
if(书库中无此书)
{
for(i=total;i>mid&&total;i--)/*将新采购的书插在适合位置,保持有序*/
空出插入位置;
输入新购书籍的相关信息:
书号、书名、作者、出版社;
boo[i].next=NULL;
total++;/*总量加1*/
}
}
voidDelete(Book&boo,charDeleteNum[])/*清除图书信息*/
{
if(书库中没有此书)
输出“无此书”;
if(书库中有此书)
{
strcpy(连续两本书的相关信息);
现存量减1;库存量减1;
}
else输出“此书已有借阅者,无法删除!
”;
}
voidBorrow(Book&boo,lend&Lin,charBorrowNum[],charCaNum[])/*借阅图书信息*/
{
if(没有找到此书)输出“书库中无此书!
”;
if(书库中有此书)
{
借出一本书后,该书的现存量减1;并在借阅记录链表中插入该条记录;再对应读者信息记录链表,如果已有该读者证号信息,直接在该链表中插入此次借阅记录;如果无该读者证号信息,申请新单链表存放借阅记录。
}
else输出“该书现存量为0”;
}
voidReturn(Book&boo,lend&Lin,charReturnNum[],charBorrowerNum[])/*归还图书信息*/
{
if(书库中无此书)
输出“无此书记录”;
if(书库中有此书)
{
查找图书文件,修改图书的现存量;查找记录借阅信息的单链表,填入还书日期,删除借阅信息;查找记录读者信息的单链表,删除证号信息。
}
}
voidSearchByNum(Book&boo,charSeaNum[])/*按书号查找*/
{
if(书库中无此书信息)/*用二分法查找*/
输出“无此书”;
else/*书库中有此书信息*/
输出与此书有关的相关信息;
}
voidSearchByName(Book&boo)/*按书名查找*/
{
输入想要查找书的书名;
用顺序查找法查找;
if(查找到需要查找的书)
输出与此书相关的信息;
}
建议画出主要模块流程图。
四设计与调试分析
1、这个程序设计中要注意定义两个结构体:
图书结构体、借阅人结构体。
其中定义数组存放图书信息,申请链表存放借阅记录和读者信息记录。
2、程序中运用到大多的插入与删除,所以申请链表比较方便插入与删除。
但应前期需求分析的准备工作不充分,导致程序运行功能不全,比如查找时关于此书的信息不能全部显示出来,并且添加删除时库存的变化不能直接显示出来。
程序的健壮性不能达到预期的结果,这些都是需要改进的。
3、在程序中的函数调用是个非常重要的部分,也是经常需要用到的,在编写程序过程中,因为函数调用不准确,使得循环进不去,后来改变函数的调用关系,才达到了预期结果。
4、程序中还定义了全局变量,之前没定义全局变量,在下面的编写过程,同样性质的地方需要重复定义,比较麻烦,定义全局变量使得程序比较简明一点。
五用户手册
【使用说明】
1、进入图书馆管理系统主页面
2、若有新书要新编入库,选择1,进入新书入库系统,输入入库书的书号,若书库中无该书,则设立新书目,输入新书信息。
若书库中已有该书,则输入新信息覆盖修改原书库中该书号对应书的信息。
3、若有书籍信息需要删除,选择2,进入清空库存系统,输入想要删除书的书号,则此书信息就已删除。
4、若要借阅图书,选择3,进入图书借阅系统,输入需要借阅书的书号以及读者证号,并输入还书日期,则借书成功。
5、若要归还图书,选择4,进入图书归还系统,输入需要归还图书的书号以及读者证号,则还书成功。
6、若要查找信息,选择5,进入查找信息子系统。
若要按书号查找,则选择子系统中的1,输入需要查找的书的书号,若按书名查找,则选择子系统中的2,输入需要查找的书名,若按作者查找,输入需要查找书的作者进行查找,若查找结束,则按0退出。
7、若系统使用结束,按0退出。
【程序中的头文件】
#include
#include
#include
#defineMAXSIZE100
#defineLIST_INIT_SIZE100
intRetotal;/*定义的全局变量*/
inttotal;
六测试成果
1、采编入库
2、清空库存
3、图书借阅
4、图书归还
5、图书查找
七附录(源程序清单)
#include
#include
#include
#defineMAXSIZE100
#defineLIST_INIT_SIZE100
typedefstructBoro
{
charBNum[20];
charRetDate[8];
structBoro*next;
}Bor;
typedefstructLinkBook
{
Bor*next;
charCNum[20];
intTotal;
}lend[LIST_INIT_SIZE];
typedefstructLNode
{
charCardNum[20];
structLNode*next;
}LinkList;
typedefstructbook
{
charnum[20];
charname[20];
charauth[20];
charpub[20];
intTotNum;
intNowNum;
LinkList*next;
}Book[MAXSIZE];
intRetotal;
inttotal;
voidInitBo(Book&boo)
{
for(inti=0;i{
boo[i].NowNum=0;
boo[i].TotNum=0;
boo[i].next=NULL;
}
}
voidInitRe(lend&Lin)
{
for(inti=0;iLin[i].next=NULL;
}
intmid=0;
boolBinarySearch(Bookboo,charSearchNum[])
{
intlow=0,high=total;
intfound=0;
while(low<=high)
{
mid=(low+high)/2;
if(strcmp(boo[mid].num,SearchNum)==0)
{
found=1;
returntrue;
}
if(strcmp(boo[mid].num,SearchNum)!
=0)
high=mid-1;
else
low=mid+1;
}
if(found==0)
returnfalse;
}
voidBuy(Book&boo,charBuyNum[])
{
inti;
if(BinarySearch(boo,BuyNum))
{
boo[mid].TotNum++;
boo[mid].NowNum++;
printf("入库成功.\n");
printf("已更改书库中该书的信息。
\n");
printf("编号:
%s书名:
%s",boo[mid].num,boo[mid].name);
printf("作者:
%s出版社:
%s",boo[mid].auth,boo[mid].pub);
printf("\n");
}
if(!
BinarySearch(boo,BuyNum))
{
for(i=total;i>mid&&total;i--)
boo[i]=boo[i-1];
printf("该书在书库中不存在,设立新书目!
\n");
strcpy(boo[i].num,BuyNum);
printf("该书购入的数量是:
");
scanf("%d",&boo[i].NowNum);
boo[i].TotNum=boo[i].NowNum;
printf("该书的名字是:
");
scanf("%s",&boo[i].name);
printf("该书的作者是:
");
scanf("%s",&boo[i].auth);
printf("该书的出版社是:
");
scanf("%s",&boo[i].pub);
boo[i].next=NULL;
total++;
printf("已增加该书的信息!
\n");
printf("编号:
%s书名:
%s",boo[i].num,boo[i].name);
printf("作者:
%s出版社:
%s",boo[i].auth,boo[i].pub);
printf("\n");
printf("入库成功.\n");
}
}
voidDelete(Book&boo,charDeleteNum[])
{
if(BinarySearch(boo,DeleteNum)==false||total==0)
printf("书库中没有该书.\n");
if(BinarySearch(boo,DeleteNum))
{
if(!
boo[mid].next)
{
intj;
for(j=mid;jboo[j]=boo[j+1];
strcpy(boo[j].num,boo[j+1].num);
strcpy(boo[j].name,boo[j+1].name);
strcpy(boo[j].auth,boo[j+1].auth);
strcpy(boo[j].pub,boo[j+1].pub);
boo[j].TotNum=boo[j+1].TotNum;
boo[j].NowNum=boo[j+1].NowNum;
printf("已成功删除该书.\n");
}
else
printf("该书有借阅者,无法删除。
\n");
}
}
voidBorrow(Book&boo,lend&Lin,charBorrowNum[],charCaNum[])
{
Bor*p,*q;
LinkList*m,*n;
if(!
BinarySearch(boo,BorrowNum)||total==0)
printf("书库里没这书。
\n");
if(BinarySearch(boo,BorrowNum))
{
if(boo[mid].NowNum>0)
{
boo[mid].NowNum--;
if(boo[mid].next==NULL)
{
m=(LinkList*)malloc(sizeof(LNode));
boo[mid].next=m;
strcpy(m->CardNum,CaNum);
m->next=NULL;
}
else
{
m=boo[mid].next;
while(m->next)
m=m->next;
n=(LinkList*)malloc(sizeof(LNode));
m->next=n;
strcpy(n->CardNum,CaNum);
n->next=NULL;
}
inti=0;
for(i=0;i{
if(!
strcmp(Lin[i].CNum,CaNum))
{
p=Lin[i].next;
while(p->next)p=p->next;
q=(Bor*)malloc(sizeof(Boro));
p->next=q;
strcpy(q->BNum,BorrowNum);
printf("输入归还日期:
");
scanf("%s",&q->RetDate);
q->next=NULL;
printf("借阅成功.\n");
break;
}
}
if(i==Retotal)
{
strcpy(Lin[i].CNum,CaNum);
p=(Bor*)malloc(sizeof(Boro));
Lin[i].next=p;
strcpy(p->BNum,BorrowNum);
printf("输入归还日期:
");
scanf("%s",&p->RetDate);
p->next=NULL;
Retotal++;
printf("借阅成功.\n");
}
}
else
printf("借阅失败.该书现在库存为0.\n");
}
}
voidReturn(Book&boo,lend&Lin,charReturnNum[],charBorrowerNum[])
{
Bor*p,*q;
LinkList*m,*n;
intflag=0;
if(!
BinarySearch(boo,ReturnNum)||!
total)
printf("书库中无此书.\n");
if(BinarySearch(boo,ReturnNum))
{
m=boo[mid].next;
if(!
strcmp(m->CardNum,BorrowerNum))
{
boo[mid].NowNum++;
boo[mid].next=m->next;
free(m);
}
else
{
while(m->next)
{
if(!
strcmp(m->next->CardNum,BorrowerNum))
{
n=m->next;
m->next=n->next;
free(n);
boo[mid].NowNum++;
break;
}
m=m->next;
}
}
}
for(inti=0;i{
if(!
strcmp(Lin[i].CNum,BorrowerNum))
{
p=Lin[i].next;
if(!
strcmp(p->BNum,ReturnNum))
{
Lin[i].next=p->next;
free(p);
printf("成功归还该书.\n");
flag=1;
break;
}
else
{
while(p->next)
{
if(!
strcmp(p->next->BNum,ReturnNum))
{
q=p->next;
p->next=q->next;
free(q);
printf("成功归还该书.\n");
flag=1;
break;
}
p=p->next;
}
}
}
}
for(intk=0;kif(!
Lin[k].next)
{
intj;
for(j=k;jLin[j]=Lin[j+1];
strcpy(Lin[j].CNum,"");
Retotal--;
}
if(flag==0)
printf("无该证信息.\n");
}
voidSearchByNum(Book&boo,charSeaNum[])
{
LinkList*p;
p=boo[mid].next;
if(BinarySearch(boo,SeaNum)==true)
{
printf("书号:
%s\n",boo[mid].num);
printf("书名:
%s\n",boo[mid].name);
printf("作者名:
%s\n",boo[mid].auth);
printf("出版社:
%s\n",boo[mid].pub);
printf("现存量:
%s\n",boo[mid].NowNum);
printf("库存量:
%s\n",boo[mid].TotNum);
printf("\n");
}
else
printf("对不起,未找到您想查找的书。
\n");
}
voidSearchByName(Book&boo)
{
charSeaName[20];
printf("输入想查找的书的书名:
\n");
scanf("%s",&SeaName);
printf("此书存在!
\n");
for(inti=0;i{
if(strcmp(SeaName,boo[i].name)==0)
{
printf("编号:
%s书名:
%s",boo[i].num,boo[i].name);
printf("作者:
%s出版社:
%s",boo[i].auth,boo[i].pub);
printf("总库存量:
%s",boo[i].TotNum);
printf("现库存量:
%s",boo[i].NowNum);
printf("\n");
}
}
}
voidSearchByAuth(Book&boo)
{
charSeaAuth[20];
printf("输入想查找的书的作者:
\n");
scanf("%s",&