-1

我正在使用 C 语言开发员工薪酬程序,我正在尝试找到一种更好的方法来组织代码来计算小时工的薪酬。我想使用 switch 语句,而不是一大堆 if 语句。我只是想知道这是否可能?案例需要一个值还是可以保持空白?例如,我可以只使用“ case :”而不是“ case value1 :”吗?我知道如果我确实使用了 switch 语句,我可能不得不使用 if's 来验证用户输入的内容是否有效。还是我应该坚持一堆如果?

如果您想知道,以下是我需要遵循的指示:

  1. 一家公司向其雇员支付: a) 经理,他们获得固定的周薪;b) 小时工,他们在工作的前 40 小时和“半小时”内获得固定的小时工资,即加班时间的小时工资的 1.5 倍;c) 佣金工人,他们收到 250 美元外加每周销售额的 5.7%;或 d) 计件工人,他们为每件生产的每件商品获得固定金额。

编写一个程序来计算每个员工的每周工资。您事先不知道员工人数。每种员工类型都有自己的工资代码:

1 经理
2小时工
3 佣金工人
4 计件工。

编写一个单独的函数来处理每种支付代码类型。使用开关根据员工的工资代码计算每个员工的工资。在开关中,提示用户输入程序需要的适当事实,以根据该员工的工资代码计算每个员工的工资。
酌情添加合理性检查(例如,工资在 0 - 100000 之间,工作小时在 0 - 84 之间,小时工资在 0 - 250 之间,每周销售额在 0 - 1000000 之间,件数在 1 - 1000 之间,每件工资在 0.01 - 1000 之间. 使用常量)。

以下是程序常量:#include

//  constants
#define MANAGERS                1
#define HOURLY_WORKERS          2
#define COMMISSION_WORKERS      3
#define PIECEWORKERS            4
#define STOP_PROGRAM            -1
#define COMMISSION_PERCENT      0.057
#define COMMISSION_PAY          250
#define OVERTIME_HOURS          1.5
#define MAX_HOURS_WORKED        40

这是我到目前为止的每小时工作人员功能的代码:

void calcHourlyWorkerPay()
{
    float hourlyPayRate;
    int totalHoursWorked;
    float totalPay;

    printf("You entered 2 for Hourly Worker.\n\n");
    printf("Enter hourly pay rate.\n" 
        "(Entry must be between 0 and 250): ");
    scanf  ("%f", &hourlyPayRate);
    printf("Enter total hours worked.\n" 
        "(Entry must be between 0 and 84): ");
    scanf  ("%d", &totalHoursWorked);

    if ((totalHoursWorked <= MAX_HOURS_WORKED) && (totalHoursWorked >= 84))
    {

    }
}

我问的原因是因为我想为此添加验证,如果用户输入的数字不在 0 到 84 之间,它会说“输入无效,请输入 0 到 84 之间的数字”。我还想添加验证,如果用户输入的每小时费率不在 0 到 250 之间,它会说“输入无效,请输入 0 到 250 之间的数字”。我希望我没有混淆任何人。我可能犯了一些错误,我应该指出我对 C 编程非常陌生。

已编辑

我将 if 语句编辑如下:

if (((totalHoursWorked >= 0) && (totalHoursWorked <= 84)) && ((hourlyPayRate >= 0) && (hourlyPayRate <= 250)))
{
    totalPay = totalHoursWorked * hourlyPayRate;
}
else if ((totalHoursWorked <= 0) || (totalHoursWorked >= 84))
{
    printf("\n\nINVALID!!!  Total hours worked MUST be between 0 and 84.\n\n");
    printf("Enter total hours worked.\n" 
        "(Entry must be between 0 and 84): ");
    scanf  ("%d", &totalHoursWorked);

}
else if ((hourlyPayRate <= 0) || (hourlyPayRate >= 250))
{
    printf("\n\nINVALID!!!  Hourly pay rate MUST be between 0 and 250.\n\n");
    printf("Enter hourly pay rate.\n" 
        "(Entry must be between 0 and 250): ");
    scanf  ("%f", &hourlyPayRate);
}
else
{
    totalPay = (MAX_HOURS_WORKED * hourlyPayRate) + ((hoursWorked - MAX_HOURS_WORKED) * hourlyPayRate * OVERTIME_HOURS);
}

这是正确的,它会起作用吗?

4

1 回答 1

0

一方面,您在一个表达式中检查 (totalHoursWorked >= 0) 是否在“else”条件中检查 (totalHoursWorked <= 0)。与零相等的检查应该只存在于其中一个检查中。您还应该将常用表达式分解以简化它们 - 例如,您已经检查了诸如 totalHoursWorked 之类的值是否在一个条件下的范围内,但是如果表达式的计算结果为 false,您将进一步向下检查它,因为您过于复杂通过将其与 hourlyPayRate 的检查相结合。如果您需要知道涉及变量的表达式是否失败,您应该将其设为该表达式中的唯一变量,并保存其他值的健全性检查,直到第一次检查通过。

如果重新输入尝试中的值超出范围,也不清楚会发生什么。如果失败,它会要求您重新输入该值,但不会再次检查。您需要将输入和验证逻辑放在一个构造中,该构造将重复直到值在范围内(或者他们表示他们想要退出),无论他们输入了多少次无效值。

由于重点是使用常量,因此您用于验证检查的值也应该是常量。

于 2014-09-28T00:52:56.093 回答