公司人事管理系统

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.运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】挑战100天 Day15(热题+面试经典150题)

【LeetCode】挑战100天 Day15&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-172.1 题目2.2 题解 三、面试经典 150 题-173.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…

AI视频生成工具——Runway gen2 全功能超详细使用教程(2)

昨天给大家分享了Runway Gen1的使用教程&#xff0c;一篇文章就能让你轻松掌握使用文字和图像从现有视频生成新的视频技能&#xff0c;还没有看过的同学们可以回看过往文章。 Runway视频生成功能有3大核心成品 Gen1&#xff1a;视频转视频工具Gen2&#xff1a;视频生成编辑工…

阅读笔记——《Removing RLHF Protections in GPT-4 via Fine-Tuning》

【参考文献】Zhan Q, Fang R, Bindu R, et al. Removing RLHF Protections in GPT-4 via Fine-Tuning[J]. arXiv preprint arXiv:2311.05553, 2023.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 目录 摘要 一、介绍 二、背景 三、方法…

集线器-交换机-路由器

1.集线器(Hub) 集线器就是将网线集中到一起的机器&#xff0c;也就是多台主机和设备的连接器。集线器的主要功能是对接收到的信号进行同步整形放大&#xff0c;以扩大网络的传输距离&#xff0c;是中继器的一种形式&#xff0c;区别在于集线器能够提供多端口服务&#xff0c;也…

Rust UI开发(三):iced如何打开图片(对话框)并在窗口显示图片?

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第三篇&#xff0c;前两篇的链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建…

2023年09月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 运行下面程序后,角色的x坐标值是?( ) A:100 B:90 C:110 D:120 答案:C 利用变量值作为条件,控制循环的次数。变量从0~10的过程中每次角色的x坐标都增加了10,当变量值为1…

人力资源管理后台 === 左树右表

1.角色管理-编辑角色-进入行内编辑 获取数据之后针对每个数据定义标识-使用$set-代码位置(src/views/role/index.vue) // 针对每一行数据添加一个编辑标记this.list.forEach(item > {// item.isEdit false // 添加一个属性 初始值为false// 数据响应式的问题 数据变化 视图…

牛客 算法 HJ103 Redraiment的走法 golang语言实现

题目 HJ103 Redraiment的走法 实现 package mainimport ("bufio""fmt""os""strconv""strings" )func main() {scanner : bufio.NewScanner(os.Stdin)nums : make([]int, 0)nums_len:0dp:make([]int, 0)for scanner.Scan()…

汇编实验2-2 查找匹配字符串笔记

一、数据段 1.字符串结尾&#xff1a;13,10&#xff0c;$ 2.设置格式控制字符串(这样就不用再写clrf函数了) 3.设置存关键字和句子的地址标签&#xff0c;以关键字为例 二、代码段 1.输入字符串 2.字符串比较 2.1 每次的比较长度&#xff0c;KLEN->CL 2.2 设置目标串起始…

java学习part12多态

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

游览器缓存讲解

浏览器缓存是指浏览器在本地存储已经请求过的资源的一种机制&#xff0c;以便在将来的请求中能够更快地获取这些资源&#xff0c;减少对服务器的请求&#xff0c;提高页面加载速度。浏览器缓存主要涉及到两个方面&#xff1a;缓存控制和缓存位置。 缓存控制 Expires 头&#…

力扣每日一题-统计和小于目标的下标对数目-2023.11.24

力扣每日一题&#xff1a;统计和小于目标的下标对数目 开篇 今天这道力扣打卡题写得我好狼狈&#xff0c;一开始思路有点问题&#xff0c;后面就是对自己的代码到处缝缝补补&#xff0c;最后蒙混过关。只能分享一下大佬的代码&#xff0c;然后我帮大家分享代码的思路。 题目链…

84基于matlab的数字图像处理

基于matlab的数字图像处理&#xff0c;数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 84matlab数字图像处理图像增强 (xiaohongshu.com)https://www.xiaohongshu.com/explore/656219d80000000032034dea

python+pytest接口自动化(1)-接口测试基础

一般我们所说的接口即API&#xff0c;那什么又是API呢&#xff0c;百度给的定义如下&#xff1a; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c;或指软件系…

【数据库基础】

目录&#xff1a; 前言什么是数据库主流数据库服务器&#xff0c;数据库&#xff0c;表关系MySQL架构SQL分类存储引擎 前言 剑指offer&#xff1a;一年又1天 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a;…

数据结构之时间复杂度与空间复杂度

1.算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 比方说我们非常熟悉的斐波拉契数列&#xff1a; long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); } 递归实现方式非常简洁&#xff0c;但一定好吗&#xff1f;如何衡量其好与坏&#xff1f; 1…

ES6之class类

ES6提供了更接近传统语言的写法&#xff0c;引入了Class类这个概念&#xff0c;作为对象的模板。通过Class关键字&#xff0c;可以定义类&#xff0c;基本上&#xff0c;ES6的class可以看作只是一个语法糖&#xff0c;它的绝大部分功能&#xff0c;ES5都可以做到&#xff0c;新…

AndroidStudio2022.3.1 Patch3使用国内下载源加速

记录一下这个版本的as在使用国内下载源加速碰到的诸多问题。 一、gradle-8.0-bin.zip下载慢 编辑项目文件夹/gradle/wrapper/gradle-wrapper.properties&#xff0c;文件内容改为如下&#xff1a; #Fri Nov 24 18:50:06 CST 2023 distributionBaseGRADLE_USER_HOME distribu…

如何获得微软MVP徽章

要成为微软MVP&#xff0c;需要在特定领域成为专家&#xff0c;并积极参与社区&#xff0c;为其他人提供帮助和支持。以下是一些步骤可以帮助你成为MVP&#xff1a; 在特定领域成为专家&#xff1a;要成为MVP&#xff0c;需要在某个领域具有专业知识和经验。这可以通过阅读相关…

OD机考真题搜集:叠积木1

题目 有一堆长方体积木,它们的高度和宽度都相同,但长度不一。 小橙想把这堆积木叠成一面墙,墙的每层可以放一个积木,或将两个积木拼接起来,要求每层的长度相同。若必须用完这些积木,叠成的墙最多为多少层?如下是叠成的一面墙的图示,积木仅按宽和高所在的面进行拼接。 …