c语言图书管理系统实践报告.docx
- 文档编号:23826510
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:34
- 大小:612.50KB
c语言图书管理系统实践报告.docx
《c语言图书管理系统实践报告.docx》由会员分享,可在线阅读,更多相关《c语言图书管理系统实践报告.docx(34页珍藏版)》请在冰豆网上搜索。
c语言图书管理系统实践报告
北京师大学分校
C程序设计实践报告
题目:
图书管理系统
学院
信息技术学院
专业
计算机科学与技术
学生姓名
龙海恩,少彬,鑫,麦淑玲
指导教师姓名
肖红玉
指导教师单位
信息技术学院
2013
年
4
月
11
日
1、题目与要求
编写一个图书管理系统,除了书上的功能之外,还要能做到读者借书还书,查看书籍排行榜,看到书籍的借阅记录和分类状况。
2、系统总体设计(要给出必要的文字说明及图示)
本报告中蓝色字体为我们小组新增的图书信息。
2.1功能需求分析(明确系统的功能需求)
(1)用户登录
(2)系统主控平台
(3)新增图书信息处理
(4)浏览图书信息处理
(5)查询图书信息处理
(6)删除图书信息
(7)保存图书信息处理
(8)普通用户借书信息处理
(9)普通用户还书信息处理
(10)普通用户可查看已借书籍
(11)查看排行榜
(12)新增用户信息
(13)查找用户
(14)查看所有用户
(15)保存用户信息
(16)退出
2.2系统功能模块划分(要给出系统功能模块图)
(1)登录系统
(2)增加图书信息
(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完成的是图书信息的管理,包括新增图书、浏览图书、查询图书、删除图书、保存图书功能。
user.c完成的是用户信息的管理,包括新增用户、用户查询、保存用户等功能。
management.c完成的是用户登录,用户退出等功能。
Main函数也在这一源程序中。
book.h中的容是图书信息的管理中涉及的常量、结构体的定义和相关函数的声明。
user.h中的容是用户信息的管理中涉及的常量、结构体的定义和相关函数的声明。
management.h中的容是菜单及退出函数的声明。
3.1重要数据的数据结构设计(即结构体的声明、变量的定义、文件)
一.头文件management.h
1.显示菜单函数声明
voidshow_admin_menu();
voidshow_search_book_menu();
voidshow_user_menu();
2.退出系统函数声明
voidadmin_exit();
voiduser_exit();
二.头文件book.h
1.常量定义
分别定义书名、出版社、出版日期、作者、ISBN、图书类型、借书读者、借阅图书的借阅量的最大长度。
(蓝色字体为我们小组新增的图书信息。
)
#defineMAX_BOOK_NAME20
#defineMAX_PUBLISHER20
#defineMAX_DATE10
#defineMAX_AUTHOR20
#defineMAX_ISBN20
#defineMAX_SORT10
#defineMAX_BORROW_USER20
#defineMAX_BOOK_COUNT10000
2.结构体类型定义
定义一个结构体类型_book_info,使用typedef语句自定义一个新类型book_info,新类型中共11个成员,分别是书名、作者、出版社、出版日期、ISBN、页数、用于标记借书还书、图书类型、借阅次数、借书读者、用于标记排行榜,用来描述图书的基本信息。
typedefstruct_book_info
{
charbook_name[MAX_BOOK_NAME];
charauthor[MAX_AUTHOR];
charpublisher[MAX_PUBLISHER];
charpub_date[MAX_DATE];
charISBN[MAX_ISBN];
intpages;
charborrow_size;
charsort[MAX_SORT];
intborrow_time;
charborrow_user[MAX_BORROW_USER];
intbook_load_time;
}book_info;
定义一个结构体类型_book,使用typedef语句自定义一个新类型book,其中成员有一个结构体变量bi和指向下一本图书的指针变量。
(此结构是存储图书信息的链表。
)
typedefstruct_book
{
book_infobi;
struct_book*next;
}book;
3.函数声明
(1)主要处理函数声明
voidinit_book();//图书模块初始化
voidload_books();//从图书文件中加载图书信息
voidadd_book();//新增图书
voidview_book();//浏览所有的图书
voiddelete_book();//删除图书
voidsave_books();//调用将图书信息保存到文件函数,给出提示信息
voidclear_books();//从存中清除图书链表信息
voidbooks_charts();//排行榜
voidupdate_book();//更新图书
(2)图书查询函数声明
voidsearch_book_by_name();//按书名查询图书
voidsearch_book_by_author();//按作者查询图书
voidsearch_book_by_publisher();//按出版社查询图书
voidsearch_book_by_pubdate();//按出版日期查询图书
voidsearch_book_by_isbn();//桉书ISBN查询图书
voidsearch_book_by_sort();//桉图书类型查询图书
(3)辅助函数声明
voidsave_books_to_file();//将图书信息保存到文件
book*get_last_book();//得到图书链表的最后一个节点
book*get_previous_book(book*p);//取得图书链表的最后一个节点
voidinput_book(book_info*info);//输入一本图书信息
voidshow_book(book_info*info);//显示图书信息
voidupdate_book_data(book_info*info);//更新图书信息
intfindstr(char*,char*);//查找字符串
voidborrow(book*);//普通用户借阅书籍
void_return(book*);//普通用户还书
voidshow_books_record();//书的借阅记录标记
三.头文件user.h
1.常量定义
#defineMAX_USERNAME10
#defineMAX_PASSWORD10
定义一个枚举类型_USER_TYPE,使用typedef语句自定义一个新枚举类型USER_TYPE,枚举类型可能取两种值,0是管理员,1是普通用户。
typedefenum_USER_TYPE
{
ADMIN=0,
USER
}USER_TYPE;
2.结构体类型定义
定义一个结构体类型_user_info,使用typedef语句自定义一个新类型user_info,新类型中共3个成员,分别是用户名,密码,用户权限,用来描述用户的基本信息。
typedefstruct_user_info
{
charusername[MAX_USERNAME];
charpassword[MAX_PASSWORD];
USER_TYPEuser_type;
}user_info;
定义一个结构体类型_user,使用typedef语句自定义一个新类型user,其中成员有一个结构体变量ui和指向下一个用户的指针变量。
(此结构是存储用户信息的链表。
)
typedefstruct_user
{
user_infoui;
struct_user*next;
}user;
3.函数声明
(1)主要处理函数声明
voidinit_user();//用户模块初始化
voidload_users();//从用户文件中加载用户信息
USER_TYPElogin();//用户登录,返回用户类型
voidadd_user();//新增一个用户
voidsearch_user();//查找一个
voidsave_users();//调用将用户信息保护到文件函数,给出提示信息
voidclear_users();//从存中清除用户链表信息
voidview_users();//查看所有用户
(2)辅助函数声明
voidsave_users_to_file();//将用户信息保存到文件
user*get_last_user();//得到用户链表的最后一个节点
user*get_previous_user(user*p);//得到用户节点p的前一个节点
user*find_user(char*name);//从用户链表中按用户名查找一个用户信息
voidshow_user(user_info*info);//显示一个用户信息
voidinput_user(user_info*info);//输入一个用户信息
voiddelete_user(user*p);//从链表中删除一个用户信息
voidupdate_user(user*p);//更新一个用户信息
四.模块化设计management.c
2.函数指针数组admin_func存储的是管理员权限操作主菜单所对应的函数。
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.c
1.预处理
增加了两个语句:
intcharts[MAX_BOOK_COUNT]={0};//声明全局变量,排行榜
externcharborrow_user[20];//调用其他源文件已声明过的变量
2.主要处理函数
(1).查找图书的几个函数中:
voidsearch_book_by_name();
voidsearch_book_by_author();
voidsearch_book_by_publisher();
voidsearch_book_by_pubdate();
voidsearch_book_by_isbn();
voidsearch_book_by_sort();
均加了借书还书代码。
while(p!
=NULL)
{
if(findstr(p->bi.book_name,s)!
=-1)
{
show_book(&(p->bi));//显示查到的图书信息
if(strcmp(borrow_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。
继续查找吗?
(yorn):
",s);
getchar();
input=getchar();
//continue;
}else{
printf(">共找到%d本图书...\n",count);
printf(">继续查找吗?
(yorn):
");
getchar();
input=getchar();
printf("..............................\n");
}
实现后截图为
(2)删除图书的代码为:
voiddelete_book()
{
intcount=1;charinput='Y';
charisbn[MAX_ISBN]={0};
charfirst_isbn[MAX_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)
{
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(">确认删除吗?
(yorn):
");
getchar();
input=getchar();
if(input=='y'||input=='Y')
{
if(strcmp(first_isbn,p->bi.ISBN)==0)first_book=p->next;elseget_previous_book(p)->next=p->next;
free(p);
}
}else
printf(">没有找到ISBN为%s的图书。
\n",isbn);
printf(">继续删除其他图书吗?
(yorn):
");
getchar();
input=getchar();
}
}
书中的这部分是代码是有错误的。
在删除第一本书的时候会报错。
加上if(count)来判断用户是否要删掉第一本书。
(4)更新图书的代码:
voidupdate_book()
{
chartry_again='Y';
book*p=NULL,*ch;
chars[MAX_BOOK_NAME]={0};//书名
while(try_again=='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_book_data(&p->bi);
else
printf("改图书已被借出,不能更新!
!
");
}
else
printf("未找到改图书");
printf(">继续更新图书吗?
(yorn):
");
getchar();
try_again=getchar();
}
}
(5)排行榜
voidbooks_charts(){
book*p=NULL,*q;
p=first_book;
inti,j,k,temp=0;
charinput='Y';
for(i=0;p!
=NULL;i++)
{
charts[i]=p->bi.borrow_time;
p->bi.book_load_time=1;
p=p->next;
}
for(j=0;j
{
for(k=j+1;k
{
if(charts[k]>charts[j])
{
temp=charts[k];
charts[k]=charts[j];
charts[j]=temp;
}
}
}
while(input=='y'||input=='Y')
{
k=0,j=0;
q=first_book;
printf("排行榜:
\n");
printf("+-----------------------------------------------------+\n");
printf("|名次|书名|被借次数|\n");
printf("+-----------------------------------------------------+\n");
while(k
{
while(q!
=NULL)
{
if(q->bi.borrow_time==charts[k]&&q->bi.book_load_time==1)
break;
q=q->next;
}
printf("|%7d.|%-21s|%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("借阅状态:
未被借出\n");
//printf("%s",info->borrow_user);
}
else{
if(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("借阅者:
%s\n",info->borrow_user);
}
printf("被借总次数:
%d\n",info->borrow_time);
//if(strcmp(info->borrow_user,"NULL")==1)
printf("..............................\n");
六.模块化设计user.c
1.预处理增加声明两个语句:
externbook*first_book;
charborrow_user[20];
2.主要处理函数
(1)在删除用户函数中,即voiddelete_user,增加了一个条件,即当要删除的用户中有借书记录时,不得删除。
并作出提示。
voiddelete_user(user*p)
{
charinput_char='N';
book*q=first_book;
user*previous=NULL;
intcount=0;
printf(">确定要删除用户[%s]吗?
(yorn):
",p->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);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 图书 管理 系统 实践 报告