/*********************************************************** * 版权所有 (C)2015, 毕梦楠 * * 文件名称:zz.cbp * 文件标识:无 * 内容摘要:图书信息管理系统设计 * 其它说明:本项目模拟图书馆的信息管理业务,设计一个可以存书、借书、还书、浏览图书信息、浏览读者信息的图书信息管理软件系统。 * 当前版本: V2.0 * 作 者:毕梦楠 * 完成日期: 20151225 * * 修改记录1: * 修改日期: 20151222 * 版本号: V1.0 * 修改人: 毕梦楠 * 修改内容:创建 * * 修改记录2: * 修改日期: 20151223 * 版本号: V1.1 * 修改人: 毕梦楠 * 修改内容:各模块建立1 * * 修改记录3: * 修改日期: 20151224 * 版本号: V1.2 * 修改人:毕梦楠 * 修改内容:完善 * **********************************************************/</span>
架构如下:
#include"list.h" int main() { FILE *fp_book,*fp_reader; /*创建文件型指针*/ if((fp_book=fopen("Book.txt","rb"))==NULL||(fp_reader=fopen("Reader.txt","rb"))==NULL) { chushihua(); } else load(); menu_select(); //调用主菜单x选择函数 }
#include <stdio.h> #include <string.h> #include <iostream> #include <stdlib.h> #include <conio.h> using namespace std; #define Max 4 //定义最大借书量为3本/人 typedef struct book { char book_num[10]; char book_name[20]; char book_writer[10]; char book_fl[10]; char book_publisher[20]; char book_time[20]; char book_price[20]; int book_xy; //现存量 int book_kc; //库存量 struct book *next; } BK; typedef struct borrow //借书信息 { char borrow_book_num[20]; char limit_date[10]; } BO; typedef struct reader //读者信息 { char reader_num[20]; char reader_name[20]; int right; BO borrow[Max]; struct reader *next; } RD; extern BK *h_book; extern RD *h_reader; int menu(); //主菜单 void chushihua(); //初始化 void menu_select(); //主菜单选择函数 void add_book(); //新书入库 void add_reader(); //读者登记 void print_reader(); //显示读者信息 void print_book(); //显示图书信息 void borrow_book(); //借书 void return_book(); //还书 void save(); //保存 void save_book(); //保存图书信息 void save_reader(); //保存读者信息 void load(); //加载 void load_reader(); //加载读者信息 void load_book(); //加载图书信息
#include"list.h" BK *h_book; RD *h_reader; /**************************************************************************************************** * 功能描述: 主菜单 * 输入参数: 选择的数字 * 输出参数: 相应的函数实现 * 返回值 : 选择的数字 * 其它说明: 共添加新书、读者登记、借阅图书、归还图书、浏览图书信息、浏览读者信息、退出系统七个功能 ****************************************************************************************************/ int Menu() /*主菜单*/ { int n; system("color 1F"); cout<<" ===============================================\n"; cout<<" 烟台大学图书管理系统\n"; cout<<" ===============================================\n"; cout<<" -------------------- 1添加新书 ----------------\n"; cout<<" -------------------- 2读者登记 ----------------\n"; cout<<" -------------------- 3借阅图书 ----------------\n"; cout<<" -------------------- 4归还图书 ----------------\n"; cout<<" -------------------- 5浏览图书信息 ------------\n"; cout<<" -------------------- 6浏览读者信息 ------------\n"; cout<<" -------------------- 7退出图书管理系统 --------\n"; cout<<" ===============================================\n"; cout<<"请选择菜单的数字:"; for(;;) { cin>>n; //输入数字 if(n<1||n>7) cout<<"输入错误!请重新输入:"; else break; } return n; } /************************************************************ * 功能描述: 主菜单选择函数 * 输入参数: 选择的数字 * 输出参数: 相应的函数 实现 * 其它说明: 循环调用这些函数 ************************************************************/ 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: add_book(); //新书入库 break; case 2: add_reader(); //读者登记 break; case 3: borrow_book(); //借书 break; case 4: return_book(); //还书 break; case 5: print_book(); //显示图书信息 break; case 6: print_reader(); //显示读者信息 break; case 7: system("cls"); //清屏 cout<<endl; cout<<"欢迎使用本系统!再见!"<<endl; getch(); exit(0); default: cout<<"错误!"<<endl; exit(0); } } } /************************************************************************************** * 功能描述: 初始化函数 * 输入参数: 输入图书的编号、名称、作者、分类号、出版单位、出版时间、价格、数量 这些信息 * 输出参数: 图书信息初始化完毕 * 其它说明: 申请新空间保存信息 **************************************************************************************/ void chushihua() //初始化 { BK *p0; p0=new book; //申请新空间 p0=(BK*)malloc(sizeof(BK)); h_book=p0; system("color 6"); cout<<"--------------------------------------------------------------------------------"<<endl; cout<<" "; cout<<"---------------------------欢迎使用烟台大学图书管理系统!!!----------------------"<<endl; cout<<" "; cout<<"--------------------------------------------------------------------------------"<<endl; cout<<endl; cout<<"请初始化图书信息"<<endl; cout<<endl; cout<<"图书编号:"; //输入图书信息 cin>>p0->book_num; cout<<"图书名称:"; cin>>p0->book_name; cout<<"图书作者:"; cin>>p0->book_writer; cout<<"图书分类号:"; cin>>p0->book_fl; cout<<"图书出版单位:"; cin>>p0->book_publisher; cout<<"图书出版时间:"; cin>>p0->book_time; cout<<"图书价格:"; cin>>p0->book_price; cout<<"图书数量:"; cin>>p0->book_kc; p0->book_xy=p0->book_kc; //图书现有量=库存量 p0->next=NULL; cout<<"图书信息初始化完毕!按任意键继续下一步操作!"; getch(); system("cls"); } /*************************************************************************************** * 功能描述: 新书入库 * 输入参数: 输入图书的编号、名称、作者、分类号、出版单位、出版时间、价格、数量 这些信息 * 输出参数: 添加完毕 * 其它说明: 若图书编号存在则添加图书数量直接入库。若图书的编号不存在,则输入名称、作者、 分类号、出版单位、出版时间、价格、数量 这些信息 ***************************************************************************************/ void add_book() //新书入库 { BK *p,*p0,*p1; p=p1=h_book; cout<<"\n添加图书模块...\n"; cout<<"\n请输入添加的新书信息......\n"; p0=new book; cout<<"图书编号:"; cin>>p0->book_num; while(strcmp(p0->book_num,p1->book_num)!=0&&p1->next!=NULL) p1=p1->next; if(strcmp(p0->book_num,p1->book_num)==0) //此处分两种情况,若图书编号存在,则直接入库,只须输入书的数量 { cout<<"\n此种图书已存在!!!"<<endl; cout<<"直接添加图书数量:"; cin>>p0->book_kc; p1->book_kc+=p0->book_kc; p1->book_xy+=p0->book_kc; } else //若不存在,则需要输入其他的信息,然后在进行插入操作 { cout<<"图书名称:"; cin>>p0->book_name; cout<<"图书作者:"; cin>>p0->book_writer; cout<<"图书分类号:"; cin>>p0->book_fl; cout<<"图书出版单位:"; cin>>p0->book_publisher; cout<<"图书出版时间:"; cin>>p0->book_time; cout<<"图书价格:"; cin>>p0->book_price; cout<<"图书数量:"; cin>>p0->book_kc;//库存数量 while(p->next) { p=p->next; } if(h_book==NULL) h_book=p0; //此处分两种情况,链表中没有数据,head直接指向p0处 else p->next=p0; //链表中有数据,链表中最后元素的next指向p0处 p0->next=NULL; p0->book_xy=p0->book_kc; } cout<<"\n添加完毕!!!\n"; getch(); system("cls"); } /************************************************************ * 功能描述: 读者登记 * 输入参数: 输入读者的学号、姓名这些信息 * 输出参数: 读者信息初始化完毕 * 其它说明: 无 ************************************************************/ void add_reader() //添加读者 { RD *p0; int i; cout<<"\n读者初始化,请输入读者信息!\n"; p0=new reader; //申请新结点存储空间 h_reader=p0; cout<<"请输入读者学号:"; cin>>p0->reader_num; cout<<"请输入读者姓名:"; cin>>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"); } p0->next=NULL; cout<<"\n读者信息初始化完毕!!!\n"; getch(); system("cls"); } /****************************************************************************** * 功能描述: 借阅图书 * 输入参数: 输入借书读者的学号、所借书的编号、归还日期等这些信息 * 输出参数: * 其它说明: 判断读者学号、所借书以及所借书的库存是否存在,读者是否存在结束资格 ******************************************************************************/ void borrow_book() //借书模块 { BK *p0; RD *p1; char bo_num[20],rea_num[20],lim_date[10]; int i; p0=h_book; p1=h_reader; cout<<"\n借书模块...\n"; cout<<"\n请输入借书的读者学号:"; cin>>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) { cout<<"\n此读者学号不存在!按任意键返回!\n"; goto END; } cout<<"\n请输入你要借的书的编号:"; cin>>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) //判断是否存在读者要借的书 { cout<<"\n此图书编号不存在!按任意键返回!\n"; goto END; } else if(p0->book_xy<=0) //判断所借书是否还有 { cout<<"\n抱歉,此书已借完!请等待新书的到来!!\n按任意键返回...."; goto END; } else if(p1->right>Max||p1->right==Max) //判断最大借书量 { cout<<"\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)//不能借同一种书 { cout<<"\n抱歉!同一个读者不能同借两本相同的书!\n按任意键返回!"; goto END; } else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0) { cout<<"\n请输入你要归还图书的日期:"; cin>>lim_date; strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num); strcpy(p1->borrow[p1->right-1].limit_date,lim_date); p0->book_xy--; cout<<"\n读者学号"; cout<<p1->reader_num; cout<<"借书完毕!按任意键继续!"; goto END; } } } else //读者从未借过书 { cout<<"\n请输入归还日期:"; cin>>lim_date; strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num); strcpy(p1->borrow[p1->right-1].limit_date ,lim_date ); p0->book_xy--; //p0->book_kc--; cout<<"\n读者学号"; cout<<p1->reader_num; cout<<"借书完毕!按任意键继续下步操作!"; } END: //end getch(); system("cls"); } /************************************************************ * 功能描述: 归还图书 * 输入参数: 输入读者的学号、所还书的编号这些信息 * 输出参数: * 其它说明: 判断读者、所还的书是否存在 ************************************************************/ void return_book() //还书模块 { BK *p; RD *q; int i,j,find=0; char return_book_num[20],return_reader_num[20]; p=h_book; q=h_reader; cout<<"\n还书模块...\n"; cout<<"\n请输入要还书的读者学号:"; cin>>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) { find=2; cout<<"\n此读者学号不存在!按任意键返回!\n"; goto end; } cout<<"\n请输入读者所还书的编号:"; cin>>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)//判断是否存在要借的书 { find=2; cout<<"\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); } strcpy(q->borrow[Max-1].borrow_book_num,"0"); strcpy(q->borrow[Max-1].limit_date,"0"); p->book_xy++; q->right--; cout<<"\n学号"; cout<<return_reader_num; cout<<"的读者还书完毕!按任意键继续下步操作!"; } if(find==0) cout<<"\n错误!此读者未借此书!按任意键返回!\n"; end: getch(); system("cls"); } /************************************************************ * 功能描述: 显示图书信息 * 输入参数: 无 * 输出参数: 输出所有的图书信息 * 其它说明: 无 ************************************************************/ void print_book() //查询图书信息 { BK *p; p=h_book; system("color 2"); cout<<"\n图书信息如下:\n\n"; cout<<"图书编号\t图书名称\t图书作者\t图书分类号\t图书出版单位\t图书出版时间\t现有数量\t库存数量\n"; while(p!=NULL) { cout<<p->book_num; cout<<"\t"; cout<<p->book_name; cout<<"\t"; cout<<p->book_writer; cout<<"\t"; cout<<p->book_fl; cout<<"\t"; cout<<p->book_publisher; cout<<"\t"; cout<<p->book_time; cout<<"\t"; cout<<p->book_xy; cout<<"\t"; cout<<p->book_kc<<endl; p=p->next; } cout<<"\n图书信息显示完毕!按任意键继续下一步操作.."; getch(); system("cls"); } /************************************************************ * 功能描述: 显示读者信息 * 输入参数: 无 * 输出参数: 输出所有读者信息 * 其它说明: 无 ************************************************************/ void print_reader() //查询读者信息 { RD *p; int i; p=h_reader; system("color 4"); cout<<"\n读者信息如下:\n\n"; cout<<"--------------------------------------------------------------------------------"<<endl; cout<<"读者学号\t\t读者姓名\n"; while(p!=NULL) { printf("%s\t\t%s",p->reader_num,p->reader_name); cout<<endl; cout<<"--------------------------------------------------------------------------------"<<endl; for(i=0; i<Max; i++) { printf("\n"); printf("图书编号"); printf("\t还书日期"); printf("\n"); printf("%s",p->borrow[i].borrow_book_num); printf("\t\t%s",p->borrow[i].limit_date); } printf("\n"); p=p->next; } cout<<"--------------------------------------------------------------------------------"<<endl; cout<<"\n读者信息显示完毕!按任意键继续下一步操作.."; getch(); system("cls"); } /************************************************************ * 功能描述: 保存信息 * 输入参数: 输入图书信息、读者信息 * 输出参数: 无 * 其它说明: 调用两个函数保存信息 ************************************************************/ void save() //保存信息 { save_reader(); save_book(); } /************************************************************ * 功能描述: 保存读者信息 * 输入参数: 输入读者的信息 * 输出参数: * 其它说明: 通过二进制文件保存读者信息 ************************************************************/ void save_reader() //保存读者信息 { FILE *fp_reader; RD *p,*p0; 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"); p0=p; p=p->next; free(p0); //释放所有结点 } h_reader=NULL; fclose(fp_reader); //关闭文件 } /************************************************************ * 功能描述: 保存图书信息 * 输入参数: 输入图书的信息 * 输出参数: * 其它说明: 通过二进制文件保存图书信息 ************************************************************/ void save_book() //保存图书信息 { FILE *fp_book; //创建文件型指针 BK *p,*p0; p=h_book; if((fp_book=fopen("Book.txt","wb"))==NULL) //创建文件,进行保存 { printf("\n文件保存失败!\n请重新启动本系统...\n"); exit(0); } while(p!=NULL) { if(fwrite(p,sizeof(BK),1,fp_book)!=1) //将链表中的信息写入文件中 printf("\n写入文件失败!\n请重新启动本系统!\n"); p0=p; p=p->next; free(p0); } h_book=NULL; fclose(fp_book); //关闭文件 } /************************************************************ * 功能描述: 加载信息 * 输入参数: 加载图书、读者的信息 * 输出参数: * 其它说明: 通过二进制文件加载信息 ************************************************************/ void load() //加载信息 { load_reader(); load_book(); } /************************************************************ * 功能描述: 加载读者信息 * 输入参数: 加载读者的信息 * 输出参数: * 其它说明: 通过二进制文件加载读者信息 ************************************************************/ void load_reader() //加载读者信息 { RD *p1,*p2,*p3; FILE *fp; //创建文件型指针 fp=fopen("book.txt","rb"); //打开文件 p1=(RD *)malloc(sizeof(RD)); fread(p1,sizeof(RD),1,fp); h_reader=p3=p2=p1; while(! feof(fp)) //读出信息,重新链入链表 { p1=(RD *)malloc(sizeof(RD)); fread(p1,sizeof(RD),1,fp); p2->next=p1; p3=p2; p2=p1; } p3->next=NULL; free(p1); fclose(fp); //关闭文件 } /************************************************************ * 功能描述: 加载图书信息 * 输入参数: 加载图书的信息 * 输出参数: * 其它说明: 通过二进制文件加载图书信息 ************************************************************/ void load_book() //加载图书信息 { BK *p1,*p2,*p3; FILE *fp; //创建文件型指针 fp=fopen("Book.txt","rb"); //打开文件 p1=(BK *)malloc(sizeof(BK)); fread(p1,sizeof(BK),1,fp); h_book=p3=p2=p1; while(! feof(fp)) //读出信息,重新链入链表 { p1=(BK *)malloc(sizeof(BK)); fread(p1,sizeof(BK),1,fp); p2->next=p1; p3=p2; p2=p1; } p3->next=NULL; free(p1); fclose(fp); //关闭文件 }
运行结果如下图所示:
1.初始化界面
2.新书入库
3.读者登记
4.借阅图书
5.归还图书
6.浏览图书信息
7.浏览读者信息
知识点总结:
本项目主要用到了线性表的链式存储结构,以及用文件保存图书信息、读者信息等。
心得体会:
学到了很多东西,提高了我解决问题的能力,也让我认识到团队的重要性。本项目还存在一些问题,功能不是太全。以后的学习中,我会更加认真地学习专业知识,不断提高自己的编程水平来完善它。