部分截图:
代码如下:
#include <iostream>
#include <cstring>
#include <iomanip>
#include <fstream>
using namespace std;
//定义职工结构体
typedef struct _employee
{
char id[10]; //编号
char name[20];//姓名
char sex; //性别
char zw[20];//职务
char zc[20]; //职称
float gzBase; //基本工资
float gzZw; //职务工资
float jtGw; //岗位津贴
float ylbx; //医疗保险
float gjj; //公积金
}Employee;
//链表节点
typedef struct _node
{
Employee emp;
struct _node* next;
}LinkNode,*LinkList;
//读取文件
void readFile(LinkList head)
{
LinkList p,t;
ifstream is;
char buf[200]={0};
is.open("data.txt",ios::in | ios::binary);
if(!is.is_open())
{
cout <<"文件打开失败!"<<endl;
return;
}
//移动到链表尾部
p = head;
while(p->next)
p = p->next;
//开始读文件
while(!is.eof())
{
t = new LinkNode;
t->next = 0;
t->emp.id[0] = 0;
is.read(buf,sizeof(Employee));
memcpy(&(t->emp),buf,sizeof(Employee));
//判断是否读取成功
if(strlen(t->emp.id) != 0)
{
p->next = t;//假如链表
p = t;
}else
{
delete t;
}
}
is.close();
}
//写文件
void write2File(LinkList head)
{
LinkList p = head->next;
ofstream os;
Employee e;
char buf[200]={0};
os.open("data.txt",ios::out | ios::binary);
while(p)
{
e = p->emp;
memcpy(buf,&e,sizeof(Employee));
os.write(buf,sizeof(Employee));
p = p->next;
}
os.close();
}
//录入信息
void input(LinkList head)
{
system("cls");
LinkList p,t;
//移动到链表尾,以便将新节点插入链表尾
p = head;
while(p->next)
p = p->next;
//新建节点
t = new LinkNode;
cout <<"请输入员工编号:";
cin >> t->emp.id;
cout << "请输入员工姓名:";
cin >> t->emp.name;
cout <<"请输入员工性别(M/F):";
cin.get(); //吸收回车符
cin >> t->emp.sex;
cout << "请输入员工职务:";
cin >> t->emp.zw;
cout <<"请输入员工职称:";
cin >> t->emp.zc;
cout <<"请输入员工基本工资:";
cin >> t->emp.gzBase;
cout <<"请输入员工职务工资:";
cin >> t->emp.gzZw;
cout <<"请输入员工岗位津贴:";
cin >> t->emp.jtGw;
cout <<"请输入员工医疗保险:";
cin >> t->emp.ylbx;
cout <<"请输入员工公积金:";
cin >> t->emp.gjj;
t->next = 0;
p->next = t;
//更新文件数据
write2File(head);
cout <<"添加成功!"<<endl;
system("pause");
}
//显示单条员工信息
void showInfo(LinkList p)
{
cout << p->emp.id <<" " << p->emp.name <<" "<<p->emp.sex<<" "<<p->emp.zw <<" "<< p->emp.zc<<" ";
cout << fixed << setprecision(2) << p->emp.gzBase<<" "<<p->emp.gzZw<<" " << p->emp.jtGw <<" " << p->emp.ylbx<<" "<<p->emp.gjj<<endl;
}
//查询
void search(LinkList head)
{
char tmp[20];
int flag = 0;
LinkList p = head->next;
system("cls");
cout <<"请输入需要查找的员工编号或者姓名:";
cin >>tmp;
while(p)
{
if(strcmp(p->emp.id,tmp)==0 || strcmp(p->emp.name,tmp)==0)
{
flag = 1;
showInfo(p);
}
p = p->next;
}
if(flag == 0)
cout <<"查无此人!"<<endl;
system("pause");
}
//修改
void changeInfo(LinkList head)
{
char id[20];
LinkList p= head->next;
system("cls");
cout <<"请输入需要修改信息的职工编号:";
cin >> id;
while(p)
{
if(strcmp(p->emp.id,id)==0)
{
cout <<"修改前的职工信息:"<<endl;
showInfo(p);
//修改信息
cout <<"请输入员工编号:";
cin >> p->emp.id;
cout << "请输入员工姓名:";
cin >> p->emp.name;
cout <<"请输入员工性别(M/F):";
cin.get(); //吸收回车符
cin >> p->emp.sex;
cout << "请输入员工职务:";
cin >> p->emp.zw;
cout <<"请输入员工职称:";
cin >> p->emp.zc;
cout <<"请输入员工基本工资:";
cin >> p->emp.gzBase;
cout <<"请输入员工职务工资:";
cin >> p->emp.gzZw;
cout <<"请输入员工岗位津贴:";
cin >> p->emp.jtGw;
cout <<"请输入员工医疗保险:";
cin >> p->emp.ylbx;
cout <<"请输入员工公积金:";
cin >> p->emp.gjj;
cout << "修改后的职工信息:"<<endl;
showInfo(p);
//更新文件数据
write2File(head);
break;
}else
p = p->next;
}
if(p==NULL)
cout <<"查无此人!"<<endl;
system("pause");
}
//删除记录
void deleteInfo(LinkList head)
{
char id[20];
LinkList pre,p;
int op;
system("cls");
cout <<"请输入要删除的职工编号:";
cin >> id;
pre = head;
p = pre->next;
while(p)
{
if(strcmp(p->emp.id,id)==0)
{
cout <<"是否要删除(1.删除 2.取消删除)? ";
cin >> op;
if(op == 1)
{
pre->next = p->next;
delete p;
//更新文件
write2File(head);
cout <<"删除成功!"<<endl;
break;
}
}else
{
pre = p;
p = p->next;
}
}
if(p==0)
cout <<"查无此人!"<<endl;
system("pause");
}
//4.a 统计各项工资平均工资及总工资平均工资
void TongjiA(LinkList head)
{
LinkList p = head->next;
float jbgz = 0;
float zwgz = 0;
float gwjt = 0;
float total = 0;
int nmb = 0;
system("cls");
while(p)
{
nmb++; //人数
jbgz += p->emp.gzBase;
zwgz += p->emp.gzZw;
gwjt += p->emp.jtGw;
total += p->emp.gzBase + p->emp.gzZw + p->emp.jtGw - p->emp.ylbx - p->emp.gjj; //总工资中扣除医疗保险和公积金
p = p->next;
}
cout <<"平均基本工资:"<< fixed<<setprecision(2)<< jbgz/nmb<<endl;
cout <<"平均职务工资:" << fixed << setprecision(2)<<zwgz/nmb<<endl;
cout <<"平均岗位津贴:" << fixed << setprecision(2)<<gwjt/nmb<<endl;
cout <<"平均总工资:" << fixed<<setprecision(2)<<total/nmb<<endl;
system("pause");
}
//4.b
void TongjiB(LinkList head)
{
float man=0;
float woman = 0;
int nmbman=0,nmbwoman=0;
LinkList p=head->next;
system("cls");
while(p)
{
if(p->emp.sex == 'M')
{
nmbman++;
man += p->emp.gzBase + p->emp.gzZw + p->emp.jtGw - p->emp.ylbx - p->emp.gjj;
}
else if(p->emp.sex == 'F')
{
nmbwoman++;
woman += p->emp.gzBase + p->emp.gzZw + p->emp.jtGw - p->emp.ylbx - p->emp.gjj;
}
p = p->next;
}
cout <<"女职工的平均工资:"<< fixed<<setprecision(2) << woman/nmbwoman << endl;
cout <<"男职工的平均工资:" << fixed << setprecision(2) << man/nmbman<<endl;
system("pause");
}
//4.c
void TongjiC(LinkList head)
{
char zw[100][20]; //所有职务
float gz[100]; //每个职务的总工资
int psn[100];//每个职务的人数
int nmb=0; //职务个数
int i;
LinkList p = head->next;
system("cls");
while(p)
{
//查找职务是否已经存在
for(i=0;i<nmb;i++)
{
if(strcmp(p->emp.zw,zw[i])==0)
break;
}
if(i<nmb)
{
gz[i] += p->emp.gzBase + p->emp.gzZw + p->emp.jtGw - p->emp.ylbx - p->emp.gjj;
psn[i] += 1;
}else
{
strcpy(zw[nmb],p->emp.zw);
gz[nmb] = p->emp.gzBase + p->emp.gzZw + p->emp.jtGw - p->emp.ylbx - p->emp.gjj;
psn[nmb] = 1;
nmb++;
}
p = p->next;
}
//输出所有情况
for(i=0;i<nmb;i++)
cout <<"职务为 " << zw[i] <<"的平均工资:"<< gz[i]/psn[i]<<endl;
system("pause");
}
//4.D
void TongjiD(LinkList head)
{
char zc[100][20]; //所有职称
float gz[100]; //每个职称的总工资
int psn[100];//每个职称的人数
int nmb=0; //职称个数
int i;
LinkList p = head->next;
system("cls");
while(p)
{
//查找职务是否已经存在
for(i=0;i<nmb;i++)
{
if(strcmp(p->emp.zw,zc[i])==0)
break;
}
if(i<nmb)
{
gz[i] += p->emp.gzBase + p->emp.gzZw + p->emp.jtGw - p->emp.ylbx - p->emp.gjj;
psn[i] += 1;
}else
{
strcpy(zc[nmb],p->emp.zw);
gz[nmb] = p->emp.gzBase + p->emp.gzZw + p->emp.jtGw - p->emp.ylbx - p->emp.gjj;
psn[nmb] = 1;
nmb++;
}
p = p->next;
}
//输出所有情况
for(i=0;i<nmb;i++)
cout <<"职称为 " << zc[i] <<"的平均工资:"<< gz[i]/psn[i]<<endl;
system("pause");
}
//4.E
void TongjiE(LinkList head)
{
int a=0,b=0,c=0,d=0,total=0;//跟阶段的人数
LinkList p = head->next;
system("cls");
while(p)
{
float sum = p->emp.gzBase + p->emp.gzZw + p->emp.jtGw;
total++;
if(sum < 3000)
a++;
else if( sum < 5000)
b++;
else if(sum <1000)
c++;
else
d++;
p = p->next;
}
cout <<"3000元以下人数:" << a<<",比例:"<< fixed << setprecision(2) << ((float)a)/total<<endl;
cout <<"3000-5000元人数:" << b<<",比例:"<< fixed << setprecision(2) << ((float)b)/total<<endl;
cout <<"5000-10000元人数:" << c<<",比例:"<< fixed << setprecision(2) << ((float)c)/total<<endl;
cout <<"10000元以上人数:" << d<<",比例:"<< fixed << setprecision(2) << ((float)d)/total<<endl;
system("pause");
}
//5.统计
void Tongji(LinkList head)
{
int op;
while(1)
{
system("cls");
cout <<"1.计算各项工资平均工资及总工资平均工资"<<endl;
cout <<"2.统计女职工和男职工的平均工资"<<endl;
cout <<"3.统计不同职务的平均工资"<<endl;
cout <<"4.统计不同职称的平均工资"<<endl;
cout <<"5.统计不同工资段人数及占比"<<endl;
cout <<"0.返回上一级菜单"<<endl;
cout <<"请选择:";
cin >> op;
switch(op)
{
case 0:return ;
case 1:TongjiA(head);break;
case 2:TongjiB(head);break;
case 3:TongjiC(head);break;
case 4:TongjiD(head);break;
case 5:TongjiE(head);break;
}
}
}
int main()
{
int op;
//初始化信息
LinkList head = new LinkNode;
head->next = 0;
readFile(head);
while(1)
{
system("cls");
cout <<"-------------职工工资管理系统------------"<<endl;
cout <<" 1.录入信息"<<endl;
cout <<" 2.查询信息"<<endl;
cout <<" 3.修改信息"<<endl;
cout <<" 4.删除信息"<<endl;
cout <<" 5.统计信息"<<endl;
cout <<" 0.退出系统"<< endl;
cout <<"请选择:"<<endl;
cin >> op;
switch(op)
{
case 0:return 0;
case 1:input(head);break;
case 2:search(head);break;
case 3:changeInfo(head);break;
case 4:deleteInfo(head);break;
case 5:Tongji(head);break;
}
}
}