浙江理工大学信息学院 实验指导书 实验名称:类的多态性的实现 学时安排:3 实验类别:设计性实验 实验要求:1人1组 学号: 2018329621200 姓名:申屠志刚  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

一、实验目的
1.理解重载运算符的意义。
2.掌握使用成员函数、友员函数重载运算符的特点。
3.掌握重载运算符函数的调用方法。
4.掌握动态联编的概念。
5.掌握虚函数和纯虚函数的使用方法。
二、实验原理介绍
设计性实验
具体原理请见实验内容和步骤
实现对抽象类的继承,通过operator函数调用的形式,实现运算符的重载
三、实验设备介绍
软件需求: windows或linux下的c++编译器
硬件需求: 对于硬件方面的要求,建议配置是Pentium III 450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间、CD-ROM驱动器、能支持24位真彩色的显示卡、彩色显示器、打印机。
四、实验内容
某公司的员工有经理Manager、技术人员Technicist和营销人员SalsePerson,他们的薪金计算方法如下:
经理按月计酬,方法是:基本工资+奖金;技术人员按月计酬,方法是:基本工资;营销人员按月计酬,方法是:基本工资+销售利润*5%。
每类人员都有职工编号、姓名、性别、入职时间、职位、基本工资等数据,其中为入职时间定义CDate类,并为该类重载运算符<<,实现入职时间的输出;各类人员使用统一接口get_pay()计算各类人员的月薪。其次,设计一个统计并输出该公司每个人员某几个月薪金情况的报表类Report,该类提供insert接口向Report类的容器中添加员工信息,并提供print接口用于输出每个员工的职工编号、姓名、性别、入职时间、职位和在设定的月份时间段中该员工的薪酬总额。为了方便实现查找功能,为Report类重载[]运算符的功能,下标值为职位,能根据职位信息查找出所有符合该职位的员工,并重载print接口,输出查找出的员工信息,信息包括职工编号、姓名、性别、入职时间、职位、基本工资。在主函数中对实现的类进行测试,首先,创建各类人员对象,通过Report类的insert接口向报表中添加这些人员信息,然后通过Report类的print接口输出报表。其次测试报表的查找功能,输入要查找的员工职位信息,通过Report类的print接口输出查找到的员工基本信息报表。
五、注意事项和要求
要求学生要提前准备实验的内容
实验完成后要求写出实验报告
六、参考书目
【C++ Prime题解】侯捷译 华中科技大学出版社
【C++程序设计与应用】 张耀仁著 华中科技大学出版社

浙江理工大学信息学院 实验指导书 实验名称:类的多态性的实现 学时安排:3 实验类别:设计性实验 实验要求:1人1组 学号: 2018329621200 姓名:申屠志刚  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄

一、实验目的
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容器。
五 程序清单
date.h

#pragma once
#include <iostream>
#include<cstdlib>
#include<string>
#include<cstdio>
#include<ctime>
using namespace std;
class CDate{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"
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

#pragma once
#include<string>
#include<map>
#include<iostream>
#include <iomanip>
#include"date.h"
using namespace std;
class Employee
{protected:string name,id;int gender;CDate enroll_date;string job;int salary;
public:Employee(string ID,string Name,int Gender,CDate Enroll_date,string Job,int Salary);void set_salary(int salary){this->salary = salary;}void set_job(string job){this->job = job;}void set_enroll(CDate enroll){this->enroll_date = enroll;}string get_id(){return id;}string get_name(){return name;}CDate get_enroll(){return enroll_date;}int get_gender(){return gender;}string get_job(){return job;}int get_salary(){return salary;}virtual double get_pay(int m) = 0;friend ostream &operator<<(ostream &output,const Employee &a1);
};
class Manager:public Employee{map<int,int> bonus;
public:Manager(string id,string name,int gender,CDate enroll,string  job,int salary);Manager(string id,string name,int gender,CDate enroll,string  job,int salary,map<int,int> bonus);void set_bonus(map<int,int> bonus);virtual double get_pay(int m);
};
class Technicist:public Employee{public:Technicist(string id,string name,int gender,CDate enroll,string  job,int salary);virtual double get_pay(int m);
};
class SalesPerson:public Employee{private:map<int,int> sales;
public:SalesPerson(string id,string name,int gender,CDate enroll,string  job,int salary);SalesPerson(string id,string name,int gender,CDate enroll,string  job,int salary,map<int,int> sales);void set_sales(map<int,int> sales);virtual double get_pay(int m);
};

Employee.cpp

#include<iostream>
#include "Employee.h"
using namespace std;ostream &operator<<(ostream &output,const Employee &a)    {output<<a.id<<"\t"<<a.name<<"\t"<<(a.gender?"男":"女")<<"\t"<<a.enroll_date<<"\t"<<a.job<<"\t"<<a.salary;return output;
}Employee::Employee(string ID,string Name,int Gender,CDate Enroll_date,string  Job,int Salary){id=ID;name=Name;gender=Gender;enroll_date=Enroll_date;salary=Salary;job=Job;
}
Manager::Manager(string id,string name,int gender,CDate enroll,string job,int salary):Employee(id,name,gender,enroll,job,salary){}
Manager::Manager(string id,string name,int gender,CDate enroll,string job,int salary,map<int,int> bonus):Employee(id,name,gender,enroll,job,salary),bonus(bonus){}
double Manager::get_pay(int m){return bonus[m]+get_salary();}
Technicist::Technicist(string id,string name,int gender,CDate enroll,string  job,int salary):Employee(id,name,gender,enroll,job,salary){}
double Technicist::get_pay(int m){return get_salary();}
SalesPerson::SalesPerson(string id,string name,int gender,CDate enroll,string  job,int salary):Employee(id,name,gender,enroll,job,salary){}
SalesPerson::SalesPerson(string id,string name,int gender,CDate enroll,string  job,int salary,map<int,int> sales):Employee(id,name,gender,enroll,job,salary),sales(sales){}
double SalesPerson::get_pay(int m){return sales[m]*0.05+get_salary();}

Report.h

#include"Employee.h"
#include<vector>
#include<list>
#include<iostream>
#include<algorithm>
using namespace std;
class Report
{private:vector<Employee*> members;list<Employee*> operator[](string job);double min_pay(list<Employee*> emp_list, int month);double max_pay(list<Employee*> emp_list, int month);void print(list<Employee*> emp_list,int month);
public:~Report();void insert(Employee* member);void print(int rp_mon);
};

Report.cpp

#include "Report.h"
Report::~Report(){}
list<Employee*> Report::operator[](string  job){list<Employee*> L;for(vector<Employee*>::iterator iter1=members.begin();iter1!=members.end();iter1++){if((*iter1)->get_job()==job){L.push_back(*iter1);}}return L;
}
double Report::min_pay(list<Employee*> emp_list, int month){list<double>Payment;for(list<Employee*>::iterator iter3=emp_list.begin();iter3!=emp_list.end();iter3++){Payment.push_back((*iter3)->get_pay(month));}return *min_element(Payment.begin(),Payment.end());
}
double Report::max_pay(list<Employee*> emp_list, int month){list<double>Payment;for(list<Employee*>::iterator iter3=emp_list.begin();iter3!=emp_list.end();iter3++){Payment.push_back((*iter3)->get_pay(month));}return *max_element(Payment.begin(),Payment.end());
}
void Report::print(list<Employee*> emp_list,int month){for(list<Employee*>::iterator iter2=emp_list.begin();iter2!=emp_list.end();iter2++){cout<<(*(*iter2))<<"\t"<<(*iter2)->get_pay(month)<<endl;}
}void Report::insert(Employee* member){members.push_back(member);
}
void Report::print(int rp_mon){cout<<"                     第"<<rp_mon<<"月职工收入报表                           "<<endl;list<Employee*>empl;string Position[3]={"经理","技术","销售"};for(int i=0;i<3;i++){cout<<"------------------------------------------------------------------------"<<endl;cout<<"职位:"<<Position[i]<<endl;cout<<"工号\t"<<"姓名\t"<<"性别\t"<<"入职时间\t"<<"职位\t"<<"基本工资\t"<<"奖金"<<endl;empl=(*this)[Position[i]];print(empl,rp_mon);cout<<"Max payment: "<<max_pay(empl,rp_mon)<<endl;cout<<"Min payment: "<<min_pay(empl,rp_mon)<<endl<<endl;}
}

main.cpp

/*
*@Author:   STZG
*@Language: C++
*/
#include<iostream>
#include "employee.h"
#include "report.h"
#include "date.h"
using namespace std;
int main()
{Report AA;AA.insert(new Manager("001","Tom",1,CDate(11,8,2001),"经理",2000,map<int,int>{{1,1000},{2,2000},{3,3000},{4,3000},{5,2500},{6,4000},{7,7000},{8,8000},{9,3000},{10,1050},{11,10000},{12,6000}}));AA.insert(new Manager("002","Ann",0,CDate(23,5,2013),"经理",3000,map<int,int>{{1,1000},{2,2000},{3,3000},{4,3000},{5,2500},{6,4000},{7,7000},{8,8000},{9,3000},{10,1050},{11,10000},{12,6000}}));AA.insert(new Manager("003","Jim",1,CDate(16,7,1998),"经理",3000,map<int,int>{{1,1000},{2,2000},{3,3000},{4,3000},{5,2500},{6,4000},{7,7000},{8,8000},{9,3000},{10,1050},{11,10000},{12,6000}}));AA.insert(new Technicist("004","David",0,CDate(14,12,2009),"技术",2000));AA.insert(new Technicist("005","Tina",1,CDate(26,8,2015),"技术",1500));AA.insert(new Technicist("006","John",1,CDate(18,1,1999),"技术",3000));AA.insert(new SalesPerson("007","Helen",0,CDate(4,2,2000),"销售",2000,map<int,int>{{1,1000},{2,8000},{3,1000},{4,9000},{5,1000},{6,1000},{7,1000},{8,1000},{9,1000},{10,2000},{11,1000},{12,1000}}));AA.insert(new SalesPerson("008","Lily",0,CDate(30,11,2007),"销售",1000,map<int,int>{{1,1000},{2,2000},{3,3000},{4,3000},{5,2500},{6,4000},{7,7000},{8,8000},{9,3000},{10,1050},{11,10000},{12,6000}}));AA.insert(new SalesPerson("009","Tony",1,CDate(1,8,2013),"销售",1500,map<int,int>{{1,1000},{2,1000},{3,3000},{4,1000},{5,1000},{6,1000},{7,1000},{8,1000},{9,1000},{10,1000},{11,1000},{12,1000}}));int month;cout<<"请输入生成报表的月份"<<endl;cin>>month;AA.print(month);//cout << "Hello world!" << endlreturn 0;
}

六 运行结果

七 实验心得
1.理解重载运算符的意义。
2.掌握使用成员函数、友员函数重载运算符的特点。
3.掌握重载运算符函数的调用方法。
4.掌握动态联编的概念。
5.掌握虚函数和纯虚函数的使用方法。

员工(类的多态性实验)相关推荐

  1. java实验三多态性_Java实验3 类的多态性和接口

    实验3 类的多态性和接口 一.实验目的 理解面向对象的多态性.理解接口和实现接口的类的关系,掌握一个类实现多个接口的声明和使用方法. 二.实验内容 1.程序理解: 接口的应用 //接口的应用 //定义 ...

  2. Java实验报告 理解类的多态性,掌握方法的继承、重载和覆盖,掌握如何从键盘输入数据以及多重循环的使用

    桂 林 理 工 大 学 实  验  报  告 班级软件16-2班 学号 3162052051734姓名梁振宇同组实验者 实验名称Java语言基础练习日期 2018年 05 月31 日 一.实验目的: ...

  3. java类与对象实验报告心得体会_java上机实验心得体会报告(大全五篇)

    北京联合大学信息学院 "面向对象程序设计"课程上机实验报告 题目: JAVA上机实验心得体会 姓名(学号): 专业:计算机科学与技术 编制时间: 2012年12月19日 版本: 1 ...

  4. C#某公司有各类员工,定义一个员工类(Employee),该类具有员工的姓名(Name)和基本薪金(Salary)等属性;并有一个虚方法(CalSalary)用于计算并输出员工的总薪金。

    .某公司有各类员工,定义一个员工类(Employee),该类具有员工的姓名(Name)和基本薪金(Salary)等属性:并有一个虚方法(CalSalary)用于计算并输出员工的总薪金. 对不同的员工, ...

  5. Java面向对象之继承,方法重写,super关键字,员工类系列继承题

    在程序中,如果想声明一个类继承另一个类,需要使用extends关键字. 格式: class 子类 extends 父类 {} 继承的好处 1.继承的出现提高了代码的复用性,提高软件开发效率. 2.继承 ...

  6. java类与对象实验_JAVA类与对象实验报告

    <JAVA类与对象实验报告>由会员分享,可在线阅读,更多相关<JAVA类与对象实验报告(6页珍藏版)>请在人人文库网上搜索. 1.面向对象程序设计实验报告实验三.类与对象(1) ...

  7. 【Java7】练习:选角色,挑苹果,员工类,换心脏,斗地主,发工资,客户信息管理软件,开发团队调度系统

    文章目录 1.玩家选择角色:return new 2.人工挑苹果:只一个接口CompareAble 3.员工类接口:implements Comparator 4. 医生帮换心脏:Organ类doWo ...

  8. 实现类的多态性,方法的重写和重载

    1.多态性是面向对象程序设计的重要部分.在Java语言中,通过使用方法的重载和重写实现类的多态性. 2.重写(覆盖)是指父子类之间的关系,当子类继承父类中所有可能被子类访问的成员方法时,如果子类的方法 ...

  9. Java基础_学习笔记_13_类的多态性(二)

    1 class Animal 2 { 3 private String name; 4 Animal(String name) 5 { 6 this.name=name; 7 } 8 public v ...

最新文章

  1. 易语言组合框连接mysql_用mysql填充的多动态组合框
  2. com口驱动_手机都没耳机口了,平衡口现在才来是作死还是?
  3. input[type=file] 异步上传文件
  4. Jackson学习二之集合类对象与JSON互相转化--转载
  5. flash 编程技巧应用 原创
  6. 缓存淘汰算法 (http://flychao88.iteye.com/blog/1977653)
  7. C11标准委员会成员解读C语言新标准
  8. oracle read by other session,AWR报告中,read by other session ,如何解决?
  9. M​y​E​c​l​i​p​s​e​下​反​编​译​插​件​安​装​使​用​方​法
  10. 缓存服务的更新策略有哪些?
  11. 飞线5根连接图_手机主板焊盘掉点飞线维修方法
  12. iOS8中添加的extensions总结(一)——今日扩展
  13. Mac如何修复“无法卸载磁盘”错误
  14. 数论知识(2)-------------欧拉函数
  15. MongoDB学习(黑马教程)-7-数据库MongoDB的集合关联
  16. python坦克大战游戏_python实现简单坦克大战
  17. 获取注册表信息-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography的MachineGuid的值
  18. 短视频源码APP开发——短视频的功能
  19. 又一所“省会大学”,来了!
  20. EasyExcel为单个Cell设置样式

热门文章

  1. vue 获取元素在浏览器的位置_JavaScript获取窗口位置和元素坐标(兼容版)
  2. python编程单片机_Micro Python:用Python语言控制单片机
  3. php和html的怎么结合,php和html怎么结合,我要做seesion验证啊。。。
  4. app把信息添加到mysql_如何将数据库表中的数据添加到ListView C#Xamarin Android App
  5. 消除python变量的值_SPSS变量值标签的批量设置、复制、显示及删除问题
  6. SpringMVC_1.认识MVC
  7. java获取环境路径方法_JAVA获取服务器路径的方法
  8. Spring cloud(Finchley)微服务框架,sleuth整合zipkin链路追踪失效的问题
  9. r语言的逻辑回归分类
  10. 物理化学 化学 动力学(上)