数据结构课程设计报告图书馆管理基本业务模拟.doc

上传人:文库蛋蛋多 文档编号:4184434 上传时间:2023-04-09 格式:DOC 页数:22 大小:400KB
返回 下载 相关 举报
数据结构课程设计报告图书馆管理基本业务模拟.doc_第1页
第1页 / 共22页
数据结构课程设计报告图书馆管理基本业务模拟.doc_第2页
第2页 / 共22页
数据结构课程设计报告图书馆管理基本业务模拟.doc_第3页
第3页 / 共22页
数据结构课程设计报告图书馆管理基本业务模拟.doc_第4页
第4页 / 共22页
数据结构课程设计报告图书馆管理基本业务模拟.doc_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《数据结构课程设计报告图书馆管理基本业务模拟.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计报告图书馆管理基本业务模拟.doc(22页珍藏版)》请在三一办公上搜索。

1、湖南科技大学课 程 设 计 报 告题目: 图书馆管理基本业务模拟 院 系: 计算机学院 专业年纪: 0 学 号: 学生姓名: 指导老师: 2010年12月30日目 录1设计任务书31.1题目与要求31.2涉及知识点31.3输入输出分析31.4测试数据分析32概要设计4 2.1结构体类型定义及函数声明4 2.2主程序流程5 3详细设计73.1数据类型实现73.2程序伪码3.3程序主要流程图4调试分析 4.1问题分析及回顾 4.2算法时空分析 4.3设想改进 4.4经验和体会5用户使用说明 5.1操作说明及详细步骤6测试结果 6.1测试数据及结果7参考文献8致谢1、 设计任务书1.1题目与要求 题

2、目:编写程序实现图书馆管理业务的模拟。 要求:书的登记内容包括书号、书名、著作者、出版社、现存量和库存量。并且按书号建立索引表以提高索引效率。程序要能够实现一下功能:a.采编入库:新购一本书,确定书号后,则登记到图书账目中,如果表中以有,则只将库存增加。b.借阅:如果书的库存量大于0,则借出一本书,登记借阅者的借书证号和归还日期,改变现存量。C.归还:注销对借阅者的登记,改变书的现存量。1.2设计知识点 系统时间函数、系统调用库函数、索引表建立、文件、结构体、指针、链表、数组、循环语句、选择语句、输入输出控制、宏定义、自定义类型等。1.3输入输出分析 普通输入:对于书籍内容登记及读者信息宜采用

3、结构体进行存储,其中的具体单项信息则采用字符数组或整形变量直接存续,考虑到书籍及读者信息的具体内容,字符数组长度为20较为合适。 对话式输入:为便于转换及比较,对话式输入采用字符数组进行存储.为保障程序的健壮性,同时限制对话式输入的格式,对于非法的会话式输入则提示用户操作失败的原因;此外为保障用户在任意一步回话操作中都能任意退出,在程序中设计一“特殊按键”,当输入时,则程序返回上一层。程序输出:对于书籍信息及读者借阅信息的显示,考虑到美观及直观的因素,则采用表格的形式进行显示;此外对于借书及还书过程中,为保障操作无误,则在用户选择后,对用户的操作进行输出,并请用户进行确认;在对话式输入中,对于

4、非法输入,程序显示的提示信息采用下划线进行强调,以引起用户的注意。1.4测试数据分析书籍登记入库操作中如果书籍登录号超过六位则应提示”格式错误”;如果书号或书名已存在,则应提示”书籍已存在”。如果操作正确,则提示“书籍已登记入库”。在书刊检索中,如果书刊存在则应显示书籍信息,如果不存在则应提示“书籍不存在”。在读者信息登记操作中,如果读者以存在,则应提示”读者已存在”.否则,提示“成功添加读者”。在读者登录过程中,如果读者信息错误,则提示“用户名或密码错误”,否则登录操作。借书还书中的输出类似于检索中的提示。2、 概要设计2.1结构体类型及函数声明结构体: 图书信息结构体类型 BOOK 读者信

5、息结构体类型READER 日期结构体类型 DATE索引项结构体类型IDXTYPE 索引表结构体类型 ISXLIST函数声明:int Info_show(BOOK *p,int n)/书籍信息显示函数int BSave(BOOK *L)/书籍信息导出函数int BLoad(BOOK *L)/书籍信息导入函数int BOOK_SORT(BOOK *B,BOOK *P)/按照书号排序函数int Store_in_lib(BOOK *B)/书籍登记入库函数int RSave(READER *R)/读者信息导出函数 int RLoad(READER *R)/读者信息导入函数READER* Search_

6、r(READER *R,READER T)/查找读者函数BOOK* Search_writer(BOOK *B)/按作者查找函数BOOK* Search_name(BOOK *B,int n)/按书名查找函数IDX_LIST* IDX_FORM(BOOK *B)/索引表生成函数BOOK* Search_num(BOOK *B,int n)/按书号查找函数int Search_menu(BOOK *B)/书籍检索菜单int If_stop(DATE *time)/判断时间循环是否停止函数DATE* RTIME()/还书日期函数int Lend(READER *tp,BOOK *B)/借书函数in

7、t Return(READER *tp,BOOK *B)/还书模块int Log_menu(READER *R,READER *tp,BOOK *B)/读者登录函数int Log_in(READER *R,BOOK *B)/读者登录模块READER* REA_SORT(READER *R,READER *p)/读者排序函数int TEACHER_LOG()/管理员登录函数int REA_INSERT(READER *R)/读者信息插入函数int Teacher(READER *R)/管理员登录主调函数int Library_menu(void)/管理函数主菜单int WELCOME()/系统欢

8、迎菜单int Show_all(BOOK *B)/藏书一览函数int CHOICE(BOOK *B,READER *R)/函数主调菜单2.2主程序流程2.2.1主程序利用switch()语句实现各个模块的调用,主函数调用如下图所示。主程序根据不同值主调函数1调用登记入库函数3调用书刊检索模块4调用教师登录模块5调用书籍显示模块6退出系统2调用读者登录模块2.3各模块的层次关系 主函数对各主要模块进行调用,各个主要模块又分别调用其他子模块。下面用各主要模块简要流程图表示说明。询问读者是否继续此操作用户确认后调用BOOK_SORT()函数调用Info_show()函数由键盘读取书籍信息登记入库主模

9、块 登记入库主模块 用户登录主模块录入借书号及密码,并保存在读者指针中用户登录主模块 调用Search_r()函数,如存在则返回读者指针验证用户后调用Log_menu()函数,再根据用户操作,调用Lend(),Rturn(),及Search_num()等函数真书刊检索主模块录入读者的检索方式,并返回选项书刊检索主函数根据读者的选择,分别调用Search_num(),Search_name(),Search()等书刊检索函数,如找到则返回指针,否则返回空指针;在每个函数中分别调用Info_show()函数教师登录模块调用REA_INSERT()函数,进行添加读者操作调用TEACHER_LOG()

10、,确认用户权限,如果认证通过,则返回1,否则返回0管理员登录模块真3、 详细设计3.1数据类型实现 图书信息结构体 读者信息结构体typedef struct BOOK_INFO typedef struct READERchar B_num20; char Rea_name20; char B_name20; char Rea_code20;char B_writer20; char Rea_num20;char B_publer20; BOOK lenb5; char B_ptime20; DATE Rtime5;int Now_store; struct READER *next;int

11、 Total_store; READER; struct BOOK_INFO *next; BOOK;还书日期结构体 索引表结构体typedef struct typedef struct int year; IDXTYPE idxterm100; int month; int len; int day; IDX_LIST; DATE;索引项结构体typedef struct IDX_TERMchar num8; int len; BOOK *P; IDXTYPE;3.2程序伪码 int Y_N()/根据读取的字符给flag赋不同值,并返回flag的值scanf(ch);if(ch0=Y|ch

12、0=y) flag=1;if(ch0!=y&ch0!=Y&ch0!=n&ch0!=N)flag=0;if(ch0=N|ch0=n) flag=-1;int Store_in_lib(BOOK *B)/读取书籍信息并经用户确认后插入书籍链表B中q=B;doif(!(tp=(BOOK*)malloc(sizeof(BOOK)return error;*tp=NULB;/所用信息都为空的书籍宏定义doscanf(tp-B_num);while(strlen(tp-B_num)!=6); for(exit=B-next;exit&strcmp(exit-B_num,tp-B_num);exit=exi

13、t-next);/判断书号是否已经存在 if(!exit) scanf(tp-B_name); for(exit=B-next;exit&strcmp(exit-B_name,tp-B_name);exit=exit-next);/判断书是否已经存在 if(exit) exit-Now_store+; exit-Total_store+; else scanf(tp);tp-next=NULL;Info_show(tp,0);do/确认是否登记入库Flag=Y_N();while(!flag);if(flag=1)BOOK_SORT(B,tp);/插入链表if(flag=-1) free(tp

14、);/释放空间do/确认是否继续flag=Y_N();while(!flag);while(flag=1);return 0;BOOK* Search_writer(BOOK *B)/从键盘读取著作者的名字,在书籍链表中查找,如果存在则返回满足/条件的指针,否则返回空指针scanf(writer);p=B-next;while(p)if(!(strcmp(p-B_writer,writer)break;p=p-next;if(p)Info_show(p,0);return p; BOOK* Search_name(BOOK *B)/从键盘读取书籍名称,如果书籍存在,则返回书记信息指针,否则返/

15、回空指针scanf(name);p=B;while(p)if(!(strcmp(p-B_name,name)break;p=p-next;if(p)p-next=NULL;Info_show(p,0);return p;IDX_LIST* IDX_FORM(BOOK *B)/根据书籍信息链表B建立书号索引表,并返回索引表的头指针if(!(List=(IDX_LIST*)malloc(sizeof(IDX_LIST)return NULL;List-len=0;List-idxterm0.len=0;/初始化tp=B-next;if(tp)doif(i=0&List-idxterm0.len=0

16、)strcpy(List-idxtermi.num,tp-B_num);memcpy(flag,tp-B_num,2);List-idxtermi.len=1;List-len=1;tp=tp-next;continue;/将第一本书的书号做为索引表的第一项并以第一项/的前两个字符作为关键字memcpy(temp,tp-B_num,2);/将tp-B_num的前两个字符赋值/给temp if(strcmp(flag,temp) i+;strcpy(List-idxtermi.num,tp-B_num);memcpy(flag,tp-B_num,2);List-idxtermi.len=1;/增

17、加新的索引项elseList-idxtermi.len+;/记录关键字相同的数量List-len=i+1;tp=tp-next;while(tp);return List;BOOK* Search_num(BOOK *B,int n)/根据书号查找书籍,如果找到则返回书籍指针,并使书籍的现存量n;/否则返回空指针BOOK *tp;int i,j,Len=0,flag=0;char num8;IDX_LIST *IList;if(!(IList=(IDX_LIST*)malloc(sizeof(IDX_LIST)return NULL;IList-len=0; tp=B-next;if(tp)I

18、List=IDX_FORM(B);elsetp=NULL;return tp;scanf(num);for(i=0;ilen&!flag;i+)if(strcmp(num,IList-idxterm0.num)idxtermi+1.num)len-1)/比较与索引表下一项的大小for(j=0;jidxtermj.len;/计算指针移动的次数for(j=1;jnext;/移动指针for(j=1;jidxtermi.len;j+)if(!strcmp(tp-B_num,num)if(!(nNow_store=0)tp-Now_store+=n;/根据主调函数改变现存量flag=1;break;tp

19、=tp-next;if(j-1=IList-idxtermi.len&!flag)/没找到tp=NULL;return tp;return tp;int Search_menu(BOOK *B)/根据用户的选择对书籍信息链表B进行不同方式的查找doscanf(ch);op=atoi(ch);while(op3); switch(op)case 1: Search_num(B,0);break;case 2: Search_name(B);break;case 3: Search_writer(B);break;return 0;int If_stop(DATE *time)/判断时间time是

20、否符合实际if(time-month=4|time-month=6|time-month=9|time-month=11) if(time-dayyear%4)&(time-year%100)|!(time-year%400) num=29; else num=28;/判断2月的天数if(time-month=2&time-daydaytm_year+1900;m=timeinfo-tm_mon+1;d=timeinfo-tm_mday;rtime-year=y;rtime-month=m;rtime-day=d;rtime-day+=60;do switch(rtime-month)case

21、 4:case 6:case 9:case 11: if(rtime-day30) rtime-month+; rtime-day-=30; break; case 2:if(!(rtime-year%4)&(rtime-year%100)|!(rtime-year%400) num=29; else num=28; if(rtime-daynum) rtime-month+; rtime-day-=num; break; default:if(rtime-day31) rtime-month+; rtime-day-=31; if(rtime-month12) rtime-year+; rt

22、ime-month-=12; while (If_stop(rtime);return rtime;int Lend(READER *tp,BOOK *B)/在图书链表B中查找用户的书籍,找到后将书籍登记到读者tp名下/并将书籍存量减一BOOK *btp=NULL;int i=0;while(strcmp(tp-lenbi.B_num,NUL)&iNow_store!=0)tp-lenbi=*btp;tp-Rtimei=*RTIME();return 0;int Return(READER *tp,BOOK *B)/在图书链表B中查找用户的书籍,找到后将书籍从读者tp名下删除/并将书籍存量减一

23、int i=0;BOOK *p;p=Search_num(B,1);while(strcmp(p-B_num,tp-lenbi.B_num)i+;if(i4)for(;ilenbi=tp-lenbi+1;tp-Rtimei=tp-Rtimei+1;tp-lenb4=NULB;return 0;READER* REA_SORT(READER *R,READER *p)READER *tp;tp=R;while(tp-next)if(strcmp(p-Rea_num,tp-next-Rea_num)next;return tp;int TEACHER_LOG()/教师登录验证,通过则返回0,否则返

24、回1 scanf(name);scanf(code);if(!strcmp(name,李云高)&!strcmp(code,121513)return 0;elsereturn 1;int REA_INSERT(READER *R)/从键盘录入读者信息,并以指针存放,经用户确认后插入读者信息链/表R中do p=R;while(p-next)p=p-next;if(!(tp=(READER*)malloc(sizeof(READER)return error;scanf(tp);tp-next=NULL;p=REA_SORT(R,tp);tp-next=p-next;p-next=tp;do fl

25、ag=Y_N();while(!flag); while (flag=1);return 0;int Teacher(READER *R)/登陆后,如确认要添加用户,则将用户顺序插入读者链表R中 if(!TEACHER_LOG()REA_INSERT(R);return 0;3.3程序主要流程图 登记入库流程图:继续?free(tp)Book_sort()入库?Info_show(tp)strcmp(tp,exit)exit-B_now+读取书籍信息10011返回主函数书刊检索模块流程图:根据检索菜单进行选择Search_num(B)Search_writer(B);Search_name(B

26、)是否继续?10返 回借书模块流程图进 入 模 块是否达到上限?0Btp=search_num(B)btp返回主函数Tp-lenbi=*btp;Tp-Rtimei=*RTIME();4.调试分析 4.1问题分析与回顾 问题1:先后输入两个字符串,后者自动连接到前者,从而影响前者的值。 分析: 输入字符串越界,导致编译器错误。 解决: 增加字符数组的长度。 问题2:当进行选择时,输入为乱码时,程序崩溃。 分析: 读取选项的为字符变量,导致编译错误。 解决: 利用字符串存储选项。 问题3:文件存储时,导致程序崩溃。 分析: 不同模块中都有存储操作,导致文件存储混乱。 解决: 尽在程序正常退出时,进

27、行文件存储操作。 问题4:利用索引表搜索书时,程序崩溃! 分析:在指针移动过程中出现空指针的调用。 解决:仔细设置,在必要出添加判断。 4.2算法时空分析 建立索引表的算法: 建立索引表达算法的空间复杂度取决于书籍登录号的具体情况,在最差的情况下,即每本书的书号前两位都不同,则空间复杂度S(n)=O(o); 就时间复杂度而言,由于建立过程中,需要访问所有的书籍链表节点,所以时间复杂度T(n)=O(n). 书号查找的算法分析 书号查找借助于索引表来实现,在查找过程中,由于需要和索引表中每一个索引项进行比较,则在最坏的情况下,时间复杂度为T(n)=O(n).4.3设想改进 在系统中,仍缺少部分功能

28、,如添加管理员帐号,删除书籍,输出用等,同时在作者索引方面也存在问题。此外在还书日期实现方面感觉仍显复杂,有待改进。 在建立所以表的方法上,时间复杂度及空间复杂度仍不尽如人意。查找方面的效率的提高又待有进一步利用树和图的搜索方法进一步改进。4.4经验和体会 通过课程设计,自己利用C语言的能力又得到了进一步的提高;而且对数据结构也有了一定的认识。最大的提高来自于解决问题的过程,在不断思考及解决问题的过程中,自己对语言的把握及对思维方式的锻炼得到提高。 编程的过程中,自己的能力不是很强,与学习好的毗邻而作,感到了压力。编程中不仅锻炼了我们的能力,同时使我对自己有了清醒的认识。此外自己的心理方面也得

29、到锻炼,因为编程中总是有这样那样的难题。 过程是艰辛的,但是当最终拿着自己的作品,心理的喜悦是难以言表的!时不待我,不管过去如何,我决心为明天努力奋斗。编程、编程、再编程!5.用户使用说明 本程序属学生课程设计作品,操作简单,对于您的每一步操作,系统都会给出提示,用户只要按照提示操作即刻。 本程序为图书馆管理业务模拟系统,只要的功能有书刊检索(书名、书号、作者)、教师登录、添加用户、浏览全部藏书、借书、还书、登记 新书入库等功能。 特别提醒:为方便用户可随时,返回主菜单,本程序设置特殊按键,输入“”,程序便会返回主菜单;管理员操作需密码帐号,如需操作请联系制作者;本程序内设实验读者帐号。借书号:0905010322 密码:010322 欢迎您的使用!6.测试结果主函数非法输入测试登记入库测试 读者登录数据测试借书操作测试还书操作测试藏书一览测试管理员登录测试添加用户测试7参考文献1 严蔚敏 吴伟民等 数据结构(C语言版)清华大学出版社 20102 蒋清明 向德生等 C语言程序设计 人民邮电出版社 20083尹德淳 龙脉工作室 C函数速查手册 人民邮电出版社 20098.致谢 在此谨对那些无私帮助我的同学以及无私教育我的辛勤的老师及学院领导表示感谢,谢谢你们的帮助。每一个语句、每一个算法,都来自于你们的无私帮助及辛勤教诲。

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

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号