公司人事管理系统

一.问题描述
一个小公司包含四类人员:经理,技术人员,销售人员和销售经理,各类人员的工资计算方法如下:经理:固定月薪(8000);技术人员:月薪按技术等级(1~8)(1600+等级*300);销售人员:按提成(4%*销售额);销售经理:底薪+提成(1500+0.2%*总销售额);设计一个管理程序,实现对各类人员的信息输入,修改和显示。
二 .基本要求
(1)使用面向对象编程思想编写开发过程中需要用到的类,比如:设计Person类:编号,姓名,岗位,工资,成员函数可设一个计算月薪的纯虚函数;另外再设计四个针对四类人员的类均继承 Person;添加相应的派生类数据成员和函数,经理和销售经理可以没有新的数据成员,计算月薪即可; 技术人员添加技术等级数据成员,销售人员添加数据成员:销售额。还需设计一个Manage 类来完成各种操作。人员数组 vector,数据类型为基类指针。
(2)需要使用菜单功能显示添加人员(输入),修改信息,浏览信息,按姓名查找,月薪排序。
(3)为了设计简洁,假定经理和销售经理都只能有一个;用文本编辑器编辑一个文本文件(总数 20 人以上)包含各类人员的信息;并且在程序中能修改保存。

基本流程图

#include<iostream>
#include<vector>
#include<string>
#include<cstdlib>
#include<windows.h>
#include<iomanip>
#include<fstream>
#include <algorithm>
#define filename "student.txt"
using namespace std;
class Person
{public:Person(string, string, int = 0);//构造函数 double virtual pay_salary() = 0; //借用虚函数进行工资初始化 void  virtual show();       //显示信息 bool operator<(const Person*&) const; //重载<比较薪水大小用于排序 static int num; //定义静态变量,自动赋予员工编号 int Number;   //编号 double Salary;//工资 string Name;//姓名 string Department;//部门 int c;//技术级
};
bool Person::operator<(const Person*& obj) const//函数重载<,用于比较薪水
{return this->Salary > obj->Salary;
}
Person::Person(string name1, string work1, int c1) //构造函数的实现
{c = c1;Number = num++;Name = name1;Department = work1;
}
int Person::num = 1;//编号从1开始
void  Person::show() {cout<<"-----------------------------------"<<endl;cout <<right<<setw(3)<<Number<<setw(10)<<Name<<setw(11)<<Department<<setw(8)<<Salary; //setw()控制输出宽度 }
class Manager :public Person //经理类,继承person类
{public:Manager(string, string, int);//构造函数 double pay_salary();//计算工资函数 void show();//显示经理的信息
};
Manager::Manager(string name1, string post1, int c1) :Person(name1, post1, c1) //构造函数 的实现
{pay_salary();
}
double Manager::pay_salary()//计算经理的工资 {Salary = 8000;return Salary;
}
void Manager::show() //显示经理的信息
{cout<<"-----------------------------------"<<endl;cout <<right<<setw(3)<<Number<<setw(10)<<Name<<setw(9)<<Department<<setw(10)<<Salary;
}
class SaleManager :public Person//销售经理类,继承person类 {public:SaleManager(string, string, int);//构造函数 double pay_salary();//计算销售经理的工资 void show();//显示销售经理的信息
};
SaleManager::SaleManager(string name1, string post1, int c1) :Person(name1, post1, c1)//构造函数 的实现 {pay_salary();
}
double SaleManager::pay_salary() //计算经理的工资,基本工资 1500元
{Salary = 1500;return Salary;
}
void SaleManager::show() //显示销售经理的信息
{cout<<"-----------------------------------"<<endl;cout <<right<<setw(3)<<Number<<setw(10)<<Name<<setw(11)<<Department<<setw(8)<<Salary;
}
class Salesman :public Person//销售人员类,继承Person类 {public:Salesman(string, string, int);//构造函数 int salevolume;//销售额double pay_salary();//计算销售人员的工资 void show();//显示销售人员的信息
};
Salesman::Salesman(string name1, string post1, int sv) :Person(name1, post1, sv)//构造函数的实现
{salevolume = sv;pay_salary();
}
double Salesman::pay_salary()//计算销售人员工资,4%×销售额 {Salary = 0.04 * salevolume;return Salary;
}
void Salesman::show() //显示销售人员的信息
{cout<<"-----------------------------------"<<endl;cout <<right<<setw(3)<<Number<<setw(10)<<Name<<setw(11)<<Department<<setw(8)<<Salary;
}
class Technician :public Person //技术人员类,继承Person类
{public:Technician(string, string, int);//技术等级为继承来的参数c double pay_salary();//计算技术人员的工资 void show();//显示技术人员的所有信息
};
Technician::Technician(string name1, string post1, int rank1) :Person(name1, post1, rank1)
{pay_salary();
}
double Technician::pay_salary() //计算技术人员的工资,技术等级×300+1600
{Salary = 1600 + 300 * c;return Salary;
}
void Technician::show()//显示所有技术人员的信息 {cout<<"-----------------------------------"<<endl;cout <<right<<setw(3)<<Number<<setw(10)<<Name<<setw(11)<<Department<<setw(8)<<Salary;
}
class Manage//管理类
{public:void Menu() { salevolume = 0; }//菜单函数 int salevolume;//总销售额 vector<Person*> Ma;//vector数组,存放Person类的对象指针 void add(Person*);//添加人员信息 void alter(string);//删除人员信息 void addtofile();//写入文件 void show();//显示所有信息 void show1();//按月薪降序 Person* find(string&);//查找人员信息
};
Person* Manage::find(string& name1) { //查找for (vector<Person*>::iterator iter = Ma.begin(); iter != Ma.end(); iter++) {if ((*iter)->Name == name1) {return *iter;}}return NULL;
}
void Manage::alter(string name1) { //删除for (vector<Person*>::iterator iter = Ma.begin(); iter != Ma.end(); iter++) {if ((*iter)->Name == name1) {Ma.erase(iter);return;}}cout << "查无此人" << endl;
}
void Manage::add(Person* people) //添加
{if (people->Department == "销售人员") {salevolume += ((Salesman*)people)->salevolume;}Ma.push_back(people);
}
void Manage::addtofile()//写入文件 {ofstream outfile(filename);//打开文件写入 for (vector<Person*>::iterator iter = Ma.begin(); iter != Ma.end(); iter++) {outfile << (*iter)->Department << " " << (*iter)->Name << " ";if ((*iter)->c == 0) outfile << endl;else outfile << (*iter)->c << endl;}outfile.close();//关闭
}
bool cmp(Person* x, Person* y) { //比较薪水return x->Salary > y->Salary;
}void Manage::show() {for (vector<Person*>::iterator iter = Ma.begin(); iter != Ma.end(); iter++) {if ((*iter)->Department == "销售经理") {(*iter)->Salary = salevolume * 0.002 +1500;break;}}sort(Ma.begin(), Ma.end(), cmp);//薪水大小排序for (vector<Person*>::iterator iter = Ma.begin(); iter != Ma.end(); iter++) {(*iter)->show();cout << endl;}
}
void readfile(Manage& obj)//读取文件 {FILE* fp;fp = fopen(filename, "r");//打开文件,只读 if (fp == NULL) {cout << "未找到人员名单" << endl;return;}while (!feof(fp)) {char post[20];char Name[20];int c;   //销售额或技术等级fscanf(fp, "%s%s%d", post, Name,&c);if (!strcmp(post, "经理")) { //文件中为经理的人的信息先填入Person* peo = new Manager(Name, post, 0);obj.add(peo);}else if (!strcmp(post, "技术人员")) {Person* peo = new Technician(Name, post, c);obj.add(peo);}else if (!strcmp(post, "销售人员")) {Person* peo = new Salesman(Name, post, c);obj.add(peo);}else if (!strcmp(post, "销售经理")) {Person* peo = new SaleManager(Name, post, 0);obj.add(peo);}}fclose(fp);//关闭文件
}
void Manage::show1()//对vector数组进行读取
{for (vector<Person*>::iterator iter = Ma.begin(); iter != Ma.end(); iter++) {(*iter)->show();cout << endl;}
}
int main(){int x;Manage T;readfile(T);while(1){cout<< "    ———————————————————————————————" << endl<< "    |       公司人事管理系统        |" << endl<< "    ———————————————————————————————" << endl<< "    |         1.添加员工           |" << endl<< "    |         2.修改信息           |" << endl<< "    |         3.按姓名查找         |" << endl<< "    |         4.显示所有信息       |" << endl<< "    |         5.按月薪降序排序     |" << endl<< "    |         0.保存并退出程序     |" << endl<< "    ———————————————————————————————" << endl;     cout<< "请选择->";cin >> x;switch (x) {case 1: {while (1) {int n;string Name;cout << "请输入姓名:" ;cin >> Name;cout << "请输入人员岗位(1.经理 2.技术人员 3. 销售人员 4.销售经理):" ; cin >> n;if (n == 1) {Person* peo = new Manager(Name, "经理", 0);T.add(peo);cout << "添加成功" << endl << endl << endl;break;}else if (n == 2) {while (1) {int rank = 0;cout << "请输入技术等级(1~8):" ;cin >> rank;if (rank > 8 || rank < 1) {cout << "输入错误,请在1~8之间输入:" ;}else {Person* peo = new Technician(Name, "技术人员", rank);T.add(peo);break;}}cout << "添加成功" << endl << endl << endl;break;}else if (n == 3) {int sales = 0;cout << "请输入销售额:" << endl;cin >> sales;Person* peo = new Salesman(Name, "销售人员", sales);T.add(peo);cout << "添加成功" << endl << endl << endl;break;}else if (n == 4) {Person* peo = new SaleManager(Name, "销售经理", 0);T.add(peo);cout << "添加成功" << endl << endl << endl;break;}else {cout << "输入错误,请重新输入:" << endl;}}system("pause");}break;case 2: {string Name;int n = 0;cout << "请输入姓名:" ;cin >> Name;Person* peo = T.find(Name);if (peo == NULL) {cout << "     查无此人" << endl << endl << endl;break;}peo->show();if (peo->Department == "经理") {cout << "    经理无法修改" << endl;}else if (peo->Department == "技术人员") {int rank = 0;while (1) {cout <<endl<< "请输入技术等级(1~8):" << endl;cin >> rank;if (rank > 8 || rank < 1) {cout << "等级输入错误,请重新输入" << endl;}else break;}T.alter(Name);peo = new Technician(Name, "技术人员", rank);T.add(peo);cout << "修改成功!" << endl;}else if (peo->Department == "销售人员") {int sales = 0;cout <<endl<< "请输入销售额:" << endl;cin >> sales;T.alter(Name);peo = new Salesman(Name, "销售人员", sales);T.add(peo);cout << "    修改成功!" << endl;}else if (peo->Department == "销售经理") {cout << "   销售经理无法修改" << endl;}else {cout << "输入错误" << endl;}}system("pause");break;case 3: {string Name;int n = 0;cout << "请输入所查找人的姓名:";cin >> Name;Person* peo = T.find(Name);if (peo == NULL) {cout << "查无此人" << endl;system("cls");break;}cout<<"-----------------------------------"<<endl;cout <<left<<setw(8)<<"序 号"<<setw(9)<<"姓 名"<<setw(10)<<"岗 位"<<setw(10)<<"工 资"<< endl; peo->show();cout<<endl<<"-----------------------------------"<<endl;cout << endl;system("pause");}break;case 4: { cout<<"-----------------------------------"<<endl;cout <<left<<setw(8)<<"序 号"<<setw(9)<<"姓 名"<<setw(10)<<"岗 位"<<setw(10)<<"工 资"<< endl; T.show1();cout<<"-----------------------------------"<<endl;system("pause");system("cls");}break;case 5: { cout<<"-----------------------------------"<<endl;cout <<left<<setw(8)<<"序 号"<<setw(9)<<"姓 名"<<setw(10)<<"岗 位"<<setw(10)<<"工 资"<< endl; T.show();}system("pause");break;case 0:T.addtofile();exit(0);default:cout << "输入错误请重新输入" << endl;break;}}return 0;
}

公司人事管理系统(C++)相关推荐

  1. 基于springboot的公司人事管理系统

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,公司人事管理系统. 计算机毕业生设计,课程设计需要帮助的可以找我 源码获取------> 链接:https://pan.baidu.c ...

  2. c++公司人事管理系统

    (1)问题描述 一个小公司包含四类人员:经理,技术人员,销售人员和销售经理,各类 人员的工资计算方法如下: 经理:固定月薪(8000):技术人员:月薪按技 术等级(1~8)( 1600+等级*300) ...

  3. 1、公司人事管理系统(C++)

    ** 基于C++的简易"公司人事管理系统" ** 励志:让所有猿同胞都能看懂的代码! (前方高能:注释贼多!) 第一次接触C++,是因为朋友的专业大作业,实在无法了找我帮忙写系统. ...

  4. Java+MySQL 基于springboot+vue的企业公司人事管理系统

    项目编号:Java+MySQL spring228-基于springboot的企业公司人事管理系统#毕业设计 开发语言:Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服 ...

  5. Java毕业设计:企业公司人事管理系统(java+springboot+vue+mysql)

    运行环境: 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架springboot+vue 项目介绍 人事是一个企业的命脉, 只有管理好 ...

  6. java基于springboot的企业公司人事管理系统(java+springboot+vue+mysql)

    运行环境: 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架springboot+vue 项目介绍 人事是一个企业的命脉, 只有管理好 ...

  7. MySQL测试题——开发公司人事管理系统,包括 Employee表 和 Department表

    一.需求分析 我们的开发团队,计划开发一款公司人事管理软件,用于帮助中小型企业进行更加高效的人事管理.现在需要对数据库部分进行设计和开发,根据对需求和立项的分析,我们确定该数据库中最核心的两个表为员工 ...

  8. java基于springboot+vue的企业公司员工人事管理系统 nodejs 前后端分离

    人事工资考勤管理系统作为企业不可缺少的部分,可以极大地提高人事劳资管理效率,是企业不可缺少的管理软件.文章从理论和实践两个角度出发,对企业的人事.工资.考勤管理业务进行详细分析,并在java平台下实现 ...

  9. Java WEB——人事管理系统

    Java WEB--人事管理系统 数据库 网页 网页展示 部分代码展示 问题 这是我的一个小总结~ 数据库 这是我数据库里设计的表,具体的我就不展示了--我用的服务器是tomcat,想要连接数据库就要 ...

  10. 2023计算机毕业设计SSM最新选题之java公司销售合同管理系统kvwra

    相信很多和我一样的同学,因为实习,因为考研和考公等等,来不及做毕业设计,双专业的话 到时肯定忙不过来.提前做好准备吧,能自己完成的尽量自己完成,尽量不要找别人.自己的毕业前的一次大作业.努力完成也有意 ...

最新文章

  1. Java SE 9(JDK9)环境安装及交互式编程环境Jshell使用示例
  2. 新的服务器装Ubuntu系统(如何在windows下制作启动盘以及如何安装Ubuntu系统)
  3. Synchronize锁重入
  4. Python基础——PyCharm版本——第八章、文件I/O(核心1)附件——Python os.chmod() 权限参照表
  5. springmvc atomikos mysql数据源_springboot+atomikos+多数据源管理事务(mysql 8.0)
  6. CC1101超低功耗无线模块在物联网能门锁中的应用
  7. python爬取酷狗音乐top500_python获取酷狗音乐top500的下载地址 MP3格式
  8. 扣绩效,从来都不会让团队变得更好
  9. 合成创意海报灵感|比技术更重要的是创意!
  10. 聚类(2)-- Fuzzy k-means clustering
  11. Android开发20——单个监听器监听多个按钮点击事件
  12. git查看某次commit的修改
  13. UE4 C++如何关闭进程?
  14. eclipse java类图_Eclipse下生成/编辑Java类图或时序图(UML)[转载]
  15. 贾俊平统计学思维导图- 第二章 数据搜集
  16. 苗圩:5G技术将八成用于移动物联网 年内适时发放5G牌照
  17. 分页虚拟存储管理——页面置换算法例题
  18. 如果一个正整数等于其各个数字的立方和,则称该数为阿姆斯特朗数(亦称为自恋性数)。 如 407=4^3+0^3+7^3就是一个阿姆斯特朗数。试编程求大于1小于1000的所有阿姆斯特朗数。
  19. c# sqlite 批量修改
  20. uni-app 遮罩层事件穿透解决办法catchtouchmove

热门文章

  1. jpg、jpeg、png... 的区别
  2. OFD文件怎么编辑修改?
  3. linux系统 浏览器安装包下载,Linux版360浏览器安装包非常大的原因
  4. YOLO系列目标检测后处理-非极大值抑制
  5. jsonrpc-c编译
  6. 工具介绍(3)- TS 视频文件分析工具神器
  7. 工具--nssm详解
  8. 利用nssm将jar包安装为windows服务
  9. 新国货全面崛起,背后的密码是什么?
  10. STM32连接射频si4438模块