某公司财务需要开发一个计算雇员工资的程序。 该公司有3类员工。 工人 工资为每小时工资额乘当月工作时数再加上工龄工资; 销售人员 工资为每小时工资额乘当月工作时数加上销售额提成再加上工龄 工资,其中,销售额提成等于该销售人员当月售出商品金额的1%; 管理人员 工资为基本工资再加上工龄工资。 请用面向对象方法分析、设计这个程序,并用C++语言写出完整的程序。 要求设计人员基类,派生工人类,销售人员类和管理人员类, 举例: 员工工号:键盘输入 员工类型:键盘输入 姓名:键盘输入 参加工作时间:键盘输入 工人工资: 每小时工资额:宏定义80元/小时 月工作时数:键盘输入 工龄工资:第一年50元/月(宏定义),以后每年以20%递增,比如1978年参加工作,1979年为50+50*0.2=60元 月总工资 = 每小时工资额*月工作时数+工龄工资 输出:工号、姓名,员工类型,月工作时数、总工资 要求: 可以同时输入输出多位员工信息

时间: 2024-04-22 17:21:44 浏览: 149
分析: 根据题目要求,需要设计一个员工类作为基类,派生出工人类、销售人员类、管理人员类,每个派生类需要实现自己的工资计算方法。同时,需要从键盘输入员工的信息,计算出员工的月总工资,并输出员工的信息。 设计: 首先,我们设计一个员工类作为基类,包含员工的基本信息(员工工号、姓名、参加工作时间)以及计算月总工资的虚函数。然后,派生出工人类、销售人员类、管理人员类,分别实现自己的月总工资计算方法。最后,从键盘输入员工的信息,计算出员工的月总工资,并输出员工的信息。 代码如下:
相关问题

c++设计某公司财务部需要开发一个计算雇员工资的程序,该公司有3类员工,员工工资计算方法如下:(1)工人工资:每小时工资额(通过成员函数设定)乘以当月工作时数(通过成员函数设定),再加上工龄工资。(2)销售员工资:每小时工资额(通过成员函数设定)乘以当月工作时数(通过成员函数设定),加上销售额提成,再加上工龄工资,其中销售额提成等于该销售员当月售出的商品金额(通过成员函数设定)的1%。(3)管理人员工资:基本工资1000元,再加上工龄工资。 其中,工龄工资指雇员在该公司工作,工龄每满一年,月工资就增加35元,请用面向对象方法分析计设计这个程序。(使用继承与派生原则)

这个程序可以使用面向对象方法进行设计,使用继承与派生原则可以实现代码的复用,提高代码的可维护性和可扩展性。具体实现如下: 首先,定义一个基类 Employee,该类包含以下成员变量和成员函数: ```c++ class Employee { protected: string name; // 姓名 int age; // 年龄 int yearsOfWork; // 在公司工作的年数 double hourlyWage; // 每小时工资额 double monthlyHours; // 当月工作时数 public: Employee(string name, int age, double hourlyWage, double monthlyHours, int yearsOfWork); virtual double calculateSalary() = 0; // 计算工资的纯虚函数 }; ``` 其中,构造函数用于初始化成员变量,calculateSalary() 是一个纯虚函数,用于在派生类中实现计算工资的具体方法。 然后,定义三个派生类:Worker、Salesman 和 Manager,分别对应三种不同的员工类型。 Worker 类的定义如下: ```c++ class Worker : public Employee { private: double workingAgeWage; // 工龄工资 public: Worker(string name, int age, double hourlyWage, double monthlyHours, int yearsOfWork); virtual double calculateSalary(); }; ``` 其中,workingAgeWage 是工龄工资,calculateSalary() 函数的实现如下: ```c++ double Worker::calculateSalary() { return hourlyWage * monthlyHours + workingAgeWage; } ``` Salesman 类的定义如下: ```c++ class Salesman : public Employee { private: double salesAmount; // 销售额 double workingAgeWage; // 工龄工资 public: Salesman(string name, int age, double hourlyWage, double monthlyHours, int yearsOfWork, double salesAmount); virtual double calculateSalary(); }; ``` 其中,salesAmount 是销售额,calculateSalary() 函数的实现如下: ```c++ double Salesman::calculateSalary() { return hourlyWage * monthlyHours + salesAmount * 0.01 + workingAgeWage; } ``` Manager 类的定义如下: ```c++ class Manager : public Employee { public: Manager(string name, int age, int yearsOfWork); virtual double calculateSalary(); }; ``` 其中,Manager 类没有 hourlyWage 和 monthlyHours 这两个成员变量,因为它的工资是由基本工资和工龄工资组成的。calculateSalary() 函数的实现如下: ```c++ double Manager::calculateSalary() { return 1000 + yearsOfWork * 35; } ``` 最后,我们需要在程序中创建对象并调用 calculateSalary() 函数来计算工资。例如: ```c++ int main() { Employee* employee1 = new Worker("张三", 30, 20, 160, 2); Employee* employee2 = new Salesman("李四", 25, 15, 160, 1, 10000); Employee* employee3 = new Manager("王五", 40, 10); cout << employee1->calculateSalary() << endl; cout << employee2->calculateSalary() << endl; cout << employee3->calculateSalary() << endl; delete employee1; delete employee2; delete employee3; return 0; } ``` 上述代码中,我们创建了三个不同类型的 Employee 对象,分别调用它们的 calculateSalary() 函数来计算工资。注意,由于 Employee 类中的 calculateSalary() 函数是一个纯虚函数,因此不能创建 Employee 类的对象,只能创建它的派生类的对象。同时,由于使用了动态内存分配,需要在程序结束前将对象释放掉。

某公司的雇员分为以下若干类 Employee :这是所有员工总的父类,属性:员工的姓名,员工的生日月份。方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100 元。 SalariedEmployee :Employee 的子类,拿固定工资的员工。属性:月薪 HourlyEmployee :Employee 的子类,按小时拿工资的员工,每月工作超出160 小时的部分按照1.5 倍工资发放。属性:每小时的工资、每月工作的小时数 SalesEmployee :Employee 的子类,销售人员,工资由月销售额和提成率决定。属性:月销售额、提成率 定义一个类Company,在main方法,把若干各种类型的员工放在一个Employee 数组里,并单元出数组中每个员工当月的工资。

以下是代码实现: ```java import java.util.Scanner; public class Company { public static void main(String[] args) { Employee[] employees = new Employee[4]; employees[0] = new SalariedEmployee("Tom", 10000); employees[1] = new HourlyEmployee("Jerry", 100, 180); employees[2] = new SalesEmployee("Bob", 5000, 0.05); employees[3] = new Employee("Alice", 7); for (Employee employee : employees) { System.out.println(employee.getName() + "'s salary of this month is " + employee.getSalary(7)); } } } class Employee { private String name; private int birthMonth; Employee(String name, int birthMonth) { this.name = name; this.birthMonth = birthMonth; } String getName() { return name; } int getBirthMonth() { return birthMonth; } double getSalary(int month) { double salary = 0.0; if (month == birthMonth) { salary += 100; } return salary; } } class SalariedEmployee extends Employee { private double monthlySalary; SalariedEmployee(String name, double monthlySalary) { super(name, 0); this.monthlySalary = monthlySalary; } @Override double getSalary(int month) { double salary = super.getSalary(month); return salary + monthlySalary; } } class HourlyEmployee extends Employee { private double hourlyWage; private int monthlyWorkHours; HourlyEmployee(String name, double hourlyWage, int monthlyWorkHours) { super(name, 0); this.hourlyWage = hourlyWage; this.monthlyWorkHours = monthlyWorkHours; } @Override double getSalary(int month) { double salary = super.getSalary(month); if (monthlyWorkHours > 160) { salary += (monthlyWorkHours - 160) * hourlyWage * 1.5 + 160 * hourlyWage; } else { salary += monthlyWorkHours * hourlyWage; } return salary; } } class SalesEmployee extends Employee { private double monthlySales; private double commissionRate; SalesEmployee(String name, double monthlySales, double commissionRate) { super(name, 0); this.monthlySales = monthlySales; this.commissionRate = commissionRate; } @Override double getSalary(int month) { double salary = super.getSalary(month); salary += monthlySales * commissionRate; return salary; } } ``` 在本例中,定义了一个父类Employee和三个子类SalariedEmployee、HourlyEmployee和SalesEmployee。每个子类继承了父类的属性和方法,并且根据不同的员工类型,重写了getSalary方法来计算每个员工的工资。主函数中,定义了一个Employee数组,分别放置了不同类型的员工,并且打印出了每个员工当月的工资。
阅读全文

相关推荐

某公司的雇员分为3类,每类员工都有相应的封装类,类的信息如下所示。(1) Employee:这是所有员工总的父类。① 属性:员工的姓名,员工的生日月份② 方法:getSalary(int month) ,参数为月份,如果该月是员工的生日,则公司会额外奖励100 元,否则默认返回0。(2) SalariedEmployee:Employee 的子类,拿固定工资的员工。① 属性:月薪。(3) SalesEmployee:Employee 的子类,销售,工资由月销售额和提成率决定。① 属性:月销售额、提成率。(4) BasePlusSalesEmployee:SalesEmployee 的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。① 属性:底薪。(5)另创建一个Company类,该类有一个属性为Employee数组,用于存储公司的员工对象。有一个displaySalay(int month),输出:xxx(姓名)x月的工资是:xxx.xx元(保留两位小数)本题要求根据上述雇员分类,编写一个程序,满足一下要求:(1)不允许有public和默认属性,根据需求,使用protected和private修饰属性;(2)每个类必须有一个全参数的构造函数;(3)合理使用this和super关键字访问属性、方法和构造函数;(4)在main方法里创建若干个Employee的子类的对象,并将这些存入一个Employee 数组;(5)以步骤(4)中的Employee数组为参数,创建一个Company的对象,调用该对象的displaySalay(int month)方法输出所有员工某月的工资。

最新推荐

recommend-type

类的运用 某公司雇员(employee)

在这个特定的场景中,我们有一个员工(Employee)类,它是其他类的基类,如经理(Manager)、技术人员(Technician)和销售员(Saleman)。这个例子展示了如何使用继承和多态性来构建一个层次化的类结构。 首先,...
recommend-type

知攻善防-应急响应靶机-web2.z18

知攻善防-应急响应靶机-web2.z18
recommend-type

掌握HTML/CSS/JS和Node.js的Web应用开发实践

资源摘要信息:"本资源摘要信息旨在详细介绍和解释提供的文件中提及的关键知识点,特别是与Web应用程序开发相关的技术和概念。" 知识点一:两层Web应用程序架构 两层Web应用程序架构通常指的是客户端-服务器架构中的一个简化版本,其中用户界面(UI)和应用程序逻辑位于客户端,而数据存储和业务逻辑位于服务器端。在这种架构中,客户端(通常是一个Web浏览器)通过HTTP请求与服务器端进行通信。服务器端处理请求并返回数据或响应,而客户端负责展示这些信息给用户。 知识点二:HTML/CSS/JavaScript技术栈 在Web开发中,HTML、CSS和JavaScript是构建前端用户界面的核心技术。HTML(超文本标记语言)用于定义网页的结构和内容,CSS(层叠样式表)负责网页的样式和布局,而JavaScript用于实现网页的动态功能和交互性。 知识点三:Node.js技术 Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,它允许开发者使用JavaScript来编写服务器端代码。Node.js是非阻塞的、事件驱动的I/O模型,适合构建高性能和高并发的网络应用。它广泛用于Web应用的后端开发,尤其适合于I/O密集型应用,如在线聊天应用、实时推送服务等。 知识点四:原型开发 原型开发是一种设计方法,用于快速构建一个可交互的模型或样本来展示和测试产品的主要功能。在软件开发中,原型通常用于评估概念的可行性、收集用户反馈,并用作后续迭代的基础。原型开发可以帮助团队和客户理解产品将如何运作,并尽早发现问题。 知识点五:设计探索 设计探索是指在产品设计过程中,通过创新思维和技术手段来探索各种可能性。在Web应用程序开发中,这可能意味着考虑用户界面设计、用户体验(UX)和用户交互(UI)的创新方法。设计探索的目的是创造一个既实用又吸引人的应用程序,可以提供独特的价值和良好的用户体验。 知识点六:评估可用性和有效性 评估可用性和有效性是指在开发过程中,对应用程序的可用性(用户能否容易地完成任务)和有效性(应用程序是否达到了预定目标)进行检查和测试。这通常涉及用户测试、反馈收集和性能评估,以确保最终产品能够满足用户的需求,并在技术上实现预期的功能。 知识点七:HTML/CSS/JavaScript和Node.js的特定部分使用 在Web应用程序开发中,开发者需要熟练掌握HTML、CSS和JavaScript的基础知识,并了解如何将它们与Node.js结合使用。例如,了解如何使用JavaScript的AJAX技术与服务器端进行异步通信,或者如何利用Node.js的Express框架来创建RESTful API等。 知识点八:应用领域的广泛性 本文件提到的“基准要求”中提到,通过两层Web应用程序可以实现多种应用领域,如游戏、物联网(IoT)、组织工具、商务、媒体等。这说明了Web技术的普适性和灵活性,它们可以被应用于构建各种各样的应用程序,满足不同的业务需求和用户场景。 知识点九:创造性界限 在开发Web应用程序时,鼓励开发者和他们的合作伙伴探索创造性界限。这意味着在确保项目目标和功能要求得以满足的同时,也要勇于尝试新的设计思路、技术方案和用户体验方法,从而创造出新颖且技术上有效的解决方案。 知识点十:参考资料和文件结构 文件名称列表中的“a2-shortstack-master”暗示了这是一个与作业2相关的项目文件夹或代码库。通常,在这样的文件夹结构中,可以找到HTML文件、样式表(CSS文件)、JavaScript脚本以及可能包含Node.js应用的服务器端代码。开发者可以使用这些文件来了解项目结构、代码逻辑和如何将各种技术整合在一起以创建一个完整的工作应用程序。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

计算机体系结构概述:基础概念与发展趋势

![计算机体系结构概述:基础概念与发展趋势](https://img-blog.csdnimg.cn/6ed523f010d14cbba57c19025a1d45f9.png) # 摘要 计算机体系结构作为计算机科学的核心领域,经历了从经典模型到现代新发展的演进过程。本文从基本概念出发,详细介绍了冯·诺依曼体系结构、哈佛体系结构以及RISC和CISC体系结构的设计原则和特点。随后,文章探讨了现代计算机体系结构的新发展,包括并行计算体系结构、存储体系结构演进和互连网络的发展。文中还深入分析了前沿技术如量子计算机原理、脑启发式计算以及边缘计算和物联网的结合。最后,文章对计算机体系结构未来的发展趋
recommend-type

int a[][3]={{1,2},{4}}输出这个数组

`int a[][3]={{1,2},{4}}` 定义了一个二维数组,它有两行三列,但是只填充了前两行的数据。第一行是 {1, 2},第二行是 {4}。 当你尝试输出这个数组时,需要注意的是,由于分配的空间是固定的,所以对于只填充了两行的情况,第三列是未初始化的,通常会被默认为0。因此,常规的打印方式会输出类似这样的结果: ``` a[0][0]: 1 a[0][1]: 2 a[1][0]: 4 a[1][1]: (未初始化,可能是0) ``` 如果需要展示所有元素,即使是未初始化的部分,可能会因为语言的不同而有不同的显示方式。例如,在C++或Java中,你可以遍历整个数组来输出: `
recommend-type

勒玛算法研讨会项目:在线商店模拟与Qt界面实现

资源摘要信息: "lerma:算法研讨会项目" 在本节中,我们将深入了解一个名为“lerma:算法研讨会项目”的模拟在线商店项目。该项目涉及多个C++和Qt框架的知识点,包括图形用户界面(GUI)的构建、用户认证、数据存储以及正则表达式的应用。以下是项目中出现的关键知识点和概念。 标题解析: - lerma: 看似是一个项目或产品的名称,作为算法研讨会的一部分,这个名字可能是项目创建者或组织者的名字,用于标识项目本身。 - 算法研讨会项目: 指示本项目是一个在算法研究会议或研讨会上呈现的项目,可能是为了教学、展示或研究目的。 描述解析: - 模拟在线商店项目: 项目旨在创建一个在线商店的模拟环境,这涉及到商品展示、购物车、订单处理等常见在线购物功能的模拟实现。 - Qt安装: 项目使用Qt框架进行开发,Qt是一个跨平台的应用程序和用户界面框架,所以第一步是安装和设置Qt开发环境。 - 阶段1: 描述了项目开发的第一阶段,包括使用Qt创建GUI组件和实现用户登录、注册功能。 - 图形组件简介: 对GUI组件的基本介绍,包括QMainWindow、QStackedWidget等。 - QStackedWidget: 用于在多个页面或视图之间切换的组件,类似于标签页。 - QLineEdit: 提供单行文本输入的控件。 - QPushButton: 按钮控件,用于用户交互。 - 创建主要组件以及登录和注册视图: 涉及如何构建GUI中的主要元素和用户交互界面。 - QVBoxLayout和QHBoxLayout: 分别表示垂直和水平布局,用于组织和排列控件。 - QLabel: 显示静态文本或图片的控件。 - QMessageBox: 显示消息框的控件,用于错误提示、警告或其他提示信息。 - 创建User类并将User类型向量添加到MainWindow: 描述了如何在项目中创建用户类,并在主窗口中实例化用户对象集合。 - 登录和注册功能: 功能实现,包括验证电子邮件、用户名和密码。 - 正则表达式的实现: 使用QRegularExpression类来验证输入字段的格式。 - 第二阶段: 描述了项目开发的第二阶段,涉及数据的读写以及用户数据的唯一性验证。 - 从JSON格式文件读取和写入用户: 描述了如何使用Qt解析和生成JSON数据,JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。 - 用户名和电子邮件必须唯一: 在数据库设计时,确保用户名和电子邮件字段的唯一性是常见的数据完整性要求。 - 在允许用户登录或注册之前,用户必须选择代表数据库的文件: 用户在进行登录或注册之前需要指定一个包含用户数据的文件,这可能是项目的一种安全或数据持久化机制。 标签解析: - C++: 标签说明项目使用的编程语言是C++。C++是一种高级编程语言,广泛应用于软件开发领域,特别是在性能要求较高的系统中。 压缩包子文件的文件名称列表: - lerma-main: 这可能是包含项目主要功能或入口点的源代码文件或模块的名称。通常,这样的文件包含应用程序的主要逻辑和界面。 通过这些信息,可以了解到该项目是一个采用Qt框架和C++语言开发的模拟在线商店应用程序,它不仅涉及基础的GUI设计,还包括用户认证、数据存储、数据验证等后端逻辑。这个项目不仅为开发者提供了一个实践Qt和C++的机会,同时也为理解在线商店运行机制提供了一个良好的模拟环境。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

【计算机组成原理精讲】:从零开始深入理解计算机硬件

![计算机组成与体系结构答案完整版](https://img-blog.csdnimg.cn/6ed523f010d14cbba57c19025a1d45f9.png) # 摘要 本文全面介绍了计算机组成的原理、数据的表示与处理、存储系统、中央处理器(CPU)设计以及系统结构与性能优化的现代技术。从基本的数制转换到复杂的高速缓冲存储器设计,再到CPU的流水线技术,文章深入阐述了关键概念和设计要点。此外,本文还探讨了现代计算机体系结构的发展,性能评估标准,以及如何通过软硬件协同设计来优化系统性能。计算机组成原理在云计算、人工智能和物联网等现代技术应用中的角色也被分析,旨在展示其在支撑未来技术进
recommend-type

vue2加载高德地图

Vue 2 中加载高德地图通常需要通过第三方库 Vue-Amap 来集成。首先,你需要安装这个库,可以使用 npm 或者 yarn 安装: ```bash npm install @vue-amap/core @vue-amap/map # 或者 yarn add @vue-amap/core @vue-amap/map ``` 然后,在 Vue 组件中导入并配置高德地图,例如在 main.js 或者单个组件的 script 部分: ```javascript import AMap from '@vue-amap/core' import Map from '@vue-amap/map