C++实现职工工资管理系统

 更新时间:2022年03月01日 09:47:27   作者:玛珈山大萌新  
这篇文章主要为大家详细介绍了C++实现简单的职工工资管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现职工工资管理系统的具体代码,供大家参考,具体内容如下

main.cpp

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
#include <windows.h>
#include "data.h"
#include "user.h"
#include "fuction1-9.h"
#include "fuction10.h"
#include "menu.h"
using namespace std;
int main()
{
    system("color 3f");
    if (login() == false)
        return 0;
    load_inf();
    while (show_menu());
    save_inf();
 
    return 0;
}

data.h

#pragma once
const int maxn = 100;
using namespace std;
struct department
{
    int code;
    int number;
    string department_name;
    void show_inf() { printf("%50s部门号:%-6d部门名称:%-12s部门人数:%-6d\n", "", code, department_name.c_str(), number); }
};
map<int, department> dep;//部门表的映射
struct employee
{
    int code;
    string name;
    string gender;
    int working_age;
    int department_code;//部门编码
    void show_inf() { printf("%50s编号:%-6d姓名:%-12s性别:%-9s工龄(年):%-6d部门:%-12s\n", "", code, name.c_str(), gender.c_str(), working_age, dep[department_code].department_name.c_str()); }
};
map<int, employee> emp;///存储数据的容器
struct wage
{
    int code;
    int base_wage;//基本工资
    int overtime;//加班工资
    int bonus;//津贴
    int gross_pay;//应发工资
    int withholding;//代扣款
    int payment; //实发工资
    void show_inf() { printf("%30s员工号:%-6d员工姓名:%-12s基本工资:%-6d\t加班工资:%-6d\t津贴:%-6d\t应发工资:%-6d\t代扣款:%6d\t实发工资:%6d\n", "", code, emp[code].name.c_str(), base_wage, overtime, bonus, gross_pay, withholding, payment); }
    void calculate() { gross_pay = base_wage + overtime + bonus, payment = gross_pay - withholding; }
};
map<int, wage> wag;

fuciton1-9.h

#pragma once
using namespace std;
void load_inf()
{
    FILE *p;
    char s[maxn];
 
    system("cls");
    if ((p = fopen("employee.txt", "r")) == NULL)
    {
        printf("%70s数据异常,无法访问!\n", "");
        system("pause");
        exit(0);
    }
    while (fgets(s, 100, p))
    {
        int code;
        char name[maxn];
        char gender[maxn];
        int working_age;
        int department_code;
 
        sscanf(s, "%d %s %s %d %d", &code, name, gender, &working_age, &department_code);
        emp[code] = (employee{ code, name, gender, working_age, department_code });
    }
    printf("%70s", "");
    for (int i = 0; i < 5; i++) { cout << "."; Sleep(200); }
    printf("员工信息导入成功!\n");
    cout << endl;
    fclose(p);
    if ((p = fopen("department.txt", "r")) == NULL)
    {
        printf("%70s数据异常,无法访问!\n", "");
        system("pause");
        exit(0);
    }
    while (fgets(s, 100, p))
    {
        int code;
        int number;
        char department_name[maxn];
 
        sscanf(s, "%d %d %s", &code, &number, department_name);
        dep[code] = { code, number, department_name };
    }
    printf("%70s", " ");
    for (int i = 0; i < 5; i++) { cout << "."; Sleep(200); }
    printf("部门信息导入成功!\n");
    cout << endl;
    fclose(p);
    if ((p = fopen("wage.txt", "r")) == NULL)
    {
        printf("%70s数据异常,无法访问!", "");
        system("pause");
        exit(0);
    }
    while (fgets(s, 100, p))
    {
        int code;//员工号
        int base_wage;//基本工资
        int overtime;//加班工资
        int bonus;//津贴
        int gross_pay;
        int withholding;//代扣款
        int payment;
 
        sscanf(s, "%d %d %d %d %d %d %d", &code, &base_wage, &overtime, &bonus, &gross_pay, &withholding, &payment);
        wag[code] = (wage{ code, base_wage, overtime, bonus, gross_pay, withholding, payment });
    }
    printf("%70s", " ");
    for (int i = 0; i < 5; i++) { cout << "."; Sleep(200); }
    printf("工资信息导入成功!\n");
    cout << endl;
    fclose(p);
    return;
}
void save_inf()
{
    FILE *p = fopen("employee.txt", "w");
    char inf[maxn];
 
    for (auto it = emp.begin(); it != emp.end(); it++)
    {
        sprintf(inf, "%d %s %s %d %d\n", it->second.code, it->second.name.c_str(), it->second.gender.c_str(), it->second.working_age, it->second.department_code);
        fputs(inf, p);
    }
    printf("%70s", " ");
    for (int i = 0; i < 5; i++) { cout << "."; Sleep(200); }
    printf("员工信息保存成功!\n");
    fclose(p);
    p = fopen("department.txt", "w");
    for (auto it = dep.begin(); it != dep.end(); it++)
    {
        sprintf(inf, "%d %d %s\n", it->second.code, it->second.number, it->second.department_name.c_str());
        fputs(inf, p);
    }
    printf("%70s", "");
    for (int i = 0; i < 5; i++) { cout << "."; Sleep(200); }
    printf("部门信息保存成功!\n");
    fclose(p);
    p = fopen("wage.txt", "w");
    for (auto it = wag.begin(); it != wag.end(); it++)
    {
        sprintf(inf, "%d %d %d %d %d %d %d\n", it->second.code, it->second.base_wage, it->second.overtime, it->second.bonus, it->second.gross_pay, it->second.withholding, it->second.payment);
        fputs(inf, p);
    }
    printf("%70s", "");
    for (int i = 0; i < 5; i++) { cout << "."; Sleep(200); }
    printf("工资信息保存成功!\n");
    fclose(p);
    return;
}
/以下为部门表的操作
void add_dep()
{
    printf("%70s请输入要添加的部门号:", "");
    int code; cin >> code;
    string department_name;
 
    if (!dep.count(code))
    {
        printf("%70s请输入部门名称:", "");
        while (1)
        {
            int flag = 0;
            cin >> department_name;
            for (auto it = dep.begin(); it != dep.end(); it++)
                if (it->second.department_name == department_name)
                {
                    printf("%70s该部门已存在, 请重新输入!\n", "");
                    flag = 1;
                }
            if (!flag) break;
        }
        dep[code] = { code, 0, department_name };
        printf("%70s部门添加成功!该部门信息如下:\n", "");
        dep[code].show_inf();
    }
    else
        printf("%70s该部门已存在!\n", "");
    return;
}
void change_dep()
{
    printf("%70s请输入要修改的部门编号:", "");
    int code; cin >> code;
 
    if (!dep.count(code))
        printf("%70s该部门不存在!\n", "");
    else
    {
        printf("%70s该部门当前信息如下:\n", "");
        dep[code].show_inf();
        printf("%70s请输入部门的新名字:", "");
        while (1)
        {
            string name; cin >> name;
            int flag = 0;
 
            for (auto it = dep.begin(); it != dep.end(); it++)
                if (it->second.department_name == name)
                {
                    flag = 1;
                    break;
                }
            if (flag)
                printf("%70s部门名字重复!请重新输入\n", "");
            else
            {
                dep[code].department_name = name;
                printf("%70s修改成功!\n", "");
                printf("%70s修改后的部门信息如下:\n", "");
                dep[code].show_inf();
                break;
            }
        }
    }
    return;
}
void delete_dep()
{
    printf("%70s请输入要删除的部门编号:", "");
    int code; cin >> code;
    if (!dep.count(code))
        printf("%70s该部门不存在,无法删除!\n", "");
    else if (!dep[code].number)//如果该部门没有人,则可删除
    {
        for (auto it = dep.begin(); it != dep.end(); it++)
            if (it->first == code)
            {
                printf("%70s您删除了%s\n", "", it->second.department_name.c_str());
                dep.erase(it);
                break;
            }
    }
    else
        printf("%70s该部门有员工,不可删除!\n", "");
    return;
}
/以下为员工表的操作
void add_emp()
{
    printf("%70s请输入要添加的员工号:", "");
    int code; cin >> code;
    if (!emp.count(code))
    {
        emp[code].code = code;
        printf("%70s请输入员工的姓名:", "");cin >> emp[code].name;
        printf("%70s请输入员工的性别:", "");cin >> emp[code].gender;
        printf("%70s请输入员工的工龄:", "");cin >> emp[code].working_age;
        printf("%70s请输入员工的部门号:", "");
        int department_code;
        while (cin >> department_code && !dep.count(department_code))
            printf("%70s该部门不存在,请重新输入:", "");
        emp[code].department_code = department_code;
        dep[department_code].number++;
        printf("%70s员工信息添加成功!员工信息如下:\n", "");
        emp[code].show_inf();
    }
    else
        printf("%70s该员工号已存在\n", "");
    return;
}
void change_emp()
{
    int code;
 
    printf("%70s请输入要修改的员工号:", "");
    while (cin >> code && !emp.count(code))
        printf("%70s该员工不存在!请重新输入:", "");
    printf("%70s该员工当前信息如下:\n", "");
    emp[code].show_inf();
    printf("%70s请输入修改后的工龄:", "");cin >> emp[code].working_age;
    printf("%70s请输入修改后的部门编码:", "");
    dep[emp[code].department_code].number--;///原部门人数减一
    cin >> emp[code].department_code;
    dep[emp[code].department_code].number++;//现部门人数加一
    printf("%70s修改成功!修改之后的信息如下:\n", "");
    emp[code].show_inf();
    return;
}
void delete_emp()
{
    printf("%70s请输入要删除的员工号:", "");
    int code; cin >> code;
    if (!emp.count(code))
        printf("%70s该员工不存在!无法删除\n", "");
    else
    {
        dep[emp[code].department_code].number--;//原部门人数减一
        for (auto it = emp.begin(); it != emp.end(); it++)
            if (it->first == code)
            {
                printf("%70s您删除的员工信息如下:\n", "");
                emp[it->second.code].show_inf();
                emp.erase(it);
                break;
            }
        for (auto it = wag.begin(); it != wag.end(); it++)
            if (it->first == code)
            {
                wag.erase(it);
                break;
            }
    }
    return;
}
void add_wag()
{
    printf("%70s请输入录入工资的员工编号:", "");
    int code; cin >> code;
 
    if (!emp.count(code))
        printf("%70s该员工不存在!\n", "");
    else if (wag.count(code))
        printf("%70s该员工信息已录入!\n", "");
    else
    {
        wag[code].code = code;
        printf("%70s请输入员工的基本工资:", ""); cin >> wag[code].base_wage;
        printf("%70s请输入员工的加班工资:", ""); cin >> wag[code].overtime;
        printf("%70s请输入员工的津贴:", "");cin >> wag[code].bonus;
        printf("%70s请输入员工的代扣款:", ""); cin >> wag[code].withholding;
        printf("%70s员工工资信息添加成功!\n", "");
        printf("%70s工资信息如下:\n", "");
        wag[code].calculate();
        wag[code].show_inf();
    }
    return;
}
void change_wag()
{
    int code;
 
    printf("%70s要修改者的编号:", "");
    while (cin >> code && !wag.count(code))
        printf("%70s该员工不存在!请重新输入\n", "");
    printf("%70s该员工当前的工资信息如下\n", "");
    wag[code].show_inf();
    printf("%70s请输入基本工资:", ""); cin >> wag[code].base_wage;
    printf("%70s请输入加班工资:", "");cin >> wag[code].overtime;
    printf("%70s请输入津贴:", ""); cin >> wag[code].bonus;
    printf("%70s请输入代扣款:", ""); cin >> wag[code].withholding;
    wag[code].calculate();
    printf("%70s修改成功!修改之后的工资信息如下\n", "");
    wag[code].show_inf();
    return;
}
void delete_wag()
{
    printf("%70s请输入要删除工资信息的员工编号:", "");
    int code; cin >> code;
    if (!wag.count(code))
        printf("%70s不存在该员工的工资信息\n", "");
    else
    {
        for (auto it = wag.begin(); it != wag.end(); it++)
            if (it->first == code)
            {
                wag.erase(it);
                printf("%70s删除成功!\n", "");
                break;
            }
    }
    return;
}

fuction10.h

#pragma once
bool comp1(const int &a, const int &b)//升序
{
    return wag[a].payment < wag[b].payment;
}
bool comp2(const int &a, const int &b)
{
    return wag[a].payment > wag[b].payment;
}
 
bool search_inf()
{
    system("cls");
    printf("%70s0.返回\n", "");
    printf("%70s1.查询全部员工的工资\n", "");
    printf("%70s2.按员工号查询员工工资\n", "");
    printf("%70s3.按部门查询员工工资\n", "");
    printf("%70s4.按指定实发工资区间查询员工工资\n", "");
    printf("%70s5.按员工姓名查询员工工资\n", "");
    printf("%70s6.查询全部部门信息\n", "");
    printf("%70s7.按编号查询单个员工的基本信息\n", "");
    printf("%70s8.按姓名查询单个员工的基本信息\n", "");
    printf("%70s9.显示所有员工的基本信息\n", "");
    printf("%70s请输入操作编号[0-9]:", "");
    int ope;
    int code;
    string name;
    int dir;
    int flag = 0;
    long long sum = 0;
    vector<int> temp; //存储满足查询要求的人员编号
 
    while (cin >> ope && !(ope >= 0 && ope <= 9))
        printf("%70s输入非法,请重新输入:", "");
    if (!ope)
        return false;
    switch (ope)
    {
    case 1:
        for (auto it = wag.begin(); it != wag.end(); it++)
        {
            temp.push_back(it->first);
            sum += it->second.payment;
        }
        printf("%70s1.按实发工资升序\n", "");
        printf("%70s2.按实发工资降序\n", "");
        printf("%70s请输入操作类型:", "");
        while (cin >> dir && dir != 1 && dir != 2)
            printf("%70s输入非法,请重新输入!\n", "");
        if (dir == 1)
            sort(temp.begin(), temp.end(), comp1);
        else
            sort(temp.begin(), temp.end(), comp2);
        for (int i = 0; i < (int)temp.size(); i++)
            wag[temp[i]].show_inf();
        printf("%144s合计: %10lld\n", "", sum);
        break;
    case 2:
        printf("%70s请输入要查询的员工号:", "");
        cin >> code;
        if (!emp.count(code))
            printf("%70s该员工不存在!\n", "");
        else if (!wag.count(code))
            printf("%70s该员工的工资信息未录入!\n", "");
        else
            wag[code].show_inf();
        break;
    case 3:
        printf("%70s请输入所要查询员工的部门:", "");
        cin >> code;
        if (!dep.count(code))
            printf("%70s该部门不存在!\n", "");
        else
        {
            for (auto it = wag.begin(); it != wag.end(); it++)
                if (emp[it->first].department_code == code)
                {
                    temp.push_back(it->first);
                    sum += it->second.payment;
                }
            printf("%70s1.按实发工资升序\n", "");
            printf("%70s2.按实发工资降序\n", "");
            printf("%70s请输入操作类型:", "");
            while (cin >> dir && dir != 1 && dir != 2)
                printf("%70s输入非法,请重新输入!\n", "");
            if (dir == 1)
                sort(temp.begin(), temp.end(), comp1);
            else
                sort(temp.begin(), temp.end(), comp2);
            for (int i = 0; i < (int)temp.size(); i++)
                wag[temp[i]].show_inf();
            printf("%144s合计: %10lld\n", "", sum);
        }
        break;
    case 4:
        int up, down;
 
        printf("%70s请输入实发工资区间的上限:", "");
        cin >> up;
        printf("%70s请输入实发工资区间的下限:", "");
        cin >> down;
        if (up < down)
            printf("%70s非法的输入!\n", "");
        else
        {
            for (auto it = wag.begin(); it != wag.end(); it++)
                if (it->second.payment >= down && it->second.payment <= up)
                {
                    temp.push_back(it->first);
                    sum += it->second.payment;
                }
            if (!temp.size())
            {
                printf("%70s查询不到符合条件的员工!\n", "");
                cout << "" << endl;
                break;
            }
            printf("%70s1.按实发工资升序\n", "");
            printf("%70s2.按实发工资降序\n", "");
            printf("%70s请输入操作类型:", "");
            int dir; cin >> dir;
            if (dir == 1)
                sort(temp.begin(), temp.end(), comp1);
            else
                sort(temp.begin(), temp.end(), comp2);
            for (int i = 0; i < (int)temp.size(); i++)
                wag[temp[i]].show_inf();
            printf("%144s合计: %10lld\n", "", sum);
        }
        break;
    case 5:
        printf("%70s请输入员工姓名:", "");
        cin >> name;
        for (auto it = emp.begin(); it != emp.end(); it++)
            if (it->second.name == name)
            {
                wag[it->first].show_inf();
                flag = 1;
            }
        if (!flag)
            printf("%70s查询不到此人!\n", "");
        break;/这个不需要排序,考虑到会有重名
    case 6:
        for (auto it = dep.begin(); it != dep.end(); it++)
            dep[it->first].show_inf();
        break;
    case 7:
        printf("%70s请输入员工编号:", "");
        cin >> code;
        
        if (!emp.count(code))
            printf("%70s该员工不存在!\n", "");
        else
            emp[code].show_inf();
        break;
    case 8:
        printf("%70s请输入员工姓名:", "");
        cin >> name;
 
        for(auto it = emp.begin(); it != emp.end(); it++)
            if (it->second.name == name)
            {
                flag = 1;
                emp[it->second.code].show_inf();
            }
        if (!flag)
            printf("%70s查询不到此人!\n", "");
        break;
    case 9:
        for (auto it = emp.begin(); it != emp.end(); it++)
            emp[it->second.code].show_inf();
        break;
    default:
        return false;
    }
    system("pause");
    return true;
}

menu.h

#pragma once
using namespace std;
bool show_menu()
{
    int dir;
    system("cls");//清屏
    printf("%70s*************************\n", "");
    printf("%70s欢迎进入职工工资管理系统!\n", "");
    printf("%70s*************************\n", "");
    printf("%70s0. 退出系统\n", "");
    printf("%70s1. 部门信息录入\n", "");
    printf("%70s2. 部门信息修改\n", "");
    printf("%70s3. 部门信息删除\n", "");
    printf("%70s4. 员工信息录入\n", "");
    printf("%70s5. 员工信息修改\n", "");
    printf("%70s6. 员工信息删除\n", "");
    printf("%70s7. 员工工资录入\n", "");
    printf("%70s8. 员工工资修改\n", "");
    printf("%70s9. 员工工资删除\n", "");
    printf("%70s10.信息查询\n", "");
    printf("%70s11.修改登录密码\n", "");
    printf("%70s请输入操作选项[0-11]:", "");
    while (cin >> dir && (dir < 0 || dir > 11)) printf("%70s非法指令,请重新输入:\n", "");
    switch (dir)
    {
    case 0:
        return false;
    case 1:
        system("cls");
        add_dep();
        system("pause");
        break;
    case 2:
        system("cls");
        change_dep();
        system("pause");
        break;
    case 3:
        system("cls");
        delete_dep();
        system("pause");
        break;
    case 4:
        system("cls");
        add_emp();
        system("pause");
        break;
    case 5:
        system("cls");
        change_emp();
        system("pause");
        break;
    case 6:
        system("cls");
        delete_emp();
        system("pause");
        break;
    case 7:
        system("cls");
        add_wag();
        system("pause");
        break;
    case 8:
        system("cls");
        change_wag();
        system("pause");
        break;
    case 9:
        system("cls");
        delete_wag();
        system("pause");
        break;
    case 10:
        while (search_inf());
        break;
    case 11:
        system("cls");
        reset_passwd();
        system("pause");
        break;
    default:
        return false;
    }
    return true;
}

user.h

#pragma once
using namespace std;
bool login()
{
    int chance = 3;
    char temp[maxn];
    char passwd[maxn];
    FILE *p;
    if ((p = fopen("passwd.txt", "r")) == NULL)
    {
        printf("%80s数据异常,无法访问!\n", "");
        fclose(p);
        exit(0);
    }
    fgets(passwd, 100, p);
    //cout << passwd << endl;
    fclose(p);
    printf("%70s********************\n", "");
    printf("%70s欢迎使用工资管理系统!\n", "");
    printf("%70s********************\n", "");
    while (chance--)
    {
        printf("%70s请输入登录密码:", "");
        scanf("%s", temp);
        if (!strcmp(temp, passwd))
        {
            printf("%70s密码正确!\n", "");
            return true;
        }
        else printf("%70s密码错误!你还剩%d次机会!\n", "", chance);
        if (!chance) printf("%70s非法用户!\n", "");
    }
    return false;
}
 
void reset_passwd()
{
    char temp1[maxn], temp2[maxn];
    char passwd[maxn];
    FILE *p;
    printf("%70s请输入3-10位不含空格的密码:", "");
    while (scanf("%s", temp1) && (strlen(temp1) < 3 && strlen(temp1) > 10))
        printf("%70s密码非法,请重新输入\n", "");
    printf("%70s请再次输入修改密码:", "");
    scanf("%s", temp2);
    if (!strcmp(temp1, temp2))
    {
        p = fopen("passwd.txt", "w");
        fgets(passwd, 100, p);
        strcpy(passwd, temp1);
        fputs(passwd, p);
        fclose(p);
        printf("%70s修改成功!\n", "");
    }
    else printf("%70s修改失败!\n", "");
    return;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 一篇文章带你实现C语言中常用库函数的模拟

    一篇文章带你实现C语言中常用库函数的模拟

    这篇文章主要介绍了C语言中常用库函数的模拟,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C++ 中Vector常用基本操作

    C++ 中Vector常用基本操作

    标准库vector类型是C++中使用较多的一种类模板,本文给大家分享C++ 中Vector常用基本操作,感兴趣的朋友一起看看吧
    2017-10-10
  • C++面试题之数a、b的值互换(不使用中间变量)

    C++面试题之数a、b的值互换(不使用中间变量)

    这篇文章主要介绍了不使用中间变量,C++实现数a、b的值互相转换操作,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • .h和.cpp文件的区别(zt)详细介绍

    .h和.cpp文件的区别(zt)详细介绍

    特别是对源文件和头文件的概念,需要深入对它了解,本文将详细介绍,需要了解的朋友可以参考下
    2012-11-11
  • C++实现趣味扫雷游戏

    C++实现趣味扫雷游戏

    这篇文章主要为大家详细介绍了C++实现趣味扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++中string的模拟实现

    C++中string的模拟实现

    这篇文章主要为大家详细介绍了C++中string的模拟实现,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • C语言入门篇--变量[定义,初始化赋值,外部声明]

    C语言入门篇--变量[定义,初始化赋值,外部声明]

    本篇文章是c语言基础篇,本文对初识c语言的变量、变量的定义、初始化与赋值、变量的分类、含义、外部声明做了简要的描述,帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • Matlab实现黑洞优化算法的示例代码

    Matlab实现黑洞优化算法的示例代码

    根据黑洞现象原理首次提出BH 算法,它在传统PSO基础上引入了新的机制,有效地提高了收敛速度并防止了陷入局部极值的情况发生.本文将用Matlab实现这一算法,需要的可以参考一下
    2022-06-06
  • OpenCV利用霍夫变换进行直线检测

    OpenCV利用霍夫变换进行直线检测

    这篇文章主要为大家详细介绍了OpenCV利用霍夫变换进行直线检测,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 深入解析C语言中的内存分配相关问题

    深入解析C语言中的内存分配相关问题

    这篇文章主要深入地介绍了C语言中的内存分配,C语言编程中的内存泄漏问题一直以来都是C编程中的一大棘手问题,本文从malloc和指针等方面对C内存进行了深层次讲解,强烈推荐!需要的朋友可以参考下
    2015-08-08

最新评论