题外话,我发现抄题目是个好习惯,它可以让你仔细地读一遍题;为什么这么说呢,因为苯人第一遍写的时候啥都没看,差点交了一份错误的作业,在发csdn时再抄一遍题才发现……
所以我们先读题:
假设某销售公司有一般员工、销售员工和销售经理。
月工资的计算办法是:
一般员工月薪=基本工资;
销售员工月薪=基本工资+销售额*提成率;
销售经理月薪=基本月薪+职务工资+销售额*提成率。
编写程序,定义一个表示一般员工的基类Employee,它包含三个表示员工基本信息得数据成员:编号number,姓名name和基本工资basicSalary。
由Employee类派生表示销售员工的Salesman类,Salesman类包含两个新数据成员:销售额sales和静态数据成员提成率commrate。
再由Salesman类派生表示销售经理的Salesman类。Salesman类包含新数据成员:职务工资jobSalary。
为这些类定义初始化数据的构造函数,以及输入数据input、计算工资pay和是输出工资条print的成员函数。
设一般员工的基本工资是2000元,销售经理的职务工资是3000元,提成率=5/1000,在main函数中,输入若干个不同类型的员工信息测试你的类结构。
读题我们知道要定义几个类,注意一下它们之间的派生继承关系
class Employee
{/*...*/};
class Salesman :public Employee
{/*...*/};
class Salesmanager :public Salesman
{/*...*/};
然后按照题目定义相应的数据成员
class Employee
{
protected:
int number;
char name[20];
double basicSalary;
double salary;
};
class Salesman :public Employee
{
protected:
double sales=0;
static double commrate;
};
double Salesman::commrate = 0.005;
class Salesmanager :public Salesman
{
protected:double jobSalary;
};
这边要注意一下题目要求:Salesman类中的commrate是静态数据成员。由于我们之后要在派生类中访问它,所以记得在类外对它进行一次额外的初始化。
之后就是老生常谈的成员函数编写。这边我们看到题中对basicSalary和jobSalary都给定了值,所以我们可以把它们直接写在构造函数里。
class Employee
{
public:
Employee()
{
basicSalary=2000;
}
void input() {
cout << "请输入编号\n";
cin >> number;
cout << "请输入姓名\n";
cin >> name;
}
void Pay()
{
salary = basicSalary;
}
void Print() {
cout << "\nnumber:" << number << "\nname:" << name << "\nsalary:" << salary;
}
};
class Salesman :public Employee
{
public:
Salesman()
{
commrate =0.005;
}
void input()
{
Employee::input();
cout << "请输入销售额\n";
cin >> sales;
}
void Pay()
{
salary = sales*commrate+ basicSalary;
}
};
double Salesman::commrate = 0.005;
class Salesmanager :public Salesman
{
public:
void input(){
Salesman::input();
}Salesmanager()
{
double js = 3000;
jobSalary=js;
}
void Pay()
{
salary = sales * Salesman::commrate + basicSalary + jobSalary;
}
};
这边的input函数虽然是同名的,但是在继承类中会优先屏蔽;但由于本题中派生的两个类也同样需要输入number、name,所以这边用::来访问基类中的input函数,就可以偷懒节省一段代码啦
其实本题中还有一个小细节,就是对于commrate进行初始化时,应该用小数的形式而非分数的形式,因为在c++中(5/1000)的结果会默认返回整形类的值,也就是小数点前的“0”。这样一来你的提成就被老板偷吃了呜呜呜(以下便是没有注意这一点导致打工人的工资被无情地克扣的错误示范)
至此,本题的大部分难点就迎刃而解了,下面便是最后的完整代码和输入输出样例
#include<iostream>
using namespace std;
class Employee
{
protected:
int number;
char name[20];
double basicSalary;
double salary;
public:
Employee()
{
basicSalary=2000;
}
void input() {
cout << "请输入编号\n";
cin >> number;
cout << "请输入姓名\n";
cin >> name;
}
void Pay()
{
salary = basicSalary;
}
void Print() {
cout << "\nnumber:" << number << "\nname:" << name << "\nsalary:" << salary;
}
};
class Salesman :public Employee
{
protected:
double sales=0;
static double commrate;
public:
Salesman()
{
commrate =0.005;
}
void input()
{
Employee::input();
cout << "请输入销售额\n";
cin >> sales;
}
void Pay()
{
salary = sales*commrate+ basicSalary;
}
};
double Salesman::commrate = 0.005;
class Salesmanager :public Salesman
{
protected:double jobSalary=0;
public:
void input(){
Salesman::input();
}Salesmanager()
{
double js = 3000;
jobSalary=js;
}
void Pay()
{
salary = sales * Salesman::commrate + basicSalary + jobSalary;
}
};
int main()
{
Employee a;
Salesman b;
Salesmanager c;
a.input();
b.input();
c.input();
a.Pay();
b.Pay();
c.Pay();
a.Print();
b.Print();
c.Print();
}