您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 统计图表 > 数据结构-图书馆管理系统
湖南科技大学课程设计报告题目:图书管理基本业务模拟院系:计算机科学与工程学院专业班级:计算机科学与技术一班学号:0905010119学生姓名:张杰指导教师:李峰2010年12月31日一、问题分析图书馆基本业务模拟包含多方面的操作,其中本程序描述的是图书馆的新书入库、读者注册、图书馆借阅、归还、信息查询(含书籍信息查询和读者信息查询)等功能。1)新书入库功能:新到书籍入库包含几方面的操作:查询该书名的书籍在图书馆信息中是否已经存在,若存在,则增加可借数量和书籍总量,若不存在,则新增加概述信息,从界面输入书籍的编号(0~999999的长整型)、书名(字符串类型)、该书作者名(字符串类型)、该书出版社信息(字符串类型)、出版日期(长整型)、该书的现存量(整型)、该书的总量(整型)。输入该信息之后,将该节点插入到书籍信息链表中去。该节点的插入位置根据查找,找到合适的位置插入,这样可以保证整个数据都是有序的,方便查找。2)读者注册功能没有账号和密码读者和管理员都不能登录系统,本系统默认第一个注册系统的是系统管理员,借阅号为1000,权限是1,并输入自己基本信息,默认可借本数为10,并将所借书信息区全部置零。不是第一个注册的读者,借阅号从1000往后顺延,自己设置密码,权限为0.,其余信息与管理员相同,但是登陆之后的界面,管理员可以看到“入库”菜单选项,普通读者不能看到该选项。3)借阅功能书籍借阅主要涉及存书库和读者信息库双方的更新。用户首先登陆系统,查询(3种查询方式)该书是否存在,该书的剩余数量是否大于零,最后查询该读者是否已经借满书籍。若以上条件都满足,则将该书编号存入该读者的借阅信息区,将该读者的可借书数量减一,该存书的可借数量减一。4)归还功能读者登录后按书名号来归还所借书籍,若书名号正确并且确认归还该书籍,则从读者的借书区删除该书籍,读者的课结束数量加一,将该书的可借数量增加一,然后返回。5)信息查询功能信息查询分为读者信息查询和书籍信息查询,读者信息查询是在读者登录之后,可以显示本人的基本信息以及借书状况(所借书的本数、可借书本书以及所借书的信息),还可查询书籍信息,可根据书籍的编号来查找书籍、根据书名来查找书籍、根据作者名来查询书籍。查询到该书籍后显示是否借阅该书籍。二、数据结构描述根据所给信息,可以采用线性链表来实现该问题。现在分别给予描述。1)读者读者有很多信息需要使用,其中包含读者的姓名、性别、密码、权限、所借书信息。这里我们定义一个结构体来描述他。定义的结构体代码如下:typedefstructREADER{longnumber;//借阅号charname[15];//读者姓名charsex;//读者性别charpassword[16];//读者的密码intresidue;//读者的剩余可借书籍数量longborrowed[10];//读者已经借阅的书籍编号intlimit;//读者权限structREADER*next;//该结构体作为线性链表的一部分用来链接下一个节点的指针}reader;2)书籍同读者信息一样,书籍也有很多信息需要描述,其中包含书籍的编码、书名、书籍作者、书籍的总量、书籍的可借数量、出版社信息、出版日期,整个全部我们定义一个reader类型的结构体,该结构体定义的代码如下:typedefstructBOOK{longnumber;//书籍编号charname[30];//书名charauthor[30];//作者charpress[30];//出版社信息longpresstime;//出版日期intexist;//在库数量inttotal;//总数量structBOOK*next;//指向写一个节点的指针}book;3)数据链接数据通过每个节点的“next”指针来链接,是单线性链表,只可以从头部查询数据,所以要记录好该链表的头结点位置,不要拿该节点的头结点参与运算,否则在程序中可能会修改该链表的头结点的信息,导致后续程序无法运行。4)查询查询书籍分为按书名查询、按书号查询和按作者查询。按书名查询到的书籍我们设定为是唯一的,及整个书库中只有一种叫该名的书籍。根据输入的书籍名,从书籍信息链表的首元节点开始遍历,若查找到则返回该书籍的指针,若没找到,则返回NULL。按作者查询的书籍可能不止一种,一样从头结点开始遍历数据,每查到一个,则输出该书信息,并且继续往下查询,该函数没有返回者,读者可以根据查询到的数据,记下编号或者书名来进一步确认该书籍信息,然后借阅该书籍。按书号查询,书号作为KEY值,在书籍里面是独一无二的,我们建立一个索引表,每两个key之间有5本书籍,这样根据所查书籍的书号可以确认该书在那个大概的区段,但后从该区段的首地址往下搜索最多5次便可确认该书的位置或者确认该书是否存在于该书库中。查询读者信息读者登录之后可以查阅自己信息,从读者头结点开始往下查询,若查询到该读者,则返回该读者指针,并且显示该读者信息,若没有查找到,则返回NULL。A、借阅模块:函数声明:voidborrow(reader*temp,book*Bhead);//借书说明:Temp是该读者的指针,Bhead是该书籍链表的头指针。该函数的流程图如下:图书馆管理系统登陆注册借阅归还个人信息个人信息归还入库B、归还模块函数声明:voidreturnbook(book*bhead,reader*temp);//还书说明:bhead是书籍链表的头指针,temp是借阅者的指针。流程图如下:N进入查找按书名查找按书号查找按作者查找进入借阅输入书名继续借阅退出借阅输入书号输入作者未找到找到借阅找到借阅成功找到YNYYNC、插入模块函数声明:voidinsert(book*bhead);//入库说明:bhead是书籍链表的头指针,流程图如下:三、算法设计进入归还输入书号存在归还归还成功退出归还YNYN输入书号书号合格输入书籍信息继续输入YNYN开始入库结束输入1、读者信息存储读者信息采用线性单链表存储,设置头结点,头结点不存储数据,初始化时头结点-next设置为空,然后每从文件中读取一组数据,则将该数据存入新开辟的空间,链接到读者信息链表中,再将该数据的next置空。2、书籍信息存储书籍信息存储采用单链表存储,设置头结点,头结点不存储数据,头结点的next为空,初始化时,从文件中读取一个格式化的数据,则将该数据存入新开辟的空间,并将该节点链接到链表中去,将next置空。3、查找查找分按书名查找、按作者查找和按书号查找。按书名查找是采用遍历线性链表的方式,从首元结点开始向下遍历,检查输入的书名和已存的书名是否匹配,如果匹配,则将该书籍的指针返回,然后查找结束。若直到最后也没找到,则返回空。按作者查找则根据输入的作者名,从书籍链表的首元结点开始遍历,检查记录中的读者信息和输入的是否匹配,若找到匹配的,则输出该书籍信息,然后继续向下遍历,直到链表尾部,查找结束。按书号查找则是根据建立的索引表来查找记录。索引表是一个线性单链表,每个索引节点包含3个内容:该索引的key值、该key值指向的书籍节点、该索引节点的下一个索引节点所在的位置。设定书籍链表中每5本书籍取一个key值,从书籍链表的首元结点开始。索引链表的头结点也为空,首元结点存储书籍链表的第一个记录的书号、第一个节点的位置和下一个索引节点的位置。然后按书号查找时,先查找索引表,找到最近的入口,再从索引节点进入书籍节点,查找到该书籍,返回该书籍的指针。按索引表在较大的数据查询时可以用空间换时间的方式减少查询时间,达到提高效率的结果。但是这样分配新的节点需要占用空间,而且每次有新增书籍需要重新生成索引表,这样需要删除源节点空间,以免造成内存浪费。四、详细程序清单1、头文件定义头文件library.h定义了3个结构体:书籍结构体、读者结构体和索引表结构体,其中书籍结构体和索引表结构体已经给出,这里不再赘述,索引表结构体的定义如下:typedefstructKEY{//索引表结点longkey;book*adress;structKEY*next;}keynode;头文件还包含一些系统头文件的声明:#includestdio.h#includestring.h#includeconio.h#includewindows.h还有一些函数的声明,用#ifndef、#endif来包含,以免重复包含。2、插入部分插入部分分为书籍入库、读者注册、登陆3大块,分3个函数,声明如下:voidinsert(book*bhead);//入库voidreg(reader*head);//注册reader*login(reader*rhead,book*bhead);//登陆这3个函数分别实现新书入库、读者注册、登陆等功能,入库功能只有管理员才能调用,其余函数均可以调用,在主函数界面就可以。3、读写模块此模块主要实现向文件写入、读取数,主要是2个文件:reader.txt、book.txt,分为4个函数:读者读、写函数,书籍读、写函数。定义如下:book*Bload();//书籍链表读取reader*Rload();//读者链表读入voidBsave(book*Bhead);//书籍信息链表写入voidRsave(reader*Rhead,book*bhead);//读者信息链表写入读者和书籍链表的初始化就由读取函数完成,若文件为空则返回空指针,若不为空,则将文件里面的信息写入到链表中,每读出一个数据,分配一个空间,将该信息输入。4、查找模块查找模块分书籍查找模块、读者查找模块,书籍查找模块分线性链遍历查询、索引表查询,读者查询直接遍历读者链表,查找该读者,若存在,返回指针,不存在则返回NULL。查找模块的定义如下:book*S_name(book*head,charname[]);//按书籍名查找函数voidS_author(book*head);//按作者查找keynode*initindex(book*head);//初始化建立索引表book*S_number(longnum,book*bhead);//按书号查找reader*S_reader(reader*rhead,longnum);//查找读者5、显示模块根据给出的节点指针,显示该节点所包含的信息,显示分为读者显示和书籍信息显示,读者信息显示包含书籍信息显示,以便显示读者所借书的信息。这两个函数的声明如下:voidshowR(reader*tr,book*bhead);//显示读者信息函数voidshowB(book*p);//显示书籍信息函数这个模块还有2个小函数,用于将存入的性别’F’、’M’转化成汉字,将存的权限“1”、“0”转化成“管理员”、“读者”输出,这两个函数的定义如下:char*sc(charp){if(p=='F'||p=='f')return女;elsereturn男;}char*lc(inti){if(i==1)return管理员;elsereturn读者;}6、风格函数Style()这个函数用来设置运行的界面颜色,并调用时执行清屏。还有密码保护函数,这个函数可以保护输入的密码不显示在界面上,不被别人看到,这个函数的定义如下:voidintpsd(char*psd)//密码保护函数{inti=0;charc;while((c=getch())!=13)/*用getch()读入的回车值为13*/{if(c!='\b'&&c!='\t'&&i20){psd[i]=c;putchar('*');i++;}if(c=='\b'&&i0){printf(\b\b);i--;}/*输出内容为退格,空格,退格;擦掉一个字符*/}psd[i]='\0';return;}这个模块还有几个菜单界面,不再赘述。五、程序运行结果1、登陆界面2、入库界面3、借阅界面4、还书界面六、心得体会这个程序设计大作业相对去年的程序设计大作业来说,难度有所提高,主要是使用了一些数据的处理方法,在数据的存储、调用、查找、排序灯方面都得到了充分的锻炼,
本文标题:数据结构-图书馆管理系统
链接地址:https://www.777doc.com/doc-7896208 .html