题目要求:输入职工信息(至少10条记录),提供新增,删除,修改,和显示功能
2条回答 默认 最新
- CSDN专家-sinJack 2022-06-01 08:51关注
#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; } }
解决 1无用
悬赏问题
- ¥15 skynet MySQL ProtocolBuffers
- ¥15 浏览器关闭事件有时没执行怎么回事
- ¥15 使用docker安装chemex后无法启动
- ¥15 关于#vue.js#的问题:word excel和ppt预览问题语言-javascript)
- ¥15 Apache显示系统错误3该如何解决?
- ¥30 uniapp小程序苹果手机加载gif图片不显示动效?
- ¥20 js怎么实现跨域问题
- ¥15 C++dll二次开发,C#调用
- ¥15 请教,如何使用C#加载本地摄像头进行逐帧推流
- ¥15 Python easyocr无法顺利执行,如何解决?