数据结构课程设计--图书管理系统
2023-09-27 14:27:29 时间
//主函数模块
#include "library.h"
int main()
{
FILE *fp_book,*fp_reader; /*创建文件型指针*/
Denglu();
if((fp_book=fopen("Book","rb"))==NULL||(fp_reader=fopen("Reader.txt","rb"))==NULL)
{
Chushihua();//开始内容都没有进行初始化
}
else Load();//加载
Menu_select(); /*调用主菜单*/
return 0;
}
//开始模块
#include"library.h"
void Denglu() /*登录界面*/
{
system("cls");
printf("*****************************************************\n");
printf("** │ **\n");
printf("**│ -------------------- │ **\n");
printf("**│ │ **\n");
printf("**│ │ 欢迎使用 │ │ **\n");
printf("**│ │ **\n");
printf("**│ │ 学生图书管理系统 │ │ **\n");
printf("**│ -------------------- │ **\n");
printf("** │ **\n");
printf("*****************************************************\n");
printf("\n\n\n\t\t 按任意键进入系统...");
getch();
system("cls");
}
int Menu() /*主菜单*/
{
int dm;
printf("\n\t\t图书管理系统主菜单:\n");
printf("=================================================\n");
printf("*\t0----保存退出系统 \n");
printf("*\t1----添加图书 \n");
printf("*\t2----读者信息登记 \n");
printf("*\t3----借书登记 \n");
printf("*\t4----还书管理 \n");
printf("*\t5----查询图书信息 \n");
printf("*\t6----删除图书 \n");
printf("*\t7----图书排序 \n");
printf("*\t8----显示所有图书 \n");
printf("=================================================\n");
printf("请选择相应操作的代码:");
while(true)
{
scanf("%d",&dm); //dm输入的数字
if(dm<0||dm>8)
printf("\n错误!请重新输入:");
else break;
}
return dm;
}
void Menu_select()/*判断主菜单选择功能函数*/
{
for(;;)
{
switch(Menu()) /*功能选择*/
{
case 0:
system("cls");
Save();
printf("\n\n\t文件保存成功!\n");
printf("\n\n\t欢迎下次使用本系统!\n");
getch();
exit(0);
case 1:
Insert_New_Book();
break;
case 2:
add_reader();
break;
case 3:
Borrow_Book();
break;
case 4:
Return_Book();
break;
case 5:
Find_Book();
break;
case 6:
Delete_Book();
break;
case 7:
BubbleSort();
break;
case 8:
Print_allbook();
break;
default:
system("cls");
printf("\n错误!请重新输入:");
break;
}
}
}
/**************************************************************************************************************
* 功能描述: 图书初始化
* 输入参数: 图书信息
* 输出参数: 无
* 返回值 : 0
* 其它说明:图书信息包括图书编号、图书分类号、图书名称、图书出版社、图书出版时间、图书作者、图书价格、图书数量。
****************************************************************************************************************/
void Chushihua() /*初始化*/
{
BK *p0;
printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n");
p0=(BK*)malloc(sizeof(BK));
h_book = (BK*)malloc(sizeof(BK));
printf("\n请输入图书信息:\n");
printf("图书编号:"); /*输入图书编号(唯一)*/
scanf("%s",p0->book_num);
printf("图书名称:"); /*输入图书名称*/
scanf("%s",p0->book_name);
printf("图书作者:"); /*输入图书作者*/
scanf("%s",p0->book_writer);
printf("图书分类号:"); /*输入图书分类号*/
scanf("%s",p0->book_fl);
printf("图书出版单位:"); /*输入图书出版单位*/
scanf("%s",p0->book_publisher);
printf("图书出版时间:"); /*输入图书出版时间*/
scanf("%s",p0->book_time);
printf("图书价格:"); /*输入图书价格*/
scanf("%s",p0->book_price);
printf("图书数量:"); /*输入图书数量*/
scanf("%d",&p0->book_count);
p0->book_xiancun=p0->book_count; /*开始时图书现有量和库存量相等*/
p0->next=NULL;
h_book->next = p0;
printf("\n图书信息初始化完毕!按任意键继续下一步操作..\n");
getch();
system("cls");
}
//选择模块
/****** 功能描述: 进入主菜单
0保存退出系统、
1添加图书、
2读者信息登记、
3借书登记、
4还书管理、
5查询图书信息,
6删除图书、
7显示所有图书。
************/
#include "library.h"
BK *h_book;//指向图书信息的指针----定义的是一个书库
RD *h_reader;//指向读者信息的指针----定义的是一个读者库
/*************** 0保存退出*********************************/
void Save() /*保存信息*/
{
Save_Reader();
Save_Book();
}
void Save_Reader() /*保存读者信息*/
{
FILE *fp_reader;//定义指向读者的文件指针
RD *p;
p=h_reader;
if((fp_reader=fopen("Reader.txt","wb"))==NULL) //创建文件,进行保存
{
printf("\n文件保存失败!\n请重新启动本系统...\n");
exit(0);
}
while(p!=NULL)//将链表中的信息写入文件中
{
if(fwrite(p,sizeof(RD),1,fp_reader)!=1) //未写入成功
printf("\n写入文件失败!\n请重新启动本系统!\n");
p=p->next;
}
fclose(fp_reader);
}
void Save_Book() /*图书信息写入文件*/
{
FILE *fp = fopen("Book","wb");
BK *cur = h_book;
while(cur->next!= NULL)
{
fwrite(cur->next,sizeof(BK),1,fp);
cur=cur->next;
}
fclose(fp);
}
void Load() //加载信息(向外读)
{
Load_Reader();
Load_Book();
}
void Load_Reader() /*加载读者信息*/
{
RD *p1,*p2,*p3;//定义读者类型的指针
FILE *fp; //创建文件型指针
fp=fopen("Reader.txt","rb"); //打开文件
p1=(RD *)malloc(sizeof(RD));
fread(p1,sizeof(RD),1,fp); //把书库内容放入p1
h_reader=p3=p2=p1;
while(!feof(fp)) //读出信息,重新链入链表,判断指针是否到达文件尾部
{
p1=(RD *)malloc(sizeof(RD));
fread(p1,sizeof(RD),1,fp);//读出信息放入链表p1
p2->next=p1; //装入新读取的
p3=p2;//每次装入最新读取的
p2=p1;//记录本次这次读取的
}
p3->next=NULL;
fclose(fp); //关闭文件
}
void Load_Book() /*加载图书信息*/
{
if(h_book == NULL)//如果开始的头指针上没有放入信息,则开辟新空间
h_book = (BK*)malloc(sizeof(BK));
FILE *fp = fopen("Book","rb");
BK *cur = h_book;//定义book类型的指针并指向书库
BK *temp;
while(!feof(fp))
{
cur->next = (BK*)malloc(sizeof(BK));
temp = cur;
fread(cur->next,sizeof(BK),1,fp);//向文件里面写数据
cur = cur->next;
}
temp->next = NULL;
fclose(fp);
}
/*********** 1添加图书(图书编号、图书分类号、图书名称、图书出版社、图书出版时间、图书作者、图书价格、图书数量)************/
void Insert_New_Book()/*新书入库*/
{
if(h_book == NULL)
h_book = (BK*)malloc(sizeof(BK));
BK *p,*p0,*p1;
p=p1=h_book;
int n;
printf("\n新书入库模块...\n");
printf("\n请输入新书信息..\n包括书号.书名.数量..\n");
p0=(BK *)malloc(sizeof(BK));
printf("图书编号:");
scanf("%s",p0->book_num);
while(p1->next!=NULL && strcmp(p0->book_num,p1->book_num)!=0) //检查图书之前有没有,有的就把指针指向图书的位置,没有就在指针循环到指针尾跳出循环
p1=p1->next;
if(strcmp(p0->book_num,p1->book_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/
{
printf("\n此编号图书已存在!!可直接入库!\n");
printf("图书数量:");
scanf("%d",&n);
p1->book_count+=n;
p1->book_xiancun+=n;
}
else/*若不存在,则需要输入其他的信息,然后在尾部进行插入操作*/
{
printf("图书名称:");
scanf("%s",p0->book_name);
printf("图书作者:");
scanf("%s",p0->book_writer);
printf("图书分类号:");
scanf("%s",p0->book_fl);
printf("图书出版单位:");
scanf("%s",p0->book_publisher);
printf("图书出版时间:");
scanf("%s",p0->book_time);
printf("图书价格:");
scanf("%s",p0->book_price);
printf("图书数量:");
scanf("%d",&n);//库存数量
while(p->next)//指到指针尾好添加书
{
p=p->next;
}
if(h_book->next==NULL)
h_book->next=p0; /*此处分两种情况,链表中没有数据,head直接指向p0处*/
else
p->next=p0;/*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/
p0->next=NULL;
p0->book_xiancun=n;
p0->book_count=n;
}
printf("\n新书入库完毕!按任意键继续下一步操作..\n");
getch();
system("cls");
}
/***************2添加读者(借书证号、姓名)***********************/
void add_reader()//添加读者
{
if(h_reader == NULL)
{
h_reader = (RD*)malloc(sizeof(RD));
h_reader->next = NULL;
}
RD *p0,*p;
int i;
printf("\n读者初始化开始,请输入读者信息..\n包括书证号.姓名..\n");
p0=(RD*)malloc(sizeof(RD)); //申请新的读者类型的结点存储空间
printf("\n请输入读者的信息:\n");
printf("读者借书证号:");
scanf("%s",p0->reader_num);
p = h_reader;
while(p->next!=NULL && strcmp(p0->reader_num,p->reader_num)!=0) //检查图书之前有没有,有的就把指针指向图书的位置,没有就在指针循环到指针尾跳出循环
p=p->next;
if(strcmp(p0->reader_num,p->reader_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/
{
printf("\n此读者编号已存在!!\n");
goto end;
}
else
{
printf("读者姓名:");
scanf("%s",p0->reader_name);
p0->right=0;//添加新的数据开始时一本书也没借
for(i=0; i<Max; i++)
{
//将后面的复制到前面去
strcpy(p0->borrow[i].borrow_book_num,"0"); //所借图书数量直接置为0(即没有借书)
strcpy(p0->borrow[i].limit_date,"0");//借书日期设置为0
}
p0->next=NULL;
p->next = p0;
printf("\n读者信息初始化完毕!按任意键继续下一步操作..\n");
}
end:
getch();
system("cls");
}
/****************** 功能描述: 3借书模块(读者借书证号、借书编号)************************/
void Borrow_Book() /*借书模块*/
{
BK *p0;//定义图书类型的指针
RD *p1;//定义读者类型的指针
char bo_num[10],rea_num[10],lim_date[8];//图书编号,读者编号,还书日期
int i;
p0=h_book;
p1=h_reader;
printf("\n借书模块...\n");
printf("\n请输入借书的读者借书证号:");
scanf("%s",rea_num);
while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0)
p1=p1->next;//找到对应的读者信息
if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0)
{
printf("\n此读者编号不存在!按任意键返回..\n");
goto END;
}
printf("\n请输入你要借的书的编号:");//找到读者编号
scanf("%s",bo_num);
while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL)
p0=p0->next;
if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0)//没这本书
{
printf("\n此图书编号不存在!按任意键返回..\n");
goto END;
}
else if(p0->book_xiancun<=0)//被借光
{
printf("\n抱歉,此书已借完!请等待新书的到来!!\n按任意键返回....");
goto END;
}
else if(p1->right>Max||p1->right==Max)//借书权限已满
{
printf("\n抱歉,借书数目已满!不能借书!\n按任意键返回....");
goto END;
}
else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0)//之前借过书但是还没达到最大值
{
for(i=0; i<Max; i++)
{
if(strcmp(p1->borrow[i].borrow_book_num,bo_num)==0)//书与借的书号相同不能借
{
printf("\n抱歉!同一个读者不能同借两本相同的书!\n按任意键返回....");
goto END;
}
else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0)//和0相等返回0,代表之前没有借阅过图书
{
printf("\n请输入你要归还图书的日期:");
scanf("%s",lim_date);
strcpy(p1->borrow[p1->right].borrow_book_num,bo_num);//把刚到手书号复制到借的书的书号中
strcpy(p1->borrow[p1->right].limit_date,lim_date);//日期同上
p0->book_yes=0;
p1->right++;//读者下次借书为第几本书
p0->book_yes=0;
p0->book_xiancun--;//书库对应减去
printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);
goto END;
}
}
}
else//这种情况就是之前没有借过书
{
printf("\n请输入你要归还图书的日期:");
scanf("%s",lim_date);
strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num);
strcpy(p1->borrow[p1->right-1].limit_date ,lim_date );
//
p0->book_yes=0;
p0->book_xiancun--;
printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);
}
END:
getch();
system("cls");
}
/*********** 4还书模块(读者借书证号、还的书的编号)***********************************/
void Return_Book() /*还书模块*/
{
BK *p;//定义书籍类型的指针
RD *q;//定义读者类型的指针
int i,j,find=0;
char return_book_num[10],return_reader_num[10];//还书的书号和读者编号
p=h_book;
q=h_reader;
printf("\n还书模块...\n");
printf("\n请输入要还书的读者编号:");
scanf("%s",return_reader_num);
while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num)!=0)//找读者的编号
q=q->next;
if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0)
{
printf("\n此读者编号不存在!按任意键返回..\n");
goto end;
}
printf("\n请输入读者还书的编号:");
scanf("%s",return_book_num);
while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0)//找图书的编号
p=p->next;
if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0)
{
printf("\n错误!此图书编号不存在!按任意键返回..\n");
goto end;
}
for(i=0; i<Max; i++)
{
if(strcmp(return_book_num,q->borrow[i].borrow_book_num)==0) //如果此读者借了此书
{
find=1;
for(j=i; j<Max-1; j++)
{
strcpy(q->borrow[j].borrow_book_num,q->borrow[j+1].borrow_book_num);//数组中把这本书后面的数据向前移动数据
strcpy(q->borrow[j].limit_date,q->borrow[j+1].limit_date);
}
p->book_xiancun++;
q->right--;
printf("\n编号%s的读者还书完毕!按任意键继续下步操作..",return_reader_num);
//
if(p->book_xiancun==p->book_count)
p->book_yes=1;
}
}
if(find==0)
printf("\n错误!此读者未借此书!按任意键返回..\n");
end:
getch();
system("cls");
}
/****************5查找图书并打印信息(1-作者名 2-书名)****************/
void Print_book(BK *p)//打印图书信息
{
printf("\n图书信息如下:\n\n");
printf("图书编号\t图书名称\t图书作者\t现有量\t\t库存量\n");
printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xiancun,p->book_count);
}
void Find_Book()//查找图书的方式的函数
{
int a;
printf("请选择查找方式:\n\n");
printf("1 按图书名查找图书\n2 按作者名查找图书 \n");
scanf("%d",&a);
if(a==1)
{
Find_Bookname();
}
else if(a==2)
{
Find_Bookwriter();
}
else
{
printf("您输入的操作不正确!\n");
}
}
void Find_Bookname() //按书名查询
{
BK *p;//定义图书类型的指针
p=h_book;
char n[80];//定义这个字符串存放书名
int flag=0;
printf("请输入要查询的书名:");
scanf("%s",n);
for(; p!=NULL; p=p->next)
{
if(strcmp(p->book_name,n)==0)//找到了对应的书名
{
Print_book(p);//打印出图书的信息
flag = 1;
}
}
if(p==NULL&&flag==0)
printf("没有相关信息!");
}
void Find_Bookwriter() //按作者名查询(与上面的按书名查找是一样的)
{
BK *p;
p = h_book;
char n[80];
int flag=0;
printf("请输入要查询的作者名:");
scanf("%s",n);
for(; p!=NULL; p=p->next)
{
if(strcmp(p->book_writer,n)==0)
{
Print_book(p);
flag=1;
}
}
if(p==NULL&&flag==0)
{
printf("没有相关信息!");
}
}
/********************6删除图书( 借出的图书不能删除)**************************/
void Delete_Book() //以图书编号作为主键进行删除
{
BK *p;
char n[10];
int flag=0;
p=h_book;
printf("输入要删除的书的编号:");
scanf("%s",n);
for(; p!=NULL; p=p->next)
{
if(p->next != NULL && !strcmp(p->next->book_num,n))
{ //在这里的条件是找到了要删除的书
if(p->next->book_yes==0)
{
printf("当前图书被借出,不能删除!");
return;
}
p->next=p->next->next; //删除语句,链表后指
printf("成功删除!");
flag=1; //成功删除标记
break;
}
}
if(p==NULL&&flag==0)
{
printf("书库中没有此书!");; //已经被删除或没有这本书
}
}
/************ 功能描述:7图书编号排序(冒泡排序算法)******************/
void BubbleSort()
{
BK *p,*t,*r,*a;
bool flag;
p = h_book->next;
a = p;
r = h_book;
while(a!=NULL)
{
a = a->next;
flag = false;
p = h_book->next;
r = h_book;
while(p->next!=NULL)
{
if(strcmp(p->book_num,p->next->book_num) > 0)
{
t = p->next;
p->next = t->next;
t->next = p;
r->next = t;
r = r->next;
flag = true;
}
else
{
p = p->next;
r = r->next;
}
}
if(!flag) break;
}
}
/*******************8显示所有图书***************************/
void Print_allbook()//显示所有的图书
{
BK *p;
p = h_book->next;//
if(p!=NULL)
{
printf("\n图书信息如下:\n\n");
printf("图书编号\t图书名称\t图书作者\t现有量\t\t库存量\n");
while(p!=NULL)
{
printf("%s\t\t%s\t\t%s\t\t%d\t\t%d\n",p->book_num,p->book_name,p->book_writer,p->book_xiancun,p->book_count);
p = p->next;
}
}
else
{
printf("※库中没有图书!※\n");
}
}
运行结果:
五.程序测试结果及正确性验证
5.1图书关系系统菜单显示:
5.2图书入库界面显示:
界面1:输入库中没有的书时需要编辑信息
相关文章
- 高校学生公寓故障报修管理系统的设计与实现(论文+源码)_kaic
- 基于vue-node的共享车位管理系统的设计与实现_kaic
- 微信小程序旅游服务平台+后台管理系统|前后分离VUE
- 微信小程序英语学习平台+后台管理系统
- 微信小程序电影购票+后台管理系统
- 精品微信小程序spring boot批发零售业商品管理系统购物商城
- [含论文+源码等]javaweb基于java新闻发布及管理系统
- 如何使用Systemctl管理系统服务和单元?
- 软件系统建模之构建用例模型(以图书管理系统为例)
- 纸业数智化供应链协同管理系统
- 环保行业B2B撮合管理系统实现产业优化升级,提升企业业务能力
- 贯穿化学制品制造业采购全过程,供应商协同管理系统实现企业订单管理全链协同
- 数商云采购管理系统解决方案丨让企业与供应商高效协同
- 纸业供应链智能管理系统优化企业供应商结构,实现供应链平台体系智慧管控
- 工业供应链管理系统推动企业数字化,便捷协同管理
- 大数据管理系统:NoSQL数据库前世今生