//主函数模块#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);        //把书库内容放入p1h_reader=p3=p2=p1;while(!feof(fp))   //读出信息,重新链入链表,判断指针是否到达文件尾部{p1=(RD *)malloc(sizeof(RD));fread(p1,sizeof(RD),1,fp);//读出信息放入链表p1p2->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处*/elsep->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:输入库中没有的书时需要编辑信息



数据结构课程设计--图书管理系统相关推荐

  1. 数据结构课程设计图书管理系统,C语言版。

    目录 一.功能描述 二.设计要求 三.实现的功能 四.代码 一.功能描述 设计一个图书管理程序满足图书馆基本业务需求. 二.设计要求 每种书的登记内容包括书号.书名.著作者.现存量和库存量等: 对书号 ...

  2. c语言课程设计图书管理系统

    数据结构c语言课程设计 图书管理系统 我做的是百度文库的第28题,目前没有报错,正常运行,但是还有一点小bug.代码很多地方写的不是很好,请多多包涵. 账号1,密码1,为管理员账号:其他账号2,3,4 ...

  3. RFID课程设计-图书管理系统用户端设计

    RFID课程设计-图书管理系统用户端设计课程设计题目课程设计任务内容题目设计基本原理NFC开发概述标签调度系统如何将 NFC 标签映射到 MIME 类型和 URI如何将 NFC 标签分发到应用在 An ...

  4. oracle课程设计图书销售系统,oracle课程设计图书管理系统

    oracle课程设计图书管理系统 数据库课程设计 设计名称:图书管理系统 组员:尚靖伟(122068) 张红凯(122072) 班级:计 G121 班信息工程学院计算机系 2013 年 6 月 27 ...

  5. java数据结构通讯录管理系统_数据结构课程设计—通讯录管理系统

    浊贤平鲁冠城美华道钉.内急顺美兴华品红缺点清屏!车组悬吊嗉囊沥胆情愿,城东兴荣规划管涌铺板?轻奏便装壳菜蓝坛卵石数据结构课程设计-通讯录管理系统.缪斯朝圣美金放下隆暑路权. 当年绸巾登封轮滑殴伤调理电 ...

  6. python通讯录管理系统设计_数据结构课程设计-通讯录管理系统(C语言版)

    ##数据结构课程设计-通讯录管理系统 一,前言 自从上次C语言课设写完后,这次数据结构课设就写的游刃有余了,很快啊,不足三天就写完了它(年轻人不讲武德),如果你认真看过我之前写的C语言课程设计-球队管 ...

  7. 数据结构课程设计—同学录管理系统(c语言)

    数据结构课程设计-同学录管理系统(c语言) 文章目录 前言 一.需求分析 二.总体设计 三.代码实现 四.代码说明 前言 计算机相关专业在学习数据结构这门课程时会有课程设计,我被分配到的是同学录管理系 ...

  8. C#课程设计-图书管理系统

    C#课程设计-图书管理系统 前言 一.课设任务是什么? 二.使用工具及软件环境 三.系统功能介绍及部分代码展示 3.1 登陆界面及主要代码 3.2 图书管理 3.3 修改书籍页面视图及主要代码 四.使 ...

  9. Python课程设计-图书管理系统

    Python课程设计-图书管理系统 摘要 第一章 绪论 1.1 开发环境及技术 1.2 系统实现功能描述 第二章 功能详细设计与实现 2.1 系统框架各层次实现 2.1.1 可视页面设计 2 数据库设 ...

最新文章

  1. Google 发布 Cloud AutoML 降低机器学习门槛,调参民工前景堪忧
  2. Windows系统安全管理
  3. postgreSQL的应用
  4. [编程入门]宏定义之闰年判断:给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计
  5. 向周鸿祎的360安全浏览器学互联网产品运营和推广
  6. 前端学习(1153):常量const01
  7. 计算机网络(八)-数据链路层-帧封装
  8. signature=f0dd2033ed5bb3cdb94f9136381f7750,Lesson 8: Signature Assignment
  9. 为什么多个线程不可能同时抢到一把锁_HFL Redis_12_redis分布式锁的3种实现方式...
  10. java默认权限什么时候使用_Java 应用程序默认权限(简例)
  11. svn 配置详解,以及各种可能遇到的问题
  12. vue递归组件eventBus策略解决父子组件通讯问题
  13. 关于MacBook电池的正确使用方法,和保养技巧
  14. zepto.js学习笔记01
  15. 记苹果企业开发者账号申请踩过的坑
  16. Signature on Pocket PC
  17. 大数据营销咨询公司AIO获数百万美元天使轮融资
  18. wps怎么减少行间距,WPS的word怎么不能缩小行间距
  19. 力扣启蒙 - 开启算法的世界
  20. 【异常记录】C# 连接数据库错误异常解决 err:40

热门文章

  1. 城乡规划资质怎么办?
  2. 泊松图像编辑(Poisson image editing)
  3. Notion,这应该是程序员最后一款笔记软件
  4. 石墨笔记,幕布和 Effie 哪个更适合公众号主?
  5. 互联网舆情监测公司监测哪些内容,TOOM北京舆情监测公司
  6. U盘杀毒后文件不见/找回
  7. 服务器:php-fpm线程卡死导致网站无响应
  8. H 小P的数学问题(分块)
  9. 基于python的在线音乐系统设计与实现
  10. 如何打开CMD以及简单Dos命令