功能设计要求
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
基本思想
(a)在实验中采用类与继承来实现职工及其工资信息的封装。
(b)将职工信息、工资信息、职工工资信息分别封装为一个类,其中职工工资信息继承职工信息与工资信息。
(c)各部分功能的实现封装为一个功能类来实现。
c++代码实现如下:
存放于Tworker.h中的类的封装实现部分:
#include<iostream>
#include<string.h>
#include<fstream>
#include<iomanip>
#include<stdlib.h>
using namespace std;
static int total=0;//职工总数
class TWorker
{
public:
void set_worker()//输入职工信息
{
cout<<"请输入职工编号:"; cin>>number;
cout<<"请输入职工姓名:"; cin>>name;
}
protected:
char name[18],number[18];
};
class TSalary
{
public:
void set_salary()//输入工资数
{
cout<<"请输入所得基本工资:"; cin>>BSalary;
cout<<"请输入所得职务工资:"; cin>>ZSalary;
cout<<"请输入所得津贴:"; cin>>bonus;
cout<<"请输入医疗保险:"; cin>>Medical_insurance;
cout<<"请输入公积金:"; cin>>fund;
}
protected:
float BSalary,ZSalary,bonus,Medical_insurance,fund;
};
class TWorker_salary:public TWorker,public TSalary
{
public:
friend class Tmanage;//作为友元函数访问
void set_work_salary()
{
set_worker();
set_salary();
}
};
class Tmanage
{
public:
int Input();//输入职工的个人信息
void Print();//输出职工信息
void Update();//修改职工信息
void Query();//查找职工信息
void Delete();//删除职工信息
void T_J();//统计职工在一定区域内的百分比
private:
TWorker_salary worker;
};
int Tmanage::Input()
{
ofstream ofile("D:\\worker.txt",ios::app); //以追加方式打开,防止输入的覆盖
if(!ofile)
{
cout<<"文件夹不能打开!"<<endl;
return 0;
}
int n=1;
while(n)//继续输入判断
{
worker.set_work_salary(); //输入职工信息
ofile<<setw(10)<<worker.number<<setw(10)<<worker.name<<setw(10)<<worker.BSalary<<setw(10)<<worker.ZSalary<<setw(10)<<worker.bonus<<setw(10)<<worker.Medical_insurance <<setw(10)<<worker.fund<<endl;//将输入信息写入文件中
cout<<"输入成功!"<<endl;
total++; //统计输入职工的总个数
cout<<"继续输入请按1 / 退出请按0:";
cin>>n;
}
ofile.close();//关闭文件
return 0;
}
void Tmanage::Print()
{
ifstream ifile("D:\\worker.txt",ios::in);//打开并读取文件
if(!ifile)
{
cout<<"文件夹不能打开!"<<endl;
abort();
}
bool flag = true;//用于标识是否找到职工
string s; //用于存放从文件中读到的记录
while(getline(ifile, s))
{
if(flag)
{
cout<<setw(10)<<"职工ID号"<<setw(10)<<"职工姓名"<<setw(10)<<"基本工资"<<setw(10)<<"职务工资"<<setw(10)<<"所得津贴"<<setw(10)<<"医疗保险"<<setw(10)<<"公积金"<<endl;
}
cout<<s<<endl;//输出职工信息
flag=false;
}
if(flag) cout<<"系统中没有职工信息!"<<endl;
ifile.close();
}
void Tmanage::Delete()
{
TWorker_salary worker[100];//用于存放从文件中读取到的记录
ifstream ifile("D:\\worker.txt",ios::in);
if(!ifile)//判断文件是否能打开
{
cout<<"文件夹不能打开!"<<endl;
abort();
}
cout<<setw(10)<<"职工ID号"<<setw(10)<<"职工姓名"<<setw(10)<<"基本工资"<<setw(10)<<"职务工资"<<setw(10)<<"所得津贴"<<setw(10)<<"医疗保险"<<setw(10)<<"公积金"<<endl;
for(int i=0;i<total;i++)//将文件中的内容提取出来且存放在数组里
{
ifile>>worker[i].number>>worker[i].name>>worker[i].BSalary>>worker[i].ZSalary>>worker[i].bonus>>worker[i].Medical_insurance>>worker[i].fund;
cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
}
ifile.close();
int n=1;
int q;
while(n)
{
ofstream ofile("D:\\worker.txt",ios::out); //out方式打开,即可覆盖,即重新往文件里添加记录
if(!ofile)
{
cout<<"文件夹不能打开!"<<endl;
abort();
}
bool flag; //用于标识该职工是否存在
char nu[18];
cout<<"请输入要删除的职工的职工号:";
cin>>nu;
flag=false;
for(int i=0;i<total;i++)
{
if(strcmp(nu,worker[i].number)!=0)//不是所要删除的职工
ofile<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;//写入文件
if(strcmp(nu,worker[i].number)==0) //是所要删除的职工
{
flag=true;
cout<<"*****删除成功*****"<<endl;
q=i; //记录要删除的职工
}
}
Tmanage::Print();//输出删除后情况
ofile.close();//关闭文件
if(!flag)
{
cout<<"查询不到该ID的职工,无法删除!继续删除请按1 / 退出请按0:";
cin>>n;
}
else
{
for(int k=q;k<total-1;k++) //删除该职工
{
strcpy(worker[k].number,worker[k+1].number);
strcpy(worker[k].name ,worker[k+1].name);
worker[k].BSalary =worker[k+1].BSalary;
worker[k].ZSalary =worker[k+1].ZSalary;
worker[k].fund =worker[k+1].fund;
worker[k].Medical_insurance=worker[k+1].Medical_insurance;
worker[k].bonus =worker[k+1].bonus;
}
total--; //删除成功时职工个数减1
cout<<"继续删除请按1 / 退出请按0:";
cin>>n;
}
}
}
void Tmanage::Update()
{
TWorker_salary worker[100];//用于存放从文件中读取到的记录
ifstream ifile("D:\\worker.txt",ios::in);
if(!ifile)//判断文件是否能打开
{
cout<<"文件夹不能打开!"<<endl;
abort();
}
cout<<setw(10)<<"职工ID号"<<setw(10)<<"职工姓名"<<setw(10)<<"基本工资"<<setw(10)<<"职务工资"<<setw(10)<<"所得津贴"<<setw(10)<<"医疗保险"<<setw(10)<<"公积金"<<endl;
for(int i=0;i<total;i++)//将文件中的内容提取出来
{
ifile>>worker[i].number>>worker[i].name>>worker[i].BSalary>>worker[i].ZSalary>>worker[i].bonus>>worker[i].Medical_insurance>>worker[i].fund;
cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
}
ifile.close();
ofstream ofile("D:\\worker.txt",ios::out);
if(!ofile)
{
cout<<"文件夹不能打开!"<<endl;
abort();
}
bool flag;//用于标识职工是否存在
int n=1;
char nu[18];
float new_BSalary,new_ZSalary,new_bonus,new_Medical_insurance,new_fund;
while(n)//继续修改判断
{
cout<<"请输入要修改信息的职工号:";
cin>>nu;
flag=false;
int a;
for(int i=0;i<total;i++)
if(strcmp(nu,worker[i].number)==0)//判断找到对应职工号
do{
cout<<"请选择要修改的信息:"<<endl;
cout<<"****************************************"<<endl;
cout<<"-----------[1] 修改基本工资-------------"<<endl;
cout<<"-----------[2] 修改职务工资-------------"<<endl;
cout<<"-----------[3] 修改津贴-----------------"<<endl;
cout<<"-----------[4] 修改医疗保险-------------"<<endl;
cout<<"-----------[5] 修改公积金---------------"<<endl;
cout<<"****************************************"<<endl;
cout<<"请选择对应数字序号进行操作:";
cin>>a;
if(a==1)
{
cout<<"请输入新的基本工资:";
cin>>new_BSalary;
for(i=0;i<total;i++)
{
if(strcmp(worker[i].number,nu)==0)
worker[i].BSalary =new_BSalary;
}
}
if(a==2)
{
cout<<"请输入新的职务工资:";
cin>>new_ZSalary;
for(i=0;i<total;i++)
{
if(strcmp(worker[i].number,nu)==0)
worker[i].ZSalary =new_ZSalary;
}
}
if(a==3)
{
cout<<"请输入新的津贴:";
cin>>new_bonus;
for(i=0;i<total;i++)
{
if(strcmp(worker[i].number,nu)==0)
worker[i].bonus =new_bonus;
}
}
if(a==4)
{
cout<<"请输入新的医疗保险:";
cin>>new_Medical_insurance;
for(i=0;i<total;i++)
{
if(strcmp(worker[i].number,nu)==0)
worker[i].Medical_insurance =new_Medical_insurance;
}
}
if(a==5)
{
cout<<"请输入新的公积金:";
cin>>new_fund;
for(i=0;i<total;i++)
{
if(strcmp(worker[i].number,nu)==0)
worker[i].fund=new_fund;
}
}
flag=true;
}while(a<1 && a>5);
if(!flag)//判断是否存在职工信息
{
cout<<"查询不到该职工的ID,无法修改!继续修改请按1 / 退出请按0:";
cin>>n;
}
else
{
cout<<"继续修改请按1 / 退出请按0:";
cin>>n;
}
}
for(int j=0;j<total;j++)
ofile<<setw(10)<<worker[j].number<<setw(10)<<worker[j].name<<setw(10)<<worker[j].BSalary<<setw(10)<<worker[j].ZSalary<<setw(10)<<worker[j].bonus<<setw(10)<<worker[j].Medical_insurance <<setw(10)<<worker[j].fund<<endl;
ofile.close();//关闭文件
}
void Tmanage::Query()
{
TWorker_salary worker[100];//用于存放从文件中读取到的记录
ifstream ifile("D:\\worker.txt",ios::in);
if(!ifile)//判断文件是否能打开
{
cout<<"文件夹不能打开!"<<endl;
abort();
}
cout<<setw(10)<<"职工ID号"<<setw(10)<<"职工姓名"<<setw(10)<<"基本工资"<<setw(10)<<"职务工资"<<setw(10)<<"所得津贴"<<setw(10)<<"医疗保险"<<setw(10)<<"公积金"<<endl;
for(int i=0;i<total;i++)//将文件中的内容提取出来
{
ifile>>worker[i].number>>worker[i].name>>worker[i].BSalary>>worker[i].ZSalary>>worker[i].bonus>>worker[i].Medical_insurance>>worker[i].fund;
cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
}
ifile.close();
cout<<"-----------------[1] 按姓名查询-------------------"<<endl;
cout<<"-----------------[2] 按工号查询-------------------"<<endl;
cout<<"----请选择查询的方式(输入对应方式的序号1或2)----:";
int k;
cin>>k;
char na[18],nu[18];
if(k==1)//按姓名查询
{
int u[18];//考虑重名
int n=1;
while(n)
{
cout<<"请输入要查询的职工的姓名:";
cin>>na;
int j=0;
for(int i=0;i<total;i++)
if(strcmp(na,worker[i].name)==0)//重名处理
{
u[j]=i;
j++;
}
if(j==0)
{
cout<<"没有你要查询的职工名!"<<endl;
cout<<"是否继续查询,继续请按1 / 退出按0:";
cin>>n;
}
else
{
cout<<"查找结果如下:";
cout<<setw(10)<<"职工ID号"<<setw(10)<<"职工姓名"<<setw(10)<<"基本工资"<<setw(10)<<"职务工资"<<setw(10)<<"所得津贴"<<setw(10)<<"医疗保险"<<setw(10)<<"公积金"<<endl;
for(int b=0;b<j;b++)
cout<<setw(10)<<worker[u[b]].number<<setw(10)<<worker[u[b]].name<<setw(10)<<worker[u[b]].BSalary<<setw(10)<<worker[u[b]].ZSalary<<setw(10)<<worker[u[b]].bonus<<setw(10)<<worker[u[b]].Medical_insurance <<setw(10)<<worker[u[b]].fund<<endl;
cout<<"是否继续查询,继续请按1 / 退出按0:";
cin>>n;
}
}
}
else//按职工号查询
{
int n=1;
while(n)
{
cout<<"请输入要查询的职工的职工号:";
cin>>nu;
bool flag=false;
for(int i=0;i<total;i++)
if(strcmp(nu,worker[i].number)==0)
{
cout<<"查找结果如下:";
cout<<setw(10)<<"职工ID号"<<setw(10)<<"职工姓名"<<setw(10)<<"基本工资"<<setw(10)<<"职务工资"<<setw(10)<<"所得津贴"<<setw(10)<<"医疗保险"<<setw(10)<<"公积金"<<endl;
cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
flag=true;
}
if(!flag)
{
cout<<"查询不到该职工信息,继续请按1 / 退出按0";
cin>>n;
}
else
{
cout<<"是否继续查询,继续请按1 / 退出按0:";
cin>>n;
}
}
}
}
void Tmanage::T_J()//统计职工在一定区域内的百分比
{
TWorker_salary worker[100];
ifstream ifile("D:\\worker.txt",ios::in);
if(!ifile)//判断文件是否能打开
{
cout<<"文件夹不能打开!"<<endl;
abort();
}
cout<<setw(10)<<"职工ID号"<<setw(10)<<"职工姓名"<<setw(10)<<"基本工资"<<setw(10)<<"职务工资"<<setw(10)<<"所得津贴"<<setw(10)<<"医疗保险"<<setw(10)<<"公积金"<<endl;
for(int i=0;i<total;i++)//将文件中的内容提取出来
{
ifile>>worker[i].number>>worker[i].name>>worker[i].BSalary>>worker[i].ZSalary>>worker[i].bonus>>worker[i].Medical_insurance>>worker[i].fund;
cout<<setw(10)<<worker[i].number<<setw(10)<<worker[i].name<<setw(10)<<worker[i].BSalary<<setw(10)<<worker[i].ZSalary<<setw(10)<<worker[i].bonus<<setw(10)<<worker[i].Medical_insurance <<setw(10)<<worker[i].fund<<endl;
}
ifile.close();
int k,p;
float totale[total];
for(int i=0;i<total;i++)//统计收益总和
{
totale[i]=worker[i].BSalary+worker[i].ZSalary+worker[i].bonus;
}
int n=1;
while(n)
{
cout<<"-----------------[1] 前三项工资之和在3000元以上的百分比-------------------"<<endl;
cout<<"-----------------[2] 前三项工资之和在2000元以下的百分比-------------------"<<endl;
cout<<"-----------------[3] 前三项工资之和在2000元到3000元之间的百分比-----------"<<endl;
cout<<"-----------------请选择统计的方式(输入对应方式的序号1,2,3):----------";
cin>>k;
if(k==1)
{
p=0; //计数器每次计数归零
for(int i=0;i<total;i++)
if(totale[i]>=3000) p++;
cout<<"前三项工资之和在3000元以上的百分比是:"<<(p/total)*100<<"%";
cout<<"是否继续查询,继续请按1 / 退出按0:";
cin>>n;
}
if(k==2)
{
p=0;
for(int i=0;i<total;i++)
if(totale[i]<2000) p++;
cout<<"前三项工资之和在2000元以下的百分比是:"<<(p/total)*100<<"%";
cout<<"是否继续查询,继续请按1 / 退出按0:";
cin>>n;
}
if(k==3)
{
p=0;
for(int i=0;i<total;i++)
if(totale[i]<3000 && totale[i]>2000) p++;
cout<<"前三项工资之和在2000元到3000元之间的百分比是:"<<(p/total)*100<<"%";
cout<<"是否继续查询,继续请按1 / 退出按0:";
cin>>n;
}
}
}
主函数的实现部分:
#include<iostream>
#include<fstream>
#include<string.h>
#include<stdlib.h>
#include"Tworker.h"
using namespace std;
void menu();//主界面
int main()
{
Tmanage aa;
int a;
while(1)
{
menu();
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<"------------------------请输入序号选择对应功能-------------------------"<<endl;
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
cout<<"请输入菜单选项:";
cin>>a;
switch(a)
{
case 1:system("cls");aa.Input();break;
case 2:system("cls");aa.Print();break;
case 3:system("cls");aa.Delete();break;
case 4:system("cls");aa.Query();break;
case 5:system("cls");aa.Update();break;
case 6:system("cls");aa.T_J();break;
case 0:system("cls");printf("*****谢谢使用*****");exit(0);
}
system("pause");
system("cls");
}
return 0;
}
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<<"** 0. 退出系统 **"<<endl;
cout<<"***********************************************************************"<<endl;
}