课程设计-基于C语言的图书借阅管理系统的设计与实现_第1页
课程设计-基于C语言的图书借阅管理系统的设计与实现_第2页
课程设计-基于C语言的图书借阅管理系统的设计与实现_第3页
课程设计-基于C语言的图书借阅管理系统的设计与实现_第4页
课程设计-基于C语言的图书借阅管理系统的设计与实现_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要图书管理系统的设计主要运用了二叉树的相关知识,一方面采用二叉树排序作为索引表的主要原因是为了方便用书序列号为关键字进行查阅,根据日常我们的借书经验来看,到图书馆借书的人或者到书店买书的人,都可以通过多种查询方式来获取所需要的书的信息,通过数的序列号能进行更加精确的查找,对于一个实用的管理系统来说缺省查找是必不可少的;采用二分查找实现精确查找;书籍入库操作应由系统管理员进行,假设此书已有收藏那么只增加库存量即可,而否那么要按系统设计要求添加相应的节点数据;书籍销毁的操作同样应由系统管理员进行,只能销毁已存在的、且未出借的书,只需在索引表中将该节点删除即可完成书籍的销毁工作;本系统中采用字符串的模式匹配算法来实现信息的缺省检索结点的设计采用标准c语言提供的一种叫做结构体的复合数据类型存储书的信息,然后再采用二杈树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。关键字:图书借阅,图书管理,二叉树

目录1前言 61.1课程设计的目的 61.2图书借阅管理系统的设计与实现的根本要求 61.3数据结构相关知识的阐述 62功能描述 73系统设计 73.1设计思路 73.2系统功能模块图 8系统构成 8管理员 83.3管理员功能模块 94算法设计 114.1节点数据的设计 114.1.1图书的存储结构模型 114.1.1管理员存储模型 114.2公共参变量说明 124.2.1administer*admins,*current_admin=NULL 124.2.2libcard*clients,*current_client=NULL; 124.3二叉排序树的插入模块的设计 124.4二叉排序树的创立模块的设计 134.5二叉排序树的查找模块设计 144.6二叉排序树的删除模块设计 154.7主函数的设计 175详细设计 185.1采用排序二叉树作为存储结构 185.2创立链表的二叉树 185.3二叉排序树的插入模块,采用递归算法实现 195.4本模块实现二叉排序树的建立 205.5二叉排序树的查找算法 215.6二叉排序树的删除算法 225.7显示管理员信息 236调试分析 306.1进入系统 306.2成进入系统之后你就可以进行相关操作了 317课程设计总结 358参考文献 351前言1.1课程设计的目的通过数据结构课程设计能更加熟练的掌握C语言以及数据结构的相关知识,能宏观的把握数据结构的各个相关局部的知识,深入的理解各个分支结构的作用和运用,特别是通过本此课程设计更能熟练的掌握和运用二叉树的相关知识,如通过二叉树能实现查找、删除、排序等从而实现对图书借阅管理。因而课程设计的主要目的就是使同学们能熟练的运用数据结构的相关知识实现各种功能。1.2图书借阅管理系统的设计与实现的根本要求对每种书登记内容包括书号、书名、作者、现存量和库存量;对所有藏书以书号为关键字建立索引表——排序二杈树,用以方便进行二分查找;采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,那么只将库存量增加;借阅:如果一种书的现存量大于0,那么借出一本,登记借阅者的书证号和归还期限,改变现存量;归还:注销对借阅者的登记,改变该书的现存量。系统主要功能如下:输出形式:能按书号、书名、著作者查找库存的书籍信息;能按学生的借书证号显示学生信息和借阅信息;书籍入库;借书功能实现;还书功能实现。

1.3数据结构相关知识的阐述本课程设计运用到得数据结构局部主要在于二叉树的运用,采用二杈树的二杈链表存储结构把单本的书关联起来,这样就可对馆藏的所有书进行统一的管理;采用排序二叉树作为索引表的优点是方便按索书号为关键字进行查询;对于一个实用的管理系统来说缺省查找是必不可少的,本系统中采用字符串的模式匹配算法来实现信息的缺省检索。采用二分查找实现精确查找;运用二叉树的插入、删除、排序来实现对图书的添加、删除、排列。2功能描述二叉树的排序主要用于对图书管理系统的图书进行排序,采用二杈树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。二叉树的插入用于实现对图书管理系统的图书进行添加,对二叉树的节点插入新节点,然后从新排列新序列来实现图书的插入。二叉树的删除主要用来对图书管理系统的图书进行销毁,对二叉树节点的删除,节点表示一本图书,删除节点就表示销毁不需要的图书信息。3系统设计3.1设计思路由于课程设计的要求是用纯的c语言实现,不能采用数据库等操作数据,故节点的设计采用标准c语言提供的一种叫做结构体的复合数据类型存储书的信息,然后再采用二杈树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。根据我们日程经验,客户到图书馆借书或者到书店买书,客户可以通过多种查询方式获得所需要的书,通过索书号只能进行精确查找,对于一个实用的管理系统来说缺省查找是必不可少的,本系统中采用字符串的模式匹配算法来实现信息的缺省检索。采用二分查找实现精确查找。书籍入库操作应由系统管理员进行,假设此书已有收藏那么只增加库存量即可,而否那么要按系统设计要求添加相应的节点数据。书籍销毁的操作同样应由系统管理员进行,只能销毁已存在的、且未出借的书。只需在索引表中将该节点删除即可完成书籍的销毁工作。根据业务实际,客户借书、还书的操作都需得管理员上班〔即本系统中的登录〕,而在每一个单位时间内每个管理员只能受理一个客户。客户有权提出借/还书但是对借/还书的操作那么是由系统管理员完成的。借书功能显然是针对具体客户而言的,所以不管你是谁,要借书就得说明你是谁〔即先登录在借书〕。客户每借一本书都应该对客户的借书信息有个详细的说明,根据业务实际对于客户应该还有借书数目的限制条件。还书功能与借数功能相似,但业务逻辑是相反的。根据业务逻辑实际当借书超过一定时间还会对违例客户进行一定的惩罚〔通常为罚款〕。3.2系统功能模块图3.2.1系统构成功能说明:描述图书管理系统的主体局部。3.2.2管理员功能说明:描述图书管理员的管理局部。3.3管理员功能模块功能说明:描述图书管理系统管理员的全部功能系统局部。4算法设计4.1节点数据的设计4.1.1图书的存储结构模型typedefstructbook{ longintstarting;//借书日期 longintending;//应还日期 charbookinform[120];//这里面存储书籍的描述信息 longintcallnum;//索书号 charbookname[30]; charwriter[20]; inttotalstorage,nowstorage;//书本的馆藏量,现有量}book;/*本结构体用于创立二叉树*/typedefstructvolume{ bookbooks;structvolume*lchild; structvolume*rchild;}volume,*Btvolume; 说明:采用二叉树而非链表进行图书的管理4.1.1管理员存储模型typedefstructadminister{ charadminID[12]; charpassword[12];charadminname[20];//管理员名字... charadminmessage[150]; structadminister*next;}administer;说明:采用二叉树而非链表进行图书的管理4.2公共参变量说明4.2.1administer*admins,*current_admin=NULL;说明:admins作为链接所有管理员的头指针 current_admin用于管理当前登陆的管理员用户 同一时刻只允许最多一名管理员登录4.2.2libcard*clients,*current_client=NULL;说明:clients作为链接所有客户的头指针 current_client用于管理当前登陆的客户 同一时刻最多只允许一名客户登录4.3二叉排序树的插入模块的设计——voidinsertBST(Btvolume*bst,book*key)功能说明:利用二叉树的结点插入方法对结点进行插入设置,从而来实现对图书信息进行插入。如下列图:4.4二叉排序树的创立模块的设计——voidcreateBST(Btvolume*bst,intmanner)功能说明:在二叉树的根节进行创立,通过文件和键盘的信息输入方法来添加相关结点及相关图书信息。如下列图:4.5二叉排序树的查找模块设计——BtvolumesearchBST(Btvolumebst,longintkey)功能说明:利用二叉树的结点查找方法对结点进行查找设置,从而来实现对图书信息进行查找。如下列图:4.6二叉排序树的删除模块设计——intdelBST(Btvolumebst,intkey)功能说明:利用二叉树的结点删除方法对结点进行删除设置,然后从新排列,从而来实现对图书信息进行删除,如下列图:4.7主函数的设计功能说明:主要目的是对图书管理的实现,通过对算法设计和组织,利用图形化界面来实现用户和管理员对图书系统的访问。如下列图:5详细设计5.1采用排序二叉树作为存储结构#include<stdlib.h>#include<stdio.h>#include<math.h>#include<string.h>#include<time.h>//函数结构体#defineMAXNUM10typedefstructbook{ longintstarting;//借书日期 longintending;//应还日期 charbookinform[120];//这里面存储书籍的描述信息 longintcallnum;//索书号 charbookname[30]; charwriter[20]; inttotalstorage,nowstorage;//书本的馆藏量,现有量}book;5.2创立链表的二叉树功能:本结构体用于创立链表的二叉树,通过对结点的生成来创立新的二叉树,最终生成图书管理系统。typedefstructvolume{ bookbooks; structvolume*lchild;//左孩子局部 structvolume*rchild;//右孩子局部}volume,*Btvolume;typedefstructlibcard{ charuserID[12]; charpassword[12];//用户的密码 charclientname[20];//用户的名字 charusermessage[150];//用户信息 bookborrow[10];//每本借书证限借书十本 structlibcard*next;}libcard;typedefstructadminister{ charadminID[12]; charpassword[12]; charadminname[20];//管理员的名字... charadminmessage[150]; structadminister*next;}administer;administer*admins,*current_admin=NULL;libcard*clients,*current_client=NULL;5.3二叉排序树的插入模块,采用递归算法实现功能:本结构体用于二叉排序树的插入模块,采用递归算法实现,通过对结点的插入来创立新的二叉树,最终生成图书管理系统。voidinsertBST(Btvolume*bst,book*key){ Btvolumes; if(*bst==NULL)//递归结束条件 { s=(Btvolume)malloc(sizeof(volume)); s->books.callnum=key->callnum; s->books.nowstorage=key->nowstorage; s->books.totalstorage=key->totalstorage; s->books.starting=key->starting; s->books.ending=key->ending; strcpy(&(s->books.bookinform),&(key->bookinform)); strcpy(&(s->books.bookname),&(key->bookname)); strcpy(&(s->books.writer),&(key->writer));s->lchild=NULL; s->rchild=NULL; *bst=s; }//递归结束条件 elseif(key->callnum<(*bst)->books.callnum) { insertBST(&((*bst)->lchild),key); } elseif(key->callnum>(*bst)->books.callnum) { insertBST(&((*bst)->rchild),key); } else { (*bst)->books.nowstorage+=key->nowstorage; (*bst)->books.totalstorage+=key->totalstorage; }}5.4本模块实现二叉排序树的建立功能说明:1、参数Btvolume*bst为待创立树的根节点 2、只有库存量为空的时候才能调用本模块 3、只有管理员才能调用本模块 4、参数manner用于指定从文件创立还是从键盘创立 manner=1:键盘、manner=2:从文件 5、只有在系统初始化是才允许从键盘创立voidcreateBST(Btvolume*bst,intmanner){ book*key; FILE*f_book_store=NULL; f_book_store=fopen("book_store.txt","r"); *bst=NULL; while(1){ key=(book*)malloc(sizeof(book));// if(manner==1) { /*输入书本信息*/ key->starting=0; key->ending=0; printf("输入索书号:"); scanf("%ld",&(key->callnum)); if(key->callnum==0){ free(key); break; }/*输入书本信息*/printf("输入入库量:"); scanf("%d",&(key->totalstorage)); key->nowstorage=key->totalstorage; printf("输入书本名:"); scanf("%s",&(key->bookname)); printf("输入著"); scanf("%s",&(key->writer)); printf("输入书描述:"); scanf("%s",&(key->bookinform)); } else { if(!feof(f_book_store))//判断文件是否结束 { key=read_book_file(f_book_store); if(key->callnum<-1) { free(key); key=NULL; } } else { free(key); break; } } if(key!=NULL) insertBST(bst,key);//调用插入操作实现新书入库 } fclose(f_book_store);/////////////////////////////////////////////////////////////////////// f_book_store=fopen("book_store.txt","w"); write_book_file(f_book_store,*bst); fclose(f_book_store);///////////////////////////////////////////////////////////////////////}5.5二叉排序树的查找算法功能:按索书号为关键字进行二分查找,采用递归算法实现,通过对结点的查找来创立新的二叉树,最终生成图书管理系统。BtvolumesearchBST(Btvolumebst,longintkey){ if(bst==NULL) returnNULL; if(bst->books.callnum==key) returnbst; if(bst->books.callnum<key) returnsearchBST(bst->rchild,key); returnsearchBST(bst->lchild,key);}5.6二叉排序树的删除算法功能:实现对馆藏的书籍进行销毁,返回是否成功intdelBST(Btvolumebst,intkey){ intsuccess=0; Btvolumep,f,s,q; p=bst; f=NULL;//实现对图书管理 while(p) { if(p->books.callnum==key) break; f=p; if(p->books.callnum>key) p=p->lchild; else p=p->rchild; }//选择对左节点还是右结点进行访问 if(p==NULL) { success=1; returnsuccess;//结点为空,对结点访问成功 } if(p->lchild==NULL) { if(f==NULL) bst=p->rchild; elseif(f->lchild==p) f->lchild=p->rchild; else f->rchild=p->rchild; free(p); success=1; }//访问结点的左孩子和右孩子成功 else { q=p; s=p->lchild; while(s->rchild) { q=s; s=s->rchild; } if(q==p) q->lchild=s->lchild; else q->rchild=s->lchild; p->books.callnum=s->books.callnum;//对左右孩子进行设置 free(s); success=1; } returnsuccess;}5.7显示管理员信息功能:本结构体重要用于对管理员信息进行管理,显示管理员的信息。voiddisplay_admins(administer*head){ inti=0; administer*temp=head; if(head==NULL) { printf("您好,当前无管理员!\n"); return; } while(temp!=NULL) { printf("\n"); printf("管理员ID:%s\n",temp->adminID); printf("管理员姓名:%s\n",temp->adminname); printf("管理员信息:%s\n",temp->adminmessage); printf("\n"); temp=temp->next; }}voiddisplay(volume*key){ time_tt; if(key==NULL) { printf("对不起,本馆目前无此藏书!\n"); return; } printf("\n"); printf("索书号:%d\n",key->books.callnum); printf("书名:%s\n",key->books.bookname); printf("作者:%s\n",key->books.writer); printf("描述:%s\n",key->books.bookinform); printf("馆藏量:%d\n",key->books.totalstorage); printf("可借量:%d\n",key->books.nowstorage); printf("\n");}/* 登录模块 返回登录的用户类型 用户必须先登录才能对图书进行操作*/intlogin(){ administer*temp_admin=NULL; libcard*temp_client=NULL; inttype,temp; view_01(); scanf("%d",&type); while(1) { switch(type) { case1: if(current_admin!=NULL) { printf("对不起,登录人数已满,您目前还不能登陆!\n"); break; } temp_admin=(administer*)malloc(sizeof(administer)); printf("请输入管理员ID:"); scanf("%s",&temp_admin->adminID); printf("请输入登录密码:"); GetPassword(&temp_admin->password,12); //scanf("%s",&temp_admin->password); if(check_admin(&temp_admin))//调用函数检查 { current_admin=temp_admin; returntype; } else { printf("对不起,密码错误!\n"); free(temp_admin);//如果登录失败那么不能进行更多的操作 current_admin=NULL; break; } case2: if(current_client!=NULL) { printf("对不起,登录人数已满,您目前还不能登陆!\n"); break; } temp_client=(libcard*)malloc(sizeof(libcard)); printf("请输入借阅证号:"); scanf("%s",&temp_client->userID); printf("请输入密码:"); GetPassword(&temp_client->password,12); //scanf("%s",&temp_client->password); if(check_client(&temp_client))//调用函数检查 { current_client=temp_client; returntype; } else { printf("对不起,密码错误!\n"); free(temp_client); current_client=NULL; break; } } printf("(0、退出)\n"); scanf("%d",&temp); if(!temp)return0; }} 读取管理员用户信息文件 administer*read_admin_file(FILE*filepoint){administerwz;administer*head=NULL;administer*p1=NULL;administer*p2=NULL;//对管理员进行访问while(1) { fread(&wz,sizeof(administer),1,filepoint); p1=(administer*)malloc(sizeof(administer));//设置管理员权限 if(feof(filepoint)) { free(p1); break; } strcpy(p1->adminID,wz.adminID); strcpy(p1->adminname,wz.adminname); strcpy(p1->adminmessage,wz.adminmessage); strcpy(p1->password,wz.password); p1->next=p2; p2=p1; } head=p2;return(head);}读取管理员用户信息文件/* 写入管理员用户的信息*/intwrite_admin_file(FILE*filepoint,administer*head){while(head!=NULL)//把链表中的数据存入文件{ fwrite(head,sizeof(administer),1,filepoint); head=head->next;}return0;}/* /* 管理员 管理员能进行图书的购入或者销毁,还能对图书进行查询操作以及浏览客户资料 但是管理员自己不能借书*/voidadmin(volume**Btroot){ inta,b,oper; volume*temp; libcard*head; FILE*filepoint=NULL; system("cls");////////////清屏 if(current_admin==NULL) { printf("您还未登录!\n"); login(); system("cls");////////////清屏 return;//不管登录是否成功都将回到原处 } while(1) { system("cls");////////////清屏 view_02(); scanf("%d",&oper); switch(oper) { case1: in_stor(Btroot); break; case2: printf("输入索书号进行销毁:"); scanf("%d",&a); if(!out_stor(Btroot,a)) printf("对不起,本馆并未藏有此书!\n"); break; case3: search(*Btroot); break; case4: preorder(*Btroot); break; case5: display_clients(clients); break; case6: display_admins(admins); break; case7: clientsev(Btroot); if(current_admin==NULL) return; break; case8: logout(1); if(current_client!=NULL)//假设此时管理员有登陆者转到管理员界面 clientsev(Btroot); return; default:return; } system("pause"); }}intmain(){ inta=0,b; intcases=0,goornot; FILE*f_book_store=NULL,*f_admin=NULL,*f_client=NULL; bookbooker; volumeroot,*Btroot; /* 读取所有管理员和客户 */ f_admin=fopen("user_admin.txt","r"); admins=read_admin_file(f_admin); fclose(f_admin); f_client=fopen("user_client.txt","r"); clients=re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论