图书管理系统设计报告个人部分.doc
·计算机科学与技术专业13级"数据构造"课程设计报告目录一、 设计任务31. 设计目的32. 问题描述33. 设计根本要求3二、 本人任务4三、 功能简介4四、 主体容51. 问题分析62. 数据构造构造体定义 63. 算法设计及程序流程图 81) 主菜单82) 登记读者 93) 借阅图书104) 查询读者144. 运行结果和调试分析15五、附录23参考文献 24六、心得体会24一、设计任务、设计目的1、了解并掌握数据构造与算法的设计方法,具备初步的独立分析和设计能力;2、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等根本方法和技能;3、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4、训练用系统的观点和软件开发一般规进展软件开发。、问题描述设计一个计算机管理系统完成图书管理根本业务。、设计根本要求1)每种书的登记容包括书号、书名、著作者、现存量和库存量;2)对书号建立索引表线性表以提高查找效率;3)系统主要功能如下:*采编入库:新购一种书,确定书号后,登记到图书帐目表中,如果表中已有,则只将库存量增加;*借阅:如果一种书的现存量大于0,则借出一本,登记借阅者的书证号和归还期限,改变现存量;*归还:注销对借阅者的登记,改变该书的现存量。进一步完成容:1)系统功能的进一步完善;2)索引表采用树表。3)设计容4)程序流程图5)源程序6)软件测试报告包括所用到的数据及结果、二、本人任务设计并编程图书管理中的主菜单、借阅、登记读者、查询读者共四个模块。三、功能简介1) 图书初始化输入图书的一些信息,编号、作者、书名、数量,使有一定的库存。2) 新书入库新书采编入库,输入编号后如果有次数只需输入数量,没有则继续输入书名、作者、数量。3) 添加读者信息读者信息初始化,输入读书证号和*,只有输入书证号和*才能进展借书还书4) 借书模块读者输入读书证号,证号存在输入要借的图书编号,不能借同一本书,如果借书数量以到达最大也不能借书。5) 还书模块归还已借的图书,要先输入读者书证号,书证号存在继续输入要还的图书编号,图书编号存在并且借来此书,归还成功。6) 查询图书信息7) 查询读者信息可查询读者*书证号,借了几本书,都是什么书和还书日期,还可以借几本书。8) 退出退出读书管理系统并保存读者和图书信息。四、主体内容图书管理系统总体情况如下列图:这个系统主要有四大模块,图书管理模块、读者管理模块、借阅操作模块、查询操作模块。每个模块下又有几个分支模块。1.问题分析主菜单模块需要设计一个可供选择的界面,在界面过选择不同的按键来实现不同的功能。登记读者模块需要可以记录学生的书证号以及学生的*。借书模块中学生可以通过书证号和所需要借的书的编号来借书,借书完成后图书数量减少。查询读者模块需要随着读者借书、还书不断变化,总是能显示出当前读者的准确信息。2.数据构造构造体定义图书文件: typedef struct book char book_num10; char book_name20; 定义图书的编号,名称,作者,char book_writer10; 现有以及库存数量int book_*y;int book_kc;struct book *ne*t; 定义图书构造体BK; 数据记录借阅文件:typedef struct borrowchar borrow_book_num10; 定义借阅图书编号以char limit_date8; 及还书日期BO; 数据记录读者文件:typedef struct readerchar reader_num10; 定义读者书证号以char reader_name10; 及读者*int right;BO borrowMa*; 借书最大数量struct reader *ne*t; 定义读者构造体RD; 数据记录3.算法设计及程序流程图进入系统后,显示功能列表,可选择任意系统。主菜单:程序流程图:执行所选功能错误,请重新输入开场输入功能所对应的数字输入的数字小于0或大于6源程序:int Menu() /*主菜单*/ int dm;printf("ntt图书管理系统主菜单n");printf("=n");printf("*t0-退出系统 n");printf("*t1-采编入库 n");printf("*t2-登记读者 n"); printf("*t3-借阅登记 n");printf("*t4-还书管理 n");printf("*t5-查询图书信息 n");printf("*t6-查询读者信息 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("nnt文件保存成功!n"); printf("nnt欢送下次使用本系统!n"); getch(); e*it(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错误!"); e*it(0);登记读者:开场输入读者信息:读者书证号,读者*完毕程序流程图:源程序: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;i<Ma*;i+) strcpy(p0->borrowi.borrow_book_num,"0"); /*所借图书直接置为(即没有借书)*/ strcpy(p0->borrowi.limit_date,"0"); p0->ne*t=NULL; printf("n读者信息初始化完毕!按任意键继续下一步操作.n"); getch(); system("cls");输入读者书证号判断读者是否存在输出:读者编号不存在!按任意键返回借阅图书:程序流程图:否是判断是否还有此图书输入要借的图书编号判断图书编号是否存在输出:此图书编号不存在!按任意键返回输出:此书已借完,按任意键返回判断读者的借书数目是否已达上限输出:借书数目已满无法借书,按任意键返回判断读者是否借了一样的图书输出:同一人不能借一样的两本书,按任意键返回输入归还图书的日期否否是是否是否图书现有数量以及库存数量都减1输出:读者借书成功,按任意键返回完毕源程序: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->ne*t!=NULL&&strcmp(rea_num,p1->reader_num)!=0) p1=p1->ne*t; if(p1->ne*t=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->ne*t!=NULL) p0=p0->ne*t; if(p0->ne*t=NULL&&strcmp(bo_num,p0->book_num)!=0) printf("n此图书编号不存在!按任意键返回.n"); goto END; else if(p0->book_*y<=0) printf("n抱歉,此书已借完!请等待新书的到来!n按任意键返回."); goto END; else if(p1->right>Ma*|p1->right=Ma*) printf("n不好意思,借书数目已满!不能借书!n按任意键返回."); goto END; else if(strcmp(p1->borrow0.borrow_book_num,"0")!=0) for(i=0;i<Ma*;i+) if(strcmp(p1->borrowi.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_*y-; p0->book_kc-; 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_*y-; p0->book_kc-; printf("n读者编号%s借书完毕!按任意键继续下步操作.",p1->reader_num); END:getch(); system("cls");查询读者:程序流程图:判断读者信息是否为空输出:读者书证号、*、图书编码和还书日期否输出读者信息打印完毕完毕源程序:void Print_reader() /*查询读者信息*/RD *p;int i;p=h_reader;printf("n读者信息如下:nn");printf("读者书证号tt读者*n"); printf("n");while(p!=NULL) printf("t%stt%s",p->reader_num,p->reader_name); for(i=0;i<Ma*;i+) printf("n"); printf("图书编号",i+1); printf("t还书日期",i+1); printf("n"); printf("t%s",p->borrowi.borrow_book_num); printf("tt%s",p->borrowi.limit_date); printf("n"); p=p->ne*t;printf("n读者信息打印完毕!按任意键继续下一步操作.");getch();system("cls");4.运行结果和调试分析同一本新书入库的运行结果图不同的新书采编入库采编入库后查询图书信息的运行结果图登记读者信息借书借书后查询图书信息的运行结果图借同一本书的运行结果图借不同的书借两本书后查询读者信息的运行结果图还书运行结果图还书之后再查询读者信息的运行结果图还书后查询图书信息退出5.附录void Login()进入界面函数int Menu()主菜单函数void Init()初始化函数void Init_book()初始化图书信息函数void Menu_select()主菜单项选择择函数void Find_Book()查找图书函数void Insert_New_Book()新书入库函数void add_reader()添加读者函数void Print_reader()查询读者信息函数void Print_book()查询图书信息函数void Borrow_Book()借书函数void Return_Book()还书函数void Save()保存信息函数void Save_Book()保存图书信息函数vo id Save_Reader()保存读者信息函数void Load()加载信息函数void Load_Reader()加载读者信息void Load_Book()加载图书信息参考文献:C语言程序设计何钦铭版数据构造耿国华版数据构造课程设计苏仕华版六、心得体会本次课程设计,使我对"数据构造"这门课程有了更深入的理解。"数据构造"是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。刚开场做这个程序的时候,感到完全无从下手,甚至让我觉得完成这次程序设计根本就是不可能的,于是开场查阅各种资料以及参考文献,之后便开场着手写程序,写完运行时有很多问题,通过同学间的帮助最终根本解决问题。但是其中还有写瑕疵无法去除,可能是我的水平还不够好,还需要更多的实践操作才能写的更好吧。通过这段时间的课程设计,我认识到数据构造是一门比拟难的课程。需要多花时间上机练习。这次的程序训练培养了我实际分析问题、编程和动手能力,使我掌握了程序设计的根本技能,提高了我适应实际,实践编程的能力。总的来说,这次课程设计让我获益匪浅,对数据构造也有了进一步的理解和认识。图书管理系统源程序#include<stdio.h> #include <string.h> #include <stdlib.h> #include<conio.h> #define Ma* 4 typedef struct book char book_num10; char book_name20; char book_writer10;char book_cbs10;int book_*y; int book_kc; struct book *ne*t; BK; typedef struct borrow char borrow_book_num10; char limit_date8; BO; typedef struct reader char reader_num10; char reader_name10; int right; BO borrowMa*; struct reader *ne*t; RD; BK *h_book; RD *h_reader; void Login(); int Menu(); void Init(); void Init_book(); void Menu_select(); void Insert_New_Book(); void Find_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("nnnttt欢送使用图书管理系统n");printf("nnntt*n"); printf("nntt程序制作人王攀圆柱柱 nntt*:42 47");printf("nnntt 按任意键进入系统.");getch();system("cls"); int Menu() /*主菜单*/ int dm; printf("ntt图书管理系统主菜单n");printf("=n"); printf("*t0-退出系统 n");printf("*t1-采编入库 n");printf("*t2-登记读者 n");printf("*t3-借阅登记 n");printf("*t4-还书管理 n");printf("*t5-查询图书信息 n");printf("*t6-查询读者信息 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("nnt文件保存成功!n"); printf("nnt欢送下次使用本系统!n"); getch(); e*it(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错误!"); e*it(0); void Init() /*初始化*/BK *p0;p0=(BK*)malloc(sizeof(BK); /*分配一个sizeof(BK)大小的空间,并且把该空间的地址赋给BK指针类型的p0*/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("%s",p0->book_cbs); printf("图书数量:"); /*输入图书数量*/ scanf("%d",&p0->book_kc); p0->book_*y=p0->book_kc; /*开场时图书现有量和库存量相等*/ p0->ne*t=NULL; 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->ne*t!=NULL) p1=p1->ne*t; 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_*y+=p0->book_kc; else/*假设不存在,则需要输入其他的信息,然后在进展插入操作*/printf("图书名称:"); scanf("%s",p0->book_name); printf("图书作者:"); scanf("%s",p0->book_writer); printf("图书:"); scanf("%s",p0->book_cbs); printf("图书数量:"); scanf("%d",&p0->book_kc);/*库存数量*/while(p->ne*t) p=p->ne*t; if(h_book=NULL) h_book=p0; /*此处分两种情况,链表中没有数据,head直接指向p0处*/ else p->ne*t=p0; /*此处分两种情况,链表中有数据,链表中最后元素的ne*t指向p0处*/p0->ne*t=NULL; p0->book_*y=p0->book_kc; 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;i<Ma*;i+) strcpy(p0->borrowi.borrow_book_num,"0"); /*所借图书直接置为0(即没有借书)*/ strcpy(p0->borrowi.limit_date,"0"); p0->ne*t=NULL; 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->ne*t!=NULL&&strcmp(rea_num,p1->reader_num)=0) p1=p1->ne*t; if(p1->ne*t=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->ne*t=NULL) p0=p0->ne*t; if(p0->ne*t=NULL&&strcmp(bo_num,p0->book_num)!=0) printf("n此图书编号不存在!按任意键返回.n"); goto END; else if(p0->book_*y<=0) printf("n抱歉,此书已借完!请等待新书的到来!n按任意键返回."); goto END; else if(p1->right>Ma*|p1->right=Ma*) printf("n不好意思,借书数目已满!不能借书!n按任意键返回."); goto END; else if(strcmp(p1->borrow0.borrow_book_num,"0")!=0) for(i=0;i<Ma*;i+) if(strcmp(p1->borrowi.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_*y-; p0->book_kc-; 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_*y-; p0->book_kc-; printf("n读者编号%s借书完毕!按任意键继续下步操作.",p1->reader_num); END:getch(); system("cls"); void Return_Book() /*还书模块*/BK *p; RD *q; int i,j,find=0; char retu