《最新c语言图书管理系统实践报告.doc》由会员分享,可在线阅读,更多相关《最新c语言图书管理系统实践报告.doc(115页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-datec语言图书管理系统实践报告北京师范大学珠海分校北京师范大学珠海分校C程序设计实践报告题目:图 书 管 理 系 统学 院信息技术学院专 业计算机科学与技术学 生 姓 名龙海恩,郑少彬,张鑫,麦淑玲指导教师姓名肖红玉指导教师单位信息技术学院2013年4月11日1、 题目与要求编写一个图书管理系统,除了书上的功能之外,还要能做到读者借书还书,查看书籍排行榜,看到书籍的借阅记
2、录和分类状况。2、 系统总体设计(要给出必要的文字说明及图示)本报告中蓝色字体为我们小组新增的图书信息。2.1功能需求分析(明确系统的功能需求)(1) 用户登录(2) 系统主控平台(3) 新增图书信息处理(4) 浏览图书信息处理(5) 查询图书信息处理(6) 删除图书信息(7) 保存图书信息处理(8) 普通用户借书信息处理(9) 普通用户还书信息处理(10) 普通用户可查看已借书籍(11) 查看排行榜(12) 新增用户信息(13) 查找用户(14) 查看所有用户(15) 保存用户信息(16) 退出2.2系统功能模块划分(要给出系统功能模块图)(1) 登录系统(2) 增加图书信息(3) 浏览图书
3、信息(4) 查找图书信息(1)按书名查找(2)按作者查找(3)按出版社查找(4)按出版日期查找(5)按ISBN查找(6)按图书类型查找(5) 删除图书信息保存图书信息(6) 图书排行榜(7) 新增用户信息(8) 查找用户信息(9) 更新用户信息(10) 删除用户信息(11) 保存用户信息(12) 退出系统(1)管理员退出系统(2)普通用户退出系统3、 详细设计本系统包括图书信息管理和用户管理两大方面,程序有三大模块,有三个源程序文件(management.c、book.c、user.c)和三个头文件(management.h、book.h、user.h)。其中book.c完成的是图书信息的管理
4、,包括新增图书、浏览图书、查询图书、删除图书、保存图书功能。user.c完成的是用户信息的管理,包括新增用户、用户查询、保存用户等功能。management.c完成的是用户登录,用户退出等功能。Main函数也在这一源程序中。book.h中的内容是图书信息的管理中涉及的常量、结构体的定义和相关函数的声明。user.h中的内容是用户信息的管理中涉及的常量、结构体的定义和相关函数的声明。management.h中的内容是菜单及退出函数的声明。 31重要数据的数据结构设计(即结构体的声明、变量的定义、文件)一 头文件management.h1.显示菜单函数声明void show_admin_menu(
5、);void show_search_book_menu();void show_user_menu();2.退出系统函数声明void admin_exit();void user_exit();二 头文件book.h1.常量定义分别定义书名、出版社、出版日期、作者、ISBN、图书类型、借书读者、借阅图书的借阅量的最大长度。(蓝色字体为我们小组新增的图书信息。)#define MAX_BOOK_NAME 20#define MAX_PUBLISHER 20#define MAX_DATE 10#define MAX_AUTHOR 20#define MAX_ISBN 20#define MAX
6、_SORT 10#define MAX_BORROW_USER 20#define MAX_BOOK_COUNT 100002. 结构体类型定义定义一个结构体类型_book_info,使用typedef 语句自定义一个新类型book_info,新类型中共11个成员,分别是书名、作者、出版社、出版日期、ISBN、页数、用于标记借书还书 、图书类型、借阅次数、借书读者、 用于标记排行榜 ,用来描述图书的基本信息。typedef struct _book_infochar book_nameMAX_BOOK_NAME;char authorMAX_AUTHOR;char publisherMAX_P
7、UBLISHER;char pub_dateMAX_DATE;char ISBNMAX_ISBN;int pages;char borrow_size;char sortMAX_SORT;int borrow_time;char borrow_userMAX_BORROW_USER;int book_load_time;book_info;定义一个结构体类型_book,使用typedef 语句自定义一个新类型book,其中成员有一个结构体变量bi和指向下一本图书的指针变量。(此结构是存储图书信息的链表。)typedef struct _bookbook_info bi;struct _book
8、* next;book;3. 函数声明(1)主要处理函数声明void init_book(); /图书模块初始化void load_books(); /从图书文件中加载图书信息void add_book(); /新增图书 void view_book(); /浏览所有的图书void delete_book(); /删除图书void save_books(); /调用将图书信息保存到文件函数,给出提示信息void clear_books(); /从内存中清除图书链表信息void books_charts(); /排行榜void update_book(); /更新图书(2)图书查询函数声明voi
9、d search_book_by_name(); /按书名查询图书void search_book_by_author(); /按作者查询图书void search_book_by_publisher(); /按出版社查询图书void search_book_by_pubdate(); /按出版日期查询图书void search_book_by_isbn(); /桉书ISBN查询图书void search_book_by_sort(); /桉图书类型查询图书(3)辅助函数声明void save_books_to_file(); /将图书信息保存到文件book* get_last_book();
10、 /得到图书链表的最后一个节点book* get_previous_book(book* p); /取得图书链表的最后一个节点void input_book(book_info* info); /输入一本图书信息void show_book(book_info* info); /显示图书信息void update_book_data(book_info* info); /更新图书信息int findstr(char* , char*); /查找字符串void borrow(book*); /普通用户借阅书籍void _return(book*); /普通用户还书void show_books_
11、record(); /书的借阅记录标记三 头文件user.h1.常量定义#define MAX_USERNAME 10#define MAX_PASSWORD 10定义一个枚举类型_USER_TYPE,使用typedef 语句自定义一个新枚举类型USER_TYPE,枚举类型可能取两种值,0是管理员,1是普通用户。typedef enum _USER_TYPEADMIN = 0,USERUSER_TYPE;2. 结构体类型定义定义一个结构体类型_user_info,使用typedef 语句自定义一个新类型user_info,新类型中共3个成员,分别是用户名,密码,用户权限,用来描述用户的基本信息
12、。typedef struct _user_infochar usernameMAX_USERNAME;char passwordMAX_PASSWORD;USER_TYPE user_type;user_info;定义一个结构体类型_user,使用typedef 语句自定义一个新类型user,其中成员有一个结构体变量ui和指向下一个用户的指针变量。(此结构是存储用户信息的链表。)typedef struct _useruser_info ui;struct _user* next;user;3. 函数声明(1)主要处理函数声明void init_user(); /用户模块初始化void lo
13、ad_users(); /从用户文件中加载用户信息USER_TYPE login(); /用户登录,返回用户类型void add_user(); /新增一个用户void search_user(); /查找一个void save_users(); /调用将用户信息保护到文件函数,给出提示信息void clear_users(); /从内存中清除用户链表信息void view_users(); /查看所有用户(2)辅助函数声明void save_users_to_file(); /将用户信息保存到文件user* get_last_user(); /得到用户链表的最后一个节点user* get_p
14、revious_user(user* p); /得到用户节点p的前一个节点user* find_user(char* name); /从用户链表中按用户名查找一个用户信息void show_user(user_info* info); /显示一个用户信息void input_user(user_info* info); /输入一个用户信息void delete_user(user* p); /从链表中删除一个用户信息void update_user(user* p); /更新一个用户信息四 模块化设计management.c2. 函数指针数组admin_func存储的是管理员权限操作主菜单所对
15、应的函数。void (* admin_func)() = add_book,view_book,show_search_book_menu,delete_book,update_book,save_books,books_charts,add_user,search_user,save_users,view_users,admin_exit;其他函数基本没多大改变,跟书中一样。五 模块化设计book.c1. 预处理增加了两个语句:int chartsMAX_BOOK_COUNT = 0; /声明全局变量,排行榜extern char borrow_user20; /调用其他源文件已声明过的变量
16、2. 主要处理函数(1) .查找图书的几个函数中:void search_book_by_name();void search_book_by_author();void search_book_by_publisher();void search_book_by_pubdate();void search_book_by_isbn();void search_book_by_sort();均加了借书还书代码。while (p != NULL)if (findstr(p-bi.book_name, s) != -1)show_book(&(p-bi);/显示查到的图书信息if(strcmp(b
17、orrow_user,admin) != 0)if(p-bi.borrow_size) = N)borrow(p);/在user.c中定义else_return(p);/在user.c中定义save_books();count+;p = p-next;if (count = 0)printf(没有找到图书%s。继续查找吗?(y or n):, s);getchar();input = getchar();/continue;elseprintf(共找到%d本图书.n, count);printf(继续查找吗?(y or n):);getchar();input = getchar();prin
18、tf(.n);实现后截图为(2) 删除图书的代码为:void delete_book()int count=1; char input = Y;char isbnMAX_ISBN = 0;char first_isbnMAX_ISBN = 0; book* p = NULL;book* result = NULL;while (input = Y | input = y)printf(删除图书.n);printf(请输入ISBN(最大长度为 %d):, MAX_ISBN);scanf(%s, isbn);p = first_book;result = NULL;while (p != NULL
19、)if (count) strcpy(first_isbn,p-bi.ISBN); if (strcmp(p-bi.ISBN, isbn) = 0)result = p;break;count = 0; p = p-next;if (result != NULL)show_book(&(result-bi);printf(确认删除吗?(y or n):);getchar();input = getchar();if (input = y | input = Y)if (strcmp(first_isbn, p-bi.ISBN) = 0) first_book = p-next; else ge
20、t_previous_book(p)-next = p-next;free(p);elseprintf(没有找到ISBN为 %s 的图书。n, isbn);printf(继续删除其他图书吗?(y or n):);getchar();input = getchar();书中的这部分是代码是有错误的。在删除第一本书的时候会报错。加上if(count)来判断用户是否要删掉第一本书。(4) 更新图书的代码:void update_book()char try_again = Y;book* p = NULL,*ch;char sMAX_BOOK_NAME = 0;/书名while (try_again
21、 = Y | try_again = y)p = first_book;ch = first_book;printf(更新图书.n);printf(请输入要更新图书的书名(最大长度为%d):, MAX_BOOK_NAME);scanf(%s, s);while(p != NULL)if(strcmp(s,p-bi.book_name) = 0)break;p = p-next;if(p != NULL)while(ch != NULL)if(strcmp(ch-bi.borrow_user,NULL) != 0)break;ch = ch-next;if(ch = NULL)update_bo
22、ok_data(&p-bi);elseprintf(改图书已被借出,不能更新!);elseprintf(未找到改图书);printf(继续更新图书吗?(y or n):);getchar();try_again = getchar();(5) 排行榜void books_charts()book *p = NULL,*q;p = first_book;int i,j,k,temp = 0;char input = Y;for(i = 0;p != NULL;i+)chartsi = p-bi.borrow_time;p-bi.book_load_time = 1;p = p-next;for(
23、j = 0;j i;j+)for(k = j+1;k chartsj)temp = chartsk;chartsk = chartsj;chartsj = temp;while(input = y | input = Y)k = 0,j = 0;q = first_book;printf(排行榜:n);printf(+-+n);printf(| 名次 | 书名 | 被借次数 |n);printf(+-+n);while(k bi.borrow_time = chartsk & q-bi.book_load_time = 1)break;q = q-next;printf(|%7d. | %-2
24、1s|%8d |n,k+1,q-bi.book_name,q-bi.borrow_time);printf(+-+n);q-bi.book_load_time = 2;q = first_book;k+;printf(要继续查看排行榜么?(要 y 不要 n)n);getchar();input = getchar();while(q != NULL)q-bi.book_load_time = 1;q = q-next;printf(.);3. 辅助函数在show_book中增加了部分显示图书的借阅状态,即被谁借了,借阅次数。if(info-borrow_size = N)printf(借阅状态
25、:未被借出n);/printf(%s,info-borrow_user);elseif(strcmp(borrow_user,info-borrow_user) != 0)printf(借阅状态:已被借出n);if(strcmp(borrow_user,info-borrow_user) = 0)printf(借阅状态:你借了该图书n);if(strcmp(borrow_user,admin) = 0)printf(借阅者:%sn,info-borrow_user);printf(被借总次数:%dn,info-borrow_time);/if(strcmp(info-borrow_user,N
26、ULL) = 1)printf(.n);六 模块化设计user.c1. 预处理增加声明两个语句:extern book* first_book;char borrow_user20;2. 主要处理函数(1) 在删除用户函数中,即void delete_user,增加了一个条件,即当要删除的用户中有借书记录时,不得删除。并作出提示。void delete_user(user* p)char input_char = N;book *q = first_book;user* previous = NULL;int count = 0;printf(确定要删除用户 %s 吗?(y or n):, p
27、-ui.username);getchar();input_char = getchar();while(q != NULL)if(strcmp(q-bi.borrow_user,p-ui.username) = 0)count+;q = q-next;if(count = 0)if (input_char = Y | input_char = y)previous = get_previous_user(p);previous-next = p-next;free(p);p = NULL;elseprintf(该用户有借书记录,不得删除!);(2) 新增一个,能查看所有用户的函数,即void
28、 view_users,代码如下:void view_users()char try_again = Y;/*printf(%s,p-next-next-next-ui.username);getchar();getchar();*/p = p-next;while (try_again = Y | try_again = y)user* p = first_user;p = p-next;printf(+-+n);printf(| 账号 | 密码 |n);printf(+-+n);while(p != NULL)printf(| %-10s| %-10s|n,p-ui.username,p-
29、ui.password);printf(+-+n);p = p-next;printf(需要再次查询用户信息么? 要 y 不要 n:);getchar();try_again = getchar();printf(-n);(3) 普通用户借书功能函数,即void borrow,代码如下:void borrow(book* p)char sure = N;printf(确定要借阅吗?(y or n);getchar();sure = getchar();if(sure = y | sure = Y)p-bi.borrow_size = Y;p-bi.borrow_time+;strcpy(p-b
30、i.borrow_user,borrow_user);(4)普通用户还书功能函数,代码如下:void _return(book* p)char sure = N;if(strcmp(borrow_user,p-bi.borrow_user) = 0)printf(确定要还书吗?(y or n);getchar();sure = getchar();if(sure = y | sure = Y)p-bi.borrow_size = N;strcpy(p-bi.borrow_user,NULL);(5)查看读者本人已借书籍,代码如下:void show_books_record()book* p
31、= NULL;char input = Y;while (input = y | input = Y)p = first_book;printf(+-+n);printf(| 书名 | 作者 |n);printf(+-+n);while (p != NULL)if(strcmp(p-bi.borrow_user,borrow_user) = 0)printf(|%24s|%23s|n, p-bi.book_name, p-bi.author);printf(+-+n);p = p-next;printf(再次查阅已借书籍吗?(y or n):);getchar();input = getcha
32、r(); 3.2函数的规划和设计(即根据分析需要设计哪些函数及其之间的调用关系)主菜单上对应的选项分别对应着各个函数,写成一个函数把菜单上的各个函数包括起来。这样的函数有:void (* admin_func),调用着add_book;view_book;show_search_book_menu;delete_book;update_book;save_books;books_charts;add_user,;search_user;save_users;view_users;admin_exit;void (* admin_search_book_func),调用着search_book_
33、by_name,search_book_by_author,search_book_by_publisher,search_book_by_pubdate,search_book_by_isbn,search_book_by_sort;void (* user_func),调用着view_book,show_search_book_menu,show_books_record,books_charts,user_exit;(2)在查找图书中,无论是按什么方式查找,都调用了void borrow(book* p)和void _return(book* p)两个函数,即在读者每次查找完书之后,都询
34、问“是否借书”,“是否还书”的过程。在退出系统的时候,管理员和用户的退出是不一样的,在管理员退出的时候,有admin_exit,调用的函数是save_users_to_file();clear_users();save_books_to_file();clear_books(); exit(0);而用户退出的时候,调用的是clear_users();clear_books();exit(0); 3.3主控模块(main函数)的流程分析与设计(要画出主函数的流程图)显示管理员登陆菜单重试?输入用户名和密码开始判断输入的用户名和密码是否正确?判断输入的用户名是否为管理员?显示用户管理菜单继续下一步结束YNYNYN 3.4主要功能模块的流程分析与设计(分别画出各主要功能模块实现的流程图)(1)普通用户登陆结束 重试?输入用户名和密码开始判断输入的用户名和密码是否正确?显示用户管理菜单查找图书查看已借书籍排行榜退出系统浏览图书继续?继续?继续?AYN N YYYYNNN判断该书是否已借?A返回主菜单按图书类型查找按ISBN查找按出版日期查找按出版社查找按作者查找按书名查找判断该借书人是否为该用户?是否要还这本书?还书成功主菜单界面是否要借这本书?是否要继续查找书籍?借书成功