题目要求:输入职工信息(至少10条记录),提供新增,删除,修改,和显示功能
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define N 100
struct GongZi
{
int num; //员工工号;
char name[20]; //员工姓名;
float jbgz; //基本工资;
float jt; //津贴;
float gt; //岗贴;
float bt; //补贴;
float ft; //房贴;
float jtbt; //交通补贴;
float sfgz; //实发工资;
float sh; //税收;
float zzgz; //最终工资;
}Yuan,yuan[N];
char filename[100]={"员工工资管理.txt"}; //储存员工的信息;
FILE *fp; //文件指针;
void Gongz(); //职工个人所得税计算模块;
void Tianj(); //添加职工的工资信息模块;
void Chax(); //职工工资查询模块;
void Xiug(); //职工工资修改模块;
void Tongji(); //职工工资统计模块;
void Try_again(); //输入错误重试模块;
void Menu(); //主菜单;
void zhuijia(); //追加添加职工信息;
void Shanchu(); //删除职工的信息;
int main(void)
{
Menu();
return 0;
}
void Menu() //主菜单;
{
printf("=====================================\n");
printf("| (1)职工个人所得税的计算 |\n");
printf("| (2)职工工资录入 |\n");
printf("| (3)添加职工信息 |\n");
printf("| (4)职工工资查询 |\n");
printf("| (5)删除职工信息 |\n");
printf("| (6)职工工资修改 |\n");
printf("| (7)职工工资统计 |\n");
printf("| (0)退出程序 |\n");
printf("=====================================\n");
int n;
scanf("%d",&n);
switch(n)
{
case 0: exit(0);
case 1: Gongz(); break;
case 2: Tianj(); break;
case 3: zhuijia(); break;
case 4: Chax(); break;
case 5: Shanchu(); break;
case 6: Xiug(); break;
case 7: Tongji(); break;
default: Try_again(); break;
}
}
void Tianj() //信息录入;
{
int select;
fp=fopen(filename,"wb+");
if(fp==NULL)
{
printf("打开文件夹失败:\n");
exit(1);
}
printf("******************请输入员工信息*******************\n");
printf("输入员工编号:");
scanf("%d",&Yuan.num);
printf("输入员工姓名:");
scanf("%s",Yuan.name);
printf("输入员工的基本工资:");
scanf("%f",&Yuan.jbgz);
printf("津贴:");
scanf("%f",&Yuan.jt);
printf("岗贴:");
scanf("%f",&Yuan.gt);
printf("房贴:");
scanf("%f",&Yuan.ft);
printf("补贴:");
scanf("%f",&Yuan.bt);
printf("交通补贴:");
scanf("%f",&Yuan.jtbt);
Yuan.sfgz=Yuan.jbgz+Yuan.jt+Yuan.gt+Yuan.ft+Yuan.bt+Yuan.ft;
printf("实发工资:%f",Yuan.sfgz);
printf("\n");
fwrite(&Yuan,sizeof(struct GongZi),1,fp);
printf("*****(1)继续录入*****(2)主菜单**********\n"); //在这里进行选择,是否进行录入还是选择返回主菜单;
printf("请输入你的选择[ ]\b\b");
scanf("%d",&select);
while(1)
{
if(select==2)
{
fclose(fp);
system("cls");
Menu();
}
else if(select==1)
{
fclose(fp);
system("cls");
zhuijia();
}
else
{
printf("输入错误,请重新输入[ ]\b\b");
scanf("%d",&select);
}
}
}
/*添加职工信息,跟功能2唯一区别,该功能是从利用文件追加进行输入*/
void zhuijia()
{
int select;
fp=fopen(filename,"ab+");
if(fp==NULL)
{
printf("打开文件夹失败:\n");
exit(1);
}
printf("******************请输入员工信息*******************\n");
printf("输入员工编号:");
scanf("%d",&Yuan.num);
printf("输入员工姓名:");
scanf("%s",Yuan.name);
printf("输入员工的基本工资:");
scanf("%f",&Yuan.jbgz);
printf("津贴:");
scanf("%f",&Yuan.jt);
printf("岗贴:");
scanf("%f",&Yuan.gt);
printf("房贴:");
scanf("%f",&Yuan.ft);
printf("补贴:");
scanf("%f",&Yuan.bt);
printf("交通补贴:");
scanf("%f",&Yuan.jtbt);
Yuan.sfgz=Yuan.jbgz+Yuan.jt+Yuan.gt+Yuan.ft+Yuan.bt+Yuan.ft;
printf("实发工资:%f",Yuan.sfgz);
printf("\n");
fwrite(&Yuan,sizeof(struct GongZi),1,fp);
printf("*****(1)继续录入*****(2)主菜单**********\n");
printf("请输入你的选择[ ]\b\b");
scanf("%d",&select);
while(1)
{
if(select==2)
{
fclose(fp);
system("cls");
Menu();
}
else if(select==1)
{
fclose(fp);
system("cls");
zhuijia();
}
else
{
printf("输入错误,请重新输入[ ]\b\b");
scanf("%d",&select);
}
}
}
/*实发工资如果在5000以内则税收为实发工资的5%;
5000~10000则超过5000的部分乘以10%;剩下的按5%计算;
10000以上则超过10000的按15%计算,5000~10000部分则按10%计算,5000部分则按5%计算;*/
void Gongz()
{
int n,y=0,select;
printf("请输入员工的编号:");
scanf("%d",&n);
fp=fopen(filename,"ab+");
if(fp==NULL)
{
printf("打开文件夹失败:\n");
exit(1);
}
while(fread(&Yuan,sizeof(struct GongZi),1,fp))
{
if(n==Yuan.num)
{
if(Yuan.sfgz<5000)
{
Yuan.sh=Yuan.sfgz*0.05;
Yuan.zzgz=Yuan.sfgz-Yuan.sh;
}
else if(Yuan.sfgz>5000&&Yuan.sfgz<10000)
{
Yuan.sh=(Yuan.sfgz-5000)*0.1+5000*0.05;
Yuan.zzgz=Yuan.sfgz-Yuan.sh;
}
else
{
Yuan.sh=(Yuan.sfgz-10000)*0.15+5000*0.1+5000*0.05;
Yuan.zzgz=Yuan.sfgz-Yuan.sh;
}
y=1;
break;
}
}
if(y==1)
{
printf("员工编号:%d 员工姓名:%s 税收:%0.2f 最终工资:%0.2f\n",Yuan.num,Yuan.name,Yuan.sh,Yuan.zzgz);
}
else
{
printf("查无此人!!!\n");
}
printf("*****(1)继续查询*****(2)主菜单**********\n");
printf("请输入你的选择[ ]\b\b");
scanf("%d",&select);
while(1)
{
if(select==2)
{
fclose(fp);
system("cls");
Menu();
}
else if(select==1)
{
fclose(fp);
system("cls");
Gongz();
}
else
{
printf("输入错误,请重新输入[ ]\b\b");
scanf("%d",&select);
}
}
}
/*查询职工信息,通过职工编号遍历寻找*/
void Chax()
{
int n,y=0,select;
printf("请输入员工的编号:");
scanf("%d",&n);
fp=fopen(filename,"ab+");
if(fp==NULL)
{
printf("打开文件夹失败:\n");
exit(1);
}
while(fread(&Yuan,sizeof(struct GongZi),1,fp))
{
if(n==Yuan.num)
{
printf("员工编号:%07d 姓名:%s 基本工资:%0.2f 津贴:%0.2f 岗贴:%0.2f 补贴:%0.2f 房贴:%0.2f 交通补贴:%0.2f 实发工资:%0.2f\n\n",
Yuan.num,Yuan.name,Yuan.jbgz,Yuan.jt,Yuan.gt,Yuan.bt,Yuan.ft,Yuan.jtbt,Yuan.sfgz);
y=1;
break;
}
}
if(y!=1)
{
printf("查无此人!!!\n");
}
printf("*****(1)继续查询*****(2)主菜单**********\n");
printf("请输入你的选择[ ]\b\b");
scanf("%d",&select);
while(1)
{
if(select==2)
{
fclose(fp);
system("cls");
Menu();
}
else if(select==1)
{
fclose(fp);
system("cls");
Chax();
}
else
scanf("%d",&select);
}
}
//修改员工的信息;
void Xiug()
{
int i=0,j,k,numb,y=0,select;
fp=fopen(filename,"rb+");
if(fp==NULL)
{
printf("打开文件失败\n");
exit(1);
}
while(fread(&Yuan,sizeof(struct GongZi),1,fp)) //用结构体数组储存文件中的员工信息
{
yuan[i++]=Yuan;
}
for(j=0;j<i-1;j++) //按员工的编号从小到大排序
{
for(k=j+1;k<i;k++)
{
if(yuan[j].num>yuan[k].num)
{
Yuan=yuan[j];
yuan[j]=yuan[k];
yuan[k]=Yuan;
}
}
}
printf("请输入您要修改的员工编号:"); //输入要修改的编号
scanf("%d",&numb);
for(j=0;j<i;j++) //通过遍历寻找到目标编号;
{
if(numb==yuan[j].num)
{
printf("员工编号:%07d 姓名:%s 基本工资:%0.2f 津贴:%0.2f 岗贴:%0.2f 补贴:%0.2f 房贴:%0.2f 交通补贴:%0.2f 实发工资:%0.2f",yuan[j].num,
yuan[j].name,yuan[j].jbgz,yuan[j].jt,yuan[j].gt,yuan[j].bt,yuan[j].ft,yuan[j].jtbt,yuan[j].sfgz);
printf("\n\n");
printf("******************请输入你要修改的员工信息*******************\n");
printf("输入员工姓名:");
scanf("%s",yuan[j].name);
printf("输入员工的基本工资:");
scanf("%f",&yuan[j].jbgz);
printf("津贴:");
scanf("%f",&yuan[j].jt);
printf("岗贴:");
scanf("%f",&yuan[j].gt);
printf("房贴:");
scanf("%f",&yuan[j].ft);
printf("补贴:");
scanf("%f",&yuan[j].bt);
printf("交通补贴:");
scanf("%f",&yuan[j].jtbt);
yuan[j].sfgz=yuan[j].jbgz+Yuan.jt+yuan[j].gt+yuan[j].ft+yuan[j].bt+yuan[j].ft;
printf("实发工资:%f",yuan[j].sfgz);
printf("\n");
y=1;
}
}
if(y==1) //通过y的值来判断是否修改成功;
printf("修改成功!\n\n");
else
printf("查无此人!!!\n\n");
rewind(fp); //把文件指针指向开头
for(j=0;j<i;j++) //重新把结构体数组写进文件;
{
fwrite(&yuan[j],sizeof(struct GongZi),1,fp);
}
printf("*****(1)继续修改*****(2)主菜单**********\n");
printf("请输入你的选择[ ]\b\b");
scanf("%d",&select);
while(1)
{
if(select==2)
{
fclose(fp);
system("cls");
Menu();
}
else if(select==1)
{
fclose(fp);
system("cls");
Xiug();
}
else
scanf("%d",&select);
}
}
void Tongji()
{
int i=0,j,k; //统计人数;
float sfzgz=0,dsr=0,zsr=0,gsr=0; //统实发总工资、低收入,中收入,高收入;
fp=fopen(filename,"rb+");
if(fp==NULL)
{
printf("打开文件失败\n");
exit(1);
}
printf("员工编号 姓名 基本工资 津贴 岗贴 补贴 房贴 交通补贴 实发工资\n");
while(fread(&Yuan,sizeof(struct GongZi),1,fp))
{
yuan[i++]=Yuan;
}
for(j=0;j<i-1;j++)
{
for(k=j+1;k<i;k++)
{
if(yuan[j].num>yuan[k].num)
{
Yuan=yuan[j];
yuan[j]=yuan[k];
yuan[k]=Yuan;
}
}
}
for(j=0;j<i;j++)
{
if(yuan[j].sfgz<5000)
dsr++;
else if(yuan[j].sfgz>5000&&yuan[j].sfgz<10000)
zsr++;
else
gsr++;
sfzgz+=yuan[j].sfgz;
printf("%07d %s %5.2f %4.2f %4.2f %4.2f %4.2f %4.2f %4.2f",yuan[j].num,
yuan[j].name,yuan[j].jbgz,yuan[j].jt,yuan[j].gt,yuan[j].bt,yuan[j].ft,yuan[j].jtbt,yuan[j].sfgz);
printf("\n\n");
}
printf("员工总人数:%d 实发总工资:%0.2f\n\n",i,sfzgz);
printf("低收入人群占比%0.2f%%\n\n",(dsr/i)*100);
printf("中等收入人群占比%0.2f%%\n\n",(zsr/i)*100);
printf("高收入人群占比%0.2f%%\n\n",(gsr/i)*100);
fclose(fp);
printf("按任意键返回主菜单\n");
system("pause");
system("cls");
Menu();
}
/*删除职工信息,把员工的信息删除后,后面的数据会替代前面的数据,达到删除的功能*/
void Shanchu()
{
int numb,i=0,j,k,select,y=0,t;
fp=fopen(filename,"rb+");
if(fp==NULL)
{
printf("打开文件失败\n");
exit(1);
}
while(fread(&Yuan,sizeof(struct GongZi),1,fp)) //用结构体数组储存文件中的员工信息
{
yuan[i++]=Yuan;
}
for(j=0;j<i-1;j++) //按员工的编号从小到大排序
{
for(k=j+1;k<i;k++)
{
if(yuan[j].num>yuan[k].num)
{
Yuan=yuan[j];
yuan[j]=yuan[k];
yuan[k]=Yuan;
}
}
}
printf("请输入你要删除的员工编号:");
scanf("%d",&numb);
for(j=0;j<i;j++)
{
if(yuan[j].num==numb)
{
printf("员工编号:%07d 姓名:%s 基本工资:%0.2f 津贴:%0.2f 岗贴:%0.2f 补贴:%0.2f 房贴:%0.2f 交通补贴:%0.2f 实发工资:%0.2f\n\n",
yuan[j].num,yuan[j].name,yuan[j].jbgz,yuan[j].jt,yuan[j].gt,yuan[j].bt,yuan[j].ft,yuan[j].jtbt,yuan[j].sfgz);
printf("按 1 删除,按其他数字键取消删除\n\n");
scanf("%d",&t);
if(t!=1)
{
system("cls");
Menu();
break;
}
for(k=j;k<i;k++) //后面的结构体往前面移动;
{
yuan[k]=yuan[k+1];
}
y++;
}
}
if(y==0)
printf("查无此人!!!\n");
else
printf("删除成功!\n\n");
fclose(fp); //这里选择先将文件关闭,再重新用 wb 从头开始写进去
fp=fopen(filename,"wb+");
if(fp==NULL)
{
printf("打开文件失败\n");
exit(1);
}
for(j=0;j<i-y;j++) //重新把结构体数组写进文件,这里要减掉删除的那个数;
{
fwrite(&yuan[j],sizeof(struct GongZi),1,fp);
}
printf("*****(1)继续删除*****(2)主菜单**********\n");
printf("请输入你的选择[ ]\b\b");
scanf("%d",&select);
while(1)
{
if(select==2)
{
fclose(fp);
system("cls");
Menu();
}
else if(select==1)
{
fclose(fp);
system("cls");
Shanchu();
}
else
scanf("%d",&select);
}
}
/*当用户输出其他数字时,无法进行其他操作,可以利用此函数让用户重新输入*/
void Try_again()
{
int n;
printf("输入错误:请重新输入!!!\n");
printf("请再次输入您的选择[ ]\b\b");
scanf("%d",&n);
switch(n)
{
case 0: exit(0);
case 1: Gongz(); break;
case 2: Tianj(); break;
case 3: zhuijia(); break;
case 4: Chax(); break;
case 5: Shanchu(); break;
case 6: Xiug(); break;
case 7: Tongji(); break;
default: Try_again(); break;
}
}
需要用链表还是结构体数组?
下面的代码是最简单的工资计算形式,如需链表形式,可在下方回复。代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define MAXNMB 200
typedef struct _employee
{
int id; //员工编号
char name[20];
float solary; //基本工资
float ks; //扣税
float jx; //绩效
float bt; //补贴
}Employee;
//录入功能
void input(Employee a[], int* nmb)
{
system("cls");
printf("请输入员工编号:");
scanf("%d", &a[*nmb].id);
printf("请输入员工姓名:");
scanf("%s", a[*nmb].name);
printf("请输入员工工资:");
scanf("%f", &a[*nmb].solary);
printf("请输入扣税金额:");
scanf("%f", &a[*nmb].ks);
printf("请输入绩效工资:");
scanf("%f", &a[*nmb].jx);
printf("请输入补贴:");
scanf("%f", &a[*nmb].bt);
*nmb += 1;
printf("添加成功!\n");
system("pause");
}
//删除
void dele(Employee a[], int* nmb)
{
int id;
int i, j;
system("cls");
printf("请输入需要删除的员工编号:");
scanf("%d", &id);
for (i = 0; i < *nmb; i++)
{
if (a[i].id == id)
{
for (j = i; j < *nmb - 1; j++)
a[j] = a[j + 1];
*nmb -= 1;
printf("删除成功!\n");
system("pause");
return;
}
}
printf("未找到该员工,删除成功!\n");
system("pause");
}
//修改
void Mod(Employee a[], int nmb)
{
int id;
int i;
system("cls");
printf("请输入需要修改的员工编号:");
scanf("%d", &id);
for (i = 0; i < nmb; i++)
{
if (a[i].id == id)
{
printf("请输入员工编号:");
scanf("%d", &a[i].id);
printf("请输入员工姓名:");
scanf("%s", a[i].name);
printf("请输入员工工资:");
scanf("%f", &a[i].solary);
printf("请输入扣税金额:");
scanf("%f", &a[i].ks);
printf("请输入绩效工资:");
scanf("%f", &a[i].jx);
printf("请输入补贴:");
scanf("%f", &a[i].bt);
printf("修改成功!\n");
system("pause");
return;
}
}
printf("未找到该员工,修改成功!\n");
system("pause");
}
//显示
void showAll(Employee a[], int nmb)
{
int i;
system("cls");
printf("员工信息如下:\n");
printf("员工编号 员工姓名 基本工资 扣税金额 绩效工资 补贴\n");
printf("------------------------------------------\n");
for (i = 0; i < nmb; i++)
{
printf("%8d %20s %8.2f %8.2f %8.2f %8.2f\n", a[i].id, a[i].name, a[i].solary,a[i].ks,a[i].jx,a[i].bt);
}
system("pause");
}
//查询
void search(Employee a[], int nmb)
{
int id;
int i;
system("cls");
printf("请输入需要查询的员工编号:");
scanf("%d", &id);
printf("员工编号 员工姓名 基本工资 扣税金额 绩效工资 补贴\n");
for (i = 0; i < nmb; i++)
{
if (a[i].id == id)
{
printf("%8d %20s %8.2f %8.2f %8.2f %8.2f\n", a[i].id, a[i].name, a[i].solary, a[i].ks, a[i].jx, a[i].bt);
system("pause");
return;
}
}
printf("未找到该员工!\n");
system("pause");
}
int main()
{
Employee a[MAXNMB];
int nmb = 0;
int op;
while (1)
{
system("cls");
printf("-------------工资管理系统--------------\n");
printf(" 1.新增员工信息\n");
printf(" 2.删除员工信息\n");
printf(" 3.修改员工信息\n");
printf(" 4.显示所有员工信息\n");
printf(" 5.查询员工信息\n");
printf(" 0.退出系统\n");
scanf("%d", &op);
switch (op)
{
case 0: return 0;
case 1: input(a, &nmb); break;
case 2:dele(a, &nmb); break;
case 3:Mod(a, nmb); break;
case 4:showAll(a, nmb); break;
case 5:search(a, nmb); break;
}
}
return 0;
}