1、一图书信息管理系统一图书信息管理系统1.1 题目要求 图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。 试设计一图书信息管理系统,使之能提供以下功能:a) 系统以菜单方式工作b) 图书信息录入功能(图书信息用文件保存)输入c) 图书信息浏览功能输出d) 查询和排序功能:(至少一种查询方式)算法(1) 按书名查询(2) 按作者名查询e) 图书信息的删除与修改(可选项)v提示建立职工信息结构体,结构体成员包括职工号、姓名、性别、年龄、学历、工资、住址、电话。1.2 需求分析根据题目要求,要求对图书信息进行输入、输出等操作;在程序中需要浏览图书的信息,应提供显示、查找、浏览、
2、插入、修改等操作;另外还应提供键盘式选择菜单实现功能选择。1.3总体设计根据需求分析,可以对这个系统的设计分为以下几个模块:图1.3 系统功能模块图1.4详细设计1.4.1 主函数主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。其中各功能模块用菜单方式选择。流程图:显示各功能选项图1.4.1 主函数流程图程序: /*主函数*/main ()menu();/*menu函数*/void menu() int n,w1;/*变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围*/ do puts(tt*menu*nn); puts(tttt1.Enter new da
3、ta); puts(tttt2.Browse all); puts(tttt3.Search );puts(tttt4.add); puts(tttt5.Exit); puts(nntt*n); printf(Choice your number(1-5): bb); scanf(%d,&n); if(n5) /*对选择的数字作出判断,是否在菜单功能数字范围内*/ w1=1;getchar(); else w1=0; while(w1=1); switch(n)/*根据输入的数字,进入到相应的操作模块中*/ case 1:enter();break;/*输入模块*/ case 2:browse
4、();break; /*浏览模块*/ case 3:search();break; /*查找模块,其中包括按不同类别进行查找的多个子模块*/ case 4:add();break;/*插入模块*/ case 5:exit(0); /*退出*/ 注:menu函数能提供菜单方式选择功能,可以根据用户需要进入到所想要的操作模块中,此外把menu函数独立出来,可以方便随时对它进行调用,容易返回到系统界面。 用结构体来存放职工信息:/*结构体*/struct workerchar number11;char name20;char sex20;char adress20;char xueli20;cha
5、r telephone20;char age20;char salary20;worN;/* worN中每个数组元素对应一个职工*/其中可以根据宏定义# define N随时对N的值进行调整,扩大信息的储存量。1.4.2各功能模块设计(1)输入模块需求分析 对信息进行输入。流程图:图1 输入模块流程图程序:/*输入模块*/void enter()/*输入函数*/int i,n; printf(How many workers(0-%d):,N-1); scanf(%d,&n);/*输入记录的个数,赋值给n*/ printf(n Enter data nownn); for(i=0;in;i+)
6、/*通过for循环语句依次输入N个职工信息数据*/ printf(n Input %dth worker record.n,i+1); input(i);/*调用单个输入函数*/ if(i!=0)save(n);/*调用保存函数*/ printf_back(); /*一个任务结束时让用户选择是浏览还是返回*/ (2)浏览模块需求分析 该模块的功能是显示所有职工记录信息。流程图显示职工记录(10个一屏):按任意键显示下一屏按任意键返回主菜单图2 浏览模块流程图程序:/*浏览(全部)模块*/browse() /*浏览(全部模块)*/ int i,j,n; n=load(); /*调用加载函数,并计
7、算可以记录的个数*/ printf_face(); /*调出显示数据结构项目函数*/ for(i=0;inn1).number2).xueli3).cancel and back);printf(Which you needed?: bb);scanf(%d,&c);if(c3|c3|c1);switch(c) /* switch语句提供按不同类别进行查找功能*/case 1:search1();break; /*按职工号进行查找*/ case 2:search2();break; /*按姓名进行查找*/ case 3:menu();break; /*返回主菜单*/*按职工号查找模块*/流程图
8、:按职工号查找模块用户作出选择,输入一整型数值1,2,还是3修改返回主菜单继续查找图4 按职工号查找模块流程图 程序:search1()int i,n,k,w1=1,w2,w3,w4; struct worker s; /*定义结构体变量s,用以储存输入的number的值,便于进行比较*/ n=load(); /*加载将要记录的个数*/ do /*该do- while循环语句判断是否继续执行该函数*/ do /*该do- while循环语句判断是否找到要查找的对象*/ k=-1; printf(nnEnter number that you want to search! number:);
9、scanf(%s,s.number); printf_face();/*调出显示数据结构项目函数*/ for(i=0;in;i+) /* for循环语句用来判断原数据信息中是否有与输入职工号相 同的职工号*/ if(strcmp(s.number,wori.number)=0) /*原数据信息中找到与输入职工号相 同的职工号*/ k=i; printf_one(k);break; if(k=-1) / *原数据信息中没有找到与输入职工号相同的职工号*/ printf(nnNo exit!please); printf(nnAre you again?nt1).again 2).No and b
10、ack bb); scanf(%d,&w1); if(w1=2) menu();/*返回主菜单*/ while(k=-1&w1=1);/*在没有找到且想再次查找的情况下继续进行循环*/ w4=0;w3=0; if(k!=-1) /*在查找到的情况下*/ printf(nnWhat do you want to do?nt1).Search another 2).Modify 3).Back menu bb); scanf(%d,&w2); switch(w2) case 1:search1();break;/*继续按照职工号查找其他对象*/ case 2:w3=modify_data(k,n)
11、;break;/*对查找到的对象进行修改*/ case 3:menu();break;/*返回主菜单*/ while(w2=1);menu();/*返回主菜单*/ /*按学历查找模块*/流程图按职工学历查找模块用户作出选择,输入一整型数值1,2,还是3修改返回主菜单继续查找图5按职工学历查找模块流程图程序:search2()int i,n,k,w1=1,w2,w3,w4; struct worker s; /*定义结构体变量s,用以储存输入的xueli的值,便于进行比较*/ n=load(); /*加载将要记录的个数*/ do /*该do- while循环语句判断是否继续执行该函数*/ do
12、/*该do- while循环语句判断是否找到要查找的对象*/ k=-1; printf(nnEnter xueli that you want to search! xueli:); scanf(%s, s.xueli ); printf_face();/*调出显示数据结构项目函数*/ for(i=0;in;i+) /* for循环语句用来判断原数据信息中是否有与输入职工学历相同的 职工*/ if(strcmp(s. xueli,wori. xueli)=0) /*原数据信息中找到与输入职工学历相同的职工*/ k=i; printf_one(k);break; if(k=-1) / *原数据信
13、息中没有找到与输入职工学历相同的职工*/ printf(nnNo exit!please); printf(nnAre you again?nt1).again 2).No and back bb); scanf(%d,&w1); if(w1=2) menu();/*返回主菜单*/ while(k=-1&w1=1);/*在没有找到且想再次查找的情况下继续进行循环*/ w4=0;w3=0; if(k!=-1) /*在查找到的情况下*/ printf(nnWhat do you want to do?nt1).Search another 2).Modify 3).Back menu bb); s
14、canf(%d,&w2); switch(w2) case 1:search1();break;/*继续按照职工学历查找其他对象*/ case 2:w3=modify_data(k,n);break;/*对查找到的对象进行修改*/ case 3:menu();break;/*返回主菜单*/ while(w2=1);menu();/*返回主菜单*/(4)插入模块需求分析 该模块的功能是插入职工记录信息并且不能覆盖原有职工信息。流程图 插入模块调用加载函数让用户输入要插入的职工信息个数 调用整条信息输入函数 用户作出选择,输入1or21还是22返回主菜单1 浏览全部图6插入模块流程图【程序】/*插
15、入模块*/add() /*插入模块*/ int i,n,m,k; FILE*fp; n=load(); /*加载将要记录的个数*/printf(How many worker are you want to add(0-%d)?:,N-1-n); scanf(%d,&m); /*输入要查如职工信息的个数*/k=m+n; for(i=n;ik;i+) /*用for循环实现m个信息的录入*/ printf(nInput %dth workers record.n,i-n+1 ); input(i); /*调用整条职工信息输入函数*/ if(fp=fopen(worker.txt,ab)=NULL)
16、 printf(cannot open filen); for(i=n;ik;i+) /*用for循环实现对m个信息录入到文件worker.txt */if(fwrite(&wori,sizeof(struct worker),1,fp)!=1) printf(file write errorn); fclose(fp); printf_back(); /*一个任务结束时的选择浏览还是返回的函数*/1.4.3公共函数(1)保存函数 save(int n) 说明:形参n控制保存的个数。程序:void save(int n) FILE *fp; /*定义文件指针*/ int i; if(fp=fo
17、pen(worker.txt,wb)=NULL)/*以只写方式打开二进制文件,若打不开返回NULL值*/ printf(nCannot open filen); for(i=0;in;i+) /* for循环语句作用为读写n个数据块*/ if(fwrite(&wori,sizeof(struct worker),1,fp)!=1)/*若读写成功,则返回值1*/ printf(file write errorn); fclose(fp); /*关闭文件*/ (2)加载函数 load()说明:该函数可以用来加载所有记录,并且可以返回所有记录的个数。程序:int load()FILE *fp;int
18、 i;if(fp=fopen(worker.txt,rb)=NULL) /*以只读方式打开二进制文件,若打不开返回NULL值*/printf(nCannot open filen);return NULL;for(i=0;!feof(fp);i+)/*在文件关闭之前,向磁盘文件中读入数据块*/fread(&wori,sizeof(struct worker),1,fp);fclose(fp);return(i-1); /*返回数据块数值*/(3)职工号输入函数no_input(int i,int n)说明:该函数对输入职工号进行判断,确保输入的职工号唯一。形参i表示第i个职工记录,形参n表示总
19、共有n个职工记录。程序:void no_input(int i,int n)int j,k,w1;do /*该do- while循环语句用来输入职工号信息并判断号码是否重复*/w1=0;printf(number:);scanf(%s,wori.number);for(j=0;wori.numberj!=0;j+) /*判断输入的号码是否由0-9间的数字组成*/if(wori.numberj9)/*输入数字不是有0-9之间的数字组成*/puts(Input error!Only be made up of (0-9).Please reinput!n);w1=1;break;if(w1!=1)
20、 /* w1!=1表示输入数字正确*/for(k=0;knn 1).number 2).name 3).cancel and back);printf(Which you needed?: bb);scanf(%d,&c);if(c3|c3|c1);do /*按照选择输出对应数据块*/switch(c)case 1:no_input(i,n);break;case 2:printf(name:);scanf(%s,wori.name);break;case 3:menu();break;puts(nNow:n);printf_face();printf_one(i); /*显示一个记录的函数
21、*/printf(nAre you sure?nnt1).sure 2).no and remodify 3).back without save in this time bb);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 按职工号查询截图按学
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1