数据结构图书馆管理系统_第1页
数据结构图书馆管理系统_第2页
数据结构图书馆管理系统_第3页
数据结构图书馆管理系统_第4页
数据结构图书馆管理系统_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、湖南科技大学课程设计报告题目:图书管理基本业务模拟院系:计算机科学与工程学院专业班级:计算机科学与技术一班学号:学生姓名:指导教师:2010年12月31日、问题分析图书馆基本业务模拟包含多方面的操作,其中本程序描述的是图书馆的新书入库、读者注册、图书馆借阅、归还、信息查询(含书籍信息查询和读者信息查询)等功能。1)新书入库功能:新到书籍入库包含几方面的操作:查询该书名的书籍在图书馆信息中是否已经存在,若存在,则增加可借数量和书籍总量,若不存在,则新增加概述信息,从界面输入书籍的编号(0999999的长整型)、书名(字符串类型)、该书作者名(字符串类型)、该书出版社信息(字符串类型)、出版日期(

2、长整型)、该书的现存量(整型)、该书的总量(整型)。输入该信息之后,将该节点插入到书籍信息链表中去。该节点的插入位置根据查找,找到合适的位置插入,这样可以保证整个数据都是有序的,方便查找。2)读者注册功能没有账号和密码读者和管理员都不能登录系统,本系统默认第一个注册系统的是系统管理员,借阅号为1000,权限是1,并输入自己基本信息,默认可借本数为10,并将所借书信息区全部置零。不是第一个注册的读者,借阅号从1000往后顺延,自己设置密码,权限为0.,其余信息与管理员相同,但是登陆之后的界面,管理员可以看到“入库”菜单选项,普通读者不能看到该选项。3)借阅功能书籍借阅主要涉及存书库和读者信息库双

3、方的更新。用户首先登陆系统,查询(3种查询方式)该书是否存在,该书的剩余数量是否大于零,最后查询该读者是否已经借满书籍。若以上条件都满足,则将该书编号存入该读者的借阅信息区,将该读者的可借书数量减一,该存书的可借数量减一。4)归还功能读者登录后按书名号来归还所借书籍,若书名号正确并且确认归还该书籍,则从读者的借书区删除该书籍,读者的课结束数量加一,将该书的可借数量增加一,然后返回。5)信息查询功能信息查询分为读者信息查询和书籍信息查询,读者信息查询是在读者登录之后,可以显示本人的基本信息以及借书状况(所借书的本数、可借书本书以及所借书的信息),还可查询书籍信息,可根据书籍的编号来查找书籍、根据

4、书名来查找书籍、根据作者名来查询书籍。查询到该书籍后显示是否借阅该书籍。二、数据结构描述根据所给信息,可以采用线性链表来实现该问题。现在分别给予描述。1)读者读者有很多信息需要使用,其中包含读者的姓名、性别、密码、权限、所借书信息。这里我们定义一个结构体来描述他。定义的结构体代码如下:typedefstructREADERlongnumber;/借阅号charname15;读者姓名charsex;/读者性别charpassword16;读者的密码intresidue;/读者的剩余可借书籍数量longborrowed10;读者已经借阅的书籍编号intlimit;/读者权限structREADER

5、*next;该结构体作为线性链表的一部分用来链接下一个节点的指针reader;2)书籍同读者信息一样,书籍也有很多信息需要描述,其中包含书籍的编码、书名、书籍作者、书籍的总量、书籍的可借数量、出版社信息、出版日期,整个全部我们定义一个reader类型的结构体,该结构体定义的代码如下:typedefstructBOOKlongnumber;/书籍编号charname30;书名charauthor30;作者charpress30;/出版社信息longpresstime;/出版日期intexist;/在库数量inttotal;/总数量structBOOK*next;/指向写一个节点的指针book;3

6、)数据链接数据通过每个节点的“next”指针来链接,是单线性链表,只可以从头部查询数据,所以要记录好该链表的头结点位置,不要拿该节点的头结点参与运算,否则在程序中可能会修改该链表的头结点的信息,导致后续程序无法运行。查询查询书籍分为按书名查询、按书号查询和按作者查询。按书名查询到的书籍我们设定为是唯一的,及整个书库中只有一种叫该名的书籍。根据输入的书籍名,从书籍信息链表的首元节点开始遍历,若查找到则返回该书籍的指针,若没找到,则返回NULL。按作者查询的书籍可能不止一种,一样从头结点开始遍历数据,每查到一个,则输出该书信息并且继续往下查询,该函数没有返回者,读者可以根据查询到的数据,记下编号或

7、者书名来进一步确认该书籍信息,然后借阅该书籍。按书号查询,书号作为KEY值,在书籍里面是独一无二的,我们建立一个索引表,每两个key之间有5本书籍,这样根据所查书籍的书号可以确认该书在那个大概的区段,但后从该区段的首地址往下搜索最多5次便可确认该书的位置或者确认该书是否存在于该书库中。查询读者信息读者登录之后可以查阅自己信息,从读者头结点开始往下查询,若查询到该读者,则返回该读者指针,并且显示该读者信息若没有查找到,则返回NULL。A、借阅模块:函数声明:voidborrow(reader*temp,book*Bhead);借书说明:Temp是该读者的指针,Bhead是该书籍链表的头指针。该函

8、数的流程图如下:B、归还模块函数声明:voidreturnbook(book*bhead,reader*temp);还书说明:bhead是书籍链表的头指针,temp是借阅者的指针。流程图如下:C、插入模块函数声明:voidinsert(book*bhead);入库说明:bhead是书籍链表的头指针,流程图如下:三、算法设计1、读者信息存储读者信息采用线性单链表存储,设置头结点,头结点不存储数据,初始化时头结点-next设置为空,然后每从文件中读取一组数据,则将该数据存入新开辟的空间,链接到读者信息链表中,再将该数据的next置空。2、书籍信息存储书籍信息存储采用单链表存储,设置头结点,头结点不

9、存储数据,头结点的next为空,初始化时,从文件中读取一个格式化的数据,则将该数据存入新开辟的空间,并将该节点链接到链表中去,将next置空。3、查找查找分按书名查找、按作者查找和按书号查找。按书名查找是采用遍历线性链表的方式,从首元结点开始向下遍历,检查输入的书名和已存的书名是否匹配,如果匹配,则将该书籍的指针返回,然后查找结束。若直到最后也没找到,则返回空。按作者查找则根据输入的作者名,从书籍链表的首元结点开始遍历,检查记录中的读者信息和输入的是否匹配,若找到匹配的,则输出该书籍信息,然后继续向下遍历,直到链表尾部,查找结束。按书号查找则是根据建立的索引表来查找记录。索引表是一个线性单链表

10、,每个索引节点包含3个内容:该索引的key值、该key值指向的书籍节点、该索引节点的下一个索引节点所在的位置。设定书籍链表中每5本书籍取一个key值,从书籍链表的首元结点开始。索引链表的头结点也为空,首元结点存储书籍链表的第一个记录的书号、第一个节点的位置和下一个索引节点的位置。然后按书号查找时,先查找索引表,找到最近的入口,再从索引节点进入书籍节点查找到该书籍,返回该书籍的指针。按索引表在较大的数据查询时可以用空间换时间的方式减少查询时间,达到提高效率的结果。但是这样分配新的节点需要占用空间,而且每次有新增书籍需要重新生成索引表,这样需要删除源节点空间,以免造成内存浪费。四、详细程序清单1、

11、头文件定义头文件library.h定义了3个结构体:书籍结构体、读者结构体和索引表结构体,其中书籍结构体和索引表结构体已经给出,这里不再赘述,索引表结构体的定义如下:typedefstructKEY/索引表结点longkey;book*adress;structKEY*next;keynode;头文件还包含一些系统头文件的声明:#includestdio.h#includestring.h#includeconio.h#includewindows.h还有一些函数的声明,用#ifndef、#endif来包含,以免重复包含。2、插入部分插入部分分为书籍入库、读者注册、登陆3大块,分3个函数,声明

12、如下: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);书籍信息链表写入v

13、oidRsave(reader*Rhead,book*bhead);读者信息链表写入读者和书籍链表的初始化就由读取函数完成,若文件为空则返回空指针,若不为空,则将文件里面的信息写入到链表中,每读出一个数据分配一个空间,将该信息输入。4、查找模块查找模块分书籍查找模块、读者查找模块,书籍查找模块分线性链遍历查询、索引表查询,读者查询直接遍历读者链表,查找该读者,若存在,返回指针,不存在则返回NULL。查找模块的定义如下:book*S_name(book*head,charname);按书籍名查找函数voidS_author(book*head);按作者查找keynode*initindex(bo

14、ok*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”转化成“管理员”、“读

15、者”输出,这两个函数的定义如下: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&i0)printf(bb);i-;

16、/*输出内容为退格,空格,退格;擦掉一个字符一个字符*/一个字符一个字符*/psdi=O;return;这个模块还有几个菜单界面,不再赘述。五、程序运行结果1、登陆界面J;炷只士六:2八列I注XI十K:VI口lUEUuynu.t?xt2、入库界面3、借阅界面X:UsersJasonDesktopibDebuglibX:UsersJasonDesktopibDebuglibae:residue0&Bbook-exist0)temp-residue-;Bbook-exist-;for(i=0;iborrowedi0=0)temp-borrowedi0=Bbook-number;temp-borro

17、wedi1=backtime();break;printf(n借阅成功!);elseif(!(temp-residue0)printf(n您只能借阅10本书籍!);elseif(!(Bbook-exist0)printf(n该书没有库存,请借阅其他书籍!);printf(n您要继续借阅书籍吗?Y/N);t=getch();if(t=y|t=Y)continue;elsebreak;voidreturnbook(book*bhead,reader*temp)还书longnum;inti,j=0;chart;book*p;printf(nI1);printf(n1欢迎使用还书系统|);printf

18、(n11);printf(nn请输入您所还书的编号:);scanf(%d,&num);for(i=0;iborrowedi0)j=1;p=S_number(num,bhead);if(p!=NULL&j=1)printf(n|111TOC o 1-5 h zn1);printf(n丨书本编号丨书籍名称丨出版社名称丨出版时间I作者丨);printf(n|111H1);printf(nI%8dI%12sI%14sI%8dI%14sI,p-number,p-name,p-press,p-presstime,p-author);printf(n1111J1n);printf(n确认归还该书籍?Y/N)

19、;t=getch();if(t=Y|t=y)p-exist+;temp-residue+;for(i=0;iborrowedi0=num)temp-borrowedi0=0;temp-borrowedi1=0;break;elsereturn;elseprintf(n编号有误,请仔细检查!);3、insert.cpp#includelibrary.hvoidinsert(book*bhead)入库style();longt;book*temp1,*temp,*temp2;temp1=bhead-next;printf(nI);printf(nB1欢迎使用);printf(n1);while(1

20、)printf(n请输入您给定书的编号(6位以内的正整数):);scanf(%d,&t);if(t999999)printf(n您的编号不在处理范围(1999999)之内!);fflush(stdin);continue;elsetemp2=S_number(t,bhead);if(temp2=NULL)break;elsetemp2-total+;temp2-exist+;printf(n编号为d的书已存在,入库成功!,t);return;temp=(book*)malloc(sizeof(book);temp-number=t;printf(n请输入书名:);scanf(%s,temp-n

21、ame);printf(n请输入本书作者:);scanf(%s,temp-author);printf(n请输入本书出版社:);scanf(%s,temp-press);printf(n请输入本书出版时间:);scanf(%d,&temp-presstime);temp-next=NULL;temp-total=1;temp-exist=1;if(bhead-next=NULL)bhead-next=temp;elsewhile(templ-next!=NULL&templ-numbervtemp-number)找至U合适的位置,插入书籍信息templ=templ-next;temp-next

22、=templ-next;templ-next=temp;printf(n|1);printf(n1入库成功I);printf(n11);voidreg(reader*head)注册style();longi=l000;intj;chartll6,t2l6;reader*temp=head-next;reader*p=(reader*)malloc(sizeof(reader);printf(n|1);printf(n1欢迎使用注册系统I);printf(n11);printf(n请输入姓名:);scanf(%s,p-name);getchar();while(1)printf(n请输入性别:n

23、M:男性:nF:女性:);p-sex=getchar();if(p-sex=F|p-sex=f|p-sex=M|p-sex=m)break;elseprintf(n阁下既非男,又非女,莫非来自泰国?);while(1)while(1)请输入您的密码:请输入您的密码:);您设置的密码过于简单,请重新设置:);请确认您的密码:);printf(nintpsd(t1);if(strlen(t1)password,t1);break;elseprintf(n您两次输入的密码不一致!);p-residue=10;p-next=NULL;for(j=0;jborrowedj0=0;p-borrowedj1

24、=0;if(temp=NULL)p-number=i;head-next=p;p-limit=1;else+i;while(temp-next!=NULL)+i;temp=temp-next;p-number=i;p-limit=0;temp-next=p;showR(p,NULL);reader*login(reader*rhead,book*bhead)登陆longnum;charpass16;inti=5;reader*reader;style();printf(n|);printf(nprintf(n欢迎使用登陆系统);printf(n11);while(1)printf(n请输入您的

25、借阅证号:);scanf(%d,&num);if(reader=S_reader(rhead,num)=NULL)printf(n没有找到您所在编号的读者.);getch();returnNULL;elsebreak;while(i0)printf(n请输入密码:);intpsd(pass);if(strcmp(pass,reader-password)=0)returnreader;elseprintf(n密码错误);returnNULL;4、load_save.cpp#includelibrary.hbook*Bload()书籍链表读取FILE*p;book*Bhead=(book*)ma

26、lloc(sizeof(book);book*temp,*temp1;Bhead-next=NULL;if(p=fopen(book.txt,r)=NULL)printf(n打开文件book.txt失败,请检查.);returnNULL;elsefgetc(p);if(!feof(p)未到文件尾printf(n非空);rewind(p);/返回文件头temp=(book*)malloc(sizeof(book);fscanf(p,%14d%12s%18s%8d%14s%4d%4dn,&temp-number,temp-name,temp-press,&temp-presstime,temp-a

27、uthor,&temp-total,&temp-exist);temp-next=NULL;Bhead-next=temp;while(!feof(p)temp1=(book*)malloc(sizeof(book);fscanf(p,%14d%12s%14s%8d%18s%4d%4dn,&temp1-number,temp1-name,temp1-press,&temp1-presstime,temp1-author,&temp1-total,&temp1-exist);temp1-next=NULL;temp-next=temp1;temp=temp-next;printf(n书籍信息读取

28、成功.);returnBhead;reader*Rload()读者链表读入FILE*p;inti;reader*temp,*temp1;reader*Rhead=(reader*)malloc(sizeof(reader);Rhead-next=NULL;if(p=fopen(reader.txt,r)=NULL)printf(n打开文件reader.txt失败,请检查);returnNULL;elsefgetc(p);if(!feof(p)文件未到尾部rewind(p);temp=(reader*)malloc(sizeof(reader);fscanf(p,%12d%10s%3c%8d%2

29、d%12s,&temp-number,temp-name,&temp-sex,&temp-residue,&temp-limit,temp-password);for(i=0;iborrowedi0);fscanf(p,%10d,&temp-borrowedi1);temp-next=NULL;Rhead-next=temp;while(!feof(p)printf(a);temp1=(reader*)malloc(sizeof(reader);fread(temp1,sizeof(reader),1,p);temp1-next=NULL;temp-next=temp1;temp=temp-n

30、ext;printf(n读者信息读取成功.);returnRhead;voidBsave(book*Bhead)书籍信息链表写入FILE*p;book*temp=Bhead-next;if(temp=NULL)return;elseif(p=fopen(book.txt,w)=NULL)printf(n打开book.txt失败.);while(temp!=NULL)/showB(temp);fprintf(p,%14d%12s%14s%8d%14s%4d%4dn,temp-number,temp-name,temp-press,temp-presstime,temp-author,temp-t

31、otal,temp-exist);temp=temp-next;printf(n存储书籍成功.);voidRsave(reader*Rhead,book*Bhead)FILE*p;inti;reader*temp=Rhead-next;if(temp=NULL)return;elseif(p=fopen(reader.txt,w)=NULL)printf(n打开reader.txt失败.);while(temp!=NULL)Sleep(1000);/showR(temp,Bhead);fprintf(p,%12d%10s%3c%8d%2d%12s,temp-number,temp-name,t

32、emp-sex,temp-residue,temp-limit,temp-password);for(i=0;iborrowedi0);fprintf(p,%10d,temp-borrowedi1);temp=temp-next;printf(n存储读者成功.);5、search.cpp#includelibrary.h/按书名查找书book*S_name(book*head,charname)book*temp=head-next;if(temp=NULL)printf(n书库中还没有书籍,请入库!);elsewhile(temp!=NULL)if(strcmp(temp-name,name

33、)=0)printf(n书名为的书存在!,name);break;elsetemp=temp-next;returntemp;/按书作者查找voidS_author(book*head)charauthor30;book*temp=head-next;if(temp=NULL)printf(n书库中还没有书籍,请入库门;elseprintf(n请输入您要查找的作者名:);scanf(%s,author);while(temp!=NULL)if(strcmp(author,temp-author)=0)showB(temp);temp=temp-next;getch();keynode*init

34、index(book*head)初始化建立索引表inti;book*temp=head-next;keynode*tempkey,*p;printf(n初始化索引表开始.);keynode*keyhead=(keynode*)malloc(sizeof(keynode);keyhead-next=NULL;tempkey=keyhead-next;if(temp!=NULL)p=(keynode*)malloc(sizeof(keynode);给索引节点分配空间p-key=temp-number;p-adress=temp;p-next=NULL;数据赋完剩下插入keyhead-next=p;

35、tempkey=keyhead-next;while(temp!=NULL)for(i=0;inext!=NULL;i+)temp=temp-next;if(ikey=temp-number;p-adress=temp;p-next=NULL;tempkey-next=p;tempkey=tempkey-next;getch();returnkeyhead;voiddelkey(keynode*keyhead)keynode*temp;if(keyhead-next=NULL)free(keyhead);elsewhile(keyhead!=NULL)temp=keyhead;keyhead=

36、keyhead-next;free(temp);printf(n索引表清空!);/按索引表查找book*S_number(longnum,book*bhead)inti;book*p;keynode*keyhead=initindex(bhead);keynode*tempkey=keyhead-next;if(tempkey=NULL)printf(n书库没有记录,请输入!);delkey(keyhead);returnNULL;elsewhile(tempkey-next!=NULL)if(tempkey-keynext-keynext;elsebreak;if(tempkey=NULL)

37、printf(没有找到编号为d的书籍!,num);delkey(keyhead);returnNULL;elsep=tempkey-adress;for(i=0;inumber=num)/showB(p);delkey(keyhead);returnp;elsep=p-next;delkey(keyhead);returnNULL;reader*S_reader(reader*rhead,longnum)/查找读者reader*temp=rhead-next;if(temp=NULL)printf(n文件中没有数据导入,请检查修复系统!);returnNULL;elsewhile(temp)i

38、f(temp-number=num)returntemp;elsetemp=temp-next;returntemp;6、showing.cpp#includelibrary.hvoidshowR(reader*tr,book*bhead)inti;book*p;printf(nprintf(nr=n);printf(n|I);printf(n|hH);il读者信息F=!irirbook*p;printf(nprintf(nr=n);printf(n|I);printf(n|hH);il读者信息F=!iriririr);借阅证号);ni1printf(n|权限|printf(nfdI);pri

39、ntf(n|%12d|%10s|%6s|%8d|%8d|%6s|,tr-number,tr-name,sc(tr-sex),tr-residue,10-tr-residue,lc(tr-limit);printf(n”111111”);printf(nfor(i=0;iborrowedi0=0)continue;elseIIII性别II剩余可借丨已借本数!JLirJLirJLirJLir以下为所借书籍信息:n);printf(n%d,tr-borrowedi0);p=S_number(tr-borrowedi0,bhead);printf(ni111n);voidshowB(book*p)TO

40、C o 1-5 h zprintf(ni111r111);printf(n丨书本编号丨书籍名称丨出版社名称丨出版时间丨作者丨共计丨可借丨);printf(n|111F1II);printf(n|%8d|%12s|%14s|%8d|%14s|%4d|%4d|,p-number,p-name,p-press,p-presstime,p-author,p-total,p-exist);printf(n1111L111n);char*sc(charp)if(p=F|p=f)return女;elsereturn男;char*lc(inti)if(i=1)return管理员;elsereturn读者;7、

41、style.cpp#includelibrary.hvoidstyle()风格函数/system(modeconcols=80lines=300);system(color0f);system(cls);voidintpsd(char*psd)密码保护函数inti=0;charc;while(c=getch()!=13)/*用getch()读入的回车值为13*/if(c!=b&c!=t&i0)printf(bb);i-;/*输出内容为退格,空格,退格;擦掉一个字符*/psdi=0;return;voidmenu(structBOOK*Bhead,reader*Rhead)reader*tempr;style();charm;while(1)TOC o 1-5 h zprintf(n|1);printf(n丄1f图书馆系统|1);printf

温馨提示

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

评论

0/150

提交评论