一、课程设计的题目与要求
1、课程设计目的
(1)熟悉DEVC++的开发环境,掌握基本的编程方法,熟悉用C语言完成一个应用程序的设计过程,掌握有关编辑和调试程序的方法和技巧;
(2)主要掌握C语言中的结构体、指针及文件操作等内容;
(3)了解开发简单应用程序的全过程,包括:分析、设计、编程、调试和编写设计报告。
2、功能要求
在主函数中读入原始数据文件的内容,保存在对应的结构体数组中,然后显示菜单,利用菜单调用各个函数,分别完成如下功能:
(1)实现查询和显示功能:①按职工号和姓名查询②查询基本工资低于的信息③显示全部信息,将排序后的结果显示在屏幕上。
(2)计算工资功能:(等于基本工资+职务工资+津贴),实发工资(等于应发工资扣除医疗保险、公积金、水电费),并按工资条的形式输出(输出格式自行设计)
(3)修改功能:可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示。
(4)添加功能:录入新的职工信息数据。在录入新的信息前,首先判断该职工号是否存在,如果不存在,则可进行数据录入并依次输入职工的相关信息;如果存在,则提示不能进行添加操作。
(5)删除功能:可删除数据文件中的任一记录。
(6)排序功能:按基本工资或实发工资排序。
(7)统计功能:计算各项工资平均值,并将结果保存到新的文件中。
二、课程设计题目功能
1、系统功能模块框图设计
2、数据结构明
定义结构体数组employ,用来存放文本文档当中的数据,其中no用来存放工号,name存放姓名,jiben用来存放基本工资,zhiwu用来存放职务工资,jintie用来存放津贴,yiliao用来存放医疗保险,gongjijin用来存放公积金,shuidian用来存放水电费,yingfa用来存放应发工资,shifa用来存放实发工资。
#defineN12
structemploy
{charno[10];//存放工号
charname[20];//存放名字
intjinben;//存放基本工资
intzhiwu;//存放职务工资
intjintie;//存放津贴
intyiliao;//存放医疗保险
intgongjijin;//存放公积金
intshuidian;//存放水电费
intyingfa;//存放应发工资
intshifa;//存放实发工资}
employ[N],emplo;//employ[N]结构体数组,emplo是工人的數量
charstr[80];//字符数组存放标题
intM=0;//全局变量,记录条数
3、详细设计
(1)准备数据
建立数据文件,如下图2所示。
(2)程序整体框架设计
思路分析:工资的相关数据存放在WLW.txt文件中,需要先读取文本文
件中数据给结构体数组赋值,后面的各项功能的实现都是对结构体数组的操作。整个程序框架如上图3所示。
(3)读数据文件函数ReadFile()
1.定义一个指针变量,指向要读取的文件WLW.txt,先读取第一行标题栏如果指针为NULL输出,提示并异常退出使用while()循环
2.用scanf()函数读取每一行数据,循环结束的条件是文件指针指向文件尾,即feof(fp)值为1。全局变量M为文件中实际记录数据的条数
3.打印“人物信息读取成功”
voidReadFile()//读取数据
{inti=0;
FILE*fp;//指针
if((fp=fopen("WLW.txt","r"))==NULL)
{printf("文件打开失败");
exit(0);}
//标题栏
fscanf(fp,"%s%s%s%s%s%s%s%s%s%s\n",employ[0].name,employ[0].name,employ[0].name,employ[0].name,employ[0].name,
employ[0].name,employ[0].name,employ[0].name,employ[0].name,employ[0].name);//读第一行标题栏
while(!feof(fp))//检查文件是否结束
{fscanf(fp,"\n\n%s%s%d%d%d%d%d%d\n\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
i++;}
M=i;
printf("\n\n人物信息文件读取成功!\n\n");
fclose(fp);//关闭文件}
(4)显示全部信息display()
利用for语句将文件里的数据依次提取并输出到显示器上。
voiddisplay()//显示全部
{inti=0;
printf("\n工号名字基本工资职务工资津贴医疗保险积金水电\n");
for(i=0;iM;i++)
{printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.yiliao,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);}}
(5)查询信息query()
查询有三種方式,一種是按姓名查找,一種是按工号查找,還有一種是查找查询工资低于的;
用switch-case语句分支查找
1.按姓名查找cxname()
输入查询的名字,用strcmp()函数判断是否存在所输入的姓名,存在则输出,不存在则提示是否继续查找,继续查找用goto进行循环,否则按0退出
voidcxname()//按名字查询
{intHasname=0,i;
charname[20];
charC;
Loop:
printf("请输入要查询的名字");
fflush(stdin);
scanf("%s",name);
for(i=0;i=M;i++)
{if(strcmp(name,employ.name)==0)
printf("\n%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,
employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
Hasname=1;}}
if(!Hasname)
printf("查无此人\n");
printf("按Y(y)继续查找:");
fflush(stdin);
Hasname==0;
scanf("%c",C);
if(C==Y
C==y)
gotoLoop;}
2.按工号查找cxno()
输入查询的工号用strcmp()函数判断是否存在所输入的工号,存在则输出,不存在则提示是否继续查找,继续查找用goto进行循环,否则退出
voidcxno()//按工号查询
{intHasno=0,i;
charC;
charno[10];
Loop:
printf("请输入要查询的工号");
fflush(stdin);
scanf("%s",no);
for(i=0;i=N;i++)
{if(!strcmp(no,employ.no))
{
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
Hasno=1;}
}
if(!Hasno)
printf("查无此人\n");
printf("按Y(y)继续查找:");
fflush(stdin);
Hasno==0;
scanf("%c",C);
if(C==Y
C==y)
gotoLoop;
}
3.查询工资低于的cxsan()
用for()函数将所有信息都进行操作,用if()进行比较,小于则打印输出
voidcxsan()//显示工资低于的
{inti,n=0;
intsan=;
for(i=0;i=N-2;i++)
{if(sanemploy.jiben)
{n++;
if(n==1)
{printf("\n\n工号名字基本工资职务工资津贴医疗保险积金水电费\n");}
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
}}}
(6)计算工资calcuate()
计算工资有兩種方式,一種是计算应发工资,第二種是计算实发工资
用switch-case语句分支查找
1.计算应发工资g1()
用for()对所有信息进行操作,再输出应发工资
2.计算实发工资g2()
用for()对所有信息进行操作,再输出应发工资
voidcalcuate()//计算工资
{do
{inti;
loop:
printf("------------------------\n");
printf("
**********计算********
\n");
printf("
*******1.应发工资*****
\n");
printf("
*******2.实发工资*****
\n");
printf("
********0.返回********
\n");
printf("
*输入你的选择(0--2)*
\n");
printf("------------------------\n");
scanf("%d",i);
switch(i)
{case1:g1();gotoloop;break;
case2:g2();gotoloop;break;
case0:return;break;}
}while(1);}
voidg1()//应发工资
{inti;
printf("\n工号名字基本工资职务工资津贴应发工资\n");
for(i=0;i=M-1;i++)
{employ.yingfa=employ.jiben+employ.zhiwu+employ.jintie;
printf("%3s%5s%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yingfa);}}
voidg2()//实发工资
{inti;
printf("工号姓名应发工资医疗保险公积金水电费实发工资\n");
for(i=0;i=M-1;i++)
{employ.yingfa=employ.jiben+employ.zhiwu+employ.jintie;
employ.shifa=employ.yingfa-employ.yiliao-employ.gongjijin-employ.shuidian;
printf("%3s%5s%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.yingfa,employ.yiliao,
employ.gongjijin,employ.shuidian,employ.shifa);}
}
(7)修改信息revise()
先输入编号,如有重复利用goto函数进行循环,打印出编号所对应的职员利用strcpy()进行修改,最后打印出修改后职员的信息
voidrevise()//修改
{intn;
charstr[80];
inti;
num:
printf("请输入编号:");
scanf("%d",n);
if(n1
n=M)
{printf("编号错误,请输入数字位于1~%d之间",M);
gotonum;
}
printf("\n您选择的职员是:\n工号名字基本工资职务工资津贴医疗保险公积金水电费");
printf("\n%-5s%-8s%5d%5d%5d%5d%5d%5d\n",employ[n-1].no,employ[n-1].name,employ[n-1].jiben,
employ[n-1].zhiwu,employ[n-1].jintie,employ[n-1].yiliao,employ[n-1].gongjijin,employ[n-1].shuidian);
printf("工号");
scanf("%s",str);
strcpy(employ[n-1].no,str);
printf("名字");
scanf("%s",str);
strcpy(employ[n-1].name,str);
printf("基本工资");
scanf("%5d",i);
employ[n-1].jiben=i;
printf("职务工资");
scanf("%5d",i);
employ[n-1].zhiwu=i;
printf("津贴");
scanf("%5d",i);
employ[n-1].jintie=i;
printf("医疗保险");
scanf("%5d",i);
employ[n-1].yiliao=i;
printf("公积金");
scanf("%5d",i);
employ[n-1].gongjijin=i;
printf("水电费");
scanf("%5d",i);
employ[n-1].shuidian=i;
printf("\n您修改后的职员信息是:\n工号名字基本工资职务工资津贴医疗保险公积金水电费");
printf("\n%-5s%-8s%5d%5d%5d%5d%5d%5d\n",employ[n-1].no,employ[n-1].name,employ[n-1].jiben,
employ[n-1].zhiwu,employ[n-1].jintie,employ[n-1].yiliao,employ[n-1].gongjijin,employ[n-1].shuidian);
}
(8)添加信息add()
先定义一个字符变量存入需要添加的工号,利用if()和函数strcmp()进行判断,存在则输出“该工号已存在,请重新输入”字样,不存在则输入姓名等信息,最后打印出所有的信息。
voidadd()//添加记录
{charid[3];
inti;
printf("请输入需录入的工号:");
scanf("%s",id);
if(!strcmp(id,employ.no))
{printf("该工号已存在,添加信息失败,请重新输入!");
return;
}
//输入其它数据项
printf("请输入姓名:");
scanf("%s",employ.name);
printf("请输入基本工资:");
scanf("%d",employ.jiben);
printf("请输入职务工资:");
scanf("%d",employ.zhiwu);
printf("请输入津贴:");
scanf("%d",employ.jintie);
printf("请输入医疗保险:");
scanf("%d",employ.yiliao);
printf("请输入公积金:");
scanf("%d",employ.gongjijin);
printf("请输入水电费:");
scanf("%d",employ.shuidian);
M++;
printf("现有记录:");
printf("\n工号姓名基本工资职务工资津贴医疗保险公积金水电费\n");
for(i=0;i=N;i++);
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
printf("文件保存成功!\n");
}
(9)删除信息delete()
打开文件并创建打开一个临时文件,将标题栏输入临时文件中,输入删除的姓名,利用if判断是否存在此员工,如果不存在输出“未找到该职员信息,请仔细核对,详细信息如下:”,存在则删除
voiddelete()//删除
{FILE*fin;
FILE*ftp;
chary[20]="";
inti,j,k=0;
intflog=0;
fin=fopen("WLW.txt","r");//读打开原文件WLW.txt
ftp=fopen("tmp.txt","w");//写打开临时文件tmp.txt
if(fin==NULL
ftp==NULL)
{printf("文件打开失败!");
exit(0);
}
fprintf(ftp,"工号名字基本工资职务工资津贴医疗保险公积金水电费\n");
printf("请输入您要删除的职员姓名:");
scanf("%s",y);
for(i=0;iM;i++)
{if(strcmp(y,employ.name)==0)
{
printf("\n删除成功!您删除的职员如下:\n");
printf("工号名字基本工资职务工资津贴医疗保险公积金水电费\n");
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.yiliao,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
flog=1;
for(j=i+1;jM;j++)
{employ[j-1]=employ[j];
}
for(i=0;iM-1;i++)
{
fprintf(ftp,"%3s%3s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.yiliao,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
}}
}
fclose(ftp);
fclose(fin);
remove("WLW.txt");
rename("tmp.txt","WLW.txt");
}
(10)按基本工资排序pxjiben()
用for循環對所有信息进行操作,
voidpxjiben()//按基本工资排序
{inti,j;
for(i=0;iM-1;i++)
{for(j=i+1;jM;j++)
{if(employ.jibenemploy[j].jiben)
{emplo=employ;
employ=employ[j];
employ[j]=emplo;
}
}
}
(11)按实发工资排序pxshifa()
voidpxshifa()//按实发工资排序
{inti,j;
for(i=0;i=M-1;i++)
{for(j=i+1;jM;j++)
{employ.yingfa=employ.jiben+employ.zhiwu+employ.jintie;
employ.shifa=employ.yingfa-employ.yiliao-employ.gongjijin-employ.shuidian;
if(employ.shifaemploy[j].shifa)
{emplo=employ;
employ=employ[j];
employ[j]=emplo;
}
}
}
printf("\n工号名字基本工资职务工资津贴医疗保险公积金水电费实发工资\n");
for(i=0;iM;i++)
{
printf("%3s%5s%5d%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian,employ.shifa);
}
}
(12)统计census()
voidcensus()//统计
{FILE*fp=fopen("统计.txt","w");//写入新建文件统计.txt
inti;
floatj=0,k=0,m=0,n=0,num1,num2,num3,num4;
chara[20]="基本工资的平均值=";
charb[20]="职务工资的平均值=";
charc[20]="应发工资的平均值=";
chard[20]="实发工资的平均值=";
for(i=0;iM-1;i++)
{employ.yingfa=employ.jiben+employ.zhiwu+employ.jintie;
employ.shifa=employ.yingfa-employ.yiliao-employ.gongjijin-employ.shuidian;
}
for(i=0;iM-1;i++)
{j+=employ.jiben;
k+=employ.zhiwu;
m+=employ.yingfa;
n+=employ.shifa;
}num1=j/15;num2=k/15;num3=m/15;num4=n/15;
fprintf(fp,"%s%6.2f\n%s%6.2f\n%s%6.2f\n%s%6.2f\n",a,num1,b,num2,c,num3,d,num4);
printf("基本工资的平均值=%6.2f\n职务工资的平均值=%6.2f\n应发工资的平均值=%6.2f\n实发工资的平均值=%6.2f",num1,num2,num3,num4);
fclose(fp);
}
(13)退出exit()
4、调试与测试
在主函数调用各个功能模块函数,对各个函数进行测试.
三、课程设计总结
通过两周周的C语言课程设计,真切觉得自己才是刚刚入门,但是在这两周周的学习中还是收获很大,从开始上课好多功能不知道怎么实现到现在还能写出来一段完整的语言。
在刚开始写功能和做流程图的时候,觉的还挺简单又因为写代码又有点激动,渐渐学到后来,这种激动被频出的错误消磨殆尽了,一点小错误就暴红一大片的状况频频出现,偶尔还实在找不出那里错误,就去百度查询,不过那也不可能什么错误都有,也因为水平不够而看不懂,这时候也比较焦躁了。
之后去网络上看到一些有关于c语言的一些文章,明白了逻辑和实践的重要性。细节决定成败这句话在程序设计中最恰当不过了,因为一个小小的角标就可以使你的整个的程序无法进行,有时候绞尽脑汁也没能找出错误所在,只好老老实实的重新进行编写。
通过实践,我也发现我的好多不足之处,首先是自己的键盘输入技能还不行,经常按错字母,通过实践也有所改进;再有对c语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对c语言中经常出现的错误也不了解,通过一段时间的练习,使我在这几个方面的认识有所提高。我将这次课设中出现的问题总结了几点:
符号一定要使用英文版的。2.用scanf()函数输入整型的话一定要加符号。3.写完整的程序的时候要有一个正确并且完整的逻辑4.将return和break区分开来,break是直接跳出当前的循环,从当前循环外面开始执行,return是从被调函数返回到主调函数继续执行。
在这次两周的课程设计里,可以说是收获颇丰,学到的不仅仅是知识还有以后做事的毅力还有对思维逻辑能力的极大提高,同时不仅可以巩固以前所学过的知识,而且通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正的融会贯通,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现自己的不足。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在廖老师的指导,同学的帮助和网络信息的搜集下逐一解决,且希望通过这次的课程设计可以让我更好地学习C程序设计。
附录程序清单
#includestdio.h
#includestdlib.h
#includestring.h
#defineN11
//职员数量
structemploy{
charno[10];//存放工号
charname[20];//存放名字
intjiben;//存放基本工资
intzhiwu;//存放职务工资
intjintie;//存放津贴
intyiliao;//存放医疗保险
intgongjijin;//存放公积金
intshuidian;//存放水电费
intyingfa;//存放应发工资
intshifa;//存放实发工资
}
employ[N],emplo;//employ结构体
charstr[80];//字符数组存放标题
intM=0;//全局变量,记录条数
voidReadFile();//读取数据
voidquery();//查询
voiddisplay();//显示全部
voidmeun();//显示菜单
voidcxname();//按名字查詢
voidcxno();//按工号查询
voidcxsan();//显示工资低于的
voidcalcuate();//計算
voidg1();//应发工资
voidg2();//計算是發工資
voidrevise();//修改
voidadd();//添加
voiddelete();//刪除
voidpxjiben();//按基本工資排序
voidpxshifa();//按实发工资排序
voidcensus();//统计
voidReadFile()//读取数据
{
inti=0;
FILE*fp;//指针
if((fp=fopen("WLW.txt","r"))==NULL)
{
printf("文件打开失败");
exit(0);
}
//标题栏
fscanf(fp,"%s%s%s%s%s%s%s%s%s%s\n",employ[0].name,employ[0].name,employ[0].name,employ[0].name,employ[0].name,
employ[0].name,employ[0].name,employ[0].name,employ[0].name,employ[0].name);//读第一行标题栏
while(!feof(fp))//检查文件是否结束
{
fscanf(fp,"\n\n%s%s%d%d%d%d%d%d\n\n",employ.no,employ.name,employ.jiben,employ.zhiwu,
employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
i++;
}
M=i;
printf("\n\n人物信息文件读取成功!\n\n");
fclose(fp);//关闭文件
}
voidmeun()//显示菜单
{
printf("----------工资系统管理----------\n");
printf("
*********1.查询和显示*********
\n");
printf("
***********2.计算*************
\n");
printf("
***********3.修改*************
\n");
printf("
***********4.添加*************
\n");
printf("
***********5.删除*************
\n");
printf("
********6.按基本工资排序******
\n");
printf("
********7.按实发工资排序******
\n");
printf("
***********8.统计*************
\n");
printf("
***********9.退出*************
\n");
printf("--------------------------------\n");
}
voidquery()//查询
{
do{
inti;
cx:
{
printf("------------------------\n");
printf("
******查询和显示******
\n");
printf("
*****1.按姓名查询*****
\n");
printf("
*****2.按工号查询*****
\n");
printf("
*****3.显示全部****:*
\n");
printf("
4.显示工资低于的人
\n");
printf("
********0.返回********
\n");
printf("
*输入你的选择(0--4)*
\n");
printf("------------------------\n");
}
scanf("%d",i);
switch(i)
{
case1:cxname();gotocx;break;
case2:cxno();gotocx;break;
case3:display();gotocx;break;
case4:cxsan();gotocx;break;
case0:return;break;
}
}while(1);
}
voiddisplay()//显示全部
{
inti=0;
printf("\n工号名字基本工资职务工资津贴医疗保险积金水电费\n");
for(i=0;iM;i++)
{
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.yiliao,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
}
}
voidcxname()//按名字查询
{
intHasname=0,i;
charname[20];
charC;
Loop:
printf("请输入要查询的名字");
fflush(stdin);
scanf("%s",name);
for(i=0;i=M;i++)
{
if(strcmp(name,employ.name)==0)
{
printf("\n%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,
employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
Hasname=1;
}
}
if(!Hasname)
printf("查无此人\n");
printf("按Y(y)继续查找:");
fflush(stdin);
Hasname==0;
scanf("%c",C);
if(C==Y
C==y)
gotoLoop;
}
voidcxno()//按工号查询
{
intHasno=0,i;
charC;
charno[10];
Loop:
printf("请输入要查询的工号");
fflush(stdin);
scanf("%s",no);
for(i=0;i=N;i++)
{
if(!strcmp(no,employ.no))
{
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu
,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
Hasno=1;
}
}
if(!Hasno)
printf("查无此人\n");
printf("按Y(y)继续查找:");
fflush(stdin);
Hasno==0;
scanf("%c",C);
if(C==Y
C==y)
gotoLoop;
}
voidcxsan()//显示工资低于的
{
inti,n=0;
intsan=;
for(i=0;i=N-2;i++)
{
if(sanemploy.jiben)
{
n++;
if(n==1)
{
printf("\n\n工号名字基本工资职务工资津贴医疗保险积金水电费\n");
}
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
}
}
}
voidcalcuate()//计算工资
{
do
{
inti;
loop:
printf("------------------------\n");
printf("
**********计算********
\n");
printf("
*******1.应发工资*****
\n");
printf("
*******2.实发工资*****
\n");
printf("
********0.返回********
\n");
printf("
*输入你的选择(0--2)*
\n");
printf("------------------------\n");
scanf("%d",i);
switch(i)
{
case1:g1();gotoloop;break;
case2:g2();gotoloop;break;
case0:return;break;
}
}while(1);
}
voidg1()//应发工资
{
inti;
printf("\n工号名字基本工资职务工资津贴应发工资\n");
for(i=0;i=M-1;i++)
{
employ.yingfa=employ.jiben+employ.zhiwu+employ.jintie;
printf("%3s%5s%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yingfa);
}
}
voidg2()//实发工资
{
inti;
printf("工号姓名应发工资医疗保险公积金水电费实发工资\n");
for(i=0;i=M-1;i++)
{
employ.yingfa=employ.jiben+employ.zhiwu+employ.jintie;
employ.shifa=employ.yingfa-employ.yiliao-employ.gongjijin-employ.shuidian;
printf("%3s%5s%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.yingfa,employ.yiliao,
employ.gongjijin,employ.shuidian,employ.shifa);
}
}
voidrevise()//修改
{
intn;
charstr[80];
inti;
num:
printf("请输入编号:");
scanf("%d",n);
if(n1
n=M)
{
printf("编号错误,请输入数字位于1~%d之间",M);
gotonum;
}
printf("\n您选择的职员是:\n工号名字基本工资职务工资津贴医疗保险公积金水电费");
printf("\n%-5s%-8s%5d%5d%5d%5d%5d%5d\n",employ[n-1].no,employ[n-1].name,employ[n-1].jiben,
employ[n-1].zhiwu,employ[n-1].jintie,employ[n-1].yiliao,employ[n-1].gongjijin,employ[n-1].shuidian);
printf("工号");
scanf("%s",str);
strcpy(employ[n-1].no,str);
printf("名字");
scanf("%s",str);
strcpy(employ[n-1].name,str);
printf("基本工资");
scanf("%5d",i);
employ[n-1].jiben=i;
printf("职务工资");
scanf("%5d",i);
employ[n-1].zhiwu=i;
printf("津贴");
scanf("%5d",i);
employ[n-1].jintie=i;
printf("医疗保险");
scanf("%5d",i);
employ[n-1].yiliao=i;
printf("公积金");
scanf("%5d",i);
employ[n-1].gongjijin=i;
printf("水电费");
scanf("%5d",i);
employ[n-1].shuidian=i;
printf("\n您修改后的职员信息是:\n工号名字基本工资职务工资津贴医疗保险公积金水电费");
printf("\n%-5s%-8s%5d%5d%5d%5d%5d%5d\n",employ[n-1].no,employ[n-1].name,employ[n-1].jiben,
employ[n-1].zhiwu,employ[n-1].jintie,employ[n-1].yiliao,employ[n-1].gongjijin,employ[n-1].shuidian);
}
voidpxjiben()//按基本工资排序
{
inti,j;
for(i=0;iM-1;i++)
{
for(j=i+1;jM;j++)
{
if(employ.jibenemploy[j].jiben)
{
emplo=employ;
employ=employ[j];
employ[j]=emplo;
}
}
}
printf("\n工号名字基本工资职务工资津贴医疗保险公积金水电费\n");
for(i=0;iM;i++)
{
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
}
}
voidpxshifa()//按实发工资排序
{
inti,j;
for(i=0;i=M-1;i++)
{
for(j=i+1;jM;j++)
{
employ.yingfa=employ.jiben+employ.zhiwu+employ.jintie;
employ.shifa=employ.yingfa-employ.yiliao-employ.gongjijin-employ.shuidian;
if(employ.shifaemploy[j].shifa)
{
emplo=employ;
employ=employ[j];
employ[j]=emplo;
}
}
}
printf("\n工号名字基本工资职务工资津贴医疗保险公积金水电费实发工资\n");
for(i=0;iM;i++)
{
printf("%3s%5s%5d%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian,employ.shifa);
}
}
voidadd()//添加记录
{
charid[3];
inti;
printf("请输入需录入的工号:");
scanf("%s",id);
if(!strcmp(id,employ.no))
{
printf("该工号已存在,添加信息失败,请重新输入!");
return;
}
//输入其它数据项
printf("请输入姓名:");
scanf("%s",employ.name);
printf("请输入基本工资:");
scanf("%d",employ.jiben);
printf("请输入职务工资:");
scanf("%d",employ.zhiwu);
printf("请输入津贴:");
scanf("%d",employ.jintie);
printf("请输入医疗保险:");
scanf("%d",employ.yiliao);
printf("请输入公积金:");
scanf("%d",employ.gongjijin);
printf("请输入水电费:");
scanf("%d",employ.shuidian);
M++;
printf("现有记录:");
printf("\n工号姓名基本工资职务工资津贴医疗保险公积金水电费\n");
for(i=0;i=N;i++);
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.zhiwu,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
printf("文件保存成功!\n");
}
voiddelete()//删除
{
FILE*fin;
FILE*ftp;
chary[20]="";
inti,j,k=0;
intflog=0;
fin=fopen("WLW.txt","r");//读打开原文件WLW.txt
ftp=fopen("tmp.txt","w");//写打开临时文件tmp.txt
if(fin==NULL
ftp==NULL)
{
printf("文件打开失败!");
exit(0);
}
fprintf(ftp,"工号名字基本工资职务工资津贴医疗保险公积金水电费\n");
printf("请输入您要删除的职员姓名:");
scanf("%s",y);
for(i=0;iM;i++)
{
if(strcmp(y,employ.name)==0)
{
printf("\n删除成功!您删除的职员如下:\n");
printf("工号名字基本工资职务工资津贴医疗保险公积金水电费\n");
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.yiliao,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
flog=1;
for(j=i+1;jM;j++)
{
employ[j-1]=employ[j];
}
for(i=0;iM-1;i++)
{
fprintf(ftp,"%3s%3s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.yiliao,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
}
}
}
if(!flog)
{
printf("\n未找到该职员信息,请仔细核对,详细信息如下:\n");
printf("%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.yiliao,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
fprintf(ftp,"%3s%5s%5d%5d%5d%5d%5d%5d\n",employ.no,employ.name,employ.jiben,employ.yiliao,employ.jintie,employ.yiliao,employ.gongjijin,employ.shuidian);
}
fclose(ftp);
fclose(fin);
remove("WLW.txt");
rename("tmp.txt","WLW.txt");
}
voidcensus()//统计
{
FILE*fp=fopen("统计.txt","w");//写入新建文件统计.txt
inti;
floatj=0,k=0,m=0,n=0,num1,num2,num3,num4;
chara[20]="基本工资的平均值=";
charb[20]="职务工资的平均值=";
charc[20]="应发工资的平均值=";
chard[20]="实发工资的平均值=";
for(i=0;iM-1;i++)
{
employ.yingfa=employ.jiben+employ.zhiwu+employ.jintie;
employ.shifa=employ.yingfa-employ.yiliao-employ.gongjijin-employ.shuidian;
}
for(i=0;iM-1;i++)
{
j+=employ.jiben;
k+=employ.zhiwu;
m+=employ.yingfa;
n+=employ.shifa;
}
num1=j/15;num2=k/15;num3=m/15;num4=n/15;
fprintf(fp,"%s%6.2f\n%s%6.2f\n%s%6.2f\n%s%6.2f\n",a,num1,b,num2,c,num3,d,num4);
printf("基本工资的平均值=%6.2f\n职务工资的平均值=%6.2f\n应发工资的平均值=%6.2f\n实发工资的平均值=%6.2f",num1,num2,num3,num4);
fclose(fp);
}
voidmain()
{
inti;
ReadFile();
meun();
while(1)
{
printf("请输入操作编号");
scanf("%d",i);
switch(i)
{
case1:query();break;
case2:calcuate();break;
case3:revise();break;
case4:add();break;
case5:delete();break;
case6:pxjiben();break;
case7:pxshifa();break;
case8:census();break;
case0:return;
default:printf("您的输入有误,请重新输入!");
}
}