图书馆管理系统c语言.docx
《图书馆管理系统c语言.docx》由会员分享,可在线阅读,更多相关《图书馆管理系统c语言.docx(29页珍藏版)》请在冰豆网上搜索。
图书馆管理系统c语言
图书馆管理系统
045072班王磊
第三部分13题
一、题目要求
图书馆管理系统包括:
图书名称、图书编号、单价、作者、存在状态,借书人姓名、性别、学号等,此外设计的系统须具有如下功能:
1.新进图书及基本信息输入
2.图书基本信息查询
3.对撤销图书信息的删除
4.办理借书手续
5.办理书手续
二、需求分析
根据题目要求,需建立图书管理系统结构体,结构体中应包括图书名称,图书编号,单价、作者、存在状态,借书人姓名,性别、学号等。
其中存在状态设定为整形变量,可用不同的数字来表达,在该系统中用〝1〝来表示可借出,〝0〝来表示已借出。
图书信息应存放在文件中,所以提供文件的输入输出等操作;并且程序需具有实现图书信息浏览,查找、修改等功能,并进行借出借入服务;另外还应提供键盘是选择菜单来实现功能选择。
三、总体设计
结合上述分析该系统应包括以下模块:
信息输入、图书查找、信息删除,图书借出、图书归还。
结构图如下
四、详细设计
1、主函数
主函数要求设计比较简洁,只提供设输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
[流程图]
[程序]
main()
{intn,t;
/*变量保存选择菜单数字,判断输入的数字是否在功能人能够菜单所对应的数字范围内*/
do
{puts("\t\t\t***欢迎使用图书馆管理系统***\n\n\n");
puts("\t\t\t*************MENU************\n\n");
puts("\t\t\t1.图书信息输入\n");
puts("\t\t\t2.新图书信息录入\n");
puts("\t\t\t3.图书信息浏览\n");
puts("\t\t\t4.图书信息查找\n");
puts("\t\t\t5.图书信息修改\n");
puts("\t\t\t6.图书信息删除\n");
puts("\t\t\t7.图书借阅\n");
puts("\t\t\t8.图书归还\n");
puts("\t\t\t9.退出系统\n");
puts("\t\t\t\n\n\n*****************************\n\n");
/*对功能选项的显示*/
printf("选择使用功能种类(1--9)[]\b\b");
scanf("%d",&n);
if(n<1||n>9)
{t=1;getchar();}/*对选择的数字作判断*/
elset=0;}
while(t==1);
/*实现选择功能*/
switch(n)
{case1:
enter();break;/*输入功能*/
case2:
add();break;/*追加功能*/
case3:
browse();break;/*浏览功能*/
case4:
search();break;/*查找功能*/
case5:
modify();break;/*修改功能*/
case6:
del();break;/*删除功能*/
case7:
TSXX_out();break;/*图书借出*/
case8:
TSXX_back();break;/*归还功能*/
case9:
exit(0);break;/*退出*/
}
}
/*以上完成了主函数计主菜单的构成*/
2输入模块
[数据结构]
根据题目中对数据结构的要求每一本图书包含的信息利用一个结构体来存放。
其中结构体需包含:
字符变量:
图书名称、作者、借书人姓名
实型变量:
图书编号、单价、学号
整型变量:
存在状态,、性别、库存
定义结构体如下
structTSXX
{chartsn[30];/*图书名称*/
intbh[15];/*图书编号*/
floatpri;/*单价*/
charzzn[10];/*作者*/
intzt;/*存在状态*/
intkc/*库存*/
charjsn[10];/*借书人姓名*/
intsex;/*性别*/
intnum[15];/*学号*/
}ts[N];/*ts[N]中每个数组元素对应一本书的全部信息*/
/*以上完成了对于结构体的定义*/
[注意]
本程序ts[N]中的个数,采取宏定义的方式,可以随时在源程序宏定义中更改,本程序在此宏定义#defineN10000。
[流程图]
Y
[程序]
voidenter()
{inti;
for(i=0;i{printf("请输入图书信息\n\n");
input(i);}/*调用输入函数*/
if(i!
=0)save();/*/
printf_back();/*一个任务结束时让用户选择是浏览还是返回*/
3。
追加模块
[需求分析]
该模块的功能是假如用户需要新加入新的图书信息,通过键盘输入将新信息逐条加在原来输入文件上但不能覆盖原有信息。
[流程图]
[程序]
voidadd()
{inti,n,m,k;
FILE*fp
n=()load;
printf(〝可添加信息个数(0-%d):
[]\b\b〝,N-n-1);
scanf(〝%d〝,&m);
k=m+n;
for(i>n;i<=k;i++)
input(i);
if(fp=fopen(〝ts.txt〝,〝a〝)==NULL)
{printf(〝文件无法打开\n〝);}
for(i>n;i<=k;i++)
fclose(fp);
printf_back();
}
4.查找模块
[需求分析]
该模块的功能是根据输入的图书名称查找相应的记录找到以后,可继续进行删除和修改功能
[流程图]
YN
N
Y
[程序]
Search()
{inti,k,n,t1=1,t2,t3,t4;
structTSXXt;
n=load();
do
{do
{k=-1;
printf(〝\n\n输入你所要查询的图书名称:
〝);
scanf(〝%s〝,t.tsn);
print_show()
for(i=0;iif(strcmp(t.tsn,ts[i].tsn)==0)
{k=i;
printf_one();break;}
if(k==-1)
printf(〝对不起,您所查找的图书不存在〝);
printf(〝继续吗?
\n\t1).继续查找2)不,返回请选择[]\b\b〝);
scanf(〝%d〝,&t1);
}
while(k==-1&&wi==1);
t4=0;t3=0;
if(k!
=-1)
{printf(〝\n\n您的下一步操作\n\n1)查找下一个2}修改图书信息3)删除图书信息4)回到主菜单请选择[]\b\b〝);
scanf(〝%d〝,&t2);
switch(t2)
{case2:
w3=modify_data(k,n);break;
case3:
{print(〝\n\n你确定吗?
\n\t1)确定删除2}不,返回请选择[]\b\b〝);
scanf(〝%d〝,&t4);
if(t4==1)
ts[k].num=0;
break;
}
}
if(t3==1||t4==1)
{save(n);
printf(〝\n\n信息修改成功〝);
printf(〝\n\您的下一步操作?
\n\t1)查找下一个2)返回请选择[]\b\b〝);
scanf(〝%d〝,&t2);
}
}
}
while(t3==1);
mneu();
}
5、修改模块
[需求分析]
该模块用于显示所有图书信息,由于记录较多,故而采取分屏显示。
显示完所有纪录后,用户需输入图书编号进而查找图书信息
[流程图]
Y
N
YN
[程序]
voidmodify()/*修改模块*/
{sructTSXXt;
FILE*fp;
inti,n,k,t0=1,t1,t2=0;
n=load();
do
{k=-1;
/*让用户查看全部记录以便确认要修改的记录*/
printf_show();/*调用数据结构显示函数*/
for(i=0;i{if((i!
=0)&&(i%10==0))/*用于分屏显示*/
{printf(“\n\n请记录需要修改的图书编号。
任意键继续……”);
getch();
puts(“\n\n”);
}
printf_one(i);/*调用显示一个记录的函数*/
}
do
{printf(“\n\n请输入您需要修改的图书编号。
NO.:
”);
scanf(“%f”,&t.bh);/*输入需要修改的图书编号*/
for(i=0;iif(strcmp(t.bh,ts.bh)==0)
{k=i;/*找到许需修改的记录*/
t=ts[i];/*将ts[i]中原有需修改的记录备份给t,以便用户反悔时恢复*/
}
if(k==-1)printf(“\n\n信息不存在!
再试一次”);
}while(k==-1);/*当k=-1时表示没找到*/
print_show();/*调用数据结构显示函数*/
printf_one(k);/*调用显示一个记录的函数*/
t1=modify_data(k,n);
/*修改学生记录并且返回保存控制值t1,t1=1则表示用户已确认修改*/
if(t1==1)/*t1=1时则表示用户确定此次修改*/
{printf(“\n成功修改,是否继续修改?
\n\n\t1).是2)返回并保存\t[]\b\b);
scanf(“%d”,&t0);
t2=1;/*来控制保存,使w2=1是标记已有过的记录*/
}
eles
{to=0;
if(t2==1)
ts[k]=s;
}
/*到此处由于用户没有确认这次修改。
使t0=0,为了终止循环,ts[k]=s;则把备份的s恢复给ts[k],这样使得在此之前修改过的成功保存而本次不修改*/
if(t0!
=1&&t2==1)
/*t0不等于1则表示正常返回,t2=1则表示在此之前有过修改,这时就保存用户已确认的修改并返回*/
save(n);
/*t2不等于1表示在此之前没有修改过,而又反悔这次修改,则不保存返回*/
}while(t0==1);
menu();
}
6.删除模块
[需求模块]
该模块用于显示所有图书信息,由于记录较多,故而采取分屏显示。
显示完所有纪录后,用户需输入图书编号进而查找图书信息,
[流程图]
、、、
Y
N
N
Y
[程序]
voiddel()/*删除模块*/
{sructTSXXt;
FILE*fp;
inti,n,k,t0=1,t1,t2=0;
n=load();
do
{k=-1;
/*让用户查看全部记录以便确认要删除的记录*/
printf_show();/*调用数据结构显示函数*/
for(i=0;i{if((i!
=0)&&(i%10==0))/*用于分屏显示*/
{printf(“\n\n请记录需要删除的图书编号。
任意键继续……”);
getch();
puts(“\n\n”);
}
printf_one(i);/*调用显示一个记录的函数*/
}
do
{printf(“\n\n请输入您需要删除的图书编号。
NO.:
”);
scanf(“%f”,&t.bh);/*输入需要删除的图书编号*/
for(i=0;iif(strcmp(t.bh,ts.bh)==0)
{k=i;/*找到许需删除的记录*/
t=ts[i];/*将ts[i]中原有需删除的记录备份给t,以便用户反悔时恢复*/
}
if(k==-1)printf(“\n\n信息不存在!
再试一次”);
}while(k==-1);/*当k=-1时表示没找到*/
print_show();/*调用数据结构显示函数*/
printf_one(k);/*调用显示一个记录的函数*/
t1=del_data(k,n);
/*删除学生记录并且返回保存控制值t1,t1=1则表示用户已确认删除*/
if(t1==1)/*t1=1时则表示用户确定此次删除*/
{printf(“\n成功删除,是否继续删除?
\n\n\t1).是2)返回并保存\t[]\b\b);
scanf(“%d”,&t0);
t2=1;/*来控制保存,使w2=1是标记已有过的记录*/
}
eles
{to=0;
if(t2==1)
ts[k]=s;
}
/*到此处由于用户没有确认这次删除。
使t0=0,为了终止循环,ts[k]=s;则把备份的s恢复给ts[k],这样使得在此之前删除过的成功保存而本次不删除*/
if(t0!
=1&&t2==1)
/*t0不等于1则表示正常返回,t2=1则表示在此之前有过删除,这时就保存用户已确认的删除并返回*/
save(n);
/*t2不等于1表示在此之前没有删除过,而又反悔这次删除,则不保存返回*/
}while(t0==1);
menu();
}
7、借出模块
[需求分析]
该模块功能应体现为
voidbook_out(void)
{intn,s,i,d;
if((n=search_TSXX())!
=-1&&ts[n].kc>0)
{printf("请输入学号:
");
scanf("%d",&s);
printf("请输入可借天数:
");
scanf("%d",&d);
for(i=0;i<10;i++)
{
if(ts[n].num[i]==0)
{
ts[n].num[i]=s;
ts[n].days[i]=d;
break;
}
}
ts[n].kc--;
}
if(n!
=-1&&ts[n].kc==0)printf("此书已经全部借出.\n");
return_confirm();
}
/*上面是借书的函数,首先调用找书函数*/
8、归还模块
voidTSXX_back(void)
{
intn,s,i;
page_titie("归还图书");
if((n=search_TSXX())!
=-1&&ts[n].kc{printf("借阅者图书证列表:
\n");
for(i=0;i<10;i++)
if(ts[n].num[i]!
=0)
printf("[%d]-%d天\n",ts[n].num[i],ts[n].days[i]);
printf("请输入借书证序号:
");
scanf("%d",&s);
for(i=0;i<10;i++)
{if(ts[n].num[i]==s)
{ts[n].num[i]=0;
ts[n].days[i]=0;
break;
}
}
ts[n].kc++;
}
if(n!
=-1&&ts[n].kc==ts[n].totai)
printf("全部入藏.\n");
return_confirm();
}
9.公共函数
1)保存函数save(intn)
[说明]
/*形参n控制保存的个数。
当ts[k].bh=0表示删除,不保存该记录。
*/
[程序]
voidsave(intn)
{FILE*fp;
inti;
if((fp=fopen(“tsxx.txt”,“wb”))==NULL)
{printf(“\n不能打开文件\n”);
returnNULL;
}
for(i=0;iif(ts[i].bh!
=0)
if(fwrite(&ts[i],sizeof(structTSXX),1,fp)!
=1)
printf(“文件无法写\n”);
fclose(fp);}
2)加载函数
[说明]
[程序]
/*该函数用于加载所有记录,并且可以返回所有记录的个数。
*/
voidload()
{FILE*fp;
intI;
if((fp=fopen(“tsxx.txt”,“r”))==NULL)
{printf(“文件无法打开”);
returnNULL;
}
for(i=0;!
feof(fp);i++)
fread(&ts[i],sizeof(structTSXX)),1,fp);
fclose(fp);
return(i-1);
}
3).输入函数
a.\*输入整个记录的输入函数*\
voidinput(inti)
{printf(“图书名称:
”);
scanf(“%s”,ts[i].tsn);
printf(“图书编号:
”);
no_input1(i,i);
printf(“图书单价:
”);
scanf(“%f”&ts[i].pri);
printf(“作者:
”);
scanf(“%s”,ts[i].zzn);
;printf(“库存:
”);
scanf(“%d”,&ts[i].kc)
state();
printf(“借书人姓名:
”);
scanf(“%s”,ts[i].jsn);
printf(“性别(1代表男,2代表女):
”);
scanf(“%d”,&ts[i].sex);
printf(“学号:
”);
no_input2(i,i);}
b./*号码输入函数no_input1()*/
voidno_input(inti,intn)
{inti,j,t1;
do
{t1=0;
scanf(“%d”,ts[i].bh);
for(j=0;ts[i].bh[j]!
=’\0’;j++;)
if(ts[i].bh[j]<’0’||ts[i].bh[j]>’9’)
{puts(“输入错误!
只接受数字输入,请重新输入”);
t1=1;break;
}
if(t1!
=1)
for(k=0;kif(k!
=i&&strcmp(ts[k].bh,ts[i].bh)==0)
{puts(“记录已存在,请重新输入”);
t1=1;break;
}
}
while(t1==1);
}
c./*号码输入函数no_input2()*/
voidno_input2(intt,intp)
{inti,j,k,t1,n;
do
{t1=0;
scanf("%d",ts[i].num);
for(j=0;ts[i].num[j]!
='\0';j++)
if(ts[i].bh[j]<'0'||ts[i].bh[j]>'9')
{puts("输入错误!
只接受数字输入,请重新输入");
t1=1;break;
}
if(t1!
=1)
for(k=0;kif(k!
=i&&strcmp(ts[k].num,ts[i].num)==0)
{puts("记录已存在,请重新输入");
t1=1;break;
}
}
while(t1==1);
}
4./*状态函数*/
voidstate(inti)
{if(ts[i].kc!
=0)
printf("1");
elseprintf("0");
}
/*显示一个记录函数*/
voidprintf_one(inti)
{
printf("书名:
%s\n",ts[i].tsn);
printf("作者:
%s\n",ts[i].zzn);
printf("存数:
%dof",ts[i].kc);
printf("存在状态:
%d\n",ts[i].zt);
}
/*修改整条记录的函数*/
modify_data(inti,intn)
{intc,t1;
do
{puts("\nmodifyby=>\n\n1).编号.2).图书名称3).单价4).作者5).状态6).库存.7).全部信息8).返回");
printf("请选择:
[]\b\b");
scanf("%d",&c);
if(c>7||c<1)
{puts("\n输入错误,请重新选择");
getchar();
}
}
while(c>8||c<1);
do
{switch(c)
{case1:
no_input1(i,n);break;
case2:
printf("图书名称");scanf("%s",ts[i].tsn);break;
case3:
printf("单价");scanf("%f",&ts[i].pri);break;
case4:
printf("作者");scanf("%s",ts[i].zzn);break;
case5:
printf("状态");scanf("%d",&ts[i].zt);break;
case6:
printf("库存");scanf("%d",&ts[i].kc);break;
case7:
input(i);break;};
if(c>2&&c<7)
printf_one(i);
printf("\n确定修改嘛\n\n\t1).确定2).不,重新修改3).返回并保存[]\b\b");
scanf("%d",&t1);
}
while(t1==2);
return(t1);
}
源代码:
#include
#include
#include
structBOOK
{intid,usr[10],total,store,days[10],zt;
charname[31],author[21];
}books[100];
voidpage_title(char*menu_item)
{printf("************欢迎使用08WL型图书馆管理系统************\n\n-%s-\n\n",menu_item);
}
voidreturn_confirm(void)
{printf("\n按任意键返回……\n");
getch();
}
voidstate(intn)
{if(books[n].total!
=0)
printf("1");
if(books[n].total==0)
printf("0");
}
intsearch_book(void)
{
intn,i;
printf("请输入图书序号:
");
scanf(