C语言课程设计 图书管理系统源程序.docx
- 文档编号:5608720
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:23
- 大小:21.51KB
C语言课程设计 图书管理系统源程序.docx
《C语言课程设计 图书管理系统源程序.docx》由会员分享,可在线阅读,更多相关《C语言课程设计 图书管理系统源程序.docx(23页珍藏版)》请在冰豆网上搜索。
C语言课程设计图书管理系统源程序
源代码
//功能:
图书管理系统
//作者:
黄成勇
//时间:
2012.12.04
#include
#include
#include
#include"math.h"
#include"memory.h"
#include"string.h"
#definebook_data"e:
\\book.txt"
#definereader_data"e:
\\reader.txt"
structDate/*日期结构*/
{
intm_nYear;/*年*/
intm_nMonth;/*月*/
intm_nDay;/*日*/
};
typedefstructDatedate;
structReader/*读者结构*/
{
charrname[10];/*读者姓名*/
charnum[20];/*借书证号*/
structDatebro;/*借出时间*/
structDateback;/*归还时间*/
};
typedefstructReaderreader;
structBook/*书本结构*/
{
intm_iBook_Number;/*对应书本号*/
charm_strTitle[15];/*书名*/
charm_strWroter[15];/*作者*/
intm_nMoreNum;/*当前在架册数*/
intm_nTotalHoldNum;/*馆藏册数*/
charm_strComment[30];/*图书简介*/
structReaderreader[5];
};
typedefstructBookbook;
structInfo/*借书信息结构*/
{
structInfo*m_pParentPoint;/*前驱结点*/
structBook*m_pBookInfo;/*对应书本的信息*/
structInfo*m_pSun;/*后继结点*/
};
typedefstructInfoinfo;
structBook*InputNode(structInfo*bth);/*添加书本信息*/
voidcheck(info*bth);/*测试链表长度*/
structInfo*Search(structInfo*bth,intx,int*k,int*flag);/*查找图书*/
structInfo*Insert_BookInfo(structInfo*bth);/*图书上架*/
structInfo*Delete_BookInfo(structInfo*bth);/*图书下架*/
voidOutput_BookInfo(structInfo*bth);/*打印输出书本信息*/
voidBorrow_TheBook(structInfo*bth);/*图书出借*/
voidTurnBack_TheBook(structInfo*bth);/*图书归还*/
voidAll_TheBook(structInfo*bth);/*全部图书*/
voidAll_TheReader(structInfo*bth);/*全部读者*/
voidSave_Data(structInfo*bth);/*保存信息*/
structInfo*Load_Data(void);/*加载信息*/
charSelect_Menu();/*图书馆管理系统主菜单*/
intsums=0;
/**********************图书查找***********************/
structInfo*Search(structInfo*bth,intx,int*k,int*flag)
{
structInfo*p=NULL;
/*当前工作指针*/
p=bth;/*每次查询前,将工作指针指向双向链表头部结点*/
*flag=0;/*是否查找到指定书本号的标志,初始化置为0*/
while(p)
{
if(p->m_pBookInfo->m_iBook_Number==x)
{
/*找到相同的书号,置找到的标志*/
*flag=1;
returnp;
}
else
{
/*未找到相同的书号,置未找到标志*/
*flag=0;
}
if(p->m_pSun!
=NULL)
{
p=p->m_pSun;
/*没到双向链表的尾部时,向后移动当前指针*/
}
else
{
break;/*到达链表尾部,跳出循环*/
}
}
returnbth;
}
/*************输入图书信息*************/
structBook*InputNode(structInfo*bth)
{
structBook*p=NULL;
inti;
p=(structBook*)malloc(sizeof(structBook));/*分配内存*/
system("cls");/*清屏*/
fflush(stdin);/*清除以前的输入*/
printf("\n\t请输入书名:
");
gets(p->m_strTitle);/*从键盘取得书名*/
printf("\n\t请输入作者:
");
gets(p->m_strWroter);/*从键盘取得作者名*/
printf("\n\t请输入当前在架册数:
");
scanf("%d",&p->m_nMoreNum);/*从键盘取得当前在架册数*/
printf("\n\t请输入馆藏册数:
");
scanf("%d",&p->m_nTotalHoldNum);/*从键盘取得当前馆藏册数*/
fflush(stdin);
printf("\n\t请输入本书简介:
");/*从键盘取得本书内容简要介绍*/
gets(p->m_strComment);
/*以上从输入输出设备取得要求的信息*/
for(i=0;i<20;i++)
(p->reader[i]).num[0]='\0';/*初始化书本结构成员的相关读者指针内容为空*/
return(p);/*返回成功插入的一本书信息*/
}
/******************图书上架*****************/
structInfo*Insert_BookInfo(structInfo*bth)
{
intflag,j,k,t;
inty,x,z;
structInfo*p=NULL,*q=NULL,*u=NULL,*s=NULL;
structBook*r=NULL,*l=NULL;
system("cls");/*清屏*/
printf("\n\t请输入你想上架的书本号:
");
scanf("%d",&x);/*取书号*/
q=Search(bth,x,&k,&flag);/*查找上架的书是否已经上架,返回已经找到的书的信息*/
if(flag==1)
{/*查找成功,存在此书*/
printf("\n\t当前存在这本书%d本,您想再增加一本<<%s>>书?
(y/n)\n",q->m_pBookInfo->m_nTotalHoldNum,q->m_pBookInfo->m_strTitle);
z=getch();
if(z=='y'||z=='Y')
{/*确认上架另一本书*/
printf("\n\t本馆此书一共有:
%d本",q->m_pBookInfo->m_nTotalHoldNum);
printf("\n\t并且有:
%d本在图书馆中内未借出.",q->m_pBookInfo->m_nMoreNum);
q->m_pBookInfo->m_nTotalHoldNum++;
q->m_pBookInfo->m_nMoreNum++;
printf("\n\t上架后一共有:
%d本",q->m_pBookInfo->m_nTotalHoldNum);
printf("\n\t上架后当前有:
%d本在图书馆中.",q->m_pBookInfo->m_nMoreNum);
memset(p->m_pBookInfo->reader->num,'\0',sizeof(p->m_pBookInfo->reader->num));//使nun为空,用于借书读者判断
}
Save_Data(bth);
return(bth);
}
r=InputNode(bth);/*成功插入书本信息,指针r存放刚刚插入的书本*/
if(bth==NULL)
{
/*指针bth为空时,表示当前链表为空,此时需要单独处理,即链表头内存分配*/
bth=p=(structInfo*)malloc(sizeof(structInfo));/*申请内存*/
r->m_iBook_Number=x;/*将书号存入书本信息结构体*/
p->m_pParentPoint=NULL;/*前驱结点置空*/
p->m_pSun=NULL;/*后继结点置空*/
p->m_pBookInfo=r;
memset(p->m_pBookInfo->reader->num,'\0',sizeof(p->m_pBookInfo->reader->num));
Save_Data(bth);
return(p);/*返回新成功插入的书本结点*/
}
else
{
/*说明已经有头指针,则在此开始处理新插入的结构体指针*/
p=NULL;
p=bth;
while(p->m_pSun!
=NULL)
{
p=p->m_pSun;/*当后继结点不为空时,表示还未到链表尾部*/
}
/*当循环结束后,p指向的就是最后一个结点*/
q=(structInfo*)malloc(sizeof(structInfo));/*申请内存*/
r->m_iBook_Number=x;/*将书号存入书本信息结构体*/
p->m_pSun=q;/*双向链表的前驱与后继结点链接*/
q->m_pParentPoint=p;
q->m_pSun=NULL;
q->m_pBookInfo=r;/*指向新插入的书本信息结构体*/
//q->m_pBookInfo->reader->bro.m_nYear=0;
memset(q->m_pBookInfo->reader->num,'\0',sizeof(q->m_pBookInfo->reader->num));
}
Save_Data(bth);
return(bth);
}
/******************图书下架*****************/
structInfo*Delete_BookInfo(structInfo*bth)
{
intflag,j,k,t;
intx,y;
structInfo*u=NULL,*s=NULL,*p=NULL,*q=NULL;
structBook*bookinfo=NULL;
structInfo*BookLeftPoint=NULL;/*前驱结点*/
structInfo*BookRightPoint=NULL;/*后继结点*/
system("cls");/*清屏*/
printf("\n\t请输入你想下架的书本号:
");
scanf("%d",&x);/*接受输入*/
q=Search(bth,x,&k,&flag);/*查找指定的书是否存在*/
if(flag==0)
{/*书本不存在是,直接输出消息并返回*/
printf("\n\t这本书不存在!
\n");
return(bth);
}
else
{
if(q==NULL)
{
printf("未知错误");
returnbth;/*确保当前工作指针是有效的,防止出现非法操作*/
}
else
{
bookinfo=q->m_pBookInfo;
printf("\n\t想下架的书本信息:
");
printf("\n\t书名:
%s",bookinfo->m_strTitle);
printf("\n\t作者:
%s",bookinfo->m_strWroter);
printf("\n\t当前在架册数:
%d",bookinfo->m_nMoreNum);
printf("\n\t馆藏册数:
%d",bookinfo->m_nTotalHoldNum);
printf("\n\t本书简介:
%s\n",bookinfo->m_strComment);
printf("\n\t你想退出系统?
(y/n)");
t=getch();
if(t=='y'||t=='Y')
{
system("cls");/*清屏*/
printf("\n\t图书下架成功!
\n");
if(q->m_pParentPoint!
=NULL&&q->m_pSun!
=NULL)
{
/*夹在链表中间的结点*/
BookLeftPoint=q->m_pParentPoint;
BookRightPoint=q->m_pSun;/*要删除的结点的后继指向赋给后继结点的指针变量*/
BookLeftPoint->m_pSun=BookRightPoint;
BookRightPoint->m_pParentPoint=BookLeftPoint;
q->m_pParentPoint=NULL;
q->m_pSun=NULL;
free(q->m_pBookInfo);/*先将书本信息结构体的内存释放*/
q->m_pBookInfo=NULL;/*使指针指向安全地址*/
free(q);
q=NULL;
Save_Data(bth);
returnbth;/*返回首结点*/
}
elseif(q->m_pParentPoint==NULL)
{
/*首结点的前驱为空,这里处理首结点删除操作*/
if(q->m_pSun==NULL)
{/*前后指针域均为空时,说明只有一个结点,此时只需要将此结点删除*/
free(q->m_pBookInfo);
q->m_pBookInfo=NULL;
free(q);
q=NULL;
returnq;
}
bth=q->m_pSun;
bth->m_pParentPoint=NULL;
BookRightPoint=q;
BookRightPoint->m_pParentPoint=NULL;/*将链表中指向首结点的后继指针的前驱指针域置为空,表明是新的首结点*/
BookRightPoint->m_pSun=NULL;
free(BookRightPoint->m_pBookInfo);
BookRightPoint->m_pBookInfo=NULL;/*使指针指向安全地址*/
free(BookRightPoint);
BookRightPoint=NULL;
Save_Data(bth);
returnbth;/*返回首结点*/
}
elseif(q->m_pSun==NULL)
{
BookLeftPoint=q->m_pParentPoint;/*将要删除的结点即尾结点的前驱域保存到前驱指针变量中*/
BookLeftPoint->m_pSun=NULL;
q->m_pParentPoint=NULL;
free(q->m_pBookInfo);/*先将书本信息结构体的内存释放*/
q->m_pBookInfo=NULL;
free(q);/*将要删除的借还书信息结构体指针使用的内存空间释放*/
q=NULL;
Save_Data(bth);
returnbth;/*返回首结点*/
}
}
}
}
}
/****************查找输出书本信息***************/
voidOutput_BookInfo(structInfo*bth)
{
structInfo*q=NULL;
structBook*p=NULL;
intk=0;
intx=0;
intflag=0;
system("cls");
printf("\n\t请输入你想查找的书本号:
");
scanf("%d",&x);
q=Search(bth,x,&k,&flag);
if(flag==1)
{
p=q->m_pBookInfo;
printf("\n\t书名:
%s",p->m_strTitle);
printf("\n\t作者:
%s",p->m_strWroter);
printf("\n\t当前在架册数:
%d",p->m_nMoreNum);
printf("\n\t馆藏册数:
%d",p->m_nTotalHoldNum);
printf("\n\t本书简介:
%s\n",p->m_strComment);
}
elseprintf("\n\t这本书不存在!
");
}
/**************图书借出****************/
voidBorrow_TheBook(structInfo*bth)
{
structInfo*q=NULL;
structBook*p=NULL;
inti,k,x,flag,t;
system("cls");/*清屏*/
printf("\n\t请输入你想借的书本号:
");/*打印消息*/
scanf("%d",&x);/*接受输入*/
q=Search(bth,x,&k,&flag);/*查找书本*/
if(flag==1)
{
p=q->m_pBookInfo;
printf("\n\t借出这本书?
(y/n)");
printf("\n\t书名:
%s",p->m_strTitle);
printf("\n\t作者:
%s",p->m_strWroter);
printf("\n\t当前在架册数:
%d",p->m_nMoreNum);
printf("\n\t馆藏册数:
%d",p->m_nTotalHoldNum);
printf("\n\t本书简介:
%s\n",p->m_strComment);
t=getch();
if(t=='y'||t=='Y')
{/*确认借这本书*/
if((p->m_nMoreNum)==0)printf("\n\t对不起,本书已经全部借出...");
else
{
//system("cls");
for(i=0;i<20;i++)if((p->reader[i]).num[0]=='\0')break;
printf("\n\t请输入姓名:
");
scanf("%s",(p->reader[i]).rname);
printf("\n\t请输入借书证号:
");
scanf("%s",(p->reader[i]).num);
printf("\n\t请输入借出的日期:
");
printf("\n\t年:
");
scanf("%d",&((p->reader[i]).bro.m_nYear));
printf("\t月:
");
scanf("%d",&((p->reader[i]).bro.m_nMonth));
printf("\t日:
");
scanf("%d",&((p->reader[i]).bro.m_nDay));
printf("\n\t请输入归还日期:
");
printf("\n\t年:
");
scanf("%d",&((p->reader[i]).back.m_nYear));
printf("\t月:
");
scanf("%d",&((p->reader[i]).back.m_nMonth));
printf("\t日:
");
scanf("%d",&((p->reader[i]).back.m_nDay));
p->m_nMoreNum--;
getchar();
printf("\n\t成功借到本书.");
Save_Data(bth);
}
}
}
elseprintf("\n\t这本书不存在!
");
}
/**************图书归还******************/
voidTurnBack_TheBook(structInfo*bth)
{
structInfo*q=NULL;
structBook*p=NULL;
inti,k,x,flag,t,j;
intyear,month,day,d;
floatpay;
chartemp[20];
system("cls");/*清屏*/
printf("\n\t请输入归还的书本号:
");
scanf("%d",&x);
q=Search(b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言课程设计 图书管理系统源程序 语言 课程设计 图书 管理 系统 源程序
![提示](https://static.bdocx.com/images/bang_tan.gif)