C++ 职工工资管理的设计与实现

职工工资管理的设计与实现

职工工资管理设计与实现

功能设计要求

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;
}

 

    这个实验中的代码还是有很多的问题的。比如,建立的类数组所占的内存空间太大了,有很多空余。我觉得下次可以尝试使用链表来做。


你可能感兴趣的:(C++,职工工资管理的设计与实现)