1.理解重载运算符的意义。
2.掌握使用成员函数、友员函数重载运算符的特点。
3.掌握重载运算符函数的调用方法。
4.掌握动态联编的概念。
5.掌握虚函数和纯虚函数的使用方法。
设计性实验
具体原理请见实验内容和步骤
实现对抽象类的继承,通过operator函数调用的形式,实现运算符的重载
软件需求: 支持C++程序编辑、编译和运行的软件
硬件需求: 处理器i3、内存2G以上计算机一台。
某公司的员工有经理Manager、技术人员Technicist和营销人员SalsePerson,他们的薪金计算方法如下:
经理按月计酬,方法是:基本工资+奖金;技术人员按月计酬,方法是:基本工资;营销人员按月计酬,方法是:基本工资+销售利润*5%。其中基本工资为8000元再加上工龄工资。工龄工资就是雇员在该公司工作的工龄每增加一年,月工资就增加200元。
每类人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据;各类人员使用统一接口get_pay()计算各类人员的月薪,重载<<运算符实现员工信息的输出。其次,设计一个统计并输出该公司员工当月薪金情况的报表类Report,该类提供insert接口向Report类的容器中添加员工信息,并提供print接口用于展示以职位为单位的每个员工的职工编号、姓名、性别、入职时间以及当月该员工的薪酬,并统计出该职位员工薪酬的最高值和最低值。为了提供更方便的查找功能,请为Report类重载[]运算符,下标值为职位,能根据职位信息查找出所有符合该职位的员工。在主函数中对实现的类进行测试,首先,创建各类人员对象,通过Report类的insert接口向报表中添加这些人员信息,然后通过Report类的print接口输出当月员工薪酬情况报表并将报表写入文件中,文件以当天日期作为文件名。存储员工对象的容器请选用合适的STL容器。
//date.h:
#pragma once
#include
#include
#include
#include
#include
using namespace std;
class CDate {
private:
int d, m, y;
static const string df_s;
static const string df_l;
static CDate* default_date;
public:
CDate(int dd, int mm, int yy);
CDate();
void add_year(int n);
void add_month(int n);
void add_day(int n);
string format(string df);
int get_day() const;
int get_month() const;
int get_year() const;
static void set_default(int, int, int);
friend ostream& operator<<(ostream& os, CDate d);
};
//date.cpp:
#include "date.h"
#pragma warning( disable : 4996 )
CDate::CDate(int dd, int mm, int yy) //初始化
{
if ((mm >= 1 && mm <= 12) && (dd >= 1 && dd <= 31))
{
m = mm; d = dd; y = yy;
}
else {
m = 0; d = 0; y = 0;
cout << "the date created is wrong" << endl;
}
}
CDate::CDate() //初始化
{
if (default_date != 0) {
d = default_date->d;
m = default_date->m;
y = default_date->y;
}
else
{
time_t now;
time(&now);
struct tm* t_now;
t_now = localtime(&now);
y = t_now->tm_year + 1900;
m = t_now->tm_mon + 1;
d = t_now->tm_mday;
}
}
void CDate::add_year(int n) //加n年
{
y += n;
}
void CDate::add_month(int n) //加n月
{
m += n;
}
void CDate::add_day(int n) //加n天
{
d += n;
}
string CDate::format(string df)
{
char c_df[20];
if (df == df_s)
{
sprintf(c_df, "%d-%d-%d", y, m, d);
return string(c_df);
}
if (df == df_l)
{
sprintf(c_df, "%d年%d月%d日", y, m, d);
return string(c_df);
}
return string("");
}
int CDate::get_year() const
{
return y;
}
int CDate::get_month() const
{
return m;
}
int CDate::get_day() const
{
return d;
}
CDate* CDate::default_date = 0;
const string CDate::df_s = "ddd";
const string CDate::df_l = "DDD";
void CDate::set_default(int d, int m, int y) {
CDate::default_date = new CDate(d, m, y);
}
ostream& operator<<(ostream& os, CDate d)
{
os << d.format("DDD");
return os;
}
//Employee.h:
#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
#include
#include
#include
#include
#include
#include
//Employee.cpp:
#include "Employee.h"
#include
#include
using namespace std;
Employee::Employee(string ID, string name, string sex, CDate date, string job, double basicmoney) {
this->ID = ID;
this->name = name;
this->sex = sex;
this->date = date;
this->basicmoney = basicmoney;
this->job = job;
}
double Manager::getpay(int m) {
return price[m] + basicmoney;
}
double Technicist::getpay(int m) {
return basicmoney;
}
double SalesPerson::getpay(int m) {
return basicmoney + sales[m] * 0.05;
}
//Report.h:
#include "Employee.h"
class Report {
private:
list members;
list operator[](string job);
double min_pay(list emp_list, int month);
double max_pay(list emp_list, int month);
void print(list emp_list, int month);
public:
~Report();
void insert(Employee* p);
void print(int n);
};
//Report.cpp:
#include "Employee.h"
#include "Report.h"
#include
list Report::operator[](string job) {
list cp;
list::iterator it;
for (it = members.begin(); it != members.end(); it++) {
if ((*it)->getjob() == job)
cp.push_back(*it);
}
return cp;
}
void Report::print(int month) {
cout << " 第" << month << "月职工收入报表" << endl;
cout << "---------------------------------------------------" << endl;
cout << "职位:技术" << endl;
cout << "工号\t" << "姓名\t" << "性别\t" << "入职时间\t" << "收入" << endl;
list emp_ls;
emp_ls = (*this)["技术"];
print(emp_ls, month);
cout << "最低薪酬:" << min_pay(emp_ls, month) << endl;
cout << "最高薪酬:" << max_pay(emp_ls, month) << endl;
cout << "--------------------------------------------------" << endl;
cout << "职位:经理" << endl;
cout << "工号\t" << "姓名\t" << "性别\t" << "入职时间\t" << "收入" << endl;
emp_ls = (*this)["经理"];
print(emp_ls, month);
cout << "最低薪酬:" << min_pay(emp_ls, month) << endl;
cout << "最高薪酬:" << max_pay(emp_ls, month) << endl;
cout << "--------------------------------------------------" << endl;
cout << "职位:销售" << endl;
cout << "工号\t" << "姓名\t" << "性别\t" << "入职时间\t" << "收入" << endl;
emp_ls = (*this)["销售"];
print(emp_ls, month);
cout << "最低薪酬:" << min_pay(emp_ls, month) << endl;
cout << "最高薪酬:" << max_pay(emp_ls, month) << endl;
cout << "--------------------------------------------------" << endl;
}
double Report::min_pay(list emp_list, int month) {
vector pay;
list::iterator it;
for (it = emp_list.begin(); it != emp_list.end(); it++) {
pay.push_back((*it)->getpay(month));
}
return *min_element(pay.begin(), pay.end());
}
double Report::max_pay(list emp_list, int month) {
vector pay;
list::iterator it;
for (it = emp_list.begin(); it != emp_list.end(); it++) {
pay.push_back((*it)->getpay(month));
}
return *max_element(pay.begin(), pay.end());
}
void Report::print(list emp_list, int month) {
list::iterator it;
for (it = emp_list.begin(); it != emp_list.end(); it++) {
cout << (*it)->getID() << "\t" << (*it)->getname() << "\t";
cout << (*it)->getsex() << "\t";
cout << (*it)->getdate().format("ddd") << "\t";
cout << (*it)->getpay(month) << endl;
}
}
void Report::insert(Employee* p) {
members.push_back(p);
}
Report::~Report() {
list::iterator it;
for (it = members.begin(); it != members.end(); it++) {
delete* it;
}
}
//Main.cpp:
#include
#include "Employee.h"
#include
将想要得到工资报表的月份输入,输入1会得到1月份的员工收入报表,然后输入2,也将会得到2月份的员工收入报表,只有输入0才会退出程序。
本次实验知识涉及范围广,通过编写程序做实验的学习,我了解了STL容器的运用,也充分学到了继承和重载的知识,重载运算符,与成员函数、友员函数重载运算符的使用,以及虚函数和纯虚函数的使用方法,编写程序虽然困难,但最终也是逐一解决。所以本次实验学习到了很多知识,收益很多。