#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void run(); //运行函数
int menu(); //主菜单函数
void input(); //输入函数
void check(); //查询函数
void change(); //修改函数
void back(); //删除函数
void sort(); //排序函数
void output(); //显示函数
void statistics(); //统计函数
void writefile(); //保存至文件函数
void readfile(); //读文件函数
struct staff
{
char number[5]; //员工编号
char name[5]; //员工姓名
int base_salary; //员工基础工资
int award; //员工奖金
int deduct; //员工扣款
int gross_pay; //员工应发工资
int tax; //员工税款
int net_pay; //员工实发工资
int judge; //判断该结构体是否录入数值
}zxl[50];
void input() //输入函数
{
int i,j,k;
for(i=0;i<50;i++)
{
if(zxl[i].judge==0)
{
input1: printf("请输入员工信息:\n");
printf(" 员工编号:");
scanf("%s",zxl[i].number);
for(k=0;zxl[k].judge==1;k++)
{
if(!strcmp(zxl[k].number,zxl[i].number))
{
printf("录入编号与原有编号有重复!请重新编号!\n");
goto input1;
}
}
zxl[i].judge = 1;
printf(" 员工姓名:");
scanf("%s",zxl[i].name);
printf(" 员工基础工资:");
scanf("%d",&zxl[i].base_salary);
printf(" 员工奖金:");
scanf("%d",&zxl[i].award);
printf(" 员工扣款:");
scanf("%d",&zxl[i].deduct);
printf(" 员工应发工资:");
scanf("%d",&zxl[i].gross_pay);
printf(" 员工税款:");
scanf("%d",&zxl[i].tax);
printf(" 员工实发工资:");
scanf("%d",&zxl[i].net_pay);
printf("是否继续输入员工信息\n 1、继续 2、退出\n请选择:");
error1: scanf("%d",&j);
if(j==2) break;
else if(j==1) continue;
else
{
printf("请输入1或2:");
goto error1;
}
}
}
}
int menu()
{
int m;
printf("\n\n");
printf("*****************************主菜单*****************************\n");
printf("* 1、输入员工工资记录 6、统计工资各等级人数 *\n");
printf("* 2、查询员工工资记录 7、显示员工工资记录表 *\n");
printf("* 3、修改员工工资记录 8、保存工资记录至文件 *\n");
printf("* 4、删除员工工资记录 9、从文件读入员工数据 *\n");
printf("* 5、对员工工资记录排序 0、退出本工资管理系统 *\n");
printf("****************************************************************\n");
printf("请选择功能:");
scanf("%d",&m);
return m;
}
void run()
{
int i,j=1;
int m;
for(i=0;i<50;i++)
{
zxl[i].judge = 0;
}
printf("**********************欢迎来到工资管理系统**********************\n");
do{
m=menu();
switch(m)
{
case 1: input(); break;
case 2: check(); break;
case 3: change(); break;
case 4: back(); break;
case 5: sort(); break;
case 6: statistics();break;
case 7: output();break;
case 8: writefile();break;
case 9: readfile();break;
case 0: j=0;break;
default: printf("输入错误!请输入 0、1、2、3、4、5、6、7、8!\n");
}
}while(j);
printf("*************************已成功退出系统*************************\n");
}
void check() //查询函数
{
int i,j;
char temp[5];
check1: printf("请输入需要查询的信息:");
scanf("%s",temp);
for(i=0;zxl[i].judge==1;i++)
{
if(!strcmp(temp,zxl[i].number)||!strcmp(temp,zxl[i].name))//根据员工的编号和姓名均可查询
{
printf("员工编号 姓名 基础工资 奖金 扣款 应发工资 税款 实发工资\n");
printf("%s %s %d %d %d %d %d %d\n",zxl[i].number,zxl[i].name,zxl[i].base_salary,zxl[i].award,zxl[i].deduct,zxl[i].gross_pay,zxl[i].tax,zxl[i].net_pay);
}
}
printf("是否继续查询员工信息\n 1、继续 2、退出\n请选择:");
error2: scanf("%d",&j);
if(j==2) return;
else if(j==1) goto check1;
else
{
printf("请输入1或2:");
goto error2;
}
}
void change() //修改函数
{
int i,j,k;
char temp[5];
k = 0;
change1: printf("请输入需要修改的员工:");
scanf("%s",temp);
for(i=0;zxl[i].judge==1;i++)
{
if(!strcmp(temp,zxl[i].number)||!strcmp(temp,zxl[i].name))//根据员工的编号和姓名均可修改
{
k = 1;
printf("************************************************************\n");
printf("1、基础工资 2、奖金 3、扣款 4、应发工资 5、税款 6、实发工资\n");
printf("************************************************************\n");
printf("请选择修改内容:\n");
scanf("%d",&j);
switch(j)
{
case 1:
{
printf("原有金额为:%d;改为:",zxl[i].base_salary);
scanf("%d",&zxl[i].base_salary);
break;
}
case 2:
{
printf("原有金额为:%d;改为:",zxl[i].award);
scanf("%d",&zxl[i].award);
break;
}
case 3:
{
printf("原有金额为:%d;改为:",zxl[i].deduct);
scanf("%d",&zxl[i].deduct);
break;
}
case 4:
{
printf("原有金额为:%d;改为:",zxl[i].gross_pay);
scanf("%d",&zxl[i].gross_pay);
break;
}
case 5:
{
printf("原有金额为:%d;改为:",zxl[i].tax);
scanf("%d",&zxl[i].tax);
break;
}
case 6:
{
printf("原有金额为:%d;改为:",zxl[i].net_pay);
scanf("%d",&zxl[i].net_pay);
break;
}
}
}
}
if(k==0)
{
printf("* 没有找到该员工! *");
}
printf("是否继续修改员工信息\n 1、继续 2、退出\n请选择:");
error3: scanf("%d",&j);
if(j==2) return;
else if(j==1) goto change1;
else
{
printf("请输入1或2:");
goto error3;
}
}
void back() //删除函数
{
int i,j,k;
char temp[5];
back1:k = 0;
printf("请输入需要删除信息的员工:");
scanf("%s",temp);
for(i=0;zxl[i].judge==1;i++)
{
if(!strcmp(temp,zxl[i].number)||!strcmp(temp,zxl[i].name))//根据员工的编号和姓名均可删除
{
for(j=i;zxl[j].judge==1;j++)
{
zxl[j]=zxl[j+1]; //删除一名员工后,排在后面的员工依次往前挪一位
}
k = 1;
}
if(k==1) break;
}
printf("是否继续修改员工信息\n 1、继续 2、退出\n请选择:");
error4: scanf("%d",&j);
if(j==2) return;
else if(j==1) goto back1;
else
{
printf("请输入1或2:");
goto error4;
}
}
void output() //显示函数
{
int i;
printf("所有员工信息:\n");
if(zxl[0].judge==1)
{
printf("员工编号\t姓名\t基础工资\t奖金\t扣款\t应发工资\t税款\t实发工资\n");
for(i=0;zxl[i].judge==1;i++)
{
printf("%s\t\t%s\t\t%d\t%d\t%d\t%d\t%d\t%d\n",zxl[i].number,zxl[i].name,zxl[i].base_salary,zxl[i].award,zxl[i].deduct,zxl[i].gross_pay,zxl[i].tax,zxl[i].net_pay);
}
}
else
{
printf("* 未输入员工信息 *");
}
}
void writefile() //保存至文件函数
{
FILE *fp;
if((fp=fopen("E:\\c语言编译器\\Microsoft Visual Studio\\text\\C.data","wb"))==NULL)
{
printf("Cannot open file!\n");
exit(0);
}
fwrite(zxl,sizeof(struct staff),50,fp);
fclose(fp);
}
void readfile() //读文件函数
{
FILE *fp;
if((fp=fopen("E:\\c语言编译器\\Microsoft Visual Studio\\text\\C.data","rb"))==NULL)
{
printf("Cannot open file or file does not exist!\n");
exit(0);
}
rewind(fp);
fread(zxl,sizeof(struct staff),50,fp);
fclose(fp);
}
void statistics() //统计函数
{
int i,A=0,B=0,C=0,D=0; //按照实发工资分为四个等级
for(i=0;zxl[i].judge==1;i++)
{
if(zxl[i].net_pay>=10000) A++;
else if(zxl[i].net_pay>=5000) B++;
else if(zxl[i].net_pay>=2000) C++;
else D++;
}
printf("A级工资员工 %d 个\n",A);
printf("B级工资员工 %d 个\n",B);
printf("C级工资员工 %d 个\n",C);
printf("D级工资员工 %d 个\n",D);
}
void sort() //排序函数
{
int i,j,num;
struct staff temp;
num = 0;
for(i=0;zxl[i].judge==1;i++)
{
num = num+1;
}
for(i=0;i<num-1;i++)
{
for(j=0;j<num-i-1;j++)
{
if(zxl[j].net_pay<zxl[j+1].net_pay)//根据每个人的实发工资从高到低进行排序
{
temp = zxl[j];
zxl[j] = zxl[j+1];
zxl[j+1] = temp;
}
}
}
}
int main()
{
run();
return 0;
}
![](https://img-blog.csdnimg.cn/f67858beb9734914aa44b12ded3cb582.png)
![](https://img-blog.csdnimg.cn/3f06d6d6f18b4758853c1d68d48e55b8.png)
struct staff是结构体的名称,结构体里面定义了员工的编号、姓名、基础工资、奖金、扣款、应发工资、税款、实发工资、judge(我自己定义的一个变量,用来判断该结构体是否录入数值,比如我定义一个能容纳50个结构体的数组,没有赋值前judge变量为0,赋值一个之后他的0就变成1了,在后来输出的时候系统就会识别1即为需要输出的,如果还是0就是没有输入信息的即不需要输出的),记住结构体数组名后要加分号。switch函数中按下0至9有各自的功能,记住要加break。
文件函数定义的时候用绝对地址,把输入内容保存为.data文件,删除函数里zxl[j]=zxl[j+1]就是把删除的那一名员工后面的员工往前挪一位,修改函数里面用了switch函数判断改哪一条信息,最重要的是在查询函数,删除,修改函数if(!strcmp(temp,zxl[i].number)||!strcmp(temp,zxl[i].name))根据员工姓名和编号都可以查询员工信息。
统计员工工资进行等级划分时,人为的把0到2000的划为D等,2000到5000的划为C等,5000到10000的划为B等,10000以上的划为A等,用if...else if...else if...else...来实现划分等级。在按照工资从大到小排序时用了冒泡法,temp = zxl[j];zxl[j] = zxl[j+1];zxl[j+1] = temp;简单来说就是不停的与他后面一个数相比较,如果后面一个数比他大就交换位置。
这个员工工资管理系统主要是由几个功能:1、输入员工工资记录 2、查询员工工资记录 3、修改员工工资记录 4、删除员工工资记录 5、对员工工资记录排序 6、统计工资各等级人数 7、显示员工工资记录表 8、保存工资记录至文件 9、从文件读入员工数据 0、退出本工资管理系统,每一个功能我们可以自定义一个函数去实现它。之后我们定义一个结构体数组struct staff,这里面包括了每一名员工工资的基本信息。为了防止由于公司员工较多而导致在输入数据的时候出现错误把两个人的编号输成一样的了,我加了一条语句if(!strcmp(zxl[k].number,zxl[i].number)),这是用来判断是否出现了两个一样的员工编号,如果出现重复系统就会自动要求你重新输入。
程序在输入完一名员工信息后会让用户做出一个选择,是继续输入信息还是退出输入,但是如果有人不小心按的既不是1也不是2就会无法进行下一步了,介于以上可能会出现的操作失误我在一些自定义函数中加入了goto函数和判断语句,如果出现上述情况可以利用goto函数的标签跳到输入1,2的位置重新输入一次。
在根据员工工资对员工排序的时候使用了冒泡法从高到低进行排序,简单来说就是不停的与他后面一个数相比较,temp = zxl[j];zxl[j] = zxl[j+1];zxl[j+1] = temp;如果后面一个数比他大就交换位置。
在整个程序中用到了switch函数,但是要注意在每一个case后面一定要加上break,当然为了避免输入一些其他的数字我们有必要加上default语句。