1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 数据结构课程设计--图书管理系统

数据结构课程设计--图书管理系统

时间:2023-10-27 05:54:32

相关推荐

数据结构课程设计--图书管理系统

//主函数模块#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:输入库中没有的书时需要编辑信息



本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。