职工工资管理系统设计报告及代码

职工工资管理系统
功能设计要求

  1. 输入职工信息:编号、姓名、性别、职务、职称、基本工资、职务工资、岗位津贴、医疗保险、公积金。
  2. 查询记录:根据用户提供的编号或者根据职工姓名显示该职工的各项信息。
  3. 修改记录:可以对数据文件的任意记录的数据进行修改并在修改前后对记录内容进行显示。
    4.删除记录:根据编号显示要删除的职工信息,询问是否删除,如果回答是则删除数据文件中的该记录
  4. 统计:
    (A)计算各项工资平均工资及总工资平均工资;
    (B)统计女职工和男职工的平均工资;
    (C)统计不同职务的平均工资;
    (D)统计不同职称的平均工资;
    (E)统计不同工资段,职工工资前三项之和在3000元以下、30005000元、500010000元、10000元以上职工人数及占总职工人数的百分比;
    要求:使用二进制文件方式存储数据,系统以菜单方式工作,使用链表对信息进行管理和维护

部分截图:

img

img

代码如下:

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

有没有一种可能,这位qfl_sdu同胞在说废话