公司人事管理系统(C++)

该程序设计了一个公司人事管理系统,采用面向对象编程思想,包括Person基类及经理、技术人员、销售人员、销售经理四个派生类。系统支持人员信息输入、修改、显示、查找和月薪排序等功能,并能从文本文件读取和保存数据。菜单驱动的用户界面方便操作,实现了对公司员工的高效管理。
摘要由CSDN通过智能技术生成

公司人事管理系统

一.问题描述
一个小公司包含四类人员:经理,技术人员,销售人员和销售经理,各类人员的工资计算方法如下:经理:固定月薪(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;
}
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值