工资支付系统:
- 要求:为某公司编写一个工资支付系统,用于计算某一类员工的月薪。该公司共有四类员工:领固定月薪的(SalariedEmployee);计时取酬的(HourlyEmployee,如果一月工时超过160小时,则还需对额外的工时支付加班费);按销售额提成(CommissionEmployee)的和带底薪并按销售额提成的(BasePlusCommissionEmployee),其继承层次结构如下所示。已知每类员工均有表示员工工号、姓名和出生年月的属性,和用于计算员工月薪的方法。创建一个Employee变量数组,保存Employee类层次结构中每个具体类对象的引用,对每个Employee显示其工号、姓名、出生年月和月收入,如果当月是Employee的生日所在的月份,则还另发给他100元作为红包。
- 继承关系图如下:
![继承关系图](https://img-blog.csdnimg.cn/20201205204333750.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTgyNDMwMw==,size_16,color_FFFFFF,t_70)
- 代码实现:
abstract class Employee {
public int number;
public String name;
public int birthYear;
public int birthMonth;
public static int salary;
public abstract int salary();
}
public interface GetSalaryPerMonth {
int SalaryPerMonth = 5000;
}
public interface GetWorkHour {
int SalaryPerHour = 30;
int OvertimeSalaryPerHour = 40;
}
public interface GetSale {
int SalaryPerSale = 10;
}
public interface GetBaseSalary {
int BaseSalary = 1000;
}
import java.util.Calendar;
public class SalariedEmployee extends Employee implements GetSalaryPerMonth{
public static int RedEnvelope = 100;
public int salary() {
int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
if (month == birthMonth)
salary = SalaryPerMonth + RedEnvelope;
else
salary = SalaryPerMonth;
return salary;
}
}
import java.util.Calendar;
import java.util.InputMismatchException;
import java.util.Scanner;
public class HourlyEmployee extends Employee implements GetWorkHour {
public static double RedEnvelope = 100;
public static int StandardWorkTime = 160;
public int salary() {
try {
int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
int WorkHour;
System.out.print("请输入您的工时:");
WorkHour = new Scanner(System.in).nextInt();
if (WorkHour < 0)
{
System.out.println("请输入正整数!");
return salary();
}
else
{
if (WorkHour > StandardWorkTime)
salary = SalaryPerHour * StandardWorkTime + OvertimeSalaryPerHour * (WorkHour - 160);
else
salary = SalaryPerHour * WorkHour;
if (month == birthMonth)
salary += RedEnvelope;
return salary;
}
}
catch (InputMismatchException e)
{
System.out.println("请输入整数!");
return salary();
}
}
}
import java.util.Calendar;
import java.util.InputMismatchException;
import java.util.Scanner;
public class CommissionEmployee extends Employee implements GetSale{
public static double RedEnvelope = 100;
public int salary() {
try {
int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
int AmountOfSale;
System.out.print("请输入您的销售量:");
AmountOfSale = new Scanner(System.in).nextInt();
if (AmountOfSale < 0)
{
System.out.println("请输入正整数!");
return salary();
}
else
{
salary = AmountOfSale * SalaryPerSale;
if (month == birthMonth)
salary += RedEnvelope;
return salary;
}
}
catch (InputMismatchException e)
{
System.out.println("请输入整数!");
return salary();
}
}
}
import java.util.Calendar;
import java.util.InputMismatchException;
import java.util.Scanner;
public class BasePlusCommissionEmployee extends Employee implements GetSale,GetBaseSalary {
public static int RedEnvelope = 100;
public int salary() {
try {
int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
int AmountOfSale;
System.out.print("请输入您的销售量:");
AmountOfSale = new Scanner(System.in).nextInt();
if (AmountOfSale < 0)
{
System.out.println("请输入正整数!");
return salary();
}
else
{
salary = BaseSalary + AmountOfSale * SalaryPerSale;
if (month == birthMonth)
salary += RedEnvelope;
return salary;
}
}
catch (InputMismatchException e)
{
System.out.println("请输入整数!");
return salary();
}
}
}
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.regex.Pattern;
public class PayrollSystem {
public static int choice;
public static int choice()
{
try {
choice = new Scanner(System.in).nextInt();
if (choice < 0 || choice > 4)
{
System.out.println("请输入整数0-4!");
return choice();
}
else if (choice == 0)
System.exit(0);
else
return choice;
}
catch (InputMismatchException e)
{
System.out.println("请输入整数!");
return choice();
}
return -1;
}
public static int get_number()
{
Scanner sc = new Scanner(System.in);
System.out.print("请输入工号:");
try {
int number = sc.nextInt();
if (number <= 0)
{
System.out.println("请输入正整数!");
return get_number();
}
return number;
}
catch (InputMismatchException e)
{
System.out.println("请输入整数!");
return get_number();
}
}
public static String get_name()
{
Scanner sc = new Scanner(System.in);
System.out.print("请输入姓名:");
String name = sc.next();
Pattern pattern = Pattern.compile(".*\\d+.*");
if (pattern.matcher(name).matches())
{
System.out.println("不能输入数字");
return get_name();
}
return name;
}
public static int get_birthYear()
{
Scanner sc = new Scanner(System.in);
System.out.print("请输入出生年份:");
try {
int birthYear = sc.nextInt();
if (birthYear < 1900 || birthYear > 2021)
{
System.out.println("输入有误,请重新输入!");
return get_birthYear();
}
return birthYear;
}
catch (InputMismatchException e)
{
System.out.println("请输入数字!");
return get_birthYear();
}
}
public static int get_birthMonth()
{
Scanner sc = new Scanner(System.in);
System.out.print("请输入出生月份:");
try {
int birthMonth = sc.nextInt();
if (birthMonth < 1 || birthMonth > 12)
{
System.out.println("输入有误,请重新输入!");
return get_birthMonth();
}
return birthMonth;
}
catch (InputMismatchException e)
{
System.out.println("请输入数字!");
return get_birthMonth();
}
}
public static void main(String[] args) {
Employee []Data = new Employee[4];
Data[0] = new SalariedEmployee();
Data[1] = new HourlyEmployee();
Data[2] = new CommissionEmployee();
Data[3] = new BasePlusCommissionEmployee();
System.out.println("请输入员工类型:1.领固定月薪 2.计时取酬 3.按销售额提成 4.带底薪并按销售额提成 0.退出");
choice = choice();
switch (choice)
{
case 1:
{
Data[0].number = get_number();
Data[0].name = get_name();
Data[0].birthYear = get_birthYear();
Data[0].birthMonth = get_birthMonth();
System.out.println("处理结果:");
System.out.println("工号:"+Data[0].number);
System.out.println("姓名:"+Data[0].name);
System.out.println("出生年月:"+Data[0].birthYear+"年"+Data[0].birthMonth+"月");
System.out.println("工资:"+Data[0].salary());
break;
}
case 2:
{
Data[1].number = get_number();
Data[1].name = get_name();
Data[1].birthYear = get_birthYear();
Data[1].birthMonth = get_birthMonth();
int salary = Data[1].salary();
System.out.println("处理结果:");
System.out.println("工号:"+Data[1].number);
System.out.println("姓名:"+Data[1].name);
System.out.println("出生年月:"+Data[1].birthYear+"年"+Data[1].birthMonth+"月");
System.out.println("工资:"+salary);
break;
}
case 3:
{
Data[2].number = get_number();
Data[2].name = get_name();
Data[2].birthYear = get_birthYear();
Data[2].birthMonth = get_birthMonth();
int salary = Data[2].salary();
System.out.println("处理结果:");
System.out.println("工号:"+Data[2].number);
System.out.println("姓名:"+Data[2].name);
System.out.println("出生年月:"+Data[2].birthYear+"年"+Data[2].birthMonth+"月");
System.out.println("工资:"+salary);
break;
}
case 4:
{
Data[3].number = get_number();
Data[3].name = get_name();
Data[3].birthYear = get_birthYear();
Data[3].birthMonth = get_birthMonth();
int salary = Data[3].salary();
System.out.println("处理结果:");
System.out.println("工号:"+Data[3].number);
System.out.println("姓名:"+Data[3].name);
System.out.println("出生年月:"+Data[3].birthYear+"年"+Data[3].birthMonth+"月");
System.out.println("工资:"+salary);
break;
}
default:
System.out.println("error");
}
}
}
- 测试结果
![测试结果](https://img-blog.csdnimg.cn/20201205211411216.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTgyNDMwMw==,size_16,color_FFFFFF,t_70)