某小型公司,主要有四类人员:经理、技术人员、销售经理和推销员。
现在,需要存储这些人员的姓名、编号、级别、当月薪水.计算月薪总额并显示全部信息。
人员编号基数为 1000,每输入一个人员信息编号顺序加 1。
程序要有对所有人员提升级别的功能。 本例中为简单起见, 所有人员的初始级别均为 1级。
然后进行升级,经理升为 4 级,技术人员和销售经理升为 3 级,推销员仍为 1 级。
月薪计算办法是: 经理拿固定月薪 8000 元; 技术人员按每小时 100 元领取月薪;
推销员的月薪按该推销员当月销售额的 4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为 5000 元,
销售提成为所管辖部门当月销售总额的 5%。
id调整:定义一个全局数组来保存id,每一个员工
#include<iostream>
#include<string>
#include<typeinfo>
using namespace std;
int id[1000];
static int i = 0;
class worker //员工表
{
public:
worker(string name)
{
m_name = name;
num++;
m_id = num;
level = 1;
for(int j = 0; j <= i ; j++)
{
if(id[j] == m_id)
{
m_id++;
j = 0;
}
}
id[i] = m_id;
i++;
}
string getname()const
{
return m_name;
}
void setid(int id)
{
m_id = id;
}
int getid() const
{
return m_id;
}
virtual void display() = 0;//显示员工信息
virtual void calsalary() = 0;//计算每月薪水
virtual ~worker()
{
}
protected:
string m_name; //名字
static int num;//编号
int level; //级别
int m_id; //具体人员编号
float m_salary;//当月薪水
};
int worker::num = 1000;
class manager:public worker//经理
{
public:
manager(string name):worker(name)
{
level = 4;
}
void calsalary()
{
m_salary = 8000;
}
void display()
{
calsalary();
cout<<"职位:经理,姓名:"<<m_name<<",编号:"<<m_id<<",级别:"<<level<<",工资:"<<m_salary<<endl;
}
~manager()
{
num--;
cout<<"经理:"<<m_name<<"离开了"<<endl;
}
};
class technician:public worker//技术人员
{
public:
technician(string name,int time = 192):worker(name)
{
level = 4;
worktime = time;
}
void calsalary()
{
m_salary = worktime * 100;
}
void display()
{
calsalary();
cout<<"职位:技术人员,姓名:"<<m_name<<",编号:"<<m_id<<",级别:"<<level<<",工资:"<<m_salary<<endl;
}
~technician()
{
num--;
cout<<"技术人员:"<<m_name<<"离开了"<<endl;
}
private:
int worktime;
};
class salsesman:public worker//销售员
{
public:
salsesman(string name,float volume):worker(name)
{
level = 1;
m_volume = volume;
sum += volume;
}
void calsalary()
{
m_salary = m_volume * 0.04;
}
void display()
{
calsalary();
cout<<"职位:销售,姓名:"<<m_name<<",编号:"<<m_id<<",级别:"<<level<<",工资:"<<m_salary<<endl;
}
~salsesman()
{
num--;
cout<<"销售:"<<m_name<<"离开了"<<endl;
}
public:
static float sum;
private:
float m_volume;//销售额
};
float salsesman::sum = 0.0;
class salsesmanager:public worker//销售经理
{
public:
salsesmanager(string name):worker(name)
{
level = 3;
}
void calsalary()
{
m_salary = salsesman::sum * 0.05 + 5000;
}
void display()
{
calsalary();
cout<<"职位:销售经理,姓名:"<<m_name<<",编号:"<<m_id<<",级别:"<<level<<",工资:"<<m_salary<<endl;
}
~salsesmanager()
{
num--;
cout<<"销售经理:"<<m_name<<"离开了"<<endl;
}
public:
int volume;
};
void upgrade(worker * &w)
{
int id = w->getid();
if(typeid(*w) == typeid(salsesman))
{
string name = w->getname();
delete w;
w = new salsesmanager(name);
}
else if(typeid(*w) == typeid(salsesmanager))
{
string name = w->getname();
delete w;
w = new manager(name);
}
else if(typeid(*w) == typeid(technician))
{
string name = w->getname();
delete w;
w = new manager(name);
}
w->setid(id);
}
int main()
{
worker *w1 = new manager("张三");
w1->display();
worker *w2 = new technician("李四");
w2->display();
delete w1;
worker *w3 = new salsesman("王五",500000);
w3->display();
worker *w4 = new salsesmanager("赵六");
w4->display();
upgrade(w3);
w3->display();
cout<<endl<<"当月操作之后"<<endl;
//w1->display();
w2->display();
w3->display();
w4->display();
return 0;
}
赋予id时与数组中的进行比对,若有重复则id+1,继续比对,将无人使用的id给人员,并将新的id存入数组