搜索
您的当前位置:首页正文

实验三多态性实验报告

来源:六九路网
浙江理工大学信息学院

实验指导书

实验名称:类的多态性的实现 学时安排:3 实验类别:设计性实验 实验要求:1人1组

学号: 姓名:

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

一、实验目的

1.理解重载运算符的意义。

2.掌握使用成员函数、友员函数重载运算符的特点。

3.掌握重载运算符函数的调用方法。

4.掌握动态联编的概念。

5.掌握虚函数和纯虚函数的使用方法。

二、实验原理介绍

设计性实验

具体原理请见实验内容和步骤

实现对抽象类的继承,通过operator函数调用的形式,实现运算符的重载

三、实验设备介绍

软件需求: windows或linux下的c++编译器

硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。

四、实验内容

某公司的员工有经理Manager、技术人员Technicist和营销人员SalsePerson,他们的薪金计算方法如下:

经理按月计酬,方法是:基本工资+奖金;技术人员按月计酬,方法是:基本工资;营销人员按月计酬,方法是:基本工资+销售利润*5%。

每类人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据;各类人员使用统一接口get_pay()计算各类人员的月薪,重载<<运算符实现员工信息的输出。其次,设计一个统计并输出该公司员工当月薪金情况的报表类Report,该类提供insert接口向Report类的容器中添加员工信息,并提供print接口用于展示以职位为单位的每个员工的职工编号、姓名、性别、入职时间以及当月该员工的薪酬,并统计出该职位员工薪酬的最高值和最低值。为了提供更方便的查找功能,请为Report类重载[]运算符,下标值为职位,能根据职位信息查找出所有符合该职位的员工。在主函数中对实现的类进行测试,首先,创建各类人员对象,通过Report类的insert接口向报表中添加这些人员信息,然后通过Report类的print接口输出当月员工薪酬情况报表。存储员工对象的容器请选用合适的STL

容器。

五 程序清单

//main.cpp

#include \"class.h\"

#include

int main()

{

cout<<\"请输入指定月份\"<int month;

cin>>month;

Report re;

re.insert(new Technicist(\"0001\王华\男\技术\

re.insert(new Technicist(\"0002\李明\女\技术

\

map bonus;

bonus[1] = 1000;

bonus[2] = 2000;

bonus[3] = 3000;

re.insert(new Manager(\"0003\朱黎明\男\经理

\

bonus[1] = 500;

bonus[2] = 1500;

bonus[3] = 2000;

re.insert(new Manager(\"0004\刘改云\男\经理

\

map sales;

sales[1] = 200000;

sales[2] = 100000;

sales[3] = 500000;

re.insert(new SalesPerson(\"0005\李志武\男\销售

\

re.print(month);

return 0;

}

//class.h

#ifndef CLASS_H_INCLUDED

#define CLASS_H_INCLUDED

#include

#include

#include

#include

#include

#include

#include\"date.h\"

using namespace std;

class Employee

{

protected:

string name;

string ID;

string sex;

string job;

CDate date;

double basicmoney;

public:

Employee(string ID,string name,string sex,CDate basicmoney);

string getjob(){return job;}

string getname(){return name;}

string getID(){return ID;}

string getsex(){return sex;}

double getbasicmoney(){return basicmoney;}

CDate getdate(){return date;}

virtual double getpay(int m)=0;

};

date,string job,double 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);

};

class Manager:public Employee

{

private:

map price;

public:

Manager(string ID,string name,string sex,CDate date,string job,double basicmoney,map price):Employee( ID,name,sex,date,job,basicmoney)

{this->price=price;}

double getpay(int m);

};

class Technicist:public Employee

{

public:

Technicist(string ID,string name,string sex,CDate date,string job,double basicmoney):Employee(ID,name,sex,date,job,basicmoney){}

double getpay(int m);

};

class SalesPerson:public Employee

{

private:

map sales;

public:

SalesPerson(string ID,string name,string sex,CDate date,string job,double basicmoney,map sales):Employee(ID,name,sex,date,job,basicmoney)

{ this->sales=sales;}

double getpay(int m);

};

#endif

//fuctions.cpp

#include \"class.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;

}

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 << \"月职工收入报表\" <cout << \"------------------------------------------------------\" << endl;

cout << \"职位:经理\" << endl;

cout << \"工号\\"<< \"姓名\\"<< \"性别\\"<< \"入职时间\\"<< \"基本工资\\"<< \"薪

酬\"<< 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 << \"工号\\"<< \"姓名\\"<< \"性别\\"<< \"入职时间\\"<< \"基本工资\\"<< \"薪

酬\"<< 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 << \"工号\\"<< \"姓名\\"<< \"性别\\"<< \"入职时间\\"<< \"基本工资\\"<< \"薪

酬\"<< endl;

emp_ls = (*this)[\"技术\"];

print(emp_ls,month);

cout << \"最低薪酬:\" << min_pay(emp_ls, month) << endl;

cout << \"最高薪酬:\" << max_pay(emp_ls, month) << 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()<<\"\\"<<(*it)->getname()<<\"\\";

cout<<(*it)->getsex()<<\"\\";

cout<<(*it)->getdate().format(\"ddd\")<<\"\\";

cout<<(*it)->getbasicmoney()<<\"\\"<<\"\\";

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;

}

}

double Technicist::getpay(int m){

return basicmoney;

}

double SalesPerson::getpay(int m){

return basicmoney + sales[m] * 0.05;

}

//date.h

//增加友元函数,重载<<

friend ostream &operator<<(ostream &os,CDate &date)

{

os<return os;

}

六 运行结果

七 实验心得

此次试验涉及内容较多,主要是多态和STL容器的运用,我了解并运用了vector、list、map容器,并使用了迭代器对容器元素进行访问,复习了重载、继承的知识。在编程过程中也遇到了很多困难,比如怎样重载[]来找到所有并访问同一职务的人员的基本信息,比如怎样提取工资并对其进行大小比较,知道了不止一种方法执行此操作。收获颇丰。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top