工资发放系统

主函数

salary.cpp
#include <iostream>
#include <assert.h>
#include <iomanip>
#include "Employ.h"
#include "Manager.h"
#include "CommissionWorker.h"
#include "HourlyWorker.h" 
#include "PieceWorker.h"
 
 
using namespace std;
 
 
int main(void)
{
 cout.precision(2);
 cout.setf(ios::fixed); 
 Employee *ptr; //基类指针
  
 Manager m("张", "奇", 800.00);
 ptr = &m;
 ptr->print();            //动态连编
 cout << "的工资是:" << ptr->earnings() << "元";      //动态连编
 m.print();                  //静态连编 
 cout << "的工资是:" << m.earnings() << "元" << endl;//静态连编  
  
 CommissionWorker c("张", "明", 200.0, 3.0, 150);
 ptr = &c;
 ptr->print();            //动态连编
 cout << "的工资是:" << ptr->earnings() << "元";      //动态连编
 c.print();                  //静态连编 
 cout << "的工资是:" << c.earnings() << "元" << endl;//静态连编 
 
 HourlyWorker h("周", "玲", 20.0, 40);
 ptr = &h;
 ptr->print();            //动态连编
 cout << "的工资是:" << ptr->earnings() << "元";             //动态连编
 c.print();                  //静态连编 
 cout << "的工资是:" << c.earnings() << "元" << endl;//静态连编 
 
 PieceWorker p("孔", "杰", 5, 300);
 ptr = &p;
 ptr->print();            //动态连编
 cout << "的工资是:" << ptr->earnings() << "元";             //动态连编
 p.print();
 cout << "的工资是:" << c.earnings() << "元";                   //静态连编 
 
 return 0;
}

所有工作人员公用的数据与函数
Employ.h

#ifndef employ_h
#define employ_h
 
 
//抽象基类Employee
class Employee
{
public:
 //默认构造函数
 Employee(const char *first=" ", const char *last = " ");
 ~Employee();        //析构函数
 const char *getFirstName() const;        //读取并返回姓 
 const char *getLastName() const; //读取并返回名 
 //纯虚函数使类Employee成为抽象基类
 virtual float earnings() const = 0;    //纯虚函数
 virtual void print() const = 0;        //纯虚函数 
private:
 char *firstName;  //姓
 char *lastName;           //名   
};
 
#endif
Employ.cpp
#include <iostream>
#include <assert.h>
#include <string.h> 
#include "Employ.h"
 
 
using namespace std;
 
 
//注:纯虚函数没有定义
//构造函数动态为姓和名分配内存,并用函数strcpy把姓和名拷贝到对象中 
/*
  assert的作用是现计算表达式 expression ,如果其值为假(即为0),
  那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行
*/
Employee::Employee(const char *first, const char *last)
{
 firstName = new char[strlen(first) + 1];
 assert(firstName != 0); //测试内存分配是否成功
 strcpy(firstName, first);
 
 lastName = new char[strlen(last) + 1];
 assert(lastName != 0);  //测试内存分配是否成功
 strcpy(lastName, last); 
}
 
 
//析构函数释放动态分配的内存
Employee::~Employee()
{
 delete []firstName;
 delete []lastName;
} 
 
 
//返回指向雇员姓的指针
const char *Employee::getFirstName() const
{
 return firstName;   //调用者必须自己释放内存 
} 
 
 
//返回指向雇员名的指针
const char *Employee::getLastName() const
{
 return lastName;    //调用者必须自己释放内存 
}  

经理的对象
Manager.h

#ifndef manager_h
#define manager_h
 
 
class Manager : public Employee
{
public:
 Manager(const char*, const char*, float = 0.0);
 void setWeeklySalary(float);
 virtual float earnings() const;
 virtual void print() const;
private:
 float weeklySalary;    //每周固定薪水 
};
 
#endif  
Manager.cpp
#include <iostream>
#include <assert.h>
#include "employ.h"
#include "Manager.h"
 
 
using namespace std;
 
 
//类Manager的构造函数
Manager::Manager(const char *first, const char *last, float s)
 : Employee(first, last)
{
 weeklySalary = s;
} 
 
 
//设置经理的固定月薪
void Manager::setWeeklySalary(float s)
{
 weeklySalary = s;
} 
 
 
//返回经理的薪水
float Manager::earnings() const
{
 return weeklySalary;
} 
 
 
//打印经理的信息
void Manager::print() const
{
 cout << "\n经理:" << getFirstName() << ' ' << getLastName(); 
}  

合同工对象
CommissionWorker.h

#ifndef commisworker_h
#define commisworker_h
 
 
#include "Employ.h"
 
 
 
 
class CommissionWorker : public Employee
{
public :
 CommissionWorker(const char*, const char*, float = 0.0, float = 0.0, int = 0);
 void setSalary(float);                       //设置基本工资 
 void setCommission(float);           //设置每件产品的回扣额 
 void setQuantity(int);                       //设置每一周的销售额 
 virtual float earnings() const; //计算雇员的薪水 
 virtual void print() const;                //打印雇员的基本信息 
private:
 float salary;          //基本工资
 float commission;      //每年产品的回扣额
 int quantity;          //一周的销售额 
};
 
#endif  
CommissionWorker.cpp
#include <iostream>
#include "assert.h"
#include "CommissionWorker.h"
 
 
using namespace std;
 
 
//类CommissionWorker的构造函数
CommissionWorker::CommissionWorker(const char *first, const char *last, float s, float c, int q)
 : Employee(first, last)    //调用基类的构造函数
{
 salary = s;
 commission = c > 0 ? c : 0;
 quantity = q > 0 ? q : 0;
} 
//设置销售员每周的基本工资
void CommissionWorker::setSalary(float s)
{
 salary = s > 0 ? s : 0;
} 
 
 
//设置每件产品的回扣额
void CommissionWorker::setCommission(float c)
{
 commission = c > 0 ? c : 0;
} 
 
 
//计算雇员CommissionWorker的薪水
float CommissionWorker::earnings() const
{
 return salary + commission * quantity;
} 
 
 
//打印雇员CommissionWorker的信息
void CommissionWorker::print() const
{
 cout << "\n合同工:" << getFirstName() << ' ' << getLastName();
} 

计时工对象
HourlyWorker.h

#ifndef hourlyworker_h
#define hourlyworker_h
 
 
#include "Employ.h" 
 
 
class HourlyWorker : public Employee
{
public:
 HourlyWorker(const char*, const char*, float = 0.0, float = 0.0);
 void setWage(float);
 void setHours(float);
 virtual float earnings() const;
 virtual void print() const;
private:
 float wage;            //每小时的报酬
 float hours;   //一周工作小时数 
};
 
 
#endif  
HourlyWorker.cpp
#include <iostream>
#include <assert.h>
#include "HourlyWorker.h"
 
 
using namespace std;
 
 
//类HourlyWorker的构造函数
HourlyWorker::HourlyWorker(const char *first, const char *last, float w, float h)
 : Employee(first, last)    //调用基类的构造函数 
{
 wage = w > 0 ? w : 0;
 hours = h > 0 && h < 168 ? h : 0;
}
 
 
// 设置每小时的报酬
void HourlyWorker::setWage(float w)
{
 wage = w;
} 
 
 
//设置每周工作的小时数
void HourlyWorker::setHours(float h)
{
 hours = h > 0 && h < 168 ? h : 0;
} 
 
 
//计算并返回HourlyWorker的薪水
float HourlyWorker::earnings() const
{
 return wage * hours;
} 
 
 
//打印HourlyWorker的信息
void HourlyWorker::print() const
{
 cout << "\n小时工:" << getFirstName() << ' ' << getLastName();
} 

计件工对象
PieceWorker.h

#ifndef pieceworker_h
#define pieceworker_h
 
 
#include "Employ.h"
 
 
class PieceWorker : public Employee
{
public:
 PieceWorker(const char*, const char*, float w, int q);
 void setWage(float);
 void setQuantity(int);
 virtual float earnings() const;
 virtual void print() const;
private:
 float wagePerPiece;            //没见产品的报酬
 int quantity;                  //一周生产的产品数量 
};
 
 
#endif
PieceWorker.cpp
#include <iostream>
#include <assert.h>
#include "PieceWorker.h" 
 
 
using namespace std;
 
 
//类PieceWorker的构造函数
PieceWorker::PieceWorker(const char *first, const char *last, float w, int q)
 : Employee(first, last)    //调用基类的构造函数
{
 wagePerPiece = w > 0 ? w : 0;
 quantity = q > 0 ? q : 0;
} 
 
 
//设置没见产品的回扣额
void PieceWorker::setWage(float w)
{
 wagePerPiece = w > 0 ? w : 0;
} 
 
 
//设置每周的销售量
void PieceWorker::setQuantity(int q)
{
 quantity = q > 0 ? q : 0;
} 
 
 
//计算并返回PieceWorker每周的薪水
float PieceWorker::earnings() const
{
 return wagePerPiece * quantity;
} 
 
 
//打印PieceWorker的信息
void PieceWorker::print() const
{
 cout << "\n计件工:" << getFirstName() << ' ' << getLastName(); 
}
工资发放系统 某公司按月给其雇员发放工资,该公司有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中,退出系统,结束运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值