时间:2021-07-18 08:26:30 | 栏目:C代码 | 点击:次
课程设计目的和要求
工资管理要和人事管理相联系,生成企业每个职工的实际发放工资。
企业职工人事基本信息包括:职工编号、姓名、性别、出生日期、职称(助工、工程师、高级工程师)和任职年限。
企业职工工资信息包括:职工编号、姓名、职务工资、职务补贴、住房补贴、应发工资、个人所得税、养老保险、住房公积金和实发工资。
系统主要功能包括:
(1)创建职工人事基本信息文件,根据提示输入职工的各项信息,按职工编号对职工信息进行排序,并将排序后的职工信息存储到一个文件中。
(2)创建职工的工资信息文件(每个月创建一个文件),其中职工编号和姓名从人事信息文件中复制,其他工资组成项目按下面方法计算。
职务工资:助工=1270*(1+任职年限*2%)
工程师=2360*(1+任职年限*3%)
高级工程师=3450*(1+任职年限*5%)
职务补贴:=职务工资*25%
住房补贴=(职务工资+职务补贴)*15%
应发工资=职务工资+职务补贴+住房补贴
个人所得税=(应发工资-3000)*5%
养老保险=(职务工资+职务补贴)*10%
住房公积金=应发工资*5%
实发工资=应发工资-个人所得税-养老保险-住房公积金
(3)增加职工人事基本信息,在原有职工人事基本信息文件的基础上增加新有的职工信息。
(4)删除职工人事基本信息,提示用户输入要删除的职工编号,如果在文件有该信息存在,则将其信息输出到屏幕上,用户确认后将该信息删除,并将删除后的结果保存至原文件。最后提示用户是否继续进行删除操作。
(5)修改职工人事基本信息,提示用户输入要删除的职工编号,如果在文件有该信息存在,则将其信息输出到屏幕上,然后提示用户要修改的选项(职称、任职年限),并将修改后的结果保存至原文件。最后提示用户是否继续进行修改操作。
(6)按不同条件进行查询操作,输出满足条件的职工工资信息。
① 按职工编号查询,输入一个编号,输出对应职工工资信息。
② 按姓名查询,包括精确查询,模糊查询。
③ 按职称查询,输入职称名称,输出相应职称工资信息。
(7)按不同条件对职工工资信息进行统计工作。
① 统计个职称岗位的职工人数是多少,计算高级工程师比例。
② 计算企业职工的平均实发工资,并输出。
③ 统计职工工资低于平均工资人数,并输出他们的姓名和实发工资。
代码:
#include<stdafx.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<time.h> typedef struct date { short year; short month; short day; }st3; typedef struct gerenxinxi { char num[30]; char name[30]; char sex[30]; st3 chushengriqi; char zhicheng[20]; int nianxian; }st; typedef struct gerengongzi { char num[20]; char name[12]; double zhiwugongzi; double zhiwubutie; double zhufangbutie; double yingfagongzi; double gerensuodeshui; double yanglaobaoxian; double zhufanggongjijin; double shifagongzi; }st1; #define st3_len sizeof(st3) #define st_len sizeof(st) #define st1_len sizeof(st1) #define gerenxinxinum 1000 #define gerengongzinum 1000 st gerenxinxi[gerenxinxinum]={0}; st1 gerengongzi[gerengongzinum]={0}; int loadgerenxinxi(void);//将文件中的信息读取 int originalgerenxinxi(void);//个人信息初始化 void getonegerenxinxi(int i);//输ru一个职工的个人信息 void allgerenxinxi(int bn);//保存所有信息 void xggerenxinxi(int bn);//修改个人信息 void saveonegerenxinxi(int i);//保存个人信息 int addgerenxinxi(int bn);//增加个人信息 int delgerenxinxi(int bn); //删除个人信息 void putonegerenxinxi(int i);//输出一个个人信息 void sort(int bn);//排序 void shengchenggongzi(int bn);//生成工资 void putonegerengongzi(int i);//输出一个人的工资信息 void cxgerenxinxi(int bn);//查询 void cxzhicheng(int bn);//职称查询 void cxname(int bn);//姓名查询 void cxnum(int bn);//编号查询 void tongjigongzixinxi(int bn);//统计工资信息 float avegongzi(int bn);//平均工资 void lowgongzi(int bn);//低于平均工资 void gangweirenshu(int bn);//职工人数 void main() { int select,bn; bn=loadgerenxinxi(); if(bn==0) printf("职工信息为零:"); while(1) { printf("\n 企业职工工资管理系统 \n"); printf("\n-----------------------------\n"); printf("\n 请输入要进行操作前的序号 \n"); printf("\n 1.输入职工信息 \n"); printf("\n 2.修改职工信息 \n"); printf("\n 3.增加职工信息 \n"); printf("\n 4.删除职工信息 \n"); printf("\n 5.职工工资 \n"); printf("\n 6.统计工资信息 \n"); printf("\n 7.查询工资信息 \n"); printf("\n 0.退出 \n"); printf("\n----------------------------\n"); scanf("%d",&select); getchar(); switch(select) { case 1: originalgerenxinxi(); break; case 2: xggerenxinxi(bn); break; case 3: addgerenxinxi(bn); break; case 4: delgerenxinxi(bn); break; case 5: shengchenggongzi(bn); break; case 6: tongjigongzixinxi(bn); break; case 7: cxgerenxinxi(bn); break; case 0: return; default:printf("\n按键错误,请重新选择\n"); } } } //===================================================== int loadgerenxinxi(void)//将文件中的信息读取 { FILE *fb; int bn=0; if((fb=fopen("gerenxinxi.txt","r+"))==NULL) {printf("不能打开\n"); return(bn); } while(!feof(fb)) if(fread(&gerenxinxi[bn],st_len,1,fb)) bn++; fclose(fb); return(bn); } //====================================================== int originalgerenxinxi(void)//个人信息初始化 { int n; char c='y'; for(n=0;c=='y';n++) { printf("\n输入职工%d的信息:\n",n+1); getonegerenxinxi(n); printf("\n继续输入请按'y',停止请按'n':"); c=getchar(); getchar(); } sort(n); allgerenxinxi(n); return(n); } //====================================================== void getonegerenxinxi(int i)//输ru一个职工的个人信息 { printf("职工编号:"); gets(gerenxinxi[i].num); printf("姓名:"); gets(gerenxinxi[i].name); printf("性别:"); gets(gerenxinxi[i].sex); printf("出生日期:"); scanf("%d.%d.%d",&gerenxinxi[i].chushengriqi.year,&gerenxinxi[i].chushengriqi.month,&gerenxinxi[i].chushengriqi.day); getchar(); printf("职称(助工,工程师 ,高级工程师):"); gets(gerenxinxi[i].zhicheng); printf("任职年限:"); scanf("%d",&gerenxinxi[i].nianxian); getchar(); } //====================================================== void allgerenxinxi(int bn)//保存所有信息 { FILE *fb; if((fb=fopen("gerenxinxi.txt","w"))==NULL) { printf("不能打开\n"); exit(1); } fwrite(gerenxinxi,st_len,bn,fb); fclose(fb); } //======================================================= void xggerenxinxi(int bn)//修改个人信息 { int select,k=-1; char number[20],c1='y',c2; if(bn==0) { printf("\n职工信息为空\n:"); return; } while(c1=='y') {c2='y'; printf("\n请输入要修改的职工编号\n"); gets(number); for(int i=0;i<bn;i++) if(strcmp(gerenxinxi[i].num,number)==0) { k=i; break;} if(k<0) printf("\n编号有误,请重新输入\n"); else { printf("\n职工信息:\n"); putonegerenxinxi(k); while(c2=='y') { printf("\n请输入要修改项前的序号:\n"); printf("1.职称\n"); printf("2.任职年限\n"); printf("0.退出程序\n"); scanf("%d",&select); getchar(); switch(select) { case 1:printf("职称:"); gets(gerenxinxi[k].zhicheng); break; case 2:printf("入职年限:"); scanf("%d",&gerenxinxi[k].nianxian); getchar(); break; case 0: exit(1); default: printf("\n按键错误,请重新输入\n"); } printf("\n还要修改该职工其它信息吗(y/n)?\n"); c2=getchar(); getchar(); } } saveonegerenxinxi(k); printf("\n还要修改其他职工信息吗?(y/n)\n"); c1=getchar(); getchar(); } printf("\n按任意键继续\n"); getchar(); } //====================================================== void saveonegerenxinxi(int i)//保存个人信息 { FILE *fb; if((fb=fopen("gerenxinxi.txt","r+"))==NULL) {printf("不能打开 \n"); exit(1); } fseek(fb,st_len*i,0); fwrite(&gerenxinxi[i],st_len,1,fb); fclose(fb); } //====================================================== int addgerenxinxi(int bn)//增加个人信息 { char c='y'; FILE *fb; if((fb=fopen("gerenxinxi.txt","a"))==NULL) {printf("不能打开\n"); exit(1); } while(c=='y') {printf("\n请输入新增职工信息:\n"); getonegerenxinxi(bn); fwrite(&gerenxinxi[bn],st_len,1,fb); bn++; printf("\n继续输入其他职工信息吗?(y/n):"); c=getchar(); getchar(); } printf("\n按任意键继续\n:"); getch(); fclose(fb); return(bn); } //====================================================== int delgerenxinxi(int bn) //删除个人信息 { int k=-1; char number[20],c1='y',c2; if(bn==0) { printf("\n信息为空\n"); return(bn); } while(c1=='y') { c2='y'; printf("\n输入要删除的职工编号\n"); gets(number); for(int i=0;i<bn;i++) if(strcmp(gerenxinxi[i].num,number)==0) { k=i; break;} if(k<0) printf("\n编号有误,重新输入\n"); else { printf("\n职工信息:\n"); putonegerenxinxi(k); printf("\n确定要删除该职工的全部信息吗?(y/n):"); c2=getchar(); getchar(); if(c2=='y') { for(i=k;i<bn;i++) gerenxinxi[i]=gerenxinxi[i+1]; bn--; printf("\n成功删除!\n"); } else printf("\n取消删除!\n"); printf("\n继续删除其它职工信息吗?(y/n):"); c1=getchar(); getchar(); } } allgerenxinxi(bn); printf("\n按任意键继续!\n"); getch(); return(bn); } //==================================================== void putonegerenxinxi(int i)//输出一个个人信息 { printf("\n"); printf("职工编号:"); puts(gerenxinxi[i].num); printf("姓名:"); puts(gerenxinxi[i].name); printf("性别:"); puts(gerenxinxi[i].sex); printf("出生日期:"); printf("%d.%d.%d\n",gerenxinxi[i].chushengriqi.year,gerenxinxi[i].chushengriqi.month,gerenxinxi[i].chushengriqi.day); printf("职称:"); puts(gerenxinxi[i].zhicheng); printf("任职年限:"); printf("%d",gerenxinxi[i].nianxian); } //================================================== void sort(int bn)//排序 { st temp; int i,j; for(i=0;i<bn-1;i++); { for(j=i+1;j<bn;j++) if(gerenxinxi[i].num >gerenxinxi[i+1].num ) { temp=gerenxinxi[i]; gerenxinxi[i]=gerenxinxi[i+1]; gerenxinxi[i+1]=temp; } } } //================================================= void shengchenggongzi(int bn)//生成工资 { FILE *fp,*fp2; int i,j; if ((fp = fopen("gerenxinxi.txt", "r")) == NULL) { printf("不能打开\n"); exit(0); } fread(gerenxinxi,st_len,bn, fp); if ((fp2 = fopen("gerengongzi.txt", "w")) == NULL) { printf("不能打开\n"); exit(0); } for(i=0;i<bn;i++) { strcpy(gerengongzi[i].name, gerenxinxi[i].name); strcpy(gerengongzi[i].num, gerenxinxi[i].num); if (strcmp(gerenxinxi[i].zhicheng,"助工") == 0) {gerengongzi[i].zhiwugongzi=1270*(1+gerenxinxi[i].nianxian*0.02);} if (strcmp(gerenxinxi[i].zhicheng,"工程师") == 0) {gerengongzi[i].zhiwugongzi=2360*(1+gerenxinxi[i].nianxian*0.03);} if (strcmp(gerenxinxi[i].zhicheng,"高级工程师") == 0) {gerengongzi[i].zhiwugongzi=3450*(1+gerenxinxi[i].nianxian*0.05);} gerengongzi[i].zhiwubutie=gerengongzi[i].zhiwugongzi*0.25; gerengongzi[i].zhufangbutie=(gerengongzi[i].zhiwubutie+gerengongzi[i].zhiwugongzi)*0.15; gerengongzi[i].yingfagongzi=gerengongzi[i].zhiwugongzi+gerengongzi[i].zhiwubutie+gerengongzi[i].zhufangbutie; if(gerengongzi[i].yingfagongzi>3000) gerengongzi[i].gerensuodeshui=(gerengongzi[i].yingfagongzi-3000)*0.05; else gerengongzi[i].gerensuodeshui=0; gerengongzi[i].yanglaobaoxian=(gerengongzi[i].zhiwubutie+gerengongzi[i].zhiwugongzi)*0.1; gerengongzi[i].zhufanggongjijin=gerengongzi[i].yingfagongzi*0.05; gerengongzi[i].shifagongzi=gerengongzi[i].yingfagongzi-gerengongzi[i].gerensuodeshui-gerengongzi[i].yanglaobaoxian-gerengongzi[i].zhufanggongjijin; } printf("\n"); fwrite(gerengongzi,st1_len,bn,fp2); fclose(fp); fclose(fp2); if ((fp = fopen("gerengongzi.txt", "r+")) == NULL) { printf("不能打开\n"); exit(1); } fread(gerengongzi,st1_len,bn,fp2); for(j=0;j<bn;j++) putonegerengongzi(j); fclose(fp); } //========================================================== void putonegerengongzi(int i)//输出一个人的工资信息 { printf("\n"); printf("职工编号:"); puts(gerengongzi[i].num); printf("职工姓名:"); puts(gerengongzi[i].name); printf("劳务工资:"); printf("%f\n",gerengongzi[i].zhiwugongzi); printf("劳务补助:"); printf("%f\n",gerengongzi[i].zhiwubutie); printf("住房补贴:"); printf("%f\n",gerengongzi[i].zhufangbutie); printf("应发工资:"); printf("%f\n",gerengongzi[i].yingfagongzi); printf("个人所得税:"); printf("%f\n",gerengongzi[i].gerensuodeshui); printf("养老保险:"); printf("%f\n",gerengongzi[i].yanglaobaoxian); printf("住房公积金:"); printf("%f\n",gerengongzi[i].zhufanggongjijin); printf("实发工资:"); printf("%f\n",gerengongzi[i].shifagongzi); } //=============================================== void cxgerenxinxi(int bn)//查询 { int select; while(1) { printf("\n请输入要进行操作前的编号\n"); printf("1.编号查询\n"); printf("2.按姓名查询\n"); printf("3.按职称查询\n"); printf("0.退出查询\n"); scanf("%d",&select); getchar(); switch(select) { case 1: cxnum(bn); break; case 2: cxname(bn); break; case 3: cxzhicheng(bn); break; case 0: return; default:printf("\n按键错误,请重新选择\n"); } } } //============================================== void cxnum(int bn) { int i; char number[20],c='y'; while(c=='y') { printf("\n请输入职工编号:"); gets(number); for(i=0;i<bn;i++) if(strcmp(gerenxinxi[i].num,number)==0) { printf("\n职工%d的信息:\n"); putonegerenxinxi(i); printf("\n按任意键继续!\n"); getch(); } if(i==bn) printf("\n没有找到职工信息\n"); return; } printf("\n按任意键继续查询!\n"); getchar(); } //================================================ void cxzhicheng(int bn) { int i; char zhicheng[20],c='y'; while(c=='y') { printf("\n请输入职工职称:"); gets(zhicheng); for(i=0;i<bn;i++) if(strcmp(gerenxinxi[i].zhicheng,zhicheng)==0) { printf("\n职工的信息:\n"); putonegerenxinxi(i); printf("\n按任意键继续!\n"); getch(); } if(i==bn) { printf("\n没有找到职工信息\n"); return ; } } printf("\n按任意键继续查询!\n"); getchar(); } //============================================== void cxname(int bn)//姓名查询 { int i,j,k; char name[12],c='y'; while(c=='y') { k=-1; printf("\n请输入职工姓名:"); gets(name); for(i=0,j=1;i<bn;i++) if(strcmp(gerenxinxi[i].name,name)==0) { printf("\n当前为准确查询\n"); k=i; printf("\n职工%d的信息:\n",j++); putonegerenxinxi(k); printf("\n按任意键继续!\n"); getch(); } if(k==-1) { printf("\n当前为模糊查询\n"); for(i=0,j=1;i<bn;i++) if(strstr(gerenxinxi[i].name,name)!=NULL) { k=i; printf("\n职工%d的信息:\n",j++); putonegerenxinxi(k); printf("\n按任意键继续!\n"); getch(); } if(j==1) printf("\n没有找到职工信息!\n"); return; } } printf("\n按任意键继续!\n"); getchar(); } //================================================= void tongjigongzixinxi(int bn)//统计工资信息 { int select; while(1) { printf("请输入要进行操作前的编号\n"); printf(" 1.各职称岗位的职工人数\n"); printf(" 2.职工的平均实发工资\n"); printf(" 3.低于平均工资的人数\n"); printf(" 0.退出统计功能\n"); scanf("%d",&select); getchar(); switch(select) { case 1:gangweirenshu(bn); break; case 2:avegongzi(bn); break; case 3:lowgongzi(bn); break; case 0:return; default: printf("\n按键错误,请重新选择!\n"); } return; } } //================================================= void gangweirenshu(int bn)//职工人数 { int i,j=0, k=0, m=0; float ave; for(i=0;i<bn;i++) { if(strcmp(gerenxinxi[i].zhicheng ,"助工")==0) j++; if(strcmp(gerenxinxi[i].zhicheng ,"工程师")==0) k++; if(strcmp(gerenxinxi[i].zhicheng ,"高级工程师")==0) m++; } ave=(m*1.0/bn); printf("助工人数为%d人\n",j); printf("工程师人数为%d人\n",k); printf("高级工程师人数为%d人\n",m); printf("高级工程师比例为%f\n",ave); } //================================================== float avegongzi(int bn)//平均工资 { int i; float sum=0; float ave; for(i=0;i<bn;i++) sum=sum+gerengongzi[i].shifagongzi; ave=(sum/bn); printf("职工的平均实发工资为:%f\n",ave); return(ave); return(0); } //================================ void lowgongzi(int bn)//低于平均工资 { int i,k=0; float b; b=avegongzi(bn); for(i=0;i<bn;i++) { if(gerengongzi[i].shifagongzi<b) { k++; printf("姓名:%s\n",gerengongzi[i].name); printf("工资:%f\n",gerengongzi[i].shifagongzi); } } printf("低于平均工资的人数为:%d\n",k); }
努力了一个多星期,自己头一次做这么大的程序,鼓励一下