C - 交换声明与员工薪酬的声明吗?

时间:2014-09-27 23:48:53

标签: c if-statement switch-statement nested-if

我正在研究C中的员工薪酬计划,我正在努力寻找一种更好的方法来组织计算小时工薪酬的代码。我想使用switch语句,而不是使用ifload语句。我只是想知道这是否可能?案件是需要一个价值还是可以保持空白?例如,我可以只使用“案例:”而不是“案例 value1 :”?我知道如果我使用switch语句,我可能必须使用它来验证用户输入的内容是否有效。或者我应该坚持一堆if??

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

  1. 公司向员工支付以下费用:a)经理,收到固定的 每周工资; b)每小时工人,他们可获得固定的小时工资 他们工作的前40个小时和“一个半小时”,即每小时的1.5倍 加班工资; c)佣金工人,他们获得250美元加上5.7%的佣金 他们的每周销售;或者d)工件制造者,每件物品的固定金额 每个项目都有。
  2. 编写一个程序来计算每位员工的每周工资。你不知道 提前雇员人数。每种员工类型都有自己的薪资代码:

    1为经理人 2小时工人 委员会工人3 4为Pieceworkers。

    编写一个单独的函数来处理每种付费代码类型。使用开关 根据该员工的薪资代码计算每个员工的薪酬。内 切换,提示用户输入相应的事实程序 需要根据该员工的薪资来计算每个员工的薪酬 适当时添加合理性检查(例如,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编程非常陌生。

    EDITED

    我编辑了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);
    }
    

    这是否正确,是否有效?

1 个答案:

答案 0 :(得分:0)

首先,您要检查一个表达式中是否(totalHoursWorked&gt; = 0),并且&#34; else&#34;中的(totalHoursWorked&lt; = 0)条件。对零等式的检查应仅存在于其中一个检查中。您还应该将常用表达式分解出来以简化它们 - 例如,您已经检查了像totalHoursWorked这样的值是否在一个条件的范围内,但如果表达式的计算结果为false,则您需要进一步重新检查它,因为您&# 39;通过将它与hourlyPayRate的检查相结合,使其过于复杂。如果您需要知道涉及变量的表达式是否失败,您应该将其作为该表达式中唯一的变量,并保存其他值的完整性检查,直到第一次检查通过。

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

由于我们专注于使用常量,因此您用于验证检查的值也应保持不变。