公司人事管理系统

news2024/11/26 14:37:41

1.问题描述

一个小公司包含四类人员:经理,技术人员,销售人员和销售经理,各类人员的工资计算方法如下:经理:固定月薪(8000);技术人员:月薪按技术等级(1~8)(1600+等级*300); 销售人员:按提成(4%*销售额);销售经理:底薪+提成(1500+0.2%*总销售额);设计一个管理程序,实现对各类人员的信息输入,修改和显示。

2.需求分析  

共有6个类,SalesManager,Manager,Technician,Sales这四个类继承于Person类PersonManager类调用这些类内函数。

在菜单界面可以输入1,2,3,4,0来控制该程序,如果输入其他数字会显示输入错误请重新输入。

输入1:打开员工信息添加功能,此时需要输入员工姓名,员工身份证号码(便于查找员工),用数字1,2,3,4分别表示员工等级经理,技术人员,销售经理和销售人员,如果输入其他数字会显示输入错误请重新输入。最后如果是经理输入任意值;如果是技术人员输入技术等级(1~8);如果是销售经理输入销售额;如果是销售人员输入总销售额。功能完成。

输入2:打开人员修改功能,输入需要修改的员工身份证号方便查找,如果找到则重复1的功能对员工进行修改。如果未找到则显示未能找到该员工。

输入3:打开显示员工功能。

输入4:打开保存信息功能。

输入0:退出程序。

输入其他值:显示输入错误请重新输入。


3.详细设计

主函数:

#include"PersonManager.h"
int main() {
    PersonManager manager;
    manager.run();
    return 0;
}

员工类:

在员工类中,有员工的姓名,身份证号,职位属性,可以计算工资。

父类:
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
    
    // 构造函数
    Person(string n, int a, string i,int y) {
        name = n;
        num = a;
        id = i;
        nu = y;
         getsalary(y);
    }

    // 打印人员信息
    virtual void print() {
        cout << "姓名:" << name << endl;
        cout << "身份证号码:" << id << endl;
        cout << "工资:" << salary << endl;
    }

    // 获取人员类型
    virtual string getType() {
        return "";
    }

    // 获取人员信息字符串
    virtual string getInfoString() {
        return "";
    }

    void getsalary(int ch)
    {
        switch (ch)
        {
        case 1:
            salary = 8000;
            break;
        case 2:
            salary = 1600 + this->num * 300;
            break;
        case 3:
            salary = this->num * 0.04;
            break;
        case 4:
            salary = 2000 + 1500 + 0.002 * this->num;
            break;
        default:
            cout << "无效选项" << endl;
        }

    }
    string name; // 姓名
    int num;
    string id;
    double salary = 0; // 工资
    int nu;

};
销售经理类:
#pragma once
#include"Person.h"
#include <iostream>
using namespace std;
class SalesManager : public Person {
public:
    // 构造函数
    SalesManager(string n, int a, string i,int y) : Person(n, a, i,y) {}

    // 打印人员信息
    void print() {
        cout << "职位:销售经理" << endl;
        Person::print();
    }

    // 获取人员类型
    string getType() {
        return "SalesManager";
    }

    // 获取人员信息字符串
    string getInfoString() {
        return getType() + "," + name + "," + id + "," + to_string(salary);
    }
private:
    string name; // 姓名
    int num;
    string id;
    double salary = 0; // 工资
    int nu;
};
经理类:
#pragma once
#include"Person.h"
#include <iostream>
using namespace std;
class Manager : public Person {
public:
    // 构造函数
    Manager(string n, int a, string i,int y) : Person(n, a, i,y) {}

    // 打印人员信息
    void print() {
        cout << "职位:经理" << endl;
        Person::print();
    }

    // 获取人员类型
    string getType() {
        return "Manager";
    }

    // 获取人员信息字符串
    string getInfoString() {
        return getType() + "," + name  + "," + id + "," + to_string(salary);
    }
private:
    string name; // 姓名
    int num;
    string id;
    double salary = 0; // 工资
    int nu;
};

技术人员类:
#pragma once
#include"Person.h"
#include <iostream>
using namespace std;
// 定义技术人员类
class Technician : public Person {
public:
    // 构造函数
    Technician(string n, int a, string i,int y) : Person(n, a, i,y) {}

    // 打印人员信息
    void print() {
        cout << "职位:技术人员" << endl;
        Person::print();
    }

    // 获取人员类型
    string getType() {
        return "Technician";
    }

    // 获取人员信息字符串
    string getInfoString() {
        return getType() + "," + name  + "," + id + "," + to_string(salary);
    }
private:
    string name; // 姓名
    int num;
    string id;
    double salary = 0; // 工资
    int nu;
};
销售人员类:
#pragma once
#include"Person.h"
#include <iostream>
using namespace std;
class Sales : public Person {
public:
    // 构造函数
    Sales(string n, int a, string i,int y) : Person(n, a, i ,y)   { }

    // 打印人员信息
    void print() {
        cout << "职位:销售人员" << endl;
        Person::print();
    }

    // 获取人员类型
    string getType() {
        return "Sales";
    }

    // 获取人员信息字符串
    string getInfoString() {
        return getType() + "," + name +"," + id + "," + to_string(salary);
    }
private:
    string name; // 姓名
    int num;
    string id;
    double salary = 0; // 工资
    int nu;
};

员工管理类:

在员工管理类中,可以添加、删除、修改员工信息,查询特定员工的信息。

#pragma once
#include <string>
#include <vector>
#include"Person.h"
using namespace std;
class PersonManager {
private:
    vector<Person*> persons; // 人员数组
public:
    // 析构函数
    ~PersonManager();
    // 添加人员信息
void addPerson();
    // 修改人员信息
void modifyPerson();
    // 显示所有人员信息
void showAllPersons();
    // 保存人员信息到文件
void saveToFile(string filename);
    // 从文件中加载人员信息
void loadFromFile(string filename);
    // 显示菜单
void showMenu();
    // 运行人员管理系统
void run();
};


具体实现:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include"Person.h"
#include"Manager.h"
#include"Technician.h"
#include"SalesManager.h"
#include "PersonManager.h"
#include"Sales.h"
using namespace std;

    PersonManager::~PersonManager() {
        for (int i = 0; i < persons.size(); i++) {
            delete persons[i];
        }
    }

    // 添加人员信息
    void PersonManager::addPerson() {
        string name, id;
        int age, choice;
        //double salary;
        cout << "请输入姓名:";
        cin >> name; 
        cout << "请输入身份证号码:";
        cin >> id;
        cout << "请选择职位(1. 经理 2. 技术人员 3. 销售经理 4.销售人员):";
        cin >> choice;
        cout << "如果是经理 请输入:任意值   "<<endl<< "如果是技术人员 请输入技术等级" << endl << "如果是销售经理 请输入销售额" << endl << "如果是销售人员请输入总销售额"<<endl;
        cin >> age;
        switch (choice) {
        case 1:  
            persons.push_back(new Manager(name, age,id, choice));
            
            break;
        case 2:
          
            persons.push_back(new Technician(name, age, id, choice));
            break;
        case 3:
           
            persons.push_back(new SalesManager(name, age, id, choice));
            break;
        case 4:
          
            persons.push_back(new SalesManager(name, age, id, choice));
            break;
        default:
            cout << "无效选项,请重新输入!" << endl;
        }
        
        cout << "添加成功!" << endl;
        system("pause");
        system("cls");
    }

    // 修改人员信息
    void PersonManager::modifyPerson() {
        string id;
        cout << "请输入要修改的身份证号码:";
        cin >> id;
        for (int i = 0; i < persons.size(); i++) {
            if (persons[i]->id == id) {
                string name;
                int num, choice;
                //double salary;
                cout << "请输入新的姓名:";
                cin >> name;
                
                cout << "请选择新的职位(1. 经理 2. 技术人员 3. 销售经理 4.销售人员):";
                cin >> choice;
                cout << "如果是经理 请输入:任意值 "<<endl<<   "如果是技术人员 请输入技术等级 "<<endl << "如果是销售经理 请输入销售额" << endl<<"如果是销售人员请输入总销售额";
                cin >> num;
                switch (choice) {
                case 1:
                    delete persons[i];
                    persons[i] = new Manager(name, num, id, choice);
                    break;
                case 2:

                    delete persons[i];
                    persons[i] = new Technician(name, num, id, choice);
                    break;
                case 3:
                   
                    delete persons[i];
                    persons[i] = new SalesManager(name, num, id, choice);
                    break;
                case 4:
                   
                    delete persons[i];
                    persons[i] = new Sales(name, num, id, choice);
                    break;
                default:

                    cout << "无效选项,请重新输入!" << endl;
                }
                cout << "修改成功!" << endl;
                return;
                system("pause");
                system("cls");
            }
        }
        cout << "未找到该人员信息!" << endl;
        system("pause");
        system("cls");
    }

    // 显示所有人员信息
    void PersonManager::showAllPersons() {
        for (int i = 0; i < persons.size(); i++) {
            persons[i]->print();
            cout << endl;
        }
        system("pause");
        system("cls");
    }

    // 保存人员信息到文件
    void PersonManager::saveToFile(string filename) {
        ofstream ofs(filename);
        if (!ofs) {
            cout << "打开文件失败!" << endl;
            return;
        }
        for (int i = 0; i < persons.size(); i++) {
            ofs << persons[i]->getInfoString() << endl;
        }
        ofs.close();
        cout << "保存成功!" << endl;
        system("pause");
        system("cls");
    }

    // 从文件中加载人员信息
    void PersonManager::loadFromFile(string filename) {
        ifstream ifs(filename);
        if (!ifs) {
            cout << "打开文件失败!" << endl;
            return;
            system("pause");
            system("cls");
        }
        string line;
        while (getline(ifs, line)) {
            int pos1 = line.find(",");
            string type = line.substr(0, pos1);
            int pos2 = line.find(",", pos1 + 1);
            string name = line.substr(pos1 + 1, pos2 - pos1 - 1);
            int pos3 = line.find(",", pos2 + 1);
            int age = stoi(line.substr(pos2 + 1, pos3 - pos2 - 1));
            int pos4 = line.find(",", pos3 + 1);
            string id = line.substr(pos3 + 1, pos4 - pos3 - 1);
            int nu = stod(line.substr(pos4 + 1));
            if (type == "Manager") {
                persons.push_back(new Manager(name, age, id,nu));
            }
            else if (type == "Technician") {
                persons.push_back(new Technician(name, age, id,nu));
            }
            else if (type == "SalesManager") {
                persons.push_back(new SalesManager(name, age, id,nu));
            }
        }
        ifs.close();
        cout << "加载成功!" << endl;
        system("pause");
        system("cls");
    }

    // 显示菜单
    void PersonManager::showMenu() {
        cout << "1. 添加人员信息" << endl;
        cout << "2. 修改人员信息" << endl;
        cout << "3. 显示所有人员信息" << endl;
        cout << "4. 保存人员信息到文件" << endl;
        cout << "0. 退出" << endl;
      
    }

    // 运行人员管理系统
    void PersonManager::run() {
        int choice;
        while (true) {
            showMenu();
            cout << "请输入选项:";
            cin >> choice;
            switch (choice) {
            case 1:
                addPerson();
                break;
            case 2:
                modifyPerson();
                break;
            case 3:
                showAllPersons();
                break;
            case 4:
                saveToFile("persons.txt");
                break;
            case 0:
                cout << "谢谢使用!" << endl;
                return;
            default:
                cout << "无效选项,请重新输入!" << endl;
            }
        }
    };

4.运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1255075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习笔记】05 线性回归

线性回归 线性回归基于几个简单的假设&#xff1a; 首先&#xff0c;假设自变量 x \mathbf{x} x和因变量 y y y之间的关系是线性的&#xff0c; 即 y y y可以表示为 x \mathbf{x} x中元素的加权和&#xff0c;这里通常允许包含观测值的一些噪声&#xff1b; 其次&#xff0c;我…

Spring Cloud Gateway 的简单介绍和基本使用

前言 本文主要对Spring Cloud Gateway进行简单的概念介绍&#xff0c;并通过多模块编程的方式进行一个简单的实操。 文章目录 前言1 什么是网关&#xff08;概念&#xff09;2 微服务中的网关2.1 问题12.2 问题2 3 网关作用4 Spring Cloud Gateway组成5 Spring Cloud Gateway基…

51代码审计-PHP框架MVC类上传断点调试

知识点1&#xff0c;文件上传漏洞挖掘 搜索关键字$_FILES phpmvc架构 MVC模式&#xff08;Model-View-Controller&#xff09;是软件工程中的一种软件架构模式。 MVC把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#…

5.前端--CSS-基本概念【2023.11.26】

1. CSS 语法规范 CSS 规则由两个主要的部分构成&#xff1a;选择器以及一条或多条声明。 属性和属性值之间用英文“:”分开 多个“键值对”之间用英文“;”进行区分 选择器 : 简单来说&#xff0c;就是选择标签用的。 声明 &#xff1a;就是改变样式 2.CSS引入方式 按照 CSS 样…

【C++】多线程(一):std::thread的使用

这篇文章应我朋友的邀请&#xff0c;写一篇文章介绍下C多线程。 编译环境准备 首先确定你的编译器支持std的thread&#xff0c;如果不支持&#xff0c;就会出现诸如“thread找不到”的问题。 以下假设你使用 gnu gcc 编译器&#xff0c;因为 MSVC 的我也不太熟悉。 linux …

【详解二叉树】

&#x1f320;作者&#xff1a;TheMythWS. &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 树形结构 概念 树的示意图 树的基本术语 树的表示 树的应用 二叉树(重点) 二叉树的定义 二叉树的五…

实战oj题——用队列实现栈

前言&#xff1a;Leetcode栈和队列的习题&#xff0c;用两个队列实现栈。 【由于我们是用C语言完成这道题&#xff0c;所以我们要将关于队列的实现代码插入到题中&#xff0c;在创建一个栈&#xff0c;栈里包含两个队列。】 思路&#xff1a;我们用两个队列来实现&#xff0c;因…

java学习part12多态

99-面向对象(进阶)-面向对象的特征三&#xff1a;多态性_哔哩哔哩_bilibili 1.多态&#xff08;仅限方法&#xff09; 父类引用指向子类对象。 调用重写的方法&#xff0c;就会执行子类重写的方法。 编译看引用表面类型&#xff0c;执行看实际变量类型。 2.父子同名属性是否…

FPGA驱动CS4344 VHDL例程

CS4344是一款非常简单的I2S立体声24bit D/A芯片&#xff0c;采样率高达192KHz&#xff0c;相对于ADAU1761复杂的寄存器配置来说&#xff0c;CS4344非常友好&#xff0c;无需配置寄存器&#xff0c;只要按I2S时序输入数据&#xff0c;即可实现立体声输出&#xff0c;且10PIN TSS…

Effective Modern C++(1.顶层const与底层const)

1.顶层const与底层const的定义 const修饰的变量不可以改变&#xff0c;那么他就是顶层const&#xff0c;如&#xff1a; const int a 10; 那么&#xff0c;对于 const int *const p new int(10); 第二个const就是顶层const&#xff0c;因为他修饰的是p&#xff1b;第一个…

Windows TCP 通信测试_1

一、单对单通信测试 应用函数 socket、bind、connect、listen、accept、recv、send&#xff08;win下的函数&#xff09;等 1、客户端demo client.cpp #include<WINSOCK2.H> #include<STDIO.H> #include<iostream> #include<cstring> using namespa…

电商项目高级篇-03 商品上架

商品上架 1、商品上架1.1、设计&#xff1a;宽表设计 1、商品上架 上架的商品才可以在网站展示。 上架的商品需要可以被检索。 1.1、设计&#xff1a;宽表设计 优点&#xff1a;方便检索 缺点&#xff1a;数据冗余 商品数据模型设计&#xff1a; PUT product {"mappi…

HarmonyOS开发(七):构建丰富页面

1、组件状态管理 1.1、概述 在应用中&#xff0c;界面一般都是动态的。界面会根据不同状态展示不一样的效果。 ArkUI作为一种声明式UI&#xff0c;具有状态驱动UI更新的特点&#xff0c;当用户进行界面交互或有外部事件引起状态改变时&#xff0c;状态的变会会触发组件的自动…

【企业微信连接问题】

1、个人可以创建企业微信的企业账号么&#xff1f; 答&#xff1a;可以的&#xff0c;只是没法认证。不过基础的功能还是有的。 注册步骤&#xff1a;企业微信注册步骤 2、集简云链接企业微信&#xff0c;在授权之后&#xff0c;找不到集简云怎么办&#xff1f; 答&#xff1a…

美化wordpress复制文章内容弹出版权提示框的源码代码

通过SweetAlert美化的提示框 将下面代码添加到当前主题模板函数functions.php文件最后即可&#xff1a; function zm_copyright_tips() { echo <link rel"stylesheet" type"text/css" rel"external nofollow" target"_blank" href…

人力资源管理后台 === 权限应用

目录 1.权限应用-拆分静态路由-动态路由 2.权限应用-根据用户权限添加动态路由 3.权限应用-根据权限显示左侧菜单 4.权限应用-退出登录重置路由 5.权限应用-功能权限-按钮权限标识 6.权限应用-自定义指令应用功能权限 7.其他模块-集成 8.首页-基本结构和数字滚动 9.首页…

编译器设计03-后端概述

后端处理概述 后端处理&#xff1a;中间代码生成&#xff0c;目标代码生成&#xff0c;贯穿各个阶段的优化。 后端处理犹如得出中文文章&#xff0c;当阅读完英语文章后&#xff0c;你的脑海中就有清晰的“中间代码”了&#xff0c;想写作的时候就心中有数&#xff0c;核心论…

Sringboot3 讲解

文章目录 前言一、Springboot快速入门1.1 实例1.2 总结&#xff1a;1.2.1 什么是starter启动器1.2.2 SpringBootApplication注解的功效 二、springboot3 统一配置文件1.概述2、属性配置文件使用简单案例3、yaml配置介绍和说明4、批量配置文件的读取5、多环境配置和激活 三、spr…

vue页面表单提交时如何做校验

我们在做新增的时候&#xff0c;新增对话框是要加必填校验的&#xff0c;否则就可能会加空数据或者会产生sql的报错。那么这个校验是如何加的呢&#xff1f;下面我们来说一下。 文章目录 一、必填校验1.1 给form表单绑定一个:rules校验规则&#xff0c;给每个item加上一个prop…

17.找出1000之内的所有完数。

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为循环结构编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为“完数”。例如&#xff0c;⑥的因子为1、2、3&#xff0c;而…