C++ 工资发放系统(附UML图)

编译环境:win10(64bit),VS2017
UML:
在这里插入图片描述
main.cpp

#include <iostream>
using namespace std;

#include "employee.h"
#include "salariedemployee.h"
#include "commissionemployee.h"
#include "basepluscommissionemployee.h"
#include "hourlyemployee.h"

int main()
{
	SalariedEmployee xiaohong("123456", "xiaohong");
	xiaohong.display();

	CommissionEmployee xiaozhang("987654", "xiaozhang");
	xiaozhang.display();

	BasePlusCommissionEmployee xiaoming("112233", "xiaoming");
	xiaoming.display();

	HourlyEmployee xiaobai("445566", "xiaobai");
	xiaobai.display();

	BasePlusCommissionEmployee xiaohei("778855", "xiaohei");
	xiaohei.display();

	return 0;
}

mystring.h

#pragma once
#ifndef __MY_STRING_H
#define __MY_STRING_H

#include <iostream>
using namespace std;

class MyString
{
public:
	MyString();
	MyString(const char *str);
	MyString(const MyString &str);
	MyString &operator=(const MyString &str);
	~MyString();

	friend ostream &operator<<(ostream &os, const MyString &str);
	friend bool operator==(const MyString &str1, const MyString &str2);

	const char *getData(void);

	void append(const char *str);
	void disp(void) const;

private:
	char *m_data;
	unsigned int m_len;
};

#endif // __MY_STRING_H

mystring.cpp

#include "mystring.h"
#include <string.h>

MyString::MyString()
{
	m_data = NULL;
	m_len = 0;
}
MyString::MyString(const char *str)
{
	m_len = strlen(str);
	m_data = new char[m_len + 1];
	strcpy(m_data, str);

}
MyString::MyString(const MyString &str)
{
	m_len = strlen(str.m_data);
	m_data = new char[m_len + 1];
	strcpy(m_data, str.m_data);
}
MyString::~MyString()
{
	if (m_data != NULL)
	{
		delete[]m_data;
	}
}

const char *MyString::getData(void)
{
	return m_data;
}

MyString &MyString::operator=(const MyString &str)
{
	if (this == &str)
	{
		return *this;
	}

	if (m_data != NULL)
	{
		delete[]m_data;
	}

	m_len = strlen(str.m_data);
	m_data = new char[m_len + 1];
	strcpy(m_data, str.m_data);

	return *this;
}

void MyString::append(const char *str)
{
	m_len += strlen(str);
	char *temp = new char[m_len + 1];
	strcpy(temp, m_data);
	strcat(temp, str);
	delete m_data;
	m_data = temp;
}

void MyString::disp(void) const
{
	cout << m_data << endl;
}

bool operator==(const MyString &str1, const MyString &str2)
{
	return strcmp(str1.m_data, str2.m_data);
}

ostream &operator<<(ostream &os, const MyString &str)
{
	return os << str.m_data;
}


employee.h

#pragma once
#ifndef __EMPLOYEE_H
#define __EMPLOYEE_H

#include <iostream>
#include "mystring.h"

using namespace std;

class Employee
{
public:
	enum WorkType
	{
		WorkType_NONE = 0,
		WorkType_SalariedEmployee,
		WorkType_CommissionEmployee,
		WorkType_HourlyEmployee,
		WorkType_BasePlusCommissionEmployee
	};

	Employee(const MyString &id = "123456",
		WorkType workType = WorkType_NONE,
		const MyString &name = "xiaoming",
		const MyString &phone = "13356564545");

	void setID(const MyString &id);
	const MyString &getID() const;

	void setWorkType(WorkType workType);
	WorkType getWorkType() const;

	void setName(const MyString &name);
	const MyString &getName() const;

	void setPhone(const MyString &phone);
	const MyString &getphone() const;

	double earnings() const ;
	void display()const ;

private:
	MyString m_id;
	WorkType m_workType;
	MyString m_name;
	MyString m_phone;
};

#endif // __EMPLOYEE_H

employee.cpp

#include "employee.h"

Employee::Employee(const MyString &id ,
	WorkType workType ,
	const MyString &name ,
	const MyString &phone )
{
	m_id = id;
	m_workType = workType;
	m_name = name;
	m_phone = phone;
}

void Employee::setID(const MyString &id)
{
	m_id = id;
}

const MyString &Employee::getID() const
{
	return m_id;
}

void Employee::setWorkType(WorkType workType)
{
	m_workType = workType;
}

Employee::WorkType Employee::getWorkType() const
{
	return m_workType;
}

void Employee::setName(const MyString &name)
{
	m_name = name;
}

const MyString &Employee::getName() const
{
	return m_name;
}

void Employee::setPhone(const MyString &phone)
{
	m_phone = phone;
}

const MyString &Employee::getphone() const
{
	return m_phone;
}

double Employee::earnings() const
{
	return 0;
}

void Employee::display() const
{
	cout << "Employee::ID: " << m_id << endl;
	cout << "Employee::Type: " << m_workType << endl;
	cout << "Employee::Name: " << m_name << endl;
	cout << "Employee::Phone: " << m_phone << endl;
}

CommissionEmployee.h

#pragma once
#ifndef COMMISSION_EMPLOYEE_H
#define COMMISSION_EMPLOYEE_H

#include <iostream>
#include "employee.h"

class CommissionEmployee :virtual public Employee
{
public:
	CommissionEmployee(const MyString &id = "123456",
		const MyString &name = "xiaoming",
		const MyString &phone = "13356564545",
		double grossSales = 100,
		double commissionRate = 0.35);

	void setGrossSales(double grossSales);
	double getGrossSales() const;

	void setCommissionRate(double commissionRate);
	double getCommissionRate() const;

	double earnings() const;
	void display() const;

private:
	double m_grossSales;
	double m_commissionRate;
};
#endif // !COMMISSION_EMPLOYEE_H

CommissionEmployee.cpp

#include "CommissionEmployee.h"

CommissionEmployee::CommissionEmployee(const MyString &id, 
	const MyString &name, 
	const MyString &phone, 
	double grossSales, 
	double commissionRate)
	:Employee(id, Employee::WorkType_CommissionEmployee, name, phone)
{
	m_grossSales = grossSales;
	m_commissionRate = commissionRate;
}

void CommissionEmployee::setGrossSales(double grossSales)
{
	m_grossSales = grossSales;
}

double CommissionEmployee::getGrossSales() const
{
	return m_grossSales;
}

void CommissionEmployee::setCommissionRate(double commissionRate)
{
	m_commissionRate = commissionRate;
}

double CommissionEmployee::getCommissionRate() const
{
	return m_commissionRate;
}

double CommissionEmployee::earnings() const
{
	return m_commissionRate + m_grossSales;
}

void CommissionEmployee::display() const
{
	cout << "CommissionEmployee::ID: " << getID() << endl;
	cout << "CommissionEmployee::Type: " << getWorkType() << endl;
	cout << "CommissionEmployee::Name: " << getName() << endl;
	cout << "CommissionEmployee::Phone: " << getphone() << endl;
	cout << "CommissionEmployee::GrossSales: " << m_grossSales << endl;
	cout << "CommissionEmployee::CommissionRate: " << m_commissionRate << endl;
}

HourlyEmployee.h

#pragma once
#ifndef __HOURLY_EMPLOYEE_H
#define __HOURLY_EMPLOYEE_H

#include <iostream>
#include "employee.h"

class HourlyEmployee:public Employee
{
public:
	HourlyEmployee(const MyString &id = "123456",
		const MyString &name = "xioaming",
		const MyString &phone = "13356564545",
		double wageForHour = 30,
	double wageForOverTime = 35,
	int hours = 48);
	void setWageForHour(double wageForHour);
	double getWageForHour() const;

	void setWageForOverTime(double wageForOverTime);
	double getWageForOverTime() const;

	void setHours(int hours);
	int getHours() const;

	double earnings() const;
	void display() const;
private:
	double m_wageForHour;
	double m_wageForOverTime;
	int m_hours;
}; 

#endif // __HOURLY_EMPLOYEE_H

HourlyEmployee.cpp

#include "HourlyEmployee.h"

HourlyEmployee::HourlyEmployee(const MyString &id,
	const MyString &name,
	const MyString &phone,
	double wageForHour,
	double wageForOverTime,
	int hours)
	:Employee(id, Employee::WorkType_HourlyEmployee, name, phone)
{
	m_wageForHour = wageForHour;
	m_wageForOverTime = wageForOverTime;
	m_hours = hours;
}

void HourlyEmployee::setWageForHour(double wageForHour)
{
	m_wageForHour = wageForHour;
}

double HourlyEmployee::getWageForHour() const
{
	return m_wageForHour;
}

void HourlyEmployee::setWageForOverTime(double wageForOverTime)
{
	m_wageForOverTime = wageForOverTime;
}

double HourlyEmployee::getWageForOverTime() const
{
	return m_wageForOverTime;
}

void HourlyEmployee::setHours(int hours)
{
	m_hours = hours;
}

int HourlyEmployee::getHours() const
{
	return m_hours;
}

double HourlyEmployee::earnings() const
{
	double salary = 0;
	if (m_hours > 40)
	{
		salary = 40 * m_wageForHour + (m_hours - 40) * m_wageForOverTime;
	}
	else
	{
		salary = m_hours * m_wageForHour;
	}

	return salary;
}
void HourlyEmployee::display() const
{
	cout << "HourlyEmployee::ID: " << getID() << endl;
	cout << "HourlyEmployee::Type: " << getWorkType() << endl;
	cout << "HourlyEmployee::Name: " << getName() << endl;
	cout << "HourlyEmployee::Phone: " << getphone() << endl;
	cout << "HourlyEmployee::WageForHour: " << m_wageForHour << endl;
	cout << "HourlyEmployee::WageForOverTime: " << m_wageForOverTime << endl;
	cout << "HourlyEmployee::Hours: " << m_hours << endl;
}

SalariedEmployee.h

#pragma once
#ifndef __SALARIED_EMPLOYEE_H
#define __SALARIED_EMPLOYEE_H

#include <iostream>
#include "employee.h"

class SalariedEmployee:virtual public Employee
{
public:
	SalariedEmployee(const MyString &id = "123456",
		const MyString &name = "xiaoming",
		const MyString &phone = "13356564545",
		double weeklySalary = 1000);

	void setWeeklySalary(double weeklySalary);
	double getWeeklySalary() const;

	double earnings() const;
	void display() const;

private:
	double m_weeklySalary;
};
#endif // __SALARIED_EMPLOYEE_H

SalariedEmployee.cpp

#include "SalariedEmployee.h"

SalariedEmployee::SalariedEmployee(const MyString &id, const MyString &name, const MyString &phone, double weeklySalary)
	:Employee(id, Employee::WorkType_SalariedEmployee, name, phone)
{
	m_weeklySalary = weeklySalary;
}

void SalariedEmployee::setWeeklySalary(double weeklySalary)
{
	m_weeklySalary = weeklySalary;
}

double SalariedEmployee::getWeeklySalary() const
{
	return m_weeklySalary;
}

double SalariedEmployee::earnings() const
{
	return m_weeklySalary;
}

void SalariedEmployee::display() const
{
	cout << "SalariedEmployee::ID: " << getID() << endl;
	cout << "SalariedEmployee::Type: " << getWorkType() << endl;
	cout << "SalariedEmployee::Name: " << getName() << endl;
	cout << "SalariedEmployee::Phone: " << getphone() << endl;
	cout << "SalariedEmployee::WeeklySalary: " << m_weeklySalary << endl;
}

BasePlusCommissionEmployee.h

#pragma once
#ifndef __BASEPLUSCOMMISSION_EMPLOYEE_H
#define __BASEPLUSCOMMISSION_EMPLOYEE_H

#include <iostream>
#include "CommissionEmployee.h"
#include "SalariedEmployee.h"

class BasePlusCommissionEmployee :public SalariedEmployee, public CommissionEmployee
{
public:
	BasePlusCommissionEmployee(const MyString &id = "123456",
		const MyString &name = "xiaoming",
		const MyString &phone = "13356564545",
		double weeklySalary = 1000,
		double grossSales = 1000,
		double commissionRate = 0.35);

	double earnings() const;
	void display() const;
};

#endif // __BASEPLUSCOMMISSION_EMPLOYEE_H

BasePlusCommissionEmployee.cpp

#include <iostream>
#include "BasePlusCommissionEmployee.h"

BasePlusCommissionEmployee::BasePlusCommissionEmployee(const MyString &id,
	const MyString &name,
	const MyString &phone,
	double weeklySalary,
	double grossSales,
	double commissionRate) {};

double BasePlusCommissionEmployee::earnings() const
{
	return  getWeeklySalary() + getGrossSales() + getGrossSales() * getCommissionRate();
}

void BasePlusCommissionEmployee::display() const
{
	cout << "BasePlusCommissionEmployee::ID: " << getID() << endl;
	cout << "BasePlusCommissionEmployee::Type: " << getWorkType() << endl;
	cout << "BasePlusCommissionEmployee::Name: " << getName() << endl;
	cout << "BasePlusCommissionEmployee::Phone: " << getphone() << endl;
	cout << "BasePlusCommissionEmployee::WeeklySalary: " << getWeeklySalary() << endl;
	cout << "BasePlusCommissionEmployee::GrossSales: " << getGrossSales() << endl;
	cout << "BasePlusCommissionEmployee::CommissionRate: " << getCommissionRate() << endl;
}
工资发放系统 某公司按月给其雇员发放工资,该公司有4种雇员:  固定薪金的雇员:不管工作多长时间,总拿固定月薪;(但如果请假,要扣除相应的薪金,请假次数×每次扣除金额30)  小时工:以小时计算,加上加班费;(每月基本工作时间为160小时,其余为加班时间)  销售员:按销售收入提成计算;(每月基本销售额度为30000元,低于此额度,在月薪里扣除少于30000部分的千分之二)  带薪销售员:底薪加上销售收入提成(要求同上,若有请假,也要扣除相应的薪金) 如果雇员的生日所在的月份在本月,那么公司无条件补贴200元。 设计一工资发放系统,完成各种工资的计算,并实现以下功能: 1) 初始化系统 创建存储该公司职工信息的存储系统(Employee.dat),并进行职工信息的输入,注意:公司的职工编号由系统按顺序自动生成,并且员工号一旦分配好就不可以再修改! 第一次运行系统,根据系统提示从键盘输入员工的相应信息进行初始化操作,并保存至Employee.dat文件中。以后每次运行程序,初始化时都从文件Employee.dat中读取员工数据即可。 2) 职工信息输出 要求可以输出: 某类职工当月的薪水发放信息 分类输出全体职工当月的薪水发放信息 某一名职工当月的薪水发放信息 格式如下: ******************************** 固定薪金职员********************************* 编号 姓名 出生年月 工种 奖励薪金 固定月薪 请假天数 应扣 实发工资 是否领取 **********************************计时职员*********************************** 编号 姓名 出生年月 工种 奖励薪金 工作时长 时薪 加班时长 实发工资 是否领取 **********************************普通销售员*********************************** 编号 姓名 出生年月 工种 奖励薪金 销售额 提成比例 应扣 实发工资 是否领取*********************************带薪销售员************************************ 编号 姓名出生年月工种奖励薪金固定月薪销售额提成比例请假天数应扣实发工资是否领取 3) 添加职工 通过键盘输入相应的职工信息,添加职工,并保存至Employee.dat文件中。 4) 删除职工 通过输入职工的工号,首先输出要删除的职工相应的信息,经确认后删除,要考虑职工不存在的情况。删除后保存至Employee.dat文件中。 5) 修改信息 要求可以修改: 除编号外的所有职工信息,包括工种以及由修改工种带来的各项操作 修改某一类工种的信息,如销售人员的提成比例,统一提高0.05; 输出修改前的职工信息,经确认后修改后,输出修改后的职工信息,考虑职工不存在的情况,修改后保存至Employee.dat文件中。 6) 工资发放 通过输入职工号方式,输出查询到的职工相应的信息,经确认发放工资,将员工是否领取工资信息设置为是(即真),考虑所要查询的职工编号不存在和已经发放过工资的情况。 7) 保存退出 通过确认,保存修改的信息至文件Employee.dat中,退出系统,结束运行。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不秃头的程序猿Gabriel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值