一图书信息管理系统.docx
- 文档编号:11761312
- 上传时间:2023-03-31
- 格式:DOCX
- 页数:39
- 大小:168.10KB
一图书信息管理系统.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;i if(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;i if(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;k if(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按职工号查询截图 按学
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图书 信息管理 系统