一图书信息管理系统.docx
《一图书信息管理系统.docx》由会员分享,可在线阅读,更多相关《一图书信息管理系统.docx(39页珍藏版)》请在冰豆网上搜索。
一图书信息管理系统
一图书信息管理系统
1.1题目要求
●图书信息包括:
登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
●试设计一图书信息管理系统,使之能提供以下功能:
a)系统以菜单方式工作
b)图书信息录入功能(图书信息用文件保存)--输入
c)图书信息浏览功能--输出
d)查询和排序功能:
(至少一种查询方式)--算法
(1)按书名查询
(2)按作者名查询
e)图书信息的删除与修改(可选项)v
[提示]建立职工信息结构体,结构体成员包括职工号、姓名、性别、年龄、学历、工资、住址、电话。
1.2需求分析
根据题目要求,要求对图书信息进行输入、输出等操作;在程序中需要浏览图书的信息,应提供显示、查找、浏览、插入、修改等操作;另外还应提供键盘式选择菜单实现功能选择。
1.3总体设计
根据需求分析,可以对这个系统的设计分为以下几个模块:
图1.3系统功能模块图
1.4详细设计
1.4.1主函数
主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
[流程图]:
显示各功能选项
图1.4.1主函数流程图
[程序]:
/*****************主函数**********************/
main()
{menu();
}
/*****************menu函数********************/
voidmenu()
{intn,w1;/*变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围*/
do
{
puts("\t\t*****************menu****************\n\n");
puts("\t\t\t\t1.Enternewdata");
puts("\t\t\t\t2.Browseall");
puts("\t\t\t\t3.Search");
puts("\t\t\t\t4.add");
puts("\t\t\t\t5.Exit");
puts("\n\n\t\t***********************************\n");
printf("Choiceyournumber(1-5):
[]\b\b");
scanf("%d",&n);
if(n<1||n>5)/*对选择的数字作出判断,是否在菜单功能数字范围内*/
{w1=1;getchar();}
elsew1=0;
}while(w1==1);
switch(n)/*根据输入的数字,进入到相应的操作模块中*/
{case1:
enter();break;/*输入模块*/
case2:
browse();break;/*浏览模块*/
case3:
search();break;/*查找模块,其中包括按不同类别进行查找的多个子模块*/
case4:
add();break;/*插入模块*/
case5:
exit(0);/*退出*/
}
}
注:
menu函数能提供菜单方式选择功能,可以根据用户需要进入到所想要的操作模块中,此外把menu函数独立出来,可以方便随时对它进行调用,容易返回到系统界面。
用结构体来存放职工信息:
/********************结构体*******************/
structworker
{
charnumber[11];
charname[20];
charsex[20];
charadress[20];
charxueli[20];
chartelephone[20];
charage[20];
charsalary[20];
}wor[N];
/*wor[N]中每个数组元素对应一个职工*/
其中可以根据宏定义#defineN随时对N的值进行调整,扩大信息的储存量。
1.4.2各功能模块设计
(1)输入模块
[需求分析]对信息进行输入。
[流程图]:
图1输入模块流程图
[程序]:
/********************输入模块*******************/
voidenter()/*输入函数*/
{
inti,n;
printf("Howmanyworkers(0-%d):
",N-1);
scanf("%d",&n);/*输入记录的个数,赋值给n*/
printf("\nEnterdatanow\n\n");
for(i=0;i{printf("\nInput%dthworkerrecord.\n",i+1);
input(i);/*调用单个输入函数*/
}
if(i!
=0)save(n);/*调用保存函数*/
printf_back();/*一个任务结束时让用户选择是浏览还是返回*/
}
(2)浏览模块
[需求分析]该模块的功能是显示所有职工记录信息。
[流程图]
显示职工记录(10个一屏)
:
按任意键显示下一屏
按任意键返回主菜单
图2浏览模块流程图
[程序]:
/****************浏览(全部)模块***************/
browse()/*浏览(全部模块)*/
{
inti,j,n;
n=load();/*调用加载函数,并计算可以记录的个数*/
printf_face();/*调出显示数据结构项目函数*/
for(i=0;i{
if((i!
=0)&&(i%10==0))/*判断i值能否整除10,每10行一屏显示*/
{
printf("\n\nPassanykeytocontinue...");
getchar();
puts("\n\n");
}
printf_one(i);/*调用显示一个记录的函数*/
}
printf("\tThereare%drecord.\n",n);/*提示用户储存信息数量*/
printf("\nPassanykeytoback...");
getch();/*按任意键*/
menu();/*返回主菜单*/
}
(3)查找模块
[流程图]:
:
图3查找模块流程图
[程序]:
/***************查找模块***************/
search()/*查找模块*/
{
intc,w1;
do/*do-while循环语句用来判断用户的选择是否在程序规定之内*/
{
puts("\nsearchby=>\n\n1).number2).xueli3).cancelandback");
printf("Whichyouneeded?
:
[]\b\b");
scanf("%d",&c);
if(c>3||c<1)/*对选择的数字作出判断*/
{
puts("\nchoiceerror!
pleaseagain!
");
getchar();}
}
while(c>3||c<1);
{
switch(c)/*switch语句提供按不同类别进行查找功能*/
{
case1:
search1();break;/*按职工号进行查找*/
case2:
search2();break;/*按姓名进行查找*/
case3:
menu();break;/*返回主菜单*/
}
}
}
/***************按职工号查找模块***************/
[流程图]:
按职工号查找模块
用户作出选择,输入一整型数值
1,2,还是3
修改
返回主菜单
继续查找
图4按职工号查找模块流程图
[程序]:
search1()
{
inti,n,k,w1=1,w2,w3,w4;
structworkers;/*定义结构体变量s,用以储存输入的number的值,便于进行比较*/
n=load();/*加载将要记录的个数*/
do/*该do-while循环语句判断是否继续执行该函数*/
{
do/*该do-while循环语句判断是否找到要查找的对象*/
{
k=-1;
printf("\n\nEnternumberthatyouwanttosearch!
number:
");
scanf("%s",s.number);
printf_face();/*调出显示数据结构项目函数*/
for(i=0;i同的职工号*/
if(strcmp(s.number,wor[i].number)==0)/*原数据信息中找到与输入职工号相
同的职工号*/
{k=i;
printf_one(k);break;
}
if(k==-1)/*原数据信息中没有找到与输入职工号相同的职工号*/
{
printf("\n\nNoexit!
please");
printf("\n\nAreyouagain?
\n\t1).again2).Noandback[]\b\b");
scanf("%d",&w1);
if(w1==2)menu();/*返回主菜单*/
}
}while(k==-1&&w1==1);/*在没有找到且想再次查找的情况下继续进行循环*/
w4=0;w3=0;
if(k!
=-1)/*在查找到的情况下*/
{
printf("\n\nWhatdoyouwanttodo?
\n\t1).Searchanother2).Modify3).Backmenu[]\b\b");
scanf("%d",&w2);
switch(w2)
{case1:
search1();break;/*继续按照职工号查找其他对象*/
case2:
w3=modify_data(k,n);break;/*对查找到的对象进行修改*/
case3:
menu();break;/*返回主菜单*/
}
}
}while(w2==1);
menu();/*返回主菜单*/
}
/***************按学历查找模块***************/
[流程图]
按职工学历查找模块
用户作出选择,输入一整型数值
1,2,还是3
修改
返回主菜单
继续查找
图5按职工学历查找模块流程图
[程序]:
search2()
{inti,n,k,w1=1,w2,w3,w4;
structworkers;/*定义结构体变量s,用以储存输入的xueli的值,便于进行比较*/
n=load();/*加载将要记录的个数*/
do/*该do-while循环语句判断是否继续执行该函数*/
{
do/*该do-while循环语句判断是否找到要查找的对象*/
{k=-1;
printf("\n\nEnterxuelithatyouwanttosearch!
xueli:
");
scanf("%s",s.xueli);
printf_face();/*调出显示数据结构项目函数*/
for(i=0;i职工*/
if(strcmp(s.xueli,wor[i].xueli)==0)/*原数据信息中找到与输入职工学历相同的职工*/
{k=i;
printf_one(k);break;
}
if(k==-1)/*原数据信息中没有找到与输入职工学历相同的职工*/
{printf("\n\nNoexit!
please");
printf("\n\nAreyouagain?
\n\t1).again2).Noandback[]\b\b");
scanf("%d",&w1);
if(w1==2)menu();/*返回主菜单*/
}
}
while(k==-1&&w1==1);/*在没有找到且想再次查找的情况下继续进行循环*/
w4=0;w3=0;
if(k!
=-1)/*在查找到的情况下*/
{printf("\n\nWhatdoyouwanttodo?
\n\t1).Searchanother2).Modify3).Backmenu[]\b\b");
scanf("%d",&w2);
switch(w2)
{case1:
search1();break;/*继续按照职工学历查找其他对象*/
case2:
w3=modify_data(k,n);break;/*对查找到的对象进行修改*/
case3:
menu();break;/*返回主菜单*/
}
}
}
while(w2==1);
menu();/*返回主菜单*/
}
(4)插入模块
[需求分析]该模块的功能是插入职工记录信息并且不能覆盖原有职工信息。
[流程图]
插入模块
调用加载函数
让用户输入要插入的职工信息个数
调用整条信息输入函数
用户作出选择,输入1or2
1还是2
2返回主菜单
1浏览全部
图6插入模块流程图
【程序】
/*************************插入模块*********************/
add()/*插入模块*/
{
inti,n,m,k;
FILE*fp;
n=load();/*加载将要记录的个数*/
printf("Howmanyworkerareyouwanttoadd(0-%d)?
:
",N-1-n);
scanf("%d",&m);/*输入要查如职工信息的个数*/
k=m+n;
for(i=n;i{
printf("\nInput%dthworkersrecord.\n",i-n+1);
input(i);/*调用整条职工信息输入函数*/
}
if((fp=fopen("worker.txt","ab"))==NULL)
{
printf("cannotopenfile\n");
}
for(i=n;iif(fwrite(&wor[i],sizeof(structworker),1,fp)!
=1)
printf("filewriteerror\n");
fclose(fp);
printf_back();/*一个任务结束时的选择浏览还是返回的函数*/
}
1.4.3公共函数
(1)保存函数save(intn)
[说明]:
形参n控制保存的个数。
[程序]:
voidsave(intn)
{FILE*fp;/*定义文件指针*/
inti;
if((fp=fopen("worker.txt","wb"))==NULL)/*以只写方式打开二进制文件,若打不开返回NULL值*/
{printf("\nCannotopenfile\n");
}
for(i=0;iif(fwrite(&wor[i],sizeof(structworker),1,fp)!
=1)/*若读写成功,则返回值1*/
printf("filewriteerror\n");
fclose(fp);/*关闭文件*/
}
(2)加载函数load()
[说明]:
该函数可以用来加载所有记录,并且可以返回所有记录的个数。
[程序]:
intload()
{FILE*fp;
inti;
if((fp=fopen("worker.txt","rb"))==NULL)/*以只读方式打开二进制文件,若打不开返回NULL值*/
{printf("\nCannotopenfile\n");
returnNULL;}
for(i=0;!
feof(fp);i++)/*在文件关闭之前,向磁盘文件中读入数据块*/
fread(&wor[i],sizeof(structworker),1,fp);
fclose(fp);
return(i-1);/*返回数据块数值*/
}
(3)职工号输入函数no_input(inti,intn)
[说明]:
该函数对输入职工号进行判断,确保输入的职工号唯一。
形参i表示第i个职工记录,形参n表示总共有n个职工记录。
[程序]:
voidno_input(inti,intn)
{intj,k,w1;
do/*该do-while循环语句用来输入职工号信息并判断号码是否重复*/
{w1=0;
printf("number:
");
scanf("%s",wor[i].number);
for(j=0;wor[i].number[j]!
='\0';j++)/*判断输入的号码是否由0-9间的数字组成*/
if(wor[i].number[j]<'0'||wor[i].number[j]>'9')/*输入数字不是有0-9之间的数字组成*/
{puts("Inputerror!
Onlybemadeupof(0-9).Pleasereinput!
\n");
w1=1;break;}
if(w1!
=1)/*w1!
=1表示输入数字正确*/
for(k=0;kif(k!
=i&&strcmp(wor[k].number,wor[i].number)==0)/*判断输入的职工号是否已经重复*/
{puts("Thisrecordisexist.pleasereinput!
\n");
w1=1;break;}
}
while(w1==1);/*w1==1表示输入数字有误或者输入的职工号重复*/
}
(4)输入整一个记录函数input(inti)
[说明]:
形参i表示第i个职工记录。
[程序]:
voidinput(inti)
{no_input(i,i);/*调用职工号输入函数*/
printf("name:
");scanf("%s",wor[i].name);
printf("age:
");scanf("%s",wor[i].age);
printf("sex:
");scanf("%s",wor[i].sex);
printf("adress:
");scanf("%s",wor[i].adress);
printf("telephone:
");scanf("%s",wor[i].telephone);
printf("salary:
");scanf("%s",wor[i].salary);
printf("xueli:
");scanf("%s",wor[i].xueli);
}
(5)显示一个记录的函数printf_one(inti)
[说明]:
形参i表示第i个职工记录。
[程序]:
voidprintf_one(inti)
{
printf("%11s%6s%9s%3s%8s%11s%7s%6s\n",
wor[i].number,wor[i].name,wor[i].age,wor[i].sex,wor[i].adress,
wor[i].telephone,wor[i].salary,wor[i].xueli);
}
(6)一个任务结束时的选择浏览还是返回的函数printf_back()
voidprintf_back()
{intk,w;
printf("\n\n\tSuccessful^-^.\n\n");
printf("Whatdoyouwanttodo?
\n\n\t1).Browseallnow\t2).Back:
[]\b\b");
scanf("%d",&w);
if(w==1)browse();/*输入1再次浏览*/
elsemenu();}/*返回主菜单*/
(7)修改整条数据记录函数modify_data(inti,intn)
[说明]:
形参i表示第i个职工记录,形参n表示有n个记录,此函数带回保存控制值w1,当w1=1时表示确认保存。
[程序]:
modify_data(inti,intn)
{intc,w1;
do/*判断输入数字是否在选择范围之内*/
{puts("\nmodifyby=>\n\n1).number2).name3).cancelandback");
printf("Whichyouneeded?
:
[]\b\b");
scanf("%d",&c);
if(c>3||c<1)/*输入数字不在选择范围之内*/
{puts("\nChoiceerror!
pleaseagain!
");getchar();}
}
while(c>3||c<1);
do/*按照选择输出对应数据块*/
{switch(c)
{case1:
no_input(i,n);break;
case2:
printf("name:
");scanf("%s",wor[i].name);break;
case3:
menu();break;}
puts("\nNow:
\n");
printf_face();
printf_one(i);/*显示一个记录的函数*/
printf("\nAreyousure?
\n\n\t1).sure2).noandremodify3).backwithoutsaveinthistime[]\b\b");
scanf("%d",&w1);
if(w1==1)save(n);/*对所输入或修改数据进行保存*/
}
while(w1==2);
return(w1);/*返回保存控制值*/
}
1.5上机操作
1.5.1数据源;
1.5.2编译、连接和运行;
1.5.3结果;
下面是各个模块的截面图:
(1)主菜单函数
图7主菜单截图
(2)输入模块:
主界面出现后输入1回车显示下图:
图8输入模块截图
输入要输入的记录然后逐条增加,并进行职工号是否重复的检查,如重复则显示输入重复请重新输入:
如下图:
图9截图
(3)浏览模块
图10浏览模块截图
(4)查找模块
图11截图
按职工号查找
图12按职工号查询截图
按学