数据结构课程教学设计报告图书管理方案计划系统.doc
.课程设计报告 课设课题: 课程设计图书管理系统 学 院: 电 子 信 息 学 院 专 业: 网 络 工 程 姓 名: 班级学号: BX1213 指导教师: 张艳 报告日期: 2013.12.12 目 录一、需求分析11.1 系统开发背景和意义11.2 设计题目与要求1二、总体结构设计2三、各子模块设计33.1 初始化图书信息33.2 系统主界面33.3 采编入库43.4 输入读者信息43.5 借阅图书43.6 归还图书63.7 查询图书信息73.8 查询读者信息7四、程序设计调试情况分析9五、测试结果125.1 欢迎界面125.2 初始化图书信息125.3 系统主界面135.4 采编入库135.5 输入读者信息145.6 借阅图书155.7 归还图书165.8 查询图书信息165.9 查询读者信息175.10 保存文件,退出18六、总结19七、参考文献20八、附录(源代码)21.一、需求分析1.1 系统开发背景和意义图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书管理的效率。因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。图书管理系统需要满足来自图书馆工作人员、普通用户和借阅者三方面人员的需求。图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时还可通过图书编号等查询相应的借阅情况;普通用户的需求是查询图书馆所存的图书的相关情况;图书借阅者的需求是查看自己的相关信息及查询自己的借阅情况。1.2 设计题目与要求【问题描述】设计一个计算机管理系统完成图书管理基本业务。【基本要求】1)每种书的登记内容包括书号、书名、著作者、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)系统主要功能如下:*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;*归还:注销对借阅者的登记,改变该书的现存量。二、总体结构设计有八个模块1)图书初始化输入图书的一些信息,编号、作者、书名、数量,使有一定的库存。2)新书入库新书采编入库,输入编号后如果有次数只需输入数量,没有则继续输入书名、作者、数量。3)添加读者信息读者信息初始化,输入读书证号和姓名,只有输入书证号和姓名才能进行借书还书4)借书模块读者输入读书证号,证号存在输入要借的图书编号,不能借同一本书,如果借书数量以达到最大也不能借书。5)还书模块归还已借的图书,要先输入读者书证号,书证号存在继续输入要还的图书编号,图书编号存在并且借来此书,归还成功。6)查询图书信息7)查询读者信息可查询读者姓名书证号,借了几本书,都是什么书和还书日期,还可以借几本书。8)退出退出读书管理系统并保存读者和图书信息。图书管理系统 查询操作模块读者管理模块借阅操作模块图书管理模块理退出图书信息查询读者信息查询还书系统借书系统输入读者信息采编入库初始化图书信息图2-1 主控模块三、各子模块设计3.1 初始化图书信息进入系统后首先进行图书初始化,输入图书的信息。开始输入图书编号、名称、作者和图书数量进入系统图3-1 初始化图书信息流程图3.2 系统主界面初始化之后,进入系统,显示功能列表,可选择任意系统,但在借书之前先要输入读者信息。开始输入功能所对应的数字输入的数字小于0大于6 否错误!请重新输入 是执行所选功能图3-2 系统主界面流程图3.3 采编入库选择采编入库的功能后,先输入图书编号判断是否存在,若存在,则在原有记录上加上添加的图书数量;若不存在,则加入新的记录。录入图书信息判断是否有此图书是在原有的纪录上加上现有的图书数量否向系统中加入新纪录图3-3 采编入库流程图3.4 输入读者信息选择读者登记后,输入读者编号跟姓名。开始输入读者信息:读者书证号、姓名结束图3-4 输入读者信息流程图3.5 借阅图书选择借阅图书功能后,输入读者证号,判断该读者是否存在,若存在则输入借阅图书的编号,判断该图书编号是否存在,若存在,则判断读者借阅的图书数量是否满了和是否借阅了相同的书籍,判断成功后,则输入归还该图书的日期,该图书现有量减一,借阅成功;若读者不存在则返回。输入读者书证号判断读者是否存在否输出次读者编号不存在!按任意键返回是输入要借的图书编号判断图书编号是否存在否输出此图书编号不存在!按任意键返回是看是否还有此图书否输出此书已借完,按任意键返回是看读者的借书数目是否满了是输出借书数目已满不能借书,按任意键返回否看读者是否借了相同的书是输出同一读者不能借相同的两本书否输入归还图书的日期图书现有数量减1输出读者结束成功,按任意键返回结束图3-5 借阅图书流程图3.6 归还图书实现归还图书功能时,首先输入读者编号,并判断是否存在,若不存在就按任意键返回,;若存在输入归还的图书编号并判断是否存在,若归还图书编号不存在,则返回。存在后,将读者借阅该图书的信息清空,该图书的现有量加一。最后按任意键返回输入要还书的读者编号判断读者编号是否存在 否输出读者编号不存在按任意键返回是输入读者还书编号判断图书编号是否存在否输出此图书编号不存在按任意键返回 是此图书编号和还书日期等于0现有图书数量加1输出读者还书完毕,按任意键返回结束图3-6 归还图书流程图3.7 查询图书信息查询图书信息时,输入图书的编号,判断是否存在。不存在则返回;存在则输出图书的编号,书名,作者,现有量,跟库存量。判断图书信息是否为空 是输出此图书编号不存在按任意键返回 否输出图书信息:编号、名称、作者、现有和库存结束图3-7 查询图书信息流程图3.8 查询读者信息查询读者信息时,首先判断读者的编号是否存在,不存在就按任意键返回。若存在,则输出读者的证号,姓名,和借阅的图书编码及其还书日期。判断读者信息是否为空 是输出此读者编号不存在按任意键返回否输出读者书证号、姓名、图书编码和还书日期输出读者信息打印完毕结束图3-8 查询读者信息流程图四、程序设计调试情况分析在整个课程设计中,我们遇到了许多的问题。有些问题吧,我们在苦思冥想的时候,突然我们的编译器显示出了正确的结果,当我们欣喜若狂的在运行下一次的时候又会出现相同的问题,在借阅的过程中,在一个读者借阅了两本书以上的时候,上一本书的归还日期上还有下一本书上的编号,最后一本书输出的才是正确的结果。下图是借阅了两本书的截图:图4-1看到这里我们也知道是第一本书的还书日期的地址空间跟第二本书的编号连接在了一起导致输出的时候一直到第二本书编号的的字符串后面的/0结束。最后发现是我们在定义还书日期这个字符串的时候开辟的空间太小。我们把char limit_date8;改为char limit_date10就好了。图4-2五、测试结果5.1 欢迎界面程序运行显示“欢迎使用图书管理系统”,按任意键进入到主菜单如图5-1所示。图5-1 欢迎界面5.2 初始化图书信息在没有文件的时候会进入到初始化界面,需要输入一本图书的相关信息,如图5-2所示。图5-2 初始化图书信息5.3 系统主界面接着进入的系统的主菜单,如图5-3所示。图5-3 系统主界面5.4 采编入库实现采编入库功能按照系统提示输入信息。如图5-4。如果该图书已存在,则直接输入图书的数量如图5-5所示。图5-4 采编入库(书不存在)图5-5 采编入库(书已存在)5.5 输入读者信息按照要求输入读者信息,如图5-6所示。图5-6 输入读者信息5.6 借阅图书按照要求先输入读者证号,在输入借阅的图书编号如图5-7所示。如果读者已经借阅了一本书之后不能借阅同一本图书如图5-8所示。图5-7 借阅图书图5-8 同一个读者不能借阅同一本图书5.7 归还图书归还图书的要求按着图5-9输入即可。图5-9 归还图书5.8 查询图书信息图5-10 是没有借阅之前的图书的相关信息,图5-11是读者借阅了图书之后的信息,只改变了现有量。图5-10 借阅登记后图5-11 归还图书后5.9 查询读者信息查询读者的信息时,会输出相关借阅的图书编号以及还书日期如图5-12,5-13所示。图5-12 查询读者信息(一)图5-13 查询读者信息(二)5.10 保存文件,退出在系统的主菜单后,按0 功能保存并退出系统。图5-14 文件保存六、总结个人觉得课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程. 在生活中可以说得是无处不在。因此作为新世纪的大学来说能够分析,并解决程序中出现的问题是十分重要的。课程设计就能体现到这一方面。能够将你所学到的理论跟实际结合在一起。通过本次课程设计感慨良多。从课堂上听到的到课后应用到的根本就不是一回事。课堂上,老师在上面说,自己在下面听,到也能听懂。可是到了应用上,自己倒也是知道要用到哪方面的内容,但是偏偏不知道从何处下手;好不容易写好的一小段代码,还要跟其他功能不相冲突,这又需要我们自己去想办法去兼容好他们。通过本次课程设计试我懂得理论要跟实践相结合。正所谓“台上十分钟,台下十年功”,别人在台上表演了十分钟,你觉得很容易,可那里知道别人在下面做的努力呢。同样的,我们在课堂上听老师讲确实觉得是那么回事,但是真正做下去,也只有自己知道是何种滋味。理论始终是理论,不能都熟练应用自己所学到的知识,到头来也是一场空。在这次的课程设计过程中,我们也遇到了不能解决的难题,比如说在读者查询的时候,第二个读者始终会覆盖第一个读者的数据。我们始终没有搞明白问题的所在,只知道不是在输出读者信息的问题,应该是添加读者过程中指针始终指在第一个地址,没有移动。我们按照查询图书的函数重新编写了一次还是同样问题。一直到答辩前一天晚上还没有解决,之后只能放弃。还有在最开始的时候我们的程序功能并没有清屏功能,整个界面看起来并不是那么整洁。于是我用用getch();system(“cls”);来进行清屏,最后会出先一个小问题,在我们查询了一些资料后,又再次基础上加上了goto end;这个函数来加以完善。这次课程设计,我们也遇到了很多问题,比如说,我们再输入第二个读者的信息后会覆盖第一个读者的信息,想了半天没有弄懂是哪里错了,最后才看出来我们定义的结构体指针没有移动,导致我们输入的读者信息一直存放在同一个地址中。也有些不懂需要在网上查询的代码,组员之间相互配合,不懂就询问其他同学或者查询资料亦或者自己去弄懂问题的根结,团结协作的精神在这次课程设计中表现的淋漓尽致。我们不仅将以前的知识复习一遍;同时也弄懂了一些平常自己似懂非懂的;最后同学之间的友谊也慢慢变的深厚起来小组分工:孙泽铭:采编入库、查询图书信息、查询读者信息黄响:添加读者、借阅图书、归还图书七、参考文献1 严蔚敏 吴伟民编著 数据结构 清华大学出版社,20002 黄国瑜 叶乃菁编著 数据结构 清华大学出版社,2001 3 胡学钢编著 数据结构算法设计指导 清华大学出版社,19994 王士元编著 数据结构与数据库系统 南开大学出版社,20005 李强根主编 数据结构(C+描述) 中国水利水电出版社, 20016 杨正宏编著 数据结构 中国铁道出版社,20027 胡学钢编著 数据结构算法设计指导 清华大学出版社,19998 殷人昆 徐孝凯编著 数据结构习题解析 清华大学出版社,20029 李春葆编著 数据结构习题与解析 清华大学出版社,200110 咨讯教育小组编著 数据结构数据结构版 中国铁道出版社,2002八、附录(源代码)#include#include #include #include#define Max 4 typedef struct bookchar book_num10;char book_name20;char book_writer10;int book_xy;int book_kc;int n;struct book *next;BK;typedef struct borrowchar borrow_book_num10;char limit_date10;BO;typedef struct readerchar reader_num10;char reader_name10;int right;int m;BO borrowMax;struct reader *next;RD;BK *h_book;RD *h_reader;int n=0;int m=0;void Login(); int Menu(); void Init(); void Menu_select(); void Insert_New_Book(); void add_reader();void Print_reader(); void Print_book(); void Borrow_Book(); void Return_Book(); void Save(); void Save_Book(); void Save_Reader(); void Load();void Load_Reader(); void Load_Book(); void Login()system(cls);printf(nnntt*n);printf(nnntt* 欢迎使用图书管理系统 *n);printf(nnntt*n);printf(nnntt 按任意键进入系统.);getch(); system(cls);int Menu() /*主菜单*/ int dm;printf(ntt图书管理系统主菜单n);printf(=n);printf(*t1-采编入库 n);printf(*t2-登记读者 n); printf(*t3-借阅登记 n);printf(*t4-还书管理 n);printf(*t5-查询图书信息 n);printf(*t6-查询读者信息 n);printf(*t0-退出系统 n);printf(=n);printf(请选择相应的代码:); for(;) scanf(%d,&dm); /dm输入的数字if(dm6)printf(n错误!请重新输入:);else break;return dm; void Menu_select()/*主菜单选择函数*/for(;) switch(Menu() /*功能选择*/ case 0: system(cls); Save();printf(nnt文件保存成功!n); printf(nnt欢迎下次使用本系统!n); getch(); exit(0);case 1: Insert_New_Book();break; case 2: add_reader();break;case 3: Borrow_Book();break;case 4: Return_Book();break;case 5: Print_book();break;case 6: Print_reader();break;default:printf(n错误!);exit(0);void Init() /*初始化*/BK *p0;printf(n图书初始化开始,请输入图书信息.n包括编号.书名.数量.n);p0=(BK*)malloc(sizeof(BK);h_book=p0;printf(n请输入图书信息:n);printf(图书编号:); /*输入图书编号(唯一)*/scanf(%s,p0-book_num);printf(图书名称:); /*输入图书名称*/scanf(%s,p0-book_name);printf(图书作者:); /*输入图书作者*/scanf(%s,p0-book_writer);printf(图书数量:); /*输入图书数量*/scanf(%d,&p0-book_kc);p0-book_xy=p0-book_kc; /*开始时图书现有量和库存量相等*/p0-next=NULL;p0-n=+n;printf(n图书信息初始化完毕!按任意键继续下一步操作.n);getch();system(cls);void Insert_New_Book()/*新书入库*/BK *p,*p0,*p1; p=p1=h_book;printf(n新书入库模块.n);printf(n请输入新书信息.n包括书号.书名.数量.n);p0=(BK *)malloc(sizeof(BK);printf(图书编号:);scanf(%s,p0-book_num);while(strcmp(p0-book_num,p1-book_num)!=0&p1-next!=NULL)p1=p1-next;if(strcmp(p0-book_num,p1-book_num)=0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/printf(n此编号图书已存在!直接入库!n); printf(图书数量:); scanf(%d,&p0-book_kc); p1-book_kc+=p0-book_kc; p1-book_xy+=p0-book_kc;else/*若不存在,则需要输入其他的信息,然后在进行插入操作*/printf(图书名称:);scanf(%s,p0-book_name);printf(图书作者:);scanf(%s,p0-book_writer);printf(图书数量:);scanf(%d,&p0-book_kc);/库存数量while(p-next) p=p-next;if(h_book=NULL) h_book=p0; /*此处分两种情况,链表中没有数据,head直接指向p0处*/else p-next=p0; /*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/ p0-next=NULL; p0-book_xy=p0-book_kc; p0-n=+n; printf(n新书入库完毕!按任意键继续下一步操作.n);getch();system(cls);void add_reader()/*添加读者*/ RD *p0; int i; printf(n读者初始化开始,请输入读者信息.n包括书证号.姓名.n);p0=(RD*)malloc(sizeof(RD); /*申请新结点存储空间*/h_reader=p0;printf(n请输入读者的信息:n); printf(读者书证号:); scanf(%s,p0-reader_num); printf(读者姓名:); scanf(%s,p0-reader_name); p0-right=0; for(i=0;iborrowi.borrow_book_num,0); /*所借图书直接置为(即没有借书)*/strcpy(p0-borrowi.limit_date,0); p0-next=NULL;p0-m=+m;printf(n读者信息初始化完毕!按任意键继续下一步操作.n); getch();system(cls);void Borrow_Book() /*借书模块*/BK *p0; RD *p1;char bo_num10,rea_num10,lim_date8;int i;p0=h_book; p1=h_reader;printf(n借书模块.n);printf(n请输入借书的读者书证号:); scanf(%s,rea_num);while(p1-next!=NULL&strcmp(rea_num,p1-reader_num)!=0) p1=p1-next; if(p1-next=NULL&strcmp(rea_num,p1-reader_num)!=0) printf(n此读者编号不存在!按任意键返回.n);goto END; printf(n请输入你要借的书的编号:); scanf(%s,bo_num);while(strcmp(bo_num,p0-book_num)!=0&p0-next!=NULL) p0=p0-next; if(p0-next=NULL&strcmp(bo_num,p0-book_num)!=0) printf(n此图书编号不存在!按任意键返回.n);goto END;else if(p0-book_xyrightMax|p1-right=Max) printf(n不好意思,借书数目已满!不能借书!n按任意键返回.);goto END;else if(strcmp(p1-borrow0.borrow_book_num,0)!=0) for(i=0;iborrowi.borrow_book_num,bo_num)=0)printf(n抱歉!同一个读者不能同借两本相同的书!n按任意键返回.);goto END;else if(strcmp(p1-borrowi.borrow_book_num,0)=0) printf(n请输入你要归还图书的日期:); scanf(%s,lim_date); strcpy(p1-borrowp1-right+.borrow_book_num,bo_num); strcpy(p1-borrowp1-right-1.limit_date,lim_date); p0-book_xy-; printf(n读者编号%s借书完毕!按任意键继续下步操作.,p1-reader_num); goto END; else printf(n请输入你要归还图书的日期:); scanf(%s,lim_date); strcpy(p1-borrowp1-right+.borrow_book_num,bo_num); strcpy(p1-borrowp1-right-1.limit_date ,lim_date ); p0-book_xy-;p0-book_kc-; printf(n读者编号%s借书完毕!按任意键继续下步操作.,p1-reader_num); goto END; END:getch(); system(cls); void Return_Book() /*还书模块*/BK *p; RD *q;int i,j,find=0;char return_book_num10,return_reader_num10;p=h_book; q=h_reader;printf(n还书模块.n);printf(n请输入要还书的读者编号:); scanf(%s,return_reader_num); while(q-next!=NULL&strcmp(return_reader_num,q-reader_num)!=0) q=q-next; if(q-next=NULL&strcmp(return_reader_num,q-reader_num)!=0)find=2;printf(n此读者编号不存在!按任意键返回.n);goto end;printf(n请输入读者还书的编号:);scanf(%s,return_book_num); while(p-next!=NULL&strcmp(return_book_num,p-book_num)!=0)p=p-next; if(p-next=NULL&strcmp(return_book_num,p-book_num)!=0)find=2;printf(n错误!此图书编号不存在!按任意键返回.n);goto end; for(i=0;iborrowi.borrow_book_num)=0) /*如果此读者借了此书*/find=1; for(j=i;jborrowj.borrow_book_num,q-borrowj+1.borrow_book_num); strcpy(q-borrowj.limit_date,q-borrowj+1.limit_date); strcpy(q-borrowMax-1.borrow_book_num,0);strcpy(q-borrowMax-1.limit_date,0); p-book_xy+; q-right-; printf(n编号%s的读者还书完毕!按任意键继续下步操作.,return_reader_num); goto end; if(find=0) printf(n错误!此读者未借此书!按任意键返回.n); end: getch(); system(cls); void Print_book() /*查询图书信息*/BK *p;int i;char e10; p=h_book;printf(输入查询的图书编号:);scanf(%s, e);for(i=0;ibook_num,e)=0)printf(n图书信息如下:nn);printf(图书编号t图书名称t图书作者t现有t库存n);
收藏
- 资源描述:
-
.\
课程设计报告
课设课题: 课程设计——图书管理系统
学 院: 电 子 信 息 学 院
专 业: 网 络 工 程
姓 名:
班级学号: BX1213
指导教师: 张艳
报告日期: 2013.12.12
目 录
一、需求分析 1
1.1 系统开发背景和意义 1
1.2 设计题目与要求 1
二、总体结构设计 2
三、各子模块设计 3
3.1 初始化图书信息 3
3.2 系统主界面 3
3.3 采编入库 4
3.4 输入读者信息 4
3.5 借阅图书 4
3.6 归还图书 6
3.7 查询图书信息 7
3.8 查询读者信息 7
四、程序设计调试情况分析 9
五、测试结果 12
5.1 欢迎界面 12
5.2 初始化图书信息 12
5.3 系统主界面 13
5.4 采编入库 13
5.5 输入读者信息 14
5.6 借阅图书 15
5.7 归还图书 16
5.8 查询图书信息 16
5.9 查询读者信息 17
5.10 保存文件,退出 18
六、总结 19
七、参考文献 20
八、附录(源代码) 21
.\
一、需求分析
1.1 系统开发背景和意义
图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书管理的效率。因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。
图书管理系统需要满足来自图书馆工作人员、普通用户和借阅者三方面人员的需求。图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时还可通过图书编号等查询相应的借阅情况;普通用户的需求是查询图书馆所存的图书的相关情况;图书借阅者的需求是查看自己的相关信息及查询自己的借阅情况。
1.2 设计题目与要求
【问题描述】
设计一个计算机管理系统完成图书管理基本业务。
【基本要求】
1) 每种书的登记内容包括书号、书名、著作者、现存量和库存量;
2) 对书号建立索引表(线性表)以提高查找效率;
3) 系统主要功能如下:
*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;
*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;
*归还:注销对借阅者的登记,改变该书的现存量。
二、总体结构设计
有八个模块
1) 图书初始化
输入图书的一些信息,编号、作者、书名、数量,使有一定的库存。
2) 新书入库
新书采编入库,输入编号后如果有次数只需输入数量,没有则继续输入书名、作者、数量。
3) 添加读者信息
读者信息初始化,输入读书证号和姓名,只有输入书证号和姓名才能进行借书还书
4) 借书模块
读者输入读书证号,证号存在输入要借的图书编号,不能借同一本书,如果借书数量以达到最大也不能借书。
5) 还书模块
归还已借的图书,要先输入读者书证号,书证号存在继续输入要还的图书编号,图书编号存在并且借来此书,归还成功。
6) 查询图书信息
7) 查询读者信息
可查询读者姓名书证号,借了几本书,都是什么书和还书日期,还可以借几本书。
8) 退出
退出读书管理系统并保存读者和图书信息。
图书管理系统
查询操作模块
读者管理模块
借阅操作模块
图书管理模块
理
退出
图书信息查询
读者信息查询
还书系统
借书系统
输入读者信息
采编入库
初始化图书信息
图2-1 主控模块
三、各子模块设计
3.1 初始化图书信息
进入系统后首先进行图书初始化,输入图书的信息。
开始
输入图书编号、名称、作者和图书数量
进入系统
图3-1 初始化图书信息流程图
3.2 系统主界面
初始化之后,进入系统,显示功能列表,可选择任意系统,但在借书之前先要输入读者信息。
开始
输入功能所对应的数字
输入的数字小于0大于6
否
错误!请重新输入
是
执行所选功能
图3-2 系统主界面流程图
3.3 采编入库
选择采编入库的功能后,先输入图书编号判断是否存在,若存在,则在原有记录上加上添加的图书数量;若不存在,则加入新的记录。
录入图书信息
判断是否有此图书
是
在原有的纪录上加上现有的图书数量
否
向系统中加入新纪录
图3-3 采编入库流程图
3.4 输入读者信息
选择读者登记后,输入读者编号跟姓名。
开始
输入读者信息:读者书证号、姓名
结束
图3-4 输入读者信息流程图
3.5 借阅图书
选择借阅图书功能后,输入读者证号,判断该读者是否存在,若存在则输入借阅图书的编号,判断该图书编号是否存在,若存在,则判断读者借阅的图书数量是否满了和是否借阅了相同的书籍,判断成功后,则输入归还该图书的日期,该图书现有量减一,借阅成功;若读者不存在则返回。
输入读者书证号
判断读者是否存在
否
输出次读者编号不存在!按任意键返回
是
输入要借的图书编号
判断图书编号是否存在
否
输出此图书编号不存在!按任意键返回
是
看是否还有此图书
否
输出此书已借完,按任意键返回
是
看读者的借书数目是否满了
是
输出借书数目已满不能借书,按任意键返回
否
看读者是否借了相同的书
是
输出同一读者不能借相同的两本书
否
输入归还图书的日期
图书现有数量减1
输出读者结束成功,按任意键返回
结束
图3-5 借阅图书流程图
3.6 归还图书
实现归还图书功能时,首先输入读者编号,并判断是否存在,若不存在就按任意键返回,;若存在输入归还的图书编号并判断是否存在,若归还图书编号不存在,则返回。存在后,将读者借阅该图书的信息清空,该图书的现有量加一。最后按任意键返回
输入要还书的读者编号
判断读者编号是否存在
否
输出读者编号不存在按任意键返回
是
输入读者还书编号
判断图书编号是否存在
否
输出此图书编号不存在按任意键返回
是
此图书编号和还书日期等于0
现有图书数量加1
输出读者还书完毕,按任意键返回
结束
图3-6 归还图书流程图
3.7 查询图书信息
查询图书信息时,输入图书的编号,判断是否存在。不存在则返回;存在则输出图书的编号,书名,作者,现有量,跟库存量。
判断图书信息是否为空
是
输出此图书编号不存在按任意键返回
否
输出图书信息:编号、名称、作者、现有和库存
结束
图3-7 查询图书信息流程图
3.8 查询读者信息
查询读者信息时,首先判断读者的编号是否存在,不存在就按任意键返回。若存在,则输出读者的证号,姓名,和借阅的图书编码及其还书日期。
判断读者信息是否为空
是
输出此读者编号不存在按任意键返回
否
输出读者书证号、姓名、图书编码和还书日期
输出读者信息打印完毕
结束
图3-8 查询读者信息流程图
四、程序设计调试情况分析
在整个课程设计中,我们遇到了许多的问题。有些问题吧,我们在苦思冥想的时候,突然我们的编译器显示出了正确的结果,当我们欣喜若狂的在运行下一次的时候又会出现相同的问题,在借阅的过程中,在一个读者借阅了两本书以上的时候,上一本书的归还日期上还有下一本书上的编号,最后一本书输出的才是正确的结果。下图是借阅了两本书的截图:
图4-1
看到这里我们也知道是第一本书的还书日期的地址空间跟第二本书的编号连接在了一起导致输出的时候一直到第二本书编号的的字符串后面的‘/0’结束。最后发现是我们在定义还书日期这个字符串的时候开辟的空间太小。我们把 char limit_date[8];改为char limit_date[10]就好了。
图4-2
五、测试结果
5.1 欢迎界面
程序运行显示“欢迎使用图书管理系统”,按任意键进入到主菜单如图5-1所示。
图5-1 欢迎界面
5.2 初始化图书信息
在没有文件的时候会进入到初始化界面,需要输入一本图书的相关信息,如图5-2所示。
图5-2 初始化图书信息
5.3 系统主界面
接着进入的系统的主菜单,如图5-3所示。
图5-3 系统主界面
5.4 采编入库
实现采编入库功能按照系统提示输入信息。如图5-4。如果该图书已存在,则直接输入图书的数量如图5-5所示。
图5-4 采编入库(书不存在)
图5-5 采编入库(书已存在)
5.5 输入读者信息
按照要求输入读者信息,如图5-6所示。
图5-6 输入读者信息
5.6 借阅图书
按照要求先输入读者证号,在输入借阅的图书编号如图5-7所示。如果读者已经借阅了一本书之后不能借阅同一本图书如图5-8所示。
图5-7 借阅图书
图5-8 同一个读者不能借阅同一本图书
5.7 归还图书
归还图书的要求按着图5-9输入即可。
图5-9 归还图书
5.8 查询图书信息
图5-10 是没有借阅之前的图书的相关信息,图5-11是读者借阅了图书之后的信息,只改变了现有量。
图5-10 借阅登记后
图5-11 归还图书后
5.9 查询读者信息
查询读者的信息时,会输出相关借阅的图书编号以及还书日期如图5-12,5-13所示。
图5-12 查询读者信息(一)
图5-13 查询读者信息(二)
5.10 保存文件,退出
在系统的主菜单后,按‘0 ’功能保存并退出系统。
图5-14 文件保存
六、总结
个人觉得课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程. 在生活中可以说得是无处不在。因此作为新世纪的大学来说能够分析,并解决程序中出现的问题是十分重要的。课程设计就能体现到这一方面。能够将你所学到的理论跟实际结合在一起。
通过本次课程设计感慨良多。从课堂上听到的到课后应用到的根本就不是一回事。课堂上,老师在上面说,自己在下面听,到也能听懂。可是到了应用上,自己倒也是知道要用到哪方面的内容,但是偏偏不知道从何处下手;好不容易写好的一小段代码,还要跟其他功能不相冲突,这又需要我们自己去想办法去兼容好他们。通过本次课程设计试我懂得理论要跟实践相结合。正所谓“台上十分钟,台下十年功”,别人在台上表演了十分钟,你觉得很容易,可那里知道别人在下面做的努力呢。同样的,我们在课堂上听老师讲确实觉得是那么回事,但是真正做下去,也只有自己知道是何种滋味。理论始终是理论,不能都熟练应用自己所学到的知识,到头来也是一场空。
在这次的课程设计过程中,我们也遇到了不能解决的难题,比如说在读者查询的时候,第二个读者始终会覆盖第一个读者的数据。我们始终没有搞明白问题的所在,只知道不是在输出读者信息的问题,应该是添加读者过程中指针始终指在第一个地址,没有移动。我们按照查询图书的函数重新编写了一次还是同样问题。一直到答辩前一天晚上还没有解决,之后只能放弃。还有在最开始的时候我们的程序功能并没有清屏功能,整个界面看起来并不是那么整洁。于是我用用getch();system(“cls”);来进行清屏,最后会出先一个小问题,在我们查询了一些资料后,又再次基础上加上了goto end;这个函数来加以完善。
这次课程设计,我们也遇到了很多问题,比如说,我们再输入第二个读者的信息后会覆盖第一个读者的信息,想了半天没有弄懂是哪里错了,最后才看出来我们定义的结构体指针没有移动,导致我们输入的读者信息一直存放在同一个地址中。也有些不懂需要在网上查询的代码,组员之间相互配合,不懂就询问其他同学或者查询资料亦或者自己去弄懂问题的根结,团结协作的精神在这次课程设计中表现的淋漓尽致。我们不仅将以前的知识复习一遍;同时也弄懂了一些平常自己似懂非懂的;最后同学之间的友谊也慢慢变的深厚起来
小组分工:
孙泽铭:采编入库、查询图书信息、查询读者信息
黄响:添加读者、借阅图书、归还图书
七、参考文献
[1] 严蔚敏 吴伟民编著 《数据结构》 清华大学出版社,2000
[2] 黄国瑜 叶乃菁编著 《数据结构》 清华大学出版社,2001
[3] 胡学钢编著 《数据结构算法设计指导》 清华大学出版社,1999
[4] 王士元编著 《数据结构与数据库系统》 南开大学出版社,2000
[5] 李强根主编 《数据结构(C++描述)》 中国水利水电出版社, 2001
[6] 杨正宏编著 《数据结构》 中国铁道出版社,2002
[7] 胡学钢编著 《数据结构算法设计指导》 清华大学出版社,1999
[8] 殷人昆 徐孝凯编著 《数据结构习题解析》 清华大学出版社,2002
[9] 李春葆编著 《数据结构习题与解析》 清华大学出版社,2001
[10] 咨讯教育小组编著 《数据结构数据结构版》 中国铁道出版社,2002
八、附录(源代码)
#include
#include
#include
#include
#define Max 4
typedef struct book
{
char book_num[10];
char book_name[20];
char book_writer[10];
int book_xy;
int book_kc;
int n;
struct book *next;
}BK;
typedef struct borrow
{
char borrow_book_num[10];
char limit_date[10];
}BO;
typedef struct reader
{
char reader_num[10];
char reader_name[10];
int right;
int m;
BO borrow[Max];
struct reader *next;
}RD;
BK *h_book;
RD *h_reader;
int n=0;
int m=0;
void Login();
int Menu();
void Init();
void Menu_select();
void Insert_New_Book();
void add_reader();
void Print_reader();
void Print_book();
void Borrow_Book();
void Return_Book();
void Save();
void Save_Book();
void Save_Reader();
void Load();
void Load_Reader();
void Load_Book();
void Login()
{
system("cls");
printf("\n\n\n\t\t***************************************\n");
printf("\n\n\n\t\t** 欢迎使用图书管理系统 **\n");
printf("\n\n\n\t\t***************************************\n");
printf("\n\n\n\t\t 按任意键进入系统...");
getch();
system("cls");
}
int Menu() /*主菜单*/
{
int dm;
printf("\n\t\t图书管理系统主菜单\n");
printf("=================================================\n");
printf("*\t1----采编入库 \n");
printf("*\t2----登记读者 \n");
printf("*\t3----借阅登记 \n");
printf("*\t4----还书管理 \n");
printf("*\t5----查询图书信息 \n");
printf("*\t6----查询读者信息 \n");
printf("*\t0----退出系统 \n");
printf("=================================================\n");
printf("请选择相应的代码:");
for(;;)
{
scanf("%d",&dm); //dm输入的数字
if(dm<0||dm>6)
printf("\n错误!请重新输入:");
else
break;
}
return dm;
}
void Menu_select()/*主菜单选择函数*/
{
for(;;)
{
switch(Menu()) /*功能选择*/
{
case 0:
system("cls");
Save();
printf("\n\n\t文件保存成功!\n");
printf("\n\n\t欢迎下次使用本系统!\n");
getch();
exit(0);
case 1: Insert_New_Book();break;
case 2: add_reader();break;
case 3: Borrow_Book();break;
case 4: Return_Book();break;
case 5: Print_book();break;
case 6: Print_reader();break;
default:printf("\n错误!");
exit(0);
}
}
}
void Init() /*初始化*/
{
BK *p0;
printf("\n图书初始化开始,请输入图书信息..\n包括编号.书名.数量..\n");
p0=(BK*)malloc(sizeof(BK));
h_book=p0;
printf("\n请输入图书信息:\n");
printf("图书编号:"); /*输入图书编号(唯一)*/
scanf("%s",p0->book_num);
printf("图书名称:"); /*输入图书名称*/
scanf("%s",p0->book_name);
printf("图书作者:"); /*输入图书作者*/
scanf("%s",p0->book_writer);
printf("图书数量:"); /*输入图书数量*/
scanf("%d",&p0->book_kc);
p0->book_xy=p0->book_kc; /*开始时图书现有量和库存量相等*/
p0->next=NULL;
p0->n=++n;
printf("\n图书信息初始化完毕!按任意键继续下一步操作..\n");
getch();
system("cls");
}
void Insert_New_Book()/*新书入库*/
{
BK *p,*p0,*p1;
p=p1=h_book;
printf("\n新书入库模块...\n");
printf("\n请输入新书信息..\n包括书号.书名.数量..\n");
p0=(BK *)malloc(sizeof(BK));
printf("图书编号:");
scanf("%s",p0->book_num);
while(strcmp(p0->book_num,p1->book_num)!=0&&p1->next!=NULL)
p1=p1->next;
if(strcmp(p0->book_num,p1->book_num)==0) /*此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/
{
printf("\n此编号图书已存在!!直接入库!\n");
printf("图书数量:");
scanf("%d",&p0->book_kc);
p1->book_kc+=p0->book_kc;
p1->book_xy+=p0->book_kc;
}
else/*若不存在,则需要输入其他的信息,然后在进行插入操作*/
{
printf("图书名称:");
scanf("%s",p0->book_name);
printf("图书作者:");
scanf("%s",p0->book_writer);
printf("图书数量:");
scanf("%d",&p0->book_kc);//库存数量
while(p->next)
p=p->next;
if(h_book==NULL)
h_book=p0; /*此处分两种情况,链表中没有数据,head直接指向p0处*/
else
p->next=p0; /*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/
p0->next=NULL;
p0->book_xy=p0->book_kc;
p0->n=++n;
}
printf("\n新书入库完毕!按任意键继续下一步操作..\n");
getch();
system("cls");
}
void add_reader()/*添加读者*/
{
RD *p0;
int i;
printf("\n读者初始化开始,请输入读者信息..\n包括书证号.姓名..\n");
p0=(RD*)malloc(sizeof(RD)); /*申请新结点存储空间*/
h_reader=p0;
printf("\n请输入读者的信息:\n");
printf("读者书证号:");
scanf("%s",p0->reader_num);
printf("读者姓名:");
scanf("%s",p0->reader_name);
p0->right=0;
for(i=0;iborrow[i].borrow_book_num,"0"); /*所借图书直接置为(即没有借书)*/
strcpy(p0->borrow[i].limit_date,"0");
}
p0->next=NULL;
p0->m=++m;
printf("\n读者信息初始化完毕!按任意键继续下一步操作..\n");
getch();
system("cls");
}
void Borrow_Book() /*借书模块*/
{
BK *p0; RD *p1;
char bo_num[10],rea_num[10],lim_date[8];
int i;
p0=h_book; p1=h_reader;
printf("\n借书模块...\n");
printf("\n请输入借书的读者书证号:");
scanf("%s",rea_num);
while(p1->next!=NULL&&strcmp(rea_num,p1->reader_num)!=0)
p1=p1->next;
if(p1->next==NULL&&strcmp(rea_num,p1->reader_num)!=0)
{
printf("\n此读者编号不存在!按任意键返回..\n");
goto END;
}
printf("\n请输入你要借的书的编号:");
scanf("%s",bo_num);
while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL)
p0=p0->next;
if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0)
{
printf("\n此图书编号不存在!按任意键返回..\n");
goto END;
}
else if(p0->book_xy<=0)
{
printf("\n抱歉,此书已借完!请等待新书的到来!!\n按任意键返回....");
goto END;
}
else if(p1->right>Max||p1->right==Max)
{
printf("\n不好意思,借书数目已满!不能借书!\n按任意键返回....");
goto END;
}
else if(strcmp(p1->borrow[0].borrow_book_num,"0")!=0)
{
for(i=0;iborrow[i].borrow_book_num,bo_num)==0)
{
printf("\n抱歉!同一个读者不能同借两本相同的书!\n按任意键返回....");
goto END;
}
else if(strcmp(p1->borrow[i].borrow_book_num,"0")==0)
{
printf("\n请输入你要归还图书的日期:");
scanf("%s",lim_date);
strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num);
strcpy(p1->borrow[p1->right-1].limit_date,lim_date);
p0->book_xy--;
printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);
goto END;
}
}
}
else
{
printf("\n请输入你要归还图书的日期:");
scanf("%s",lim_date);
strcpy(p1->borrow[p1->right++].borrow_book_num,bo_num);
strcpy(p1->borrow[p1->right-1].limit_date ,lim_date );
p0->book_xy--;
p0->book_kc--;
printf("\n读者编号%s借书完毕!按任意键继续下步操作..",p1->reader_num);
goto END;
}
END:getch(); system("cls");
}
void Return_Book() /*还书模块*/
{
BK *p; RD *q;
int i,j,find=0;
char return_book_num[10],return_reader_num[10];
p=h_book; q=h_reader;
printf("\n还书模块...\n");
printf("\n请输入要还书的读者编号:");
scanf("%s",return_reader_num);
while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num)!=0)
q=q->next;
if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0)
{
find=2;
printf("\n此读者编号不存在!按任意键返回..\n");
goto end;
}
printf("\n请输入读者还书的编号:");
scanf("%s",return_book_num);
while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0)
p=p->next;
if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0)
{
find=2;
printf("\n错误!此图书编号不存在!按任意键返回..\n");
goto end;
}
for(i=0;iborrow[i].borrow_book_num)==0) /*如果此读者借了此书*/
{
find=1;
for(j=i;jborrow[j].borrow_book_num,q->borrow[j+1].borrow_book_num);
strcpy(q->borrow[j].limit_date,q->borrow[j+1].limit_date);
}
strcpy(q->borrow[Max-1].borrow_book_num,"0");
strcpy(q->borrow[Max-1].limit_date,"0");
p->book_xy++;
q->right--;
printf("\n编号%s的读者还书完毕!按任意键继续下步操作..",return_reader_num);
goto end;
}
if(find==0)
printf("\n错误!此读者未借此书!按任意键返回..\n");
end: getch(); system("cls");
}
void Print_book() /*查询图书信息*/
{
BK *p;
int i;
char e[10];
p=h_book;
printf("输入查询的图书编号:");
scanf("%s", e);
for(i=0;ibook_num,e)==0)
{
printf("\n图书信息如下:\n\n");
printf("图书编号\t图书名称\t图书作者\t现有\t库存\n");
展开阅读全文