1、C专业课程设计报告图书标准管理系统C语言课程设计报告:图书管理系统系统需求一、 新书入库: 图书信息包括书名, 书号, 库存量, 现存量共4项. 首先输入3本书的信息, 并将其存入文件 ”book.dat” 中. 当有新书入库时, 先判断文件中是否有此书( 即比较书名 ), 若有则修改库存量, 现存量的信息; 若无此书, 则将该书的信息添加到文件中. 二、图书查询: 输入一个书号, 在文件中查找此书, 若找到则输出此书的全部信息; 若找不到则输出查找失败的信息. 三、借阅管理(1) 每个读者的信息包括姓名, 编号, 1张借书卡( 限借一本书 ), 输入3个读者的信息存入文件 “reader .
2、 dat” 中. (2) 借书登记: 输入读者的编号, 所借图书的书号, 先判断姓名是否在文件”reader.dat” 中, 若有则将书号存入一张借书卡上( 注: 初始时借书卡的信息都为零, 借书后借书卡的信息改为所借书的书号), 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量. 若”reader.dat”无此姓名, 则应提示错误(3) 还书管理: 输入读者的编号, 所还图书的书号, 将借书卡的信息置为零, 并修改文件”reader.dat”的相应内容, 同时修改文件”book.dat”中此书的现存量. 四、输出全部图书信息和全部读者信息五、退出
3、系统.六、附加说明:系统将来完善的功能有:添加读者,一位读者可同时借阅和归还多本图书等总体设计一、 仔细阅读系统要求,首先将此系统化分为如下模块(即如下函数)1、 新书入库模块:可用一个函数insert_new_book(char book_num,char book_name,int number)来实现。形参分别为:书名, 书号,以及有多少本书要入库,再根据要求将信息写入文件boot.dat中。又由于最开始要输入三本新书,故可以加一个初始化函数init_book(),但是初始化函数只执行一次,也就是在系统第一次运行的时候执行,此时可以根据判断是否存在boot.dat这个文件来决定是否执行初
4、始化函数.2、 查询模块:可用一个函数void find_book(char book_num)来实现。找到就输出此书全部信息,找不到就输出查找失败信息。3、 借阅管理模块:(1) 三个读者的信息可以在系统初始化时完成.即可用初始化函数init_reader()来实现对读者的初始化。因为读者初始化函数也只是在系统第一次运行的时候执行一次,故也可以根据是否存在reader.dat文件来确定是否执行此函数。(到现在可以发现在系统初始化函数里,至少已经需要调用两个初始化函数了)(2) 借书登记模块:可用一个函数borrow_book(char reader_num,char book_num)来实现
5、。在函数中要分别判断A 该读者的编号是否已经存在,如果不存在,则提示错误。B 该读者的借阅书是否已满(即最多只能借1本书)如果是,则提醒该用户先去还书C 输出的书号对应的书是否存在,如果不存在,则提醒读者不存在此书。借书过程完成后,则对读者信息里的借书信息写上所借书号,并修改库存量。(3) 还书管理模块:可用一个函数return_book(char reader_num,char book_num)来实现。在实现此函数时要判断:A 该读者的姓名是否已经存在,如果不存在,则提示错误。B 该读者是否已经借阅此书。如果没有,则提示错误。C 还书过程完成后,则对读者信息里的借书信息清零,并修改库存量。
6、4、 输出图书和读者信息:可分别用模块print_book()和print_reader()来实现直接从book.dat文件和reader.dat文件中读取信息并输出。5、 退出系统:可用一个函数exit()来实现。首先将信息保存到文件,释放动态创建的内存空间,再退出此程序。图书管理系统二、系统主模块结构图: 退出系统新书入库图书查询借书登记借书登记输出读者信息输出图书信息详细设计一、 界面设计此系统界面采用图形和数字化菜单设计。主界面设计如下: 图书管理系统图书管理系统主菜单请选择相应的数字执行相应的功能:0:退出此系统1:新书入库2:图书查询3:借书登记4:还书管理5:输出全部图书信息和读
7、者信息各子界面如下:1、 新书入库界面:请选择相应的数字执行相应的功能:10:返回主菜单11:新书入库请输入新书名:请输入新书号:请输入新书数量: (注:新书入库成功后,程序返回到子界面1)2、 图书查询界面界面: 请选择相应的数字执行相应的功能:20:返回主菜单21:图书查询请输入需要查询的书号: (注:图书查询完成后,返回到子界面2) 3、借书登记界面:请选择相应的数字执行相应的功能:30:返回主菜单31:借书登记 请输入读者编号: 请输入所借书号: (注:借书过程完成后,返回到子界面3) 4、还书管理: 请选择相应的数字执行相应的功能:40:返回主菜单41:还书登记 请输入读者编号: 请
8、输入所借书号: (注:还书过程完成后,返回到子界面4) 5、输出全部图书和读者信息: 请选择相应的数字执行相应的功能:50:返回主菜单51:输出全部图书信息: 书号 书名: 库存量 现存量 52:输出全部读者信息: 读者编号 读者姓名 所借书号(注:输出图书和读者信息后,返回到子界面5) 二、 数据结构设计程序中考虑到图书信息和读者信息中都包含有不同类型的数据,故分别建立图书和读者两种类型的结构体;由于图书和读者的数量非固定,所以采用动态链式存储来实现。图书类型:typedef struct bkchar book_num11; /* 书号采用10位编码最后1位为字符串结束标志(下同). */
9、char book_name41; /* 书名规定不超过40个字母(20 个汉字) */ unsigned book_kc,book_xc; /* book_kc 代表库存梁,book_xc代表现存量 */struct bk *next; book;读者类型:typedef struct rdchar reader_num11; /* 读者编号采用10位编码 */char reader_name11; /* 读者姓名 */ char reader_book_num11; /*表示所借书号,初始值为“0”*/struct bk *next; reader;三、 主要功能程序结构设计1、系统主要结
10、构流程图:开始否已做初始化初始化是退出系统 0功能选择1 4 5 3 2图书查询还书借书登记新书入库是入库完否 51 52输出读者信息输出图书信息否(注:功能模块2,3,4,5都类似功能模块1,细节见下面个功能程序流程图)2、新书入库功能程序结构图 开始输入新书名、新书号和新书数量 是if(还有新书) 根据数量修改库存已存在此新书 是 否结束(即返回主菜单) 否 book.dat中增加此新书,根据数量设置库存量3、图书查询程序结构图:输入要查询的书号开始是否存在此书输入信息:此书不存在 否 是输入此书的全部信息结束(即返回主菜单)是否继续查询 否 是 4、借书登记程序结构流程图: 是是否重输否
11、满输出出错信息 否 否 是否存在编号输入读者编号开始 是是否还书借书卡是否满提示不能借书 是 否 否 是进入还书模块输入需要借的书号 结束(即返回主菜单)书号存在否 否 是 否还有读者借书借书登记,修改book.dat 中的现存信息,reader.dat 中的借书卡信息 是5、 还书管理程序结构图: 是 否 否 是输入还书的书的编号是否重输 否核对书号 错误进入查询模块输出出错信息是否存在编号输入读者编号开始是否重输否满正确还书将读者信息借书卡清0修改book.dat现存信息还有读者还书否结束(即返回主菜单)是6、输出读者和图书信息开始 选择输出图书还是读者信息输出全部读者信息图书图书结束(即
12、返回主菜单)输出全部图书信息四、文件存储路径。可执行文件tsglxt.exe及book.dat、reader.dat,都存储在c:tsgl文件夹下。程序代码:#include #include /*图形函数头文件 */#include #include typedef struct bk char book_num11; char book_name41; int book_kc; int book_xc; struct bk * next;book; /* 图书信息*/typedef struct rd char reader_num11; char reader_name11; char
13、reader_book_num11; struct rd * next ; reader;/*读者信息*/struct bk * h_book,* h_reader; /*全局变量,分别为指向图书信息链表和读者信息链表的头指针*/void Form_Insert_New_Book(); /*新书入库菜单*/void Form_Find_Book(); /*查询图书菜单 */void Form_Borrow_Book(); /*借书菜单*/void Form_Return_Book(); /*还书菜单*/void Find_Book(char *); /*查询图书*/void Insert_Ne
14、w_Book(char *,char * ,int ); /*新书入库,即在链表中插入一个新节点*/void Borrow_Book(char *,char *);/*借书,修改读者借阅信息和图书的现存信息*/void Return_Book(char *,char *);/*还书,修改读者借阅信息和图书的现存信息*/void print_book(struct bk *);/*输出全部图书信息*/void print_reader(struct rd *);/*输出全部读者信息*/void load_data();/*从文件中读取数据,链表头指针指向第一个节点*/void init_read
15、er();/*第一次运行程序时对三个读者的初始化*/void init_book();/*第一次运行程序时对三本图书的初始化*/void save();/*将链表中的信息保存到文件中*/void M_Form()/*主菜单*/ char ch; printf(n 图书管理系统主窗口); printf(n 0:退出系统); printf(n 1:新书入库); printf(n 2:图书查询); printf(n 3:借书登记); printf(n 4:还书管理); printf(n 5:输出全部信息); do /*此循环用来保证选择正确的数字键执行相应的功能*/ printf(nn 请选择相应的
16、功能代码:); scanf(%c,&ch); fflush(stdin); /*用于清楚键盘缓冲区中的多余字符*/ while(ch!=0&ch!=1&ch!=2&ch!=3&ch!=4&ch!=5); switch(ch) /*根据输入的字符进行选择执行相应的模块*/ case 0:exit(0); case 1:Form_Insert_New_Book();break; case 2:Form_Find_Book();break; case 3:Form_Borrow_Book();break; case 4:Form_Return_Book();break; case 5:load_da
17、ta();print_book(h_book);print_reader(h_reader);M_Form(); default:printf(errorn);exit(0); void Form_Find_Book() char ch; char book_num11; printf(n 图书查询功能模块,请选择相应的功能代码:n); printf( 0:返回到主菜单n); printf( 1:图书查询); do printf(nn 请选择相应的功能代码:); scanf(%c,&ch); fflush(stdin); while(ch!=0&ch!=1); switch(ch) case
18、0:M_Form();break; /*选择0,则返回到上一级目录,即主菜单*/ case 1: printf( n请输入需要需要查询的书的编号:); scanf(%s,book_num); fflush(stdin); Find_Book(book_num); /*执行查询*/ Form_Find_Book();/*查询完毕后继续返回到查询窗口,执行下一个查询*/ default:printf(errorn);exit(0); void Find_Book(char book_num) /*查询图书模块,根据图书编号查询*/ struct bk *p; p=h_book; while(p!=
19、NULL&strcmp(p-book_num,book_num)!=0) p=p-next; /*此循环用于查找,如果在中间找到,则p就不可能到末尾指向空*/ if(p=NULL) printf(nt此编号对应的图书不存在!n); else printf(nt图书编号t图书名t库存量t现存量 n); printf( %10st %10st %dt %dtn,p-book_num,p-book_name,p-book_kc,p-book_xc); getch();void init_book() /*初始化图书模块*/ book ba3; FILE *fp; int i; printf(n 系统
20、即将进行初始化,图书初始化模块:n); printf(n 请分别输入三本书的书号,书名,数量(以空格隔开):n ); for(i=0;i3;i+) /*输入3本图书进行初始化*/ scanf(%s%s%d,bai.book_num,bai.book_name,&bai.book_kc); for(i=0;i3;i+) bai.book_xc=bai.book_kc; /*开始时库存=现存*/ if(fp=fopen(book.dat,wb)=NULL)/*建立新文件book.dat准备写入数据*/ printf(不能建立图书文件,初始化失败!请重新启动系统!n); return; for(i=
21、0;ibook_num,book_num)!=0) q=p;p=p-next; if(strcmp(p-book_num,book_num)=0) printf(ntt此编号已经存在,请重新输入!n); return; t=(struct bk *)malloc(sizeof(struct bk); strcpy(t-book_num,book_num); strcpy(t-book_name,book_name); t-book_kc=t-book_xc=number; q-next=t;t-next=NULL; if(book_fp=fopen(book.dat,ab)=NULL) pri
22、ntf(不能建立图书文件,初始化失败!请重新启动系统!n); return; /*将新书信息添加到文件中*/ fwrite(t,sizeof(struct bk),1,book_fp); fclose(book_fp);void print_book(struct bk *h) /*输出图书信息*/ struct bk *p; p=h; printf(nt图书编号 t图书名 t库存量 t现存量 n); while(p!=NULL) printf( %10st %10s %10dt%10dn,p-book_num,p-book_name,p-book_kc,p-book_xc); p=p-nex
23、t; void print_reader(struct rd *h)/*输出读者信息*/ struct rd *p; p=h; printf(nt读者编号 t读者姓名 t所借书号 n); while(p!=NULL) printf( %10st %10s %10sn,p-reader_num,p-reader_name,p-reader_book_num); p=p-next; getch();void Form_Borrow_Book()/*借书菜单界面*/ char ch; char book_num11,reader_num11; printf(n 图书借阅功能模块,请选择相应的功能代码
24、:n); printf( 0:返回到主菜单n); printf( 1:图书借阅n); do printf(nn 请选择相应的功能代码:); scanf(%c,&ch); fflush(stdin); while(ch!=0&ch!=1); switch(ch) case 0:M_Form();break; case 1: printf( n请输入读者编号与所借书编号:(以空格分隔)); scanf(%s%s,reader_num,book_num); fflush(stdin); Borrow_Book(reader_num,book_num);/*调用借书函数,执行借书功能*/ Form_B
25、orrow_Book();/*借书完成后,程序返回到借书菜单*/ default:printf(errorn);exit(0); void Borrow_Book(char reader_num,char book_num)/*输入读者编号,和需要借阅的书的编号,执行借书功能*/ struct bk *book_p; struct rd *reader_p; book_p=h_book; while(book_p!=NULL&strcmp(book_p-book_num,book_num)!=0) book_p=book_p-next; if(book_p=NULL) printf(nt此编号
26、对应的图书不存在!n); Form_Borrow_Book(); reader_p=h_reader; while(reader_p!=NULL&(strcmp(reader_p-reader_num,reader_num)!=0) reader_p=reader_p-next; if(reader_p=NULL) printf(nt此编号对应的读者不存在!n); Form_Borrow_Book(); else if(strcmp(reader_p-reader_book_num,0)!=0) printf(nt已达到最大借阅数,不能再借书!n); Form_Borrow_Book(); e
27、lse book_p-book_xc=book_p-book_xc-1;/*借书完成后,修改现存量*/ strcpy(reader_p-reader_book_num,book_p-book_num);/*修改读者的借阅信息*/ save();/*将修改后的信息保存到文件中*/ load_data(); /*读入新文件中的数据*/ Form_Borrow_Book();/*程序执行完毕后,返回到借书菜单界面*/void Form_Return_Book()/*还书菜单*/ char ch; char book_num11,reader_num11; printf(n 归还图书功能模块,请选择相
28、应的功能代码:n); printf( 0:返回到主菜单n); printf( 1:归还图书n); do printf(nn 请选择相应的功能代码:); scanf(%c,&ch); fflush(stdin); while(ch!=0&ch!=1); switch(ch) case 0:M_Form();break; case 1: printf( n请输入读者编号与所还书编号:(以空格分隔)); scanf(%s%s,reader_num,book_num); fflush(stdin); Return_Book(reader_num,book_num);/*调用还书函数*/ Form_Re
29、turn_Book(); default:printf(errorn);exit(0); void Return_Book(char reader_num,char book_num)/*输入读者编号和所还书编号执行还书*/ struct bk *book_p; struct rd *reader_p; book_p=h_book; while(book_p!=NULL&strcmp(book_p-book_num,book_num)!=0) book_p=book_p-next; if(book_p=NULL) printf(nt此编号对应的图书不存在!n); Form_Return_Boo
30、k(); reader_p=h_reader; while(reader_p!=NULL&(strcmp(reader_p-reader_num,reader_num)!=0) reader_p=reader_p-next; if(reader_p=NULL) printf(nt此编号对应的读者不存在!n); Form_Return_Book(); else if(strcmp(reader_p-reader_book_num,book_num)!=0) printf(nt读者没有借阅此书n); Form_Return_Book(); else book_p-book_xc=book_p-bo
31、ok_xc+1;/*还书后,修改图书库存量*/ strcpy(reader_p-reader_book_num,0);/*还书后,修改读者借阅信息*/ save();/*保存到文件*/ load_data(); /*读入文件中的数据*/ Form_Return_Book();void init_reader()/*系统第一次运行时,初始化3位读者信息,从键盘读入*/ FILE *fp; reader ra3; int i; printf(n 系统即将进行读者初始化:n); printf(n 请分别输入三位读者的编号和姓名(以空格隔开):n ); for(i=0;i3;i+) scanf(%s%
32、s,rai.reader_num,rai.reader_name); for(i=0;i3;i+) strcpy(rai.reader_book_num,0); if(fp=fopen(reader.dat,wb)=NULL) printf(不能建立读者文件,初始化失败!请重新启动系统!n); return; for(i=0;i3;i+)/*将3位读者信息写入文件*/ if(fwrite(&rai,sizeof(struct rd),1,fp)!=1) printf(写数据错误!n); exit(0); void Form_Insert_New_Book()/*添加新书菜单*/ char ch; struct bk t; printf(n 新书入库功能模块,请选择相应的功能代码:n);