1、课程设计报告课设课题:课程设计图书管理系统学院:电子信息学院专业:网络工程姓名:班级学号: 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
2、归还图书165.8 查询图书信息165。9 查询读者信息175.10 保存文件,退出18六、总结19七、参考文献20八、附录(源代码)21数据结构课程设计图书管理系统 24一、需求分析1.1 系统开发背景和意义图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书管理的效率。因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。图书管理系统需要满足来自图书馆工作人员、普通用户和借阅者三方面人员的需求。图书馆工作人员对图书借阅者的借阅及还书要求进
3、行操作,同时还可通过图书编号等查询相应的借阅情况;普通用户的需求是查询图书馆所存的图书的相关情况;图书借阅者的需求是查看自己的相关信息及查询自己的借阅情况。1。2 设计题目与要求【问题描述】设计一个计算机管理系统完成图书管理基本业务。【基本要求】1)每种书的登记内容包括书号、书名、著作者、现存量和库存量;2)对书号建立索引表(线性表)以提高查找效率;3)系统主要功能如下:采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;归还:注销对借阅者的登记,改变该书的现存量。二、总体
4、结构设计有八个模块1)图书初始化输入图书的一些信息,编号、作者、书名、数量,使有一定的库存。2)新书入库新书采编入库,输入编号后如果有次数只需输入数量,没有则继续输入书名、作者、数量。3)添加读者信息读者信息初始化,输入读书证号和姓名,只有输入书证号和姓名才能进行借书还书4)借书模块读者输入读书证号,证号存在输入要借的图书编号,不能借同一本书,如果借书数量以达到最大也不能借书。5)还书模块归还已借的图书,要先输入读者书证号,书证号存在继续输入要还的图书编号,图书编号存在并且借来此书,归还成功。6)查询图书信息7)查询读者信息可查询读者姓名书证号,借了几本书,都是什么书和还书日期,还可以借几本书
5、。8)退出退出读书管理系统并保存读者和图书信息。图书管理系统查询操作模块读者管理模块借阅操作模块图书管理模块理退出图书信息查询读者信息查询还书系统借书系统输入读者信息采编入库初始化图书信息图21主控模块三、各子模块设计3。1 初始化图书信息进入系统后首先进行图书初始化,输入图书的信息.开始输入图书编号、名称、作者和图书数量进入系统图3-1 初始化图书信息流程图3.2 系统主界面初始化之后,进入系统,显示功能列表,可选择任意系统,但在借书之前先要输入读者信息。开始输入功能所对应的数字输入的数字小于0大于6 否错误!请重新输入 是执行所选功能图3-2 系统主界面流程图3.3 采编入库选择采编入库的
6、功能后,先输入图书编号判断是否存在,若存在,则在原有记录上加上添加的图书数量;若不存在,则加入新的记录。录入图书信息判断是否有此图书是在原有的纪录上加上现有的图书数量否向系统中加入新纪录图3-3 采编入库流程图3。4 输入读者信息选择读者登记后,输入读者编号跟姓名。开始输入读者信息:读者书证号、姓名结束图34 输入读者信息流程图3.5 借阅图书选择借阅图书功能后,输入读者证号,判断该读者是否存在,若存在则输入借阅图书的编号,判断该图书编号是否存在,若存在,则判断读者借阅的图书数量是否满了和是否借阅了相同的书籍,判断成功后,则输入归还该图书的日期,该图书现有量减一,借阅成功;若读者不存在则返回。
7、输入读者书证号判断读者是否存在否输出次读者编号不存在!按任意键返回是输入要借的图书编号判断图书编号是否存在否输出此图书编号不存在!按任意键返回是看是否还有此图书否输出此书已借完,按任意键返回是看读者的借书数目是否满了是输出借书数目已满不能借书,按任意键返回否看读者是否借了相同的书是输出同一读者不能借相同的两本书否输入归还图书的日期图书现有数量减1输出读者结束成功,按任意键返回结束图35 借阅图书流程图3.6 归还图书实现归还图书功能时,首先输入读者编号,并判断是否存在,若不存在就按任意键返回,;若存在输入归还的图书编号并判断是否存在,若归还图书编号不存在,则返回。存在后,将读者借阅该图书的信息
8、清空,该图书的现有量加一.最后按任意键返回输入要还书的读者编号判断读者编号是否存在 否输出读者编号不存在按任意键返回是输入读者还书编号判断图书编号是否存在否输出此图书编号不存在按任意键返回是此图书编号和还书日期等于0现有图书数量加1输出读者还书完毕,按任意键返回结束图36 归还图书流程图3。7 查询图书信息查询图书信息时,输入图书的编号,判断是否存在。不存在则返回;存在则输出图书的编号,书名,作者,现有量,跟库存量。判断图书信息是否为空 是输出此图书编号不存在按任意键返回否输出图书信息:编号、名称、作者、现有和库存结束图3-7 查询图书信息流程图3。8 查询读者信息查询读者信息时,首先判断读者
9、的编号是否存在,不存在就按任意键返回。若存在,则输出读者的证号,姓名,和借阅的图书编码及其还书日期。判断读者信息是否为空是输出此读者编号不存在按任意键返回否输出读者书证号、姓名、图书编码和还书日期输出读者信息打印完毕结束图38 查询读者信息流程图四、程序设计调试情况分析在整个课程设计中,我们遇到了许多的问题.有些问题吧,我们在苦思冥想的时候,突然我们的编译器显示出了正确的结果,当我们欣喜若狂的在运行下一次的时候又会出现相同的问题,在借阅的过程中,在一个读者借阅了两本书以上的时候,上一本书的归还日期上还有下一本书上的编号,最后一本书输出的才是正确的结果。下图是借阅了两本书的截图:图41看到这里我
10、们也知道是第一本书的还书日期的地址空间跟第二本书的编号连接在了一起导致输出的时候一直到第二本书编号的的字符串后面的/0结束。最后发现是我们在定义还书日期这个字符串的时候开辟的空间太小.我们把char limit_date8;改为char limit_date10就好了。图42五、测试结果5.1 欢迎界面程序运行显示“欢迎使用图书管理系统”,按任意键进入到主菜单如图5-1所示。图51 欢迎界面5。2初始化图书信息在没有文件的时候会进入到初始化界面,需要输入一本图书的相关信息,如图52所示.图52 初始化图书信息5.3 系统主界面接着进入的系统的主菜单,如图5-3所示。图5-3 系统主界面5.4
11、采编入库实现采编入库功能按照系统提示输入信息。如图54。如果该图书已存在,则直接输入图书的数量如图5-5所示。图5-4 采编入库(书不存在)图55 采编入库(书已存在)5。5 输入读者信息按照要求输入读者信息,如图5-6所示。图56 输入读者信息5。6 借阅图书按照要求先输入读者证号,在输入借阅的图书编号如图57所示.如果读者已经借阅了一本书之后不能借阅同一本图书如图58所示.图57 借阅图书图58 同一个读者不能借阅同一本图书5。7 归还图书归还图书的要求按着图59输入即可.图5-9 归还图书5。8 查询图书信息图5-10 是没有借阅之前的图书的相关信息,图5-11是读者借阅了图书之后的信息
12、,只改变了现有量.图510 借阅登记后图511 归还图书后5。9 查询读者信息查询读者的信息时,会输出相关借阅的图书编号以及还书日期如图512,513所示。图512 查询读者信息(一)图5-13 查询读者信息(二)5。10 保存文件,退出在系统的主菜单后,按0 功能保存并退出系统.图514 文件保存六、总结个人觉得课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程. 在生活中可以说得是无处不在。因此作为新世纪的大学来说能够分析,并解决程序中出现的问题是十分重要的。课程设计就能体现到这一方面。能够将你所学到的理论跟
13、实际结合在一起.通过本次课程设计感慨良多.从课堂上听到的到课后应用到的根本就不是一回事。课堂上,老师在上面说,自己在下面听,到也能听懂。可是到了应用上,自己倒也是知道要用到哪方面的内容,但是偏偏不知道从何处下手;好不容易写好的一小段代码,还要跟其他功能不相冲突,这又需要我们自己去想办法去兼容好他们。通过本次课程设计试我懂得理论要跟实践相结合.正所谓“台上十分钟,台下十年功”,别人在台上表演了十分钟,你觉得很容易,可那里知道别人在下面做的努力呢。同样的,我们在课堂上听老师讲确实觉得是那么回事,但是真正做下去,也只有自己知道是何种滋味。理论始终是理论,不能都熟练应用自己所学到的知识,到头来也是一场
14、空.在这次的课程设计过程中,我们也遇到了不能解决的难题,比如说在读者查询的时候,第二个读者始终会覆盖第一个读者的数据。我们始终没有搞明白问题的所在,只知道不是在输出读者信息的问题,应该是添加读者过程中指针始终指在第一个地址,没有移动。我们按照查询图书的函数重新编写了一次还是同样问题。一直到答辩前一天晚上还没有解决,之后只能放弃。还有在最开始的时候我们的程序功能并没有清屏功能,整个界面看起来并不是那么整洁。于是我用用getch();system(“cls”);来进行清屏,最后会出先一个小问题,在我们查询了一些资料后,又再次基础上加上了goto end;这个函数来加以完善。这次课程设计,我们也遇到
15、了很多问题,比如说,我们再输入第二个读者的信息后会覆盖第一个读者的信息,想了半天没有弄懂是哪里错了,最后才看出来我们定义的结构体指针没有移动,导致我们输入的读者信息一直存放在同一个地址中。也有些不懂需要在网上查询的代码,组员之间相互配合,不懂就询问其他同学或者查询资料亦或者自己去弄懂问题的根结,团结协作的精神在这次课程设计中表现的淋漓尽致。我们不仅将以前的知识复习一遍;同时也弄懂了一些平常自己似懂非懂的;最后同学之间的友谊也慢慢变的深厚起来小组分工:孙泽铭:采编入库、查询图书信息、查询读者信息黄响:添加读者、借阅图书、归还图书七、参考文献1 严蔚敏吴伟民编著数据结构清华大学出版社,20002
16、黄国瑜叶乃菁编著数据结构清华大学出版社,20013 胡学钢编著数据结构算法设计指导清华大学出版社,19994 王士元编著数据结构与数据库系统南开大学出版社,20005 李强根主编数据结构(C+描述)中国水利水电出版社, 20016 杨正宏编著数据结构中国铁道出版社,20027 胡学钢编著数据结构算法设计指导清华大学出版社,19998 殷人昆徐孝凯编著数据结构习题解析清华大学出版社,20029 李春葆编著数据结构习题与解析清华大学出版社,200110 咨讯教育小组编著数据结构数据结构版中国铁道出版社,2002八、附录(源代码)includestdio.hinclude string。hinclu
17、de stdlib。h#includeconio.h#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;
18、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_Re
19、ader(); 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(”*
20、t3-借阅登记 n”);printf(*t4-还书管理 n”);printf(t5-查询图书信息 n);printf(”*t6-查询读者信息 n”);printf(t0-退出系统 n”);printf(”=n”);printf(请选择相应的代码:); for(;;) scanf(%d,dm); /dm输入的数字if(dm0|dm6)printf(”n错误!请重新输入:);else break;return dm; void Menu_select()/主菜单选择函数/for(;) switch(Menu()) /功能选择*/ case 0:system(”cls);Save();printf(
21、”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图书初始化开始
22、,请输入图书信息.。n包括编号。书名.数量.。n);p0=(BK*)malloc(sizeof(BK);h_book=p0;printf(”n请输入图书信息:n);printf(图书编号:); /*输入图书编号(唯一)/scanf(”%s”,p0book_num);printf(”图书名称:); /输入图书名称/scanf(”%s,p0book_name);printf(”图书作者:); /输入图书作者*/scanf(”s”,p0book_writer);printf(图书数量:”); /输入图书数量/scanf(d,p0book_kc);p0-book_xy=p0book_kc; /*开始时
23、图书现有量和库存量相等*/p0-next=NULL;p0n=+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)
24、!=0p1-next!=NULL)p1=p1next;if(strcmp(p0-book_num,p1-book_num)=0) /此处分两种情况,若图书编号存在,则直接进库,只须输入书的数量*/printf(”n此编号图书已存在!直接入库!n); printf(”图书数量:); scanf(”d”,&p0book_kc); p1-book_kc+=p0-book_kc; p1book_xy+=p0book_kc;else/*若不存在,则需要输入其他的信息,然后在进行插入操作/printf(”图书名称:”);scanf(”%s”,p0book_name);printf(图书作者:”);scan
25、f(”s,p0book_writer);printf(图书数量:”);scanf(%d”,p0book_kc);/库存数量while(pnext) p=p-next;if(h_book=NULL) h_book=p0; /此处分两种情况,链表中没有数据,head直接指向p0处/else p-next=p0; /*此处分两种情况,链表中有数据,链表中最后元素的next指向p0处*/ p0next=NULL; p0-book_xy=p0book_kc; p0n=+n; printf(n新书入库完毕!按任意键继续下一步操作。n);getch();system(”cls”);void add_read
26、er()/*添加读者/ RD p0; int i; printf(”n读者初始化开始,请输入读者信息.。n包括书证号。姓名。.n”);p0=(RD)malloc(sizeof(RD)); /*申请新结点存储空间/h_reader=p0;printf(”n请输入读者的信息:n); printf(读者书证号:); scanf(”%s,p0reader_num); printf(”读者姓名:); scanf(”%s,p0reader_name); p0right=0; for(i=0;iMax;i+) strcpy(p0borrowi.borrow_book_num,”0”); /所借图书直接置为(
27、即没有借书)/strcpy(p0borrowi.limit_date,0”); p0-next=NULL;p0m=+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(p1next!=NULL&st
28、rcmp(rea_num,p1reader_num)!=0) p1=p1next;if(p1next=NULLstrcmp(rea_num,p1reader_num)!=0) printf(”n此读者编号不存在!按任意键返回。n”);goto END; printf(”n请输入你要借的书的编号:”); scanf(”%s,bo_num);while(strcmp(bo_num,p0book_num)!=0p0next!=NULL) p0=p0next;if(p0next=NULL&strcmp(bo_num,p0book_num)!=0) printf(”n此图书编号不存在!按任意键返回.。n
29、”);goto END;else if(p0-book_xy=0) printf(n抱歉,此书已借完!请等待新书的到来!!n按任意键返回.。);goto END; else if(p1-rightMaxp1-right=Max) printf(”n不好意思,借书数目已满!不能借书!n按任意键返回.。.);goto END;else if(strcmp(p1-borrow0。borrow_book_num,0)!=0) for(i=0;iMax;i+) if(strcmp(p1-borrowi。borrow_book_num,bo_num)=0)printf(”n抱歉!同一个读者不能同借两本相同
30、的书!n按任意键返回.。”);goto END;else if(strcmp(p1borrowi。borrow_book_num,”0)=0) printf(n请输入你要归还图书的日期:”); scanf(”s,lim_date); strcpy(p1borrowp1-right+。borrow_book_num,bo_num); strcpy(p1-borrowp1right1。limit_date,lim_date); p0-book_xy; printf(”n读者编号s借书完毕!按任意键继续下步操作。,p1reader_num); goto END;else printf(”n请输入你要
31、归还图书的日期:”); scanf(”s”,lim_date);strcpy(p1-borrowp1-right+.borrow_book_num,bo_num); strcpy(p1borrowp1right-1.limit_date ,lim_date ); p0book_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
32、_book_num10,return_reader_num10;p=h_book; q=h_reader;printf(”n还书模块。n”);printf(n请输入要还书的读者编号:); scanf(”s,return_reader_num); while(qnext!=NULLstrcmp(return_reader_num,qreader_num)!=0) q=qnext;if(q-next=NULL&strcmp(return_reader_num,qreader_num)!=0)find=2;printf(n此读者编号不存在!按任意键返回。n”);goto end;printf(”n请
33、输入读者还书的编号:);scanf(”s,return_book_num);while(pnext!=NULL&strcmp(return_book_num,pbook_num)!=0)p=pnext;if(pnext=NULLstrcmp(return_book_num,pbook_num)!=0)find=2;printf(n错误!此图书编号不存在!按任意键返回。n);goto end; for(i=0;iMax;i+)if(strcmp(return_book_num,q-borrowi.borrow_book_num)=0) /如果此读者借了此书*/find=1; for(j=i;jM
34、ax1;j+)strcpy(qborrowj。borrow_book_num,qborrowj+1.borrow_book_num); strcpy(q-borrowj.limit_date,qborrowj+1。limit_date); strcpy(qborrowMax1。borrow_book_num,”0”);strcpy(q-borrowMax1。limit_date,0”); pbook_xy+; qright; printf(”n编号s的读者还书完毕!按任意键继续下步操作。.,return_reader_num); goto end; if(find=0) printf(n错误!
35、此读者未借此书!按任意键返回。n); end: getch(); system(cls); void Print_book() /查询图书信息/BK *p;int i;char e10; p=h_book;printf(”输入查询的图书编号:);scanf(s”, e);for(i=0;in;i+)if(strcmp(p-book_num,e)=0)printf(”n图书信息如下:nn”);printf(”图书编号t图书名称t图书作者t现有t库存n”);printf(stt%sttstt%dtdn”,pbook_num,pbook_name,pbook_writer,p-book_xy,pbo
36、ok_kc);break;elsep=pnext;printf(”n图书信息打印完毕!按任意键继续下一步操作.。”);getch();system(”cls);void Print_reader() /*查询读者信息*/RD *p;int i, j;char e10;p=h_reader;printf(”输入查询的读者编号:);scanf(%s”, e);for(j=0;jm;j+)if(strcmp(p-reader_num,e)=0)printf(”n读者信息如下:nn);printf(读者书证号t读者姓名n); printf(”%stts”,p-reader_num,preader_na
37、me);for(i=0;iborrowi。borrow_book_num);printf(”tt%s,pborrowi。limit_date); printf(”n”);break;elsep=pnext;printf(”n读者信息打印完毕!按任意键继续下一步操作。”);getch();system(”cls”);void Save() /保存信息/Save_Reader();Save_Book();void Save_Reader() /保存读者信息/FILE fp_reader; RD p,p0;p=h_reader;if(fp_reader=fopen(”Reader。txt,”wb”)
38、)=NULL) /*创建文件,进行保存*/printf(n文件保存失败!n请重新启动本系统。.n);exit(0);while(p!=NULL) if(fwrite(p,sizeof(RD),1,fp_reader)!=1) /*将链表中的信息写入文件中*/printf(n写入文件失败!n请重新启动本系统!n”);p0=p;p=p-next;free(p0); /*释放所有结点/h_reader=NULL;fclose(fp_reader); /*关闭文件/void Save_Book() /保存图书信息/FILE *fp_book; /创建文件型指针*/BK *p,p0;p=h_book;if((fp_book=fopen(”Book.txt”,”wb”))=NULL) /创建文件,进行保存/printf(”n