学校主要有四类人员:从事管理的行政人员、只从事教学的纯教师、从事行政工作的教师(既有行政职务,又从事教学)和工人,现在要存储这些人员的姓名、编号、级别、当月薪水,计算月薪并显示全部信息。 人员编号基数为10000,每输入一个职工信息编号加1。 月薪的计算方法如下: 行政人员:固定月薪900*级别+奖金(850) 只从事教学的纯教师:固定月薪700*级别+课时*课时费(40/每课时) 从事行政工作的教师:固定月薪700*级别+课时*课时费(40/每课时)+奖金(650) 工人:固定月薪400*级别+特殊补(天数*30/天)。
设计要求:
根据需求陈述,设计一个基类Employee,派生出类Teacher(纯教师类)、Manager(管理类)和Worker(工人类),再由纯教师类和管理类派生出Teach_Manager(从事行政工作的教师)类。
基类定义如下:
//employee.h
classEmployee
{
protected:
char*name; //姓名
int EmpNO; //个人编号
int grade; //级别
float monthPay; //固定月薪
float accumpay; //月薪总和
static int employeeNO; //现在职员编号
public:
Employee();//构造函数
~employee();//析构函数
void pay(); //计算月薪函数
void Promote(int);//设定职级函数
void DispalyStatus();//显示信息函数
};
注意:
1、虚基类的应用。
2、派生类重载函数的定义。
//Employee.cpp
#include "Employee.h"
#include<iostream>
using namespace std;
void Employee::Input()
{
// TODO: 在此处添加实现代码.
cout << "输入姓名:" << endl;
cin.getline(name, 50);
cout << "输入个人编号" << endl;
cin >> EmpNO;
cout << "输入级别" << endl;
cin >> grade;
}
void Employee::pay()
{
// TODO: 在此处添加实现代码.
accumpay=monthPay * grade;
}
void Employee::Promote(int gra)
{
grade = gra;// TODO: 在此处添加实现代码.
}
void Employee::DisplayStatus()
{
// TODO: 在此处添加实现代码.
cout << "姓名:" << name << endl;
cout << "编号:" << EmpNO << endl;
cout << "级别:" << grade << endl;
pay();
cout << "当月薪水:" << accumpay << endl;
}
//Employee.h
#pragma once
class Employee
{
protected:
char name[50] = {};
int EmpNO;
int grade;
float monthPay;//固定月薪
float accumpay;//月薪总和
static int employeeNO;//现在职员编号
public:
Employee() {};
~Employee() {};
void Input();
void pay();//计算月薪函数
void Promote(int gra);//设定职级函数
void DisplayStatus();//显示信息函数
};
//Worker.cpp
#include "Worker.h"
#include<iostream>
using namespace std;
void Worker::pay() {
accumpay = monthPay * grade + 30 * Day;
}
float Worker::Get_pay() {
return accumpay;
}
void Worker::Input()
{
// TODO: 在此处添加实现代码.
cout << "输入姓名:" << endl;
cin.getline(name, 50);
cout << "输入个人编号" << endl;
cin >>EmpNO;
cout << "输入级别" << endl;
cin >> grade;
cout << "输入天数" << endl;
cin >> Day;
}
void Worker::DisplayStatus()
{
// TODO: 在此处添加实现代码.
cout << "姓名:" << name << endl;
cout << "编号:" << EmpNO << endl;
cout << "级别:" << grade << endl;
pay();//这里千万不要忘记,否则accumpay会随机赋值
cout << "当月薪水:" << accumpay << endl;
}
//Worker.h
#pragma once
#include "Employee.h"
class Worker :
public Employee
{
int Day;
char name[50] = {};
int EmpNO;
int grade;
float monthPay = 400;//固定月薪
float accumpay;//月薪总和
//static int employeeNO;//现在职员编号
public:
//void Promote(int gra);
//void Get_Day(int day);
void Input();
void pay();
float Get_pay();
void DisplayStatus();
};
//Manager.cpp
#include "Manager.h"
#include<iostream>
using namespace std;
void Manager::Input()
{
// TODO: 在此处添加实现代码.
cout << "输入姓名:" << endl;
cin.getline(name, 50);
cout << "输入个人编号" << endl;
cin >> EmpNO;
cout << "输入级别" << endl;
cin >> grade;
}
void Manager::pay()
{
accumpay=grade*monthPay+ 850;//固定月薪900*级别 + 奖金(850)
}
float Manager::Get_pay() {
return accumpay;
}
void Manager::DisplayStatus()
{
// TODO: 在此处添加实现代码.
cout << "姓名:" << name << endl;
cout << "编号:" << EmpNO << endl;
cout << "级别:" << grade << endl;
pay();
cout << "当月薪水:" << Get_pay() << endl;
}
//Manager.h
#pragma once
#include "Employee.h"
class Manager :
virtual public Employee
{
char name[50] = {};
int EmpNO;
int grade;
float monthPay=900;//固定月薪
float accumpay;//月薪总和
// static int employeeNO;//现在职员编号
public:
void Input();
void pay();
float Get_pay();
void DisplayStatus();
};
//Teach_Manager.cpp
#include "Teach_Manager.h"
#include<iostream>
using namespace std;
void Teach_Manager::Promote(int gra) {
grade = gra;
}
void Teach_Manager::Get_Class(int classes) {
Classes = classes;
}
void Teach_Manager::pay() {
accumpay = monthPay * grade + 40 * Classes+650;
}
float Teach_Manager::Get_pay() {
return accumpay;
}
void Teach_Manager::Input()
{
// TODO: 在此处添加实现代码.
cout << "输入姓名:" << endl;
cin.getline(name, 50);
cout << "输入个人编号" << endl;
cin >> EmpNO;
cout << "输入级别" << endl;
cin >> grade;
cout << "输入课节数量:" << endl;
cin >> Classes;
}
void Teach_Manager::DisplayStatus()
{
// TODO: 在此处添加实现代码.
cout << "姓名:" << name << endl;
cout << "编号:" << EmpNO << endl;
cout << "级别:" << grade << endl;
pay();
cout << "当月薪水:" << accumpay << endl;
}
//Teach_Manager.h
#pragma once
#include"Manager.h"
#include"Teacher.h"
class Teach_Manager:
public Teacher,public Manager
{
int Classes;
char name[50] = {};
int EmpNO;
int grade;
float monthPay= 700;//固定月薪
float accumpay;//月薪总和
//static int employeeNO;//现在职员编号
public:
void Promote(int gra);
void Get_Class(int classes);
void Input();
void pay();
float Get_pay();
void DisplayStatus();
};
//Teacher.cpp
#include "Teacher.h"
#include<iostream>
using namespace std;
void Teacher::pay() {
accumpay = monthPay * grade + 40 * classes;
}
void Teacher::Promote(int gra) {
grade = gra;
}
void Teacher::GetClass(int cl) {
classes = cl;
}
float Teacher::Get_pay() {
return accumpay;
}
void Teacher::Input()
{
cout << "输入姓名:" << endl;
cin.getline(name, 50);
cout << "输入个人编号" << endl;
cin >> EmpNO;
cout << "输入级别" << endl;
cin >> grade;
cout << "输入课节数量:" << endl;
cin >> classes;
// TODO: 在此处添加实现代码.
}
void Teacher::DisplayStatus()
{
// TODO: 在此处添加实现代码.
cout << "姓名:" << name << endl;
cout << "编号:" << EmpNO << endl;
cout << "级别:" << grade << endl;
pay();
cout << "当月薪水:" << accumpay << endl;
}
//Teacher.h
#pragma once
#include "Employee.h"
class Teacher :
virtual public Employee
{
int classes;
char name[50] = {};
int EmpNO;
int grade;
float monthPay=700;//固定月薪
float accumpay;//月薪总和
//static int employeeNO;//现在职员编号
public:
void Input();
void pay();
void Promote(int gra);
void GetClass(int cl);
float Get_pay();
void DisplayStatus();
};
//main.cpp
#include<iostream>
using namespace std;
#include"Employee.h"
#include"Manager.h"
#include"Teacher.h"
#include"Worker.h"
#include"Teach_Manager.h"
static int employeeNO = 0;
void main() {
/*char name[50] = {};
int EmpNO; //个人编号
int grade; //级别
float monthPay; //固定月薪
float accumpay; //月薪总和*/
do {
cout << "请输入人员类别(worker/teacher/teach_manager/manager)" << endl;
char employee[50] = {};
cin.getline(employee, 50);
int i = strcmp(employee, "worker");
int j = strcmp(employee, "teacher");
int k = strcmp(employee, "teach_manager");
int z = strcmp(employee, "manager");
if (i == 0) {
Worker w1;
w1.Input();
w1.DisplayStatus();
}
if (j == 0) {
Teacher t1;
t1.Input();
t1.DisplayStatus();
}
if (k == 0) {
Teach_Manager tm1;
tm1.Input();
tm1.DisplayStatus();
}
if (z == 0) {
Manager m1;
m1.Input();
m1.DisplayStatus();
}
employeeNO++;
} while (employeeNO <= 10000);
}
虽然文件很多,但是每个类的成员大体上是相似的
需要注意的是函数之间如果有成员互相引用,那么需要调用函数,形成嵌套
Input()类函数要会用
其实本题也可以用初始化列表来做,就不需要input了