1、浏览功能要求能够按照工资卡号、姓名分类浏览;有排序功能,排序后按照工资卡号升序或实发工资降序输出;查询功能要求能够按照工资卡号、姓名查询。【提示】1、文件中一行数据对应一个职工工资信息2、工资信息的数据结构采用结构体数组,一个数组元素对应一条工资单记录。3、工资单信息包括工资卡号、姓名、月份、应发工资、税费、电费、税金、实发工资等4、实发工资=应发工资税费电费税金,其中税金计算方法为:(1)应发工资800元,税金=0(2)800应发工资1400元,税金=(应发工资1400)*10%2程序设计思路1、设计思路(1)根据题目要求,应该把职工工资信息用结构体形式输入,在定义一个全局变量和文件指针进行
2、整个程序的运行,然后把职工工资信息送到文件中,所以应该提供一个结构体和文件的输入输出等操作;(2)在程序中需实现职工工资浏览、查询、统计等功能的操作,所以需要建立相应的功能模块来实现;(3)另外还需要提供键盘式选择菜单实现功能,在运行时达到所要的目的。2、总体设计整个系统可以分为信息输入、信息新增、信息浏览、信息排序和信息查询五个主要模块。3、详细设计(1)工资信息采用结构体数组:struct list int num; /工资卡号 char name20; /姓名 int month; /月份 int salary1; /应发工资 int water; /水费 int electrisity
3、; /电费 float fax; /税金 float salary2; /实发工资listN; /listN中每个数组元素对应一个职工工资信息(2)输入模块 按照工资卡号、姓名、月份、应发工资、水费、电费的顺序输入信息,税金和实发工资根据输入的信息进行计算得到,这些信息被录入到文件中。文件操作函数:fopen,fwrite,fclose.税金的计算:if(应发工资800&=1400) 税金=(应发工资-800)*5%;1400) 税金=(应发工资-1400)*10%;实发工资=应发工资-水费-电费-税金。(3)新增模块增加新的职工工资信息,从键盘输入并逐条写到原来的输入文件中,采用追加而不是覆
4、盖的方式(以”ab”方式打开文件)。(4)浏览模块 调用排序模块的排序功能,可以浏览排序后的所有职工信息。(5)排序模块排序模块提供菜单选择,实现按照工资卡号升序、实发工资升序排序。排序方法可以选择冒泡排序、插入排序、选择排序等,本系统用的是冒泡排序。(6)查询模块实现按照工资卡号和姓名的查询,采用基本的查找方法即可。3功能模块图4数据结构设计系统用将职工各项信息以结构体类型struct list来定义,它包括num,name20,month,salary1,water,electricity,fax,salaly2等不同类型的数据项,同时定义了结构体数组,包括N个数组元素,对应N个职工,每一
5、个元素用来存放一个职工的数据;每个职工的信息以结构体方式从内存和磁盘文件中进行存储和导出。以结构体方式来整合职工的不同信息,将不同的数据组合成一个有机整体,非常方便程序的调用。5算法设计1主函数提供输入、处理和输出部分的函数调用,各功能模块采用菜单方式选择。 N Y2.添加模块 1 22.新增模块 3.浏览模块4.排序模块Y 1 25.查询模块 1 26程序代码(每个函数都要有功能说明)#includestring.hconio.hstdlib.h#define N 50void main() void menu(); menu();void menu() /主菜单函数 void enter(
6、); void add(); void browse(); void search(); void order(); int n,w1; do puts(tt*MENU*nn);ttt 1.Enter ttt 2.Addttt 3.browse allttt 4.Search ttt 5.Order ttt 6.Exitnntt*n printf(Choice your number(1-6):bb scanf(%d,&n); if(n6) /*对选择的数字进行判断*/ w1=1; getchar(); else w1=0; while(w1=1); switch(n) case 1:ente
7、r();break; /*输入模块*/ case 2:add(); /*新增模块*/ case 3:browse(); /*浏览模块*/ case 4:search(); /*查找模块*/ case 5:order(); /*排序模块*/ case 6:exit(0); /*退出模块*/struct list /结构体定义工资信息 int num; /姓名 /电费 float fax; /税金void enter() /输入模块函数 void printf_back(); void save(int n); void input(int i); int i,n;how many workers
8、 (1-%d)?:,N-1); /输入职工数目n enter date nownn for(i=0;in;i+) /输入职工各项信息n input %dth student record.n,i+1); input(i); /调用职工信息输入函数 if(i!=0)save(n); /储存职工信息 printf_back(); /执行返回函数void add() /新增模块函数 int i,n,m,k; int load(); FILE *fp; /定义文件指针变量 n=load(); /导出文件信息,得到返回值how many workers are you want to add(0-%d)
9、?,N-1-n);m); /输入新增职工数目 k=m+n; /总职工数= 新增职工数+已有职工数 for(i=n+1;=k;i+) /输入新增职工信息n input %dth workers record.n,i-n+2); /调用职工信息输入函数 fp=fopen(workers.txt,ab /以追加形式打开文件i+) fwrite(&listi,sizeof(struct list),1,fp); /将内存中的职工信息输出到磁盘文件中 save(n); /储存输入信息 fclose(fp); /关闭文件 void browse() /浏览模块函数 void printf_one(int
10、i); void printf_face(); printf_face(); if(i!=0)&(i%10=0) /以10个职工为一组输出 printf(nnpass any key to continue. getch();nn printf_one(i); /输出各职工信息 printf(nt there are %d recode.n,n);n pass any key to back. /返回主菜单 void search() /查询模块函数 ttt1.search by name /按姓名查询ttt2.search by num /按工资卡号查询 if(n2) void search
11、_1(); void search_2();search_1();search_2(); void search_1() /按姓名查询 int i,n,k,w1=1,w2,w3,w4; struct list s; k=-1;nnenter name that you want to search! name:%s,s.name); /输入要查找的姓名 /输出职工信息项目 if(strcmp(s.name,listi.name)=0) /查询出与输入姓名相同的职工的信息 k=i; printf_one(k); /输出查询结果并中断,说明只能输出查到的第一个数据 if(k=-1) /如果没有查出
12、信息则执行如下选择菜单nn NO.exit!pleasennare you again?nt1).again 2).NO and back bbw1); if(w1=2)break; while(k=-1&w1=1); /选择1继续循环执行查询 w4=0;w3=0; if(k!=-1)successfulnn what do you want to do?nt1).search another 2).back bb /选择查找下一个数据或返回w2); while(w2=1); /选择1循环执行查询下一个数据 void search_2() /按工资卡号查询nnenter num that yo
13、u want to search! num:s.num); /输入要查找的工资卡号 /输出职工信息项目 if(s.num=listi.num) /查询出与输入工资卡号相同的职工的信息 printf_one(k); if(k=-1) /如果没有查出信息则执行如下选择菜单 /选择1继续循环执行查询 w4=0; while(w2=1); /选择1循环执行查询下一个数据 void order() /排序功能模块函数 int w1,n; void order_1(); void order_2();ttt1.order by num /按工资卡号排序ttt2.order by salary 2 /按实发
14、工资排序order_1();order_2(); void order_1() /按工资卡号升序排序 void save(int i); int i,j,n; void browse(); struct list s;n-1;i+) /冒泡排序法,按职工工资卡号升序排列出职工信息 for(j=i+1;jj+) if(listj.numlisti.num) s=listj; listj=listi; listi=s; save(n); /储存排序后的信息 browse(); /显示排序后的信息 void order_2() /按实发工资升序排序i+) /冒泡排序法,按实发工资升序排列出职工信息
15、if(listi.salary2listj.salary2)listj=listi;listi=s; void save(int n) /储存函数 int i;wb /以只写方式打开文件 int load() /导出文件信息rb /以只读方式打开文件!feof(fp); fread(& /读出磁盘文件中的职工信息 return(i-1); /返回数值i-1 void input(int i) /职工信息输入函数 float salary2(int i); float fax(int i);No.:listi.num);name:,listi.name);month:listi.month);salary1:listi.salary1);water:listi.water);electricity:listi.electri
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1