课设课题: 课程设计——图书管理系统
学 院: 电 子 信 息 学 院 专 业: 网 络 工 程 姓 名:
班级学号: BX1213 指导教师: ** 报告日期:
目 录
一、需求分析
系统开发背景和意义
图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书管理的效率。因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。
图书管理系统需要满足来自图书馆工作人员、普通用户和借阅者三方面人员的需求。图书馆工作人员对图书借阅者的借阅及还书要求进行操作,同时还可通过图书编号等查询相应的借阅情况;普通用户的需求是查询图书馆所存的图书的相关情况;图书借阅者的需求是查看自己的相关信息及查询自己的借阅情况。 设计题目与要求
【问题描述】
设计一个计算机管理系统完成图书管理基本业务。 【基本要求】
1) 每种书的登记内容包括书号、书名、着作者、现存量和库存量; 2) 对书号建立索引表(线性表)以提高查找效率;
3) 系统主要功能如下:
*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;
*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;
*归还:注销对借阅者的登记,改变该书的现存量。
二、总体结构设计
有八个模块 1) 图书初始化
输入图书的一些信息,编号、作者、书名、数量,使有一定的库存。 2) 新书入库
新书采编入库,输入编号后如果有次数只需输入数量,没有则继续输入书名、作者、数量。
3) 添加读者信息
读者信息初始化,输入读书证号和姓名,只有输入书证号和姓名才能进行借书还书
4) 借书模块
读者输入读书证号,证号存在输入要借的图书编号,不能借同一本书,如果借书数量以达到最大也不能借书。
5) 还书模块
归还已借的图书,要先输入读者书证号,书证号存在继续输入要还的图书编号,图书编号存在并且借来此书,归还成功。
6) 查询图书信息 7) 查询读者信息
可查询读者姓名书证号,借了几本书,都是什么书和还书日期,还可以借几本书。
8) 退出
退出读书管理系统并保存读者和图书信息。
图书
读者借阅查询退出
初始化图书采编入库输入读者信还读借书书者系系2-1 主控模块图 信统统息查图书信息查三、各子模块设计
初始化图书信息
进入系统后首先进行图书初始化,输入图书的信息。
输入图
书编号、图3-1 初始化图书信息流程图
系统主界面
初始化之后,进入系统,显示功能列表,可选择任意系统,但在借书之前先要输入读者信息。
输入功
输入的数字 否 是 错误!请重新
执行所选功能图3-2 系统主界面流程图
采编入库
选择采编入库的功能后,先输入图书编号判断是否存在,若存在,则在原有记录上加上添加的图书数量;若不存在,则加入新的记录。
是 否
在原有的纪录上
向系统中加入新图3-3 采编入库流程图
输入读者信息
选择读者登记后,输入读者编号跟姓名。
输入读者信图3-4 输入读者信息流程图
借阅图书
选择借阅图书功能后,输入读者证号,判断该读者是否存在,若存在则输入借阅图书的编号,判断该图书编号是否存在,若存在,则判断读者借阅的图书数量是否满了和是否借阅了相同的书籍,判断成功后,则输入归还该图书的日期,该图书现有量减一,借阅成功;若读者不存在则返回。
判断读者是
否
输出次读者编号
是
输入要借的图
判断图书编
否
是
输出此图书编号
看是否还有此
是
否
输出此书已借
看读者的借
否
输出借书数目已
是
看读者是否
否
输出同一读者不输入归还图书的
是
输出读者结束成图3-5 借阅图书流程图
归还图书
实现归还图书功能时,首先输入读者编号,并判断是否存在,若不存在就按任意键返回,;若存在输入归还的图书编号并判断是否存在,若归
还图书编号不存在,则返回。存在后,将读者借阅该图书的信息清空,该图书的现有量加一。最后按任意键返回
判断读者编
是
判断图书编号
是
此图书编号和还
输出读者还书完
否
输出读者编号不
否
输出此图书编号图3-6 归还图书流程图
查询图书信息
查询图书信息时,输入图书的编号,判断是否存在。不存在则返回;存在则输出图书的编号,书名,作者,现有量,跟库存量。
判断图书信
是
输出此图书编号否
输出图书信息:编
图3-7 查询图书信息流程图
查询读者信息
查询读者信息时,首先判断读者的编号是否存在,不存在就按任意键返回。若存在,则输出读者的证号,姓名,和借阅的图书编码及其还书日期。
判断读者信
是
否
输出此读者编号
输出读者书证号、姓
图3-8 查询读者信息流程图 四、程序设计调试情况分析
在整个课程设计中,我们遇到了许多的问题。有些问题吧,我们在苦思冥想的时候,突然我们的编译器显示出了正确的结果,当我们欣喜若狂的在运行下一次的时候又会出现相同的问题,在借阅的过程中,在一个读者借阅了两本书以上的时候,上一本书的归还日期上还有下一本书上的编号,最后一本书输出的才是正确的结果。下图是借阅了两本书的截图:
图4-1
看到这里我们也知道是第一本书的还书日期的地址空间跟第二本书的编号连接在了一起导致输出的时候一直到第二本书编号的的字符串后面的‘/0’结束。最后发现是我们在定义还书日期这个字符串的时候开辟的空间太小。我们把char limit_date[8];改为char limit_date[10]就好了。
图4-2
五、测试结果
欢迎界面
程序运行显示“欢迎使用图书管理系统”,按任意键进入到主菜单如图5-1所示。
图5-1 欢迎界面
初始化图书信息
在没有文件的时候会进入到初始化界面,需要输入一本图书的相关信息,如图5-2所示。
图5-2 初始化图书信息
系统主界面
接着进入的系统的主菜单,如图5-3所示。
图5-3 系统主界面
采编入库
实现采编入库功能按照系统提示输入信息。如图5-4。如果该图书已存在,则直接输入图书的数量如图5-5所示。
图5-4 采编入库(书不存在)
图5-5 采编入库(书已存在)
输入读者信息
按照要求输入读者信息,如图5-6所示。
图5-6 输入读者信息
借阅图书
按照要求先输入读者证号,在输入借阅的图书编号如图5-7所示。如果读者已经借阅了一本书之后不能借阅同一本图书如图5-8所示。
图5-7 借阅图书
图5-8 同一个读者不能借阅同一本图书
归还图书
归还图书的要求按着图5-9输入即可。
图5-9 归还图书
查询图书信息
图5-10 是没有借阅之前的图书的相关信息,图5-11是读者借阅了图书之后的信息,只改变了现有量。
图5-10 借阅登记后
图5-11 归还图书后
查询读者信息
查询读者的信息时,会输出相关借阅的图书编号以及还书日期如图5-12,5-13所示。
图5-12 查询读者信息(一) 图5-13 查询读者信息(二)
保存文件,退出
在系统的主菜单后,按‘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\\***************************************\\n\"
printf(\"\\n\\n\\n\\** 欢迎使用图书管理系统
**\\n\"); ); }
int Menu() /*主菜单*/ { );
int dm;
printf(\"\\n\\图书管理系统主菜单\\n\");
printf(\"=================================================\\n\"printf(\"\\n\\n\\n\\ 按任意键进入系统...\"); getch(); system(\"cls\");
printf(\"\\n\\n\\n\\***************************************\\n\"
);
printf(\"*\1----采编入库 \\n\"); printf(\"*\2----登记读者 \\n\"); printf(\"*\3----借阅登记 \\n\"); printf(\"*\4----还书管理 \\n\"); printf(\"*\5----查询图书信息 \\n\"); printf(\"*\6----查询读者信息 \\n\"); printf(\"*\0----退出系统 \\n\");
printf(\"=================================================\\n\"
printf(\"请选择相应的代码:\"); for(;;) {
scanf(\"%d\包括编号.书名.数量..\\n\");
p0=(BK*)malloc(sizeof(BK)); h_book=p0;
printf(\"\\n请输入图书信息:\\n\");
*/ }
printf(\"图书编号:\"); /*输入图书编号(唯一)*/ scanf(\"%s\
printf(\"图书名称:\"); /*输入图书名称*/ scanf(\"%s\
printf(\"图书作者:\"); /*输入图书作者*/ scanf(\"%s\
printf(\"图书数量:\"); /*输入图书数量*/ scanf(\"%d\
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\
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\ p1->book_kc+=p0->book_kc; p1->book_xy+=p0->book_kc; }
else/*若不存在,则需要输入其他的信息,然后在进行插入操作*/ {
printf(\"图书名称:\"); scanf(\"%s\ printf(\"图书作者:\");
scanf(\"%s\ printf(\"图书数量:\");
scanf(\"%d\ 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\ printf(\"读者姓名:\");
scanf(\"%s\
p0->right=0; for(i=0;i 置为(即没有借书)*/ } 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; } p0->next=NULL; p0->m=++m; printf(\"\\n读者信息初始化完毕!按任意键继续下一步操作..\\n\"); getch(); system(\"cls\"); strcpy(p0->borrow[i].limit_date,\"0\"); printf(\"\\n借书模块...\\n\"); printf(\"\\n请输入借书的读者书证号:\"); scanf(\"%s\ 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请输入你要借的书的编号:\"); scanf(\"%s\ while(strcmp(bo_num,p0->book_num)!=0&&p0->next!=NULL) p0=p0->next; printf(\"\\n此读者编号不存在!按任意键返回..\\n\"); goto END; if(p0->next==NULL&&strcmp(bo_num,p0->book_num)!=0) { } else if(p0->book_xy<=0) { printf(\"\\n抱歉,此书已借完!请等待新书的到来!!\\n按任意printf(\"\\n此图书编号不存在!按任意键返回..\\n\"); goto END; 键返回....\"); } else if(p1->right>Max||p1->right==Max) goto END; { printf(\"\\n不好意思,借书数目已满!不能借书!\\n按任意 键返回....\"); } goto END; else if(strcmp(p1->borrow[0].borrow_book_num,\"0\")!=0) { for(i=0;i { printf(\"\\n抱歉!同一个读者不能同借两本相同 的书!\\n按任意键返回....\"); } else goto END; if(strcmp(p1->borrow[i].borrow_book_num,\"0\")==0) { printf(\"\\n请输入你要归还图书的日 期:\"); scanf(\"%s\ 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借书完毕!按任意 键继续下步操作..\ } goto END; } } else { printf(\"\\n请输入你要归还图书的日期:\"); scanf(\"%s\ 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借书完毕!按任意键继续下步操 作..\ } 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; } END:getch(); system(\"cls\"); goto END; printf(\"\\n还书模块...\\n\"); printf(\"\\n请输入要还书的读者编号:\"); scanf(\"%s\ while(q->next!=NULL&&strcmp(return_reader_num,q->reader_num) !=0) ) { } printf(\"\\n请输入读者还书的编号:\"); scanf(\"%s\ while(p->next!=NULL&&strcmp(return_book_num,p->book_num)!=0) find=2; printf(\"\\n此读者编号不存在!按任意键返回..\\n\"); goto end; q=q->next; if(q->next==NULL&&strcmp(return_reader_num,q->reader_num)!=0 p=p->next; if(p->next==NULL&&strcmp(return_book_num,p->book_num)!=0) { } for(i=0;i printf(\"\\n错误!此图书编号不存在!按任意键返回..\\n\"); goto end; if(strcmp(return_book_num,q->borrow[i].borrow_book_num)==0) /*如果此读者借了此书*/ { find=1; for(j=i;j strcpy(q->borrow[j].borrow_book_num,q->borrow[j+1].borrow_bo ok_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的读者还书完毕!按任意键继续下步操 作..\ 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\ for(i=0;i printf(\"\\n图书信息如下:\\n\\n\"); printf(\"图书编号\图书名称\图书作者\现有\库存\\n\"); printf(\"%s\\%s\\%s\\%d\%d\\n\ ,p->book_writer,p->book_xy,p->book_kc); } void Print_reader() /*查询读者信息*/ { RD *p; int i, j; } printf(\"\\n图书信息打印完毕!按任意键继续下一步操作..\"); getch(); system(\"cls\"); break; } else p=p->next; char e[10]; p=h_reader; printf(\"输入查询的读者编号:\"); scanf(\"%s\ for(j=0;j printf(\"\\n读者信息如下:\\n\\n\"); printf(\"读者书证号\读者姓名\\n\"); printf(\"%s\\%s\ for(i=0;i printf(\"图书编号\ } } } printf(\"\还书日期\ printf(\"\\n\"); printf(\"\%s\ printf(\"\\%s\ printf(\"\\n\"); break; else } p=p->next; printf(\"\\n读者信息打印完毕!按任意键继续下一步操作..\"); getch(); system(\"cls\"); void Save() /*保存信息*/ { } void Save_Reader() /*保存读者信息*/ { FILE *fp_reader; RD *p,*p0; p=h_reader; if((fp_reader=fopen(\"\创建文件,进行保存*/ { } printf(\"\\n文件保存失败!\\n请重新启动本系统...\\n\"); exit(0); Save_Reader(); Save_Book(); while(p!=NULL) { if(fwrite(p,sizeof(RD),1,fp_reader)!=1) /*将链表中的信 息写入文件中*/ } void Save_Book() /*保存图书信息*/ { FILE *fp_book; /*创建文件型指针*/ BK *p,*p0; } h_reader=NULL; fclose(fp_reader); /*关闭文件*/ printf(\"\\n写入文件失败!\\n请重新启动本系统!\\n\"); p0=p; p=p->next; free(p0); /*释放所有结点*/ p=h_book; if((fp_book=fopen(\"\创建文件,进行保存 */ { printf(\"\\n文件保存失败!\\n请重新启动本系统...\\n\"); exit(0); } while(p!=NULL) { if(fwrite(p,sizeof(BK),1,fp_book)!=1) /*链表中的信息写入文件中*/ printf(\"\\n写入文件失败!\\n请重新启动本系统!\\n\"); p0=p; p=p->next; free(p0); } 将 } h_book=NULL; fclose(fp_book); /*关闭文件*/ void Load() /*加载信息*/ { } void Load_Reader() /*加载读者信息*/ { RD *p1,*p2,*p3; FILE *fp; /*创建文件型指针*/ fp=fopen(\"\打开文件*/ p1=(RD *)malloc(sizeof(RD)); fread(p1,sizeof(RD),1,fp); Load_Reader(); Load_Book(); h_reader=p3=p2=p1; while(! feof(fp)) /*读出信息,重新链入链表*/ { p1=(RD *)malloc(sizeof(RD)); fread(p1,sizeof(RD),1,fp); p2->next=p1; p3=p2; p2=p1; } p3->next=NULL; free(p1); fclose(fp); /*关闭文件*/ } void Load_Book() /*加载图书信息*/ { BK *p1,*p2,*p3; FILE *fp; /*创建文件型指针*/ fp=fopen(\"\打开文件*/ p1=(BK *)malloc(sizeof(BK)); fread(p1,sizeof(BK),1,fp); h_book=p3=p2=p1; while(! feof(fp)) /*读出信息,重新链入链表*/ { } p3->next=NULL; p1=(BK *)malloc(sizeof(BK)); fread(p1,sizeof(BK),1,fp); p2->next=p1; p3=p2; p2=p1; } free(p1); fclose(fp); /*关闭文件*/ int main() { FILE *fp_book,*fp_reader; /*创建文件型指针*/ Login(); if((fp_book=fopen(\"\NULL) Init(); else Load(); Menu_select(); /*调用主菜单*/ } 因篇幅问题不能全部显示,请点此查看更多更全内容