课程设计-基于C语言的图书借阅管理系统的设计与实现.doc

上传人:来看看 文档编号:5027390 上传时间:2020-01-29 格式:DOC 页数:31 大小:1.05MB
返回 下载 相关 举报
课程设计-基于C语言的图书借阅管理系统的设计与实现.doc_第1页
第1页 / 共31页
课程设计-基于C语言的图书借阅管理系统的设计与实现.doc_第2页
第2页 / 共31页
课程设计-基于C语言的图书借阅管理系统的设计与实现.doc_第3页
第3页 / 共31页
课程设计-基于C语言的图书借阅管理系统的设计与实现.doc_第4页
第4页 / 共31页
课程设计-基于C语言的图书借阅管理系统的设计与实现.doc_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《课程设计-基于C语言的图书借阅管理系统的设计与实现.doc》由会员分享,可在线阅读,更多相关《课程设计-基于C语言的图书借阅管理系统的设计与实现.doc(31页珍藏版)》请在三一文库上搜索。

1、摘 要图书管理系统的设计主要运用了二叉树的相关知识,一方面采用二叉树排序作为索引表的主要原因是为了方便用书序列号为关键字进行查阅,根据日常我们的借书经验来看,到图书馆借书的人或者到书店买书的人,都可以通过多种查询方式来获取所需要的书的信息,通过数的序列号能进行更加精确的查找,对于一个实用的管理系统来说缺省查找是必不可少的;采用二分查找实现精确查找;书籍入库操作应由系统管理员进行,若此书已有收藏则只增加库存量即可,而否则要按系统设计要求添加相应的节点数据;书籍销毁的操作同样应由系统管理员进行,只能销毁已存在的、且未出借的书,只需在索引表中将该节点删除即可完成书籍的销毁工作;本系统中采用字符串的模

2、式匹配算法来实现信息的缺省检索结点的设计采用标准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 公共参变

3、量说明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

4、显示管理员信息236 调试分析306.1 进入系统306.2成进入系统之后你就可以进行相关操作了317 课程设计总结358 参考文献351 前言1.1课程设计的目的 通过数据结构课程设计能更加熟练的掌握C语言以及数据结构的相关知识,能宏观的把握数据结构的各个相关部分的知识,深入的理解各个分支结构的作用和运用,特别是通过本此课程设计更能熟练的掌握和运用二叉树的相关知识,如通过二叉树能实现查找、删除、排序等从而实现对图书借阅管理。因而课程设计的主要目的就是使同学们能熟练的运用数据结构的相关知识实现各种功能。1.2 图书借阅管理系统的设计与实现的基本要求对每种书登记内容包括书号、书名、作者、现存量和

5、库存量;对所有藏书以书号为关键字建立索引表排序二杈树,用以方便进行二分查找;a) 采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;b) 借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;c) 归还:注销对借阅者的登记,改变该书的现存量。系统主要功能如下:输出形式:能按书号、书名、著作者查找库存的书籍信息;能按学生的借书证号显示学生信息和借阅信息;书籍入库;借书功能实现;还书功能实现。 13数据结构相关知识的阐述本课程设计运用到得数据结构部分主要在于二叉树的运用,采用二杈树的二杈链表存储结构把单本的书关联起来,这样就可对馆

6、藏的所有书进行统一的管理;采用排序二叉树作为索引表的优点是方便按索书号为关键字进行查询;对于一个实用的管理系统来说缺省查找是必不可少的,本系统中采用字符串的模式匹配算法来实现信息的缺省检索。采用二分查找实现精确查找;运用二叉树的插入、删除、排序来实现对图书的添加、删除、排列。2 功能描述二叉树的排序主要用于对图书管理系统的图书进行排序,采用二杈树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。二叉树的插入用于实现对图书管理系统的图书进行添加,对二叉树的节点插入新节点,然后从新排列新序列来实现图书的插入。二叉树的删除主要用来对图书管理系统的图书进行销毁,对二叉树节点

7、的删除,节点表示一本图书,删除节点就表示销毁不需要的图书信息。3 系统设计3.1 设计思路由于课程设计的要求是用纯的c语言实现,不能采用数据库等操作数据,故节点的设计采用标准c语言提供的一种叫做结构体的复合数据类型存储书的信息,然后再采用二杈树的二杈链表存储结构把单本的书关联起来。这样就可对馆藏的所有书进行统一的管理了。根据我们日程经验,客户到图书馆借书或者到书店买书,客户可以通过多种查询方式获得所需要的书,通过索书号只能进行精确查找,对于一个实用的管理系统来说缺省查找是必不可少的,本系统中采用字符串的模式匹配算法来实现信息的缺省检索。采用二分查找实现精确查找。书籍入库操作应由系统管理员进行,

8、若此书已有收藏则只增加库存量即可,而否则要按系统设计要求添加相应的节点数据。书籍销毁的操作同样应由系统管理员进行,只能销毁已存在的、且未出借的书。只需在索引表中将该节点删除即可完成书籍的销毁工作。根据业务实际,客户借书、还书的操作都需得管理员上班(即本系统中的登录),而在每一个单位时间内每个管理员只能受理一个客户。客户有权提出借/还书但是对借/还书的操作则是由系统管理员完成的。借书功能显然是针对具体客户而言的,所以不管你是谁,要借书就得说明你是谁(即先登录在借书)。客户每借一本书都应该对客户的借书信息有个详细的说明,根据业务实际对于客户应该还有借书数目的限制条件。还书功能与借数功能相似,但业务

9、逻辑是相反的。根据业务逻辑实际当借书超过一定时间还会对违例客户进行一定的惩罚(通常为罚款)。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;

10、/索书号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;/管

11、理员名字.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用于管理当前登陆的客户同一时刻最多

12、只允许一名客户登录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) 功能说明:利用二叉树的结点查找方法对结点

13、进行查找设置,从而来实现对图书信息进行查找。如下图: 4.6二叉排序树的删除模块设计 int delBST(Btvolume bst,int key)功能说明:利用二叉树的结点删除方法对结点进行删除设置,然后从新排列,从而来实现对图书信息进行删除,如下图:4.7 主函数的设计功能说明:主要目的是对图书管理的实现,通过对算法设计和组织,利用图形化界面来实现用户和管理员对图书系统的访问。如下图:5 详细设计5.1 采用排序二叉树作为存储结构#include#include#include#include#include /函数结构体#define MAXNUM 10typedef struct b

14、ooklong 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

15、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 adminmessage15

16、0;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

17、-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-lchi

18、ld=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 *b

19、st 为待创建树的根节点 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)/*输入

20、书本信息*/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,&(k

21、ey-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

22、;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; /访问结点的左孩子

23、和右孩子成功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 = NUL

24、L)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.call

25、num);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 t

26、ype,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-passw

27、ord);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,&

28、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;读

29、取管理员用户信息文件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

30、, 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(admini

31、ster),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(

32、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;c

33、ase 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;/*

34、读取所有管理员和客户*/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;

35、case 2:cases=login();default:break;/*选择登录的用户本系统必须先登录才能操作*/switch(cases)case 1:admin(&Btroot);/只有成功登陆的管理员才具有权限break;case 2:clientsev(&Btroot);break;default:break;system(cls);/清屏printf(是否继续(1、继续)(0、退出);scanf(%d,&goornot);if(!goornot)break;/*退出本程序之前将本次的改动记录入文件*/f_admin=fopen(user_admin.txt,w);write_adm

36、in_file(f_admin,admins);fclose(f_admin);f_client=fopen(user_client.txt,w);write_client_file(f_client,clients);fclose(f_client);f_book_store = fopen(book_store.txt,w);write_book_file(f_book_store,Btroot);fclose(f_book_store);return 0;6 调试分析6.1 进入系统您有三种选择,登录,注册和离开如果您已注册可直接登录,若目前还没有注册请先注册。当您选择注册之后会出现如下

37、界面,当您两次输入的密码不能匹配系统会让你一直输,直到匹配为止。6.2成进入系统之后你就可以进行相关操作了6.2.1管理员用户a) 图书入库功能b) 图书销毁c) 图书查询d) 图书浏览e) 客户管理6.2.2 客户借书之前6.2.3用户借书之后a.切换到客户b.切换到客户,让客户进行操作,若客户未登录,则客户登录c.退出d.退出系统7 总 结一个好的程序需要一个好的数据结构和一个好的算法,通过本次课程设计的过程中,掌握了数据结构的作用,数据结构的重点不在于它的算法的复杂度,数据结构的主要目的是为了让学生们学会如何将算法组合成为一个正确的、可靠的、可维护的系统。通过本系统中的图书管理部分是设计的重点也是设计的一大亮点,通过熟练的运用数据结构的二叉树的遍历、排序、节点的插入以及删除,从而来实现对图书管理系统的设计和维护。在这次课程设计的过程中,遇到过很多难题,主要表现在代码的错误上。而很多错误并不是由于没有掌握好数据结构的知识,而是

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1