职工工资管理设计与实现
功能设计要求
1. 输入记录:将每一个职工的姓名、ID号以及基本工资、职务工资、岗位津贴、医疗保险、公积金的数据作为一个记录。该软件能建立一个新的数据文件或给已建立好的数据文件增加记录。
2. 显示记录:根据用户提供的记录或者根据职工姓名显示一个或几个职工的各项工资和平均工资。
3. 修改记录:可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示。
4.查找记录:可以对数据文件的任意记录的数据进行查找并在查找前后对记录内容进行显示。
5. 删除记录:可删除数据文件中的任一记录。
6. 统计: (A)计算各项工资平均工资及总工资,(B)统计符合指定条件(如职工工资前三项之和在3000元以上、3000~2000元、2000~1000元) 以内的工资职工人数及占总职工人数的百分比。(C)按字符表格形式打印全部职工工资信息表及平均工资(包括各项总的平均工资)。
7.保存数据文件功能。
例如:职工工资信息表
ID号 姓名 基本工资 职务工资 津贴 医疗保险- 公积金- 总工资
01 张望 1286 794 198 109 135 2034
02 李明 1185 628 135 94 114 1740
03 王小民 895 438 98 64 73 1294
04 张效章 1350 868 210 116 150 2162
05 彭山 745 398 84 61 68 1098
¼ ¼ ¼ ¼ ¼ ¼ ¼ ¼
各项平均工资 1092.2 625.2 145 88.8 108
#define _CRT_SECURE_NO_WARNINGS1 #include<iostream> #include<fstream> #include<stdlib.h> #include<string.h> #include<Windows.h> #define max 100000000; using namespace std; class staff { public: staff() { id[5]='0'; name[10] = '0'; mon1 = mon2 = mon3 = mon4 = mon5 =0.0; } void setstaff(char *ID,char *Name,double money1,double money2,double money3,double money4,double money5 ) { strcpy(id,ID); strcpy(name,Name); mon1 = money1; mon2 = money2; mon3 = money3; mon4 = money4; mon5 = money5; } void print();//显示职工信息 double summoney();//求每个人的总工资 double avgmoney();//求每个人的平均工资 char id[5],name[10]; double mon1,mon2,mon3,mon4,mon5; }; //求每个人的总工资 double staff::summoney() { double sum; sum= mon1 + mon2 + mon3 + mon4 + mon5; return sum; } //求每个人的平均工资 double staff::avgmoney() { double avg; avg= (staff::summoney())/5; return avg; } void staff::print() { cout<<id<<" "<<name<<" "<<mon1<<" "<<mon2<<" "<<mon3<<" " <<mon4<<" "<<mon5<<" "<<staff::summoney()<<" "<<staff::avgmoney()<<endl; } //为该系统添加职工信息 int Input(staff sta[]) { cout<<" 职工信息输入"<<endl; cout<<"请输入所要输入的职工个数:"<<endl; int num = 0; cin>>num; cout<<"ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金"<<endl; for(int i = 0;i < num; i++) { flag1: char id[10]={0},name[10]={0}; double mon1,mon2,mon3,mon4,mon5; cin>>id>>name>>mon1>>mon2>>mon3>>mon4>>mon5; for(int j =0;j < i ;j++) { if(strcmp(id,sta[j].id) == 0) { cout<<"该职工的职工号已存在请重新输入"<<endl; goto flag1; } } sta[i].setstaff(id,name,mon1,mon2,mon3,mon4,mon5); } return num; } // count为当前职工人数 int Insert(staff sta[],int count) { int n=1; while(n==1) { cout<<"请输入要添加的新职工信息:"<<endl; cout<<"ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金"<<endl; flag2: char id[10]={0},name[10]={0}; double mon1,mon2,mon3,mon4,mon5; cin>>id>>name>>mon1>>mon2>>mon3>>mon4>>mon5; for(int j =0;j < count ;j++) { if(strcmp(id,sta[j].id) == 0) { cout<<"该职工的职工号已存在请重新输入"<<endl; goto flag2; } } sta[count].setstaff(id,name,mon1,mon2,mon3,mon4,mon5); cout<<"添加成功!"; count++; cout<<"是否继续添加,继续请按1 / 退出请按0:"<<endl; cin>>n; } return count; } //查找职工信息 count 为职工人数 void select(staff sta[],int count) { cout<<"请输入所要查询的职工ID:"; char id[10]={0}; cin>>id; int i = 0; for( i = 0;i < count; i++) { if(strcmp(id,sta[i].id)==0) { cout<<"该职工信息为:"<<endl; cout<<"ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 平均工资"<<endl; sta[i].print(); break; } } if(i >= count ) cout<<"系统中没有此职工信息"<<endl; } //存入文件中 void Infile(staff sta[],int count) { fstream outfile; outfile.open("staff.dat",ios::out); if(!outfile) { cout<<"文件夹不能打开."<<endl; abort(); } for(int i=0; i < count ;i++ ) { outfile<<sta[i].id<<" "<<sta[i].name<<" "<<sta[i].mon1<<" "<<sta[i].mon2<<" " <<sta[i].mon3<<" "<<sta[i].mon4<<" "<<sta[i].mon5 <<"\n" ; } outfile.close(); } //修改职工信息 void update(staff sta[],int count) { flag3: cout<<"请输入要修改信息的职工号:"; char id[5] = {0}; cin>>id; int i= 0; for( i=0;i <count ;i++) { if(strcmp(id,sta[i].id)==0) { cout<<"请选择要修改的信息:"<<endl; cout<<"***********************************************"<<endl; cout<<"****** 1.修改基本工资 ******"<<endl; cout<<"****** 2.修改职务工资 ******"<<endl; cout<<"****** 3.修改紧贴 ******"<<endl; cout<<"****** 4.修改医疗保险 ******"<<endl; cout<<"****** 5.修改公积金 ******"<<endl; cout<<"***********************************************"<<endl; cout<<"请选择对应数字序号进行操作:"; int a =0 ; char name[10] ={0}; double mon1 =0.0,mon2 =0.0,mon3 =0.0,mon4 =0.0,mon5 =0.0; cin>>a; switch(a) { case 1 : cout<<"请输入新的基本工资:"; cin>>mon1; sta[i].mon1 = mon1; break; case 2: cout<<"请输入新的岗位工资:"; cin>>mon2; sta[i].mon2 = mon2; break; case 3: cout<<"请输入新的岗位工资:"; cin>>mon3; sta[i].mon3 = mon3; break; case 4 : cout<<"请输入新的岗位工资:"; cin>>mon4; sta[i].mon4 = mon4; break; case 5: cout<<"请输入新的岗位工资:"; cin>>mon5; sta[i].mon5 = mon5; break; default: cout<<"输入不合标准"<<endl; } break; } } if(i >=count) { cout<<"查询不到该职工的ID"<<endl; cout<<"请选择是否重新输入,如果是,输入是,否则输入其他"<<endl; char ch[5]; cin>>ch; if(strcmp(ch,"是") ==0) goto flag3; } } //删除职工信息 int Delete(staff sta[],int count) { char id[10]={0}; cout<<"请输入你所要删除的职工ID :"; cin>>id; if(count < 1) { cout<<"该系统暂没有职工信息。"<<endl; return count; } else { for(int i = 0;i < count;i++) { if(strcmp(id,sta[i].id) == 0) { for(int j = i;j<(count-1); j++) sta[j]=sta[j+1]; return count-1; } } cout<<"该平台没有此职工信息"<<endl; return count; } } //求每一项的平均值 void money(staff sta[],int count) { double count1 = 0; double count2 = 0; double count3 = 0; double count4 = 0; double count5 = 0; for(int i = 0;i< count; i++) { count1 = count1 + sta[i].mon1; count2 = count2 + sta[i].mon2; count3 = count3 + sta[i].mon3; count4 = count4 + sta[i].mon4; count5 = count5 + sta[i].mon5; } cout<<"各项工资的平均工资为 "<<count1/count<<" "<<count2/count<<" "<<count3/count<<" "<<count4/count<<" "<<count5/count<<endl; } //统计:统计符合指定条件(如职工工资前三项之和在3000元以上、3000~2000元、2000~1000元) //以内的工资职工人数及占总职工人数的百分比。 double tongji(staff sta[],int count,int m,int n) /* m-n为 1000-2000,2000-3000,3000-max*/ { double number = 0.0; double money = 0.0; for(int i = 0; i < count ;i++) { money = sta[i].mon1 + sta[i].mon2 + sta[i].mon3; if((money >= m)&& (money <= n)) number++; } return number/count; } //系统界面 void menu() { cout<<"#######################################################################"<<endl; cout<<"--------------------------职工工资管理系统()---------------------------"<<endl; cout<<"***********************************************************************"<<endl; cout<<"** 1. 修改职工信息 **"<<endl; cout<<"** 2. 添加职工信息 **"<<endl; cout<<"** 3. 删除职工信息 **"<<endl; cout<<"** 4. 查找职工信息 **"<<endl; cout<<"** 5. 统计职工信息 **"<<endl; cout<<"** 6. 显示职工信息 **"<<endl; cout<<"** 7. 退出系统 **"<<endl; cout<<"#######################################################################"<<endl; } int main() { staff sta[100]; int count = 0; menu(); getchar(); count = Input(sta); cout<<"ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 平均工资"<<endl; for(int i =0; i< count;i++) sta[i].print(); Infile(sta,count); flag4: cout<<"请选择你要进行的功能:"<<endl; int num=0; double m = 0.0, n= 0.0; double temp = 0.0; cin>>num; switch(num) { case 1: update(sta,count); Infile(sta,count); cout<<"ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 平均工资"<<endl; for(int i =0; i< count;i++) sta[i].print(); break; case 2: count=Insert(sta,count); Infile(sta,count); cout<<"ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 平均工资"<<endl; for(int i =0; i< count;i++) sta[i].print(); break; case 3: count=Delete(sta,count); Infile(sta,count); cout<<"ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 平均工资"<<endl; for(int i =0; i< count;i++) sta[i].print(); break; case 4: select(sta,count);break; case 5: cout<<"请输入你要统计的职工信息指定的条件m 和 n:"; cin>>m>>n; if(m > n) { temp = m; m = n; n=temp; } cout<<"职工工资前三项之和在"<<m<<"-"<<n<<"以内的工资职工人数及占总职工人数的百分比为:" <<tongji(sta,count,m,n)<<endl; break; case 6: cout<<"ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资 平均工资"<<endl; for(int i =0; i< count;i++) sta[i].print(); money(sta,count); break; case 7: cout<<"3秒后退出系统"<<endl; Sleep(3000); return 0; default: cout<<"输入不合标准"<<endl; } cout<<"请选择是否继续使用该系统,如果是 输入yes"<<endl; char ch[5]={0}; cin>>ch; if(strcmp(ch,"yes")==0) { menu(); goto flag4; } system("pause"); return 0; }
这个实验中的代码还是有很多的问题的。比如,建立的类数组所占的内存空间太大了,有很多空余。我觉得下次可以尝试使用链表来做。