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

下载本文档

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

文档简介

摘 要图书管理系统的设计主要运用了二叉树的相关知识,一方面采用二叉树排序作为索引表的主要原因是为了方便用书序列号为关键字进行查阅,根据日常我们的借书经验来看,到图书馆借书的人或者到书店买书的人,都可以通过多种查询方式来获取所需要的书的信息,通过数的序列号能进行更加精确的查找,对于一个实用的管理系统来说缺省查找是必不可少的;采用二分查找实现精确查找;书籍入库操作应由系统管理员进行,若此书已有收藏则只增加库存量即可,而否则要按系统设计要求添加相应的节点数据;书籍销毁的操作同样应由系统管理员进行,只能销毁已存在的、且未出借的书,只需在索引表中将该节点删除即可完成书籍的销毁工作;本系统中采用字符串的模式匹配算法来实现信息的缺省检索结点的设计采用标准c语言提供的一种叫做结构体的复合数据类型存储书的信息,然后再采用二杈树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。关键字:图书借阅,图书管理,二叉树 目 录1 前言61.1课程设计的目的61.2 图书借阅管理系统的设计与实现的基本要求613数据结构相关知识的阐述62 功能描述73 系统设计73.1 设计思路73.2 系统功能模块图83.2.1系统构成83.2.2管理员83.3 管理员功能模块94 算法设计114.1 节点数据的设计114.1.1 图书的存储结构模型114.1.1 管理员存储模型114.2 公共参变量说明124.2.1 administer *admins,*current_admin=null124.2.2 libcard *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 图书借阅管理系统的设计与实现的基本要求对每种书登记内容包括书号、书名、作者、现存量和库存量;对所有藏书以书号为关键字建立索引表排序二杈树,用以方便进行二分查找;a) 采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;b) 借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;c) 归还:注销对借阅者的登记,改变该书的现存量。系统主要功能如下:输出形式:能按书号、书名、著作者查找库存的书籍信息;能按学生的借书证号显示学生信息和借阅信息;书籍入库;借书功能实现;还书功能实现。 13数据结构相关知识的阐述本课程设计运用到得数据结构部分主要在于二叉树的运用,采用二杈树的二杈链表存储结构把单本的书关联起来,这样就可对馆藏的所有书进行统一的管理;采用排序二叉树作为索引表的优点是方便按索书号为关键字进行查询;对于一个实用的管理系统来说缺省查找是必不可少的,本系统中采用字符串的模式匹配算法来实现信息的缺省检索。采用二分查找实现精确查找;运用二叉树的插入、删除、排序来实现对图书的添加、删除、排列。2 功能描述二叉树的排序主要用于对图书管理系统的图书进行排序,采用二杈树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。二叉树的插入用于实现对图书管理系统的图书进行添加,对二叉树的节点插入新节点,然后从新排列新序列来实现图书的插入。二叉树的删除主要用来对图书管理系统的图书进行销毁,对二叉树节点的删除,节点表示一本图书,删除节点就表示销毁不需要的图书信息。3 系统设计3.1 设计思路由于课程设计的要求是用纯的c语言实现,不能采用数据库等操作数据,故节点的设计采用标准c语言提供的一种叫做结构体的复合数据类型存储书的信息,然后再采用二杈树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。根据我们日程经验,客户到图书馆借书或者到书店买书,客户可以通过多种查询方式获得所需要的书,通过索书号只能进行精确查找,对于一个实用的管理系统来说缺省查找是必不可少的,本系统中采用字符串的模式匹配算法来实现信息的缺省检索。采用二分查找实现精确查找。书籍入库操作应由系统管理员进行,若此书已有收藏则只增加库存量即可,而否则要按系统设计要求添加相应的节点数据。书籍销毁的操作同样应由系统管理员进行,只能销毁已存在的、且未出借的书。只需在索引表中将该节点删除即可完成书籍的销毁工作。根据业务实际,客户借书、还书的操作都需得管理员上班(即本系统中的登录),而在每一个单位时间内每个管理员只能受理一个客户。客户有权提出借/还书但是对借/还书的操作则是由系统管理员完成的。借书功能显然是针对具体客户而言的,所以不管你是谁,要借书就得说明你是谁(即先登录在借书)。客户每借一本书都应该对客户的借书信息有个详细的说明,根据业务实际对于客户应该还有借书数目的限制条件。还书功能与借数功能相似,但业务逻辑是相反的。根据业务逻辑实际当借书超过一定时间还会对违例客户进行一定的惩罚(通常为罚款)。3.2 系统功能模块图3.2.1系统构成 功能说明: 描述图书管理系统的主体部分。 3.2.2管理员功能说明: 描述图书管理员的管理部分。3.3 管理员功能模块功能说明: 描述图书管理系统管理员的全部功能系统部分。4 算法设计4.1 节点数据的设计4.1.1 图书的存储结构模型a) typedef struct booklong int starting;/借书日期long int ending;/应还日期char bookinform120;/这里面存储书籍的描述信息long int callnum;/索书号char bookname30;char writer20;int totalstorage, nowstorage;/书本的馆藏量,现有量book;b) /*本结构体用于创建二叉树*/typedef struct volumebook books;struct volume *lchild;struct volume *rchild;volume,*btvolume;说明:采用二叉树而非链表进行图书的管理4.1.1 管理员存储模型c) typedef struct administerchar adminid12;char password12;char adminname20;/管理员名字.char adminmessage150;struct administer *next;administer;说明:采用二叉树而非链表进行图书的管理4.2 公共参变量说明4.2.1 administer *admins,*current_admin=null;说明:admins作为链接所有管理员的头指针 current_admin用于管理当前登陆的管理员用户 同一时刻只允许最多一名管理员登录4.2.2 libcard *clients,*current_client=null;说明:clients作为链接所有客户的头指针current_client用于管理当前登陆的客户同一时刻最多只允许一名客户登录4.3 二叉排序树的插入模块的设计void insertbst(btvolume *bst,book *key)功能说明:利用二叉树的结点插入方法对结点进行插入设置,从而来实现对图书信息进行插入。如下图: 4.4二叉排序树的创建模块的设计 void createbst(btvolume *bst,int manner)功能说明:在二叉树的根节进行创建,通过文件和键盘的信息输入方法来添加相关结点及相关图书信息。如下图:4.5二叉排序树的查找模块设计btvolume searchbst(btvolume bst,long int key) 功能说明:利用二叉树的结点查找方法对结点进行查找设置,从而来实现对图书信息进行查找。如下图: 4.6二叉排序树的删除模块设计 int delbst(btvolume bst,int key)功能说明:利用二叉树的结点删除方法对结点进行删除设置,然后从新排列,从而来实现对图书信息进行删除,如下图:4.7 主函数的设计功能说明:主要目的是对图书管理的实现,通过对算法设计和组织,利用图形化界面来实现用户和管理员对图书系统的访问。如下图:5 详细设计5.1 采用排序二叉树作为存储结构#include#include#include#include#include /函数结构体#define maxnum 10typedef struct booklong int starting;/借书日期long int ending;/应还日期char bookinform120;/这里面存储书籍的描述信息long int callnum;/索书号char bookname30;char writer20;int totalstorage, nowstorage;/书本的馆藏量,现有量book;5.2创建链表的二叉树功能:本结构体用于创建链表的二叉树,通过对结点的生成来创建新的二叉树,最终生成图书管理系统。typedef struct volumebook books;struct volume *lchild; /左孩子部分struct volume *rchild; /右孩子部分volume,*btvolume;typedef struct libcardchar userid12;char password12;/用户的密码char clientname20;/用户的名字char usermessage150;/用户信息book borrow10;/每本借书证限借书十本struct libcard *next;libcard;typedef struct administerchar adminid12;char password12;char adminname20;/管理员的名字.char adminmessage150;struct administer *next;administer;administer *admins,*current_admin=null;libcard *clients,*current_client=null;5.3 二叉排序树的插入模块,采用递归算法实现功能:本结构体用于二叉排序树的插入模块,采用递归算法实现,通过对结点的插入来创建新的二叉树,最终生成图书管理系统。void insertbst(btvolume *bst,book *key)btvolume s;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; /递归结束条件else if(key-callnum books.callnum)insertbst(&(*bst)-lchild),key);else if(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、只有在系统初始化是才允许从键盘创建void createbst(btvolume *bst,int manner)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);elseif(!feof(f_book_store)/判断文件是否结束key=read_book_file(f_book_store);if(key-callnum books.callnum = key)return bst;if(bst-books.callnum rchild,key);return searchbst(bst-lchild,key);5.6 二叉排序树的删除算法功能:实现对馆藏的书籍进行销毁 ,返回是否成功int delbst(btvolume bst,int key)int success=0;btvolume p,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;elsep=p-rchild;/选择对左节点还是右结点进行访问if(p=null)success=1;return success; /结点为空,对结点访问成功if(p-lchild=null)if(f=null)bst=p-rchild;else if(f-lchild=p)f-lchild=p-rchild;elsef-rchild=p-rchild;free(p);success=1; /访问结点的左孩子和右孩子成功elseq=p;s=p-lchild;while(s-rchild)q=s;s=s-rchild;if(q=p)q-lchild=s-lchild;elseq-rchild=s-lchild;p-books.callnum=s-books.callnum; /对左右孩子进行设置free(s);success=1;return success;5.7 显示管理员信息功能:本结构体重要用于对管理员信息进行管理,显示管理员的信息。void display_admins(administer *head)int i=0;administer *temp=head;if(head = null)printf(您好,当前无管理员!n);return;while(temp!=null)printf(-n);printf(管理员 id:%sn,temp-adminid);printf(管理员姓名:%sn,temp-adminname);printf(管理员信息:%sn,temp-adminmessage);printf(-n);temp=temp-next;void display(volume *key)time_t t;if(key=null)printf(对不起,本馆目前无此藏书!n);return;printf(-n);printf(索书号:%dn,key-books.callnum);printf(书名 :%sn,key-books.bookname);printf(作者 :%sn,key-books.writer);printf(描述 :%sn,key-books.bookinform);printf(馆藏量:%dn,key-books.totalstorage);printf(可借量:%dn,key-books.nowstorage);printf(-n);/*登录模块返回登录的用户类型用户必须先登录才能对图书进行操作*/int login()administer *temp_admin=null;libcard *temp_client=null;int type,temp;view_01();scanf(%d,&type);while(1)switch(type)case 1: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;return type;elseprintf(对不起,密码错误!n);free(temp_admin);/如果登录失败则不能进行更多的操作current_admin=null;break;case 2: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;return type;elseprintf(对不起,密码错误!n);free(temp_client);current_client = null;break;printf(0、退出)n);scanf(%d,&temp);if(!temp)return 0;读取管理员用户信息文件administer *read_admin_file(file *filepoint) administer wz; 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);读取管理员用户信息文件/*写入管理员用户的信息*/int write_admin_file(file *filepoint,administer *head) while(head!=null)/把链表中的数据存入文件 fwrite(head,sizeof(administer),1,filepoint);head=head-next; return 0; /*/*管理员管理员能进行图书的购入或者销毁,还能对图书进行查询操作以及浏览客户资料但是管理员自己不能借书*/void admin(volume *btroot)int a,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)case 1:in_stor(btroot);break;case 2:printf(输入索书号进行销毁:);scanf(%d,&a);if(!out_stor(btroot,a)printf(对不起,本馆并未藏有此书!n);break;case 3:search(*btroot);break;case 4:preorder(*btroot);break;case 5:display_clients(clients);break;case 6:display_admins(admins);break;case 7:clientsev(btroot);if(current_admin=null)return;break;case 8:logout(1);if(current_client!=null)/若此时管理员有登陆者转到管理员界面clientsev(btroot);return;default:return ;system(pause);int main()int a=0,b;int cases=0,goornot;file *f_book_store=null,*f_admin=null,*f_client=null;book booker;volume root,*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=read_client_file(f_client);fclose(f_client);createbst(&btroot,2);/在系统启动时调出记录while(1)system(cls);/清屏view_00();cases=0;/scanf(%d,&b);switch(b)case 1:registerer();break;case 2:cases=login();default:break;/*选择登录的用户本系统必须先登录才能操作*/switch(cases)case 1:admin(&btroot

温馨提示

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

评论

0/150

提交评论