为什么忽略我的if / else语句?

时间:2011-08-20 02:58:59

标签: java eclipse if-statement

所以我正在关注java 6.092课程@ mit ocw的介绍。我正在上第二课,但我尝试的任何事情似乎都使该计划正常运作。

我甚至注意到在第3课开始的第2课评论中提供的我的代码版本有类似的问题。 [编辑] - 课程中的代码不完整,因为我忘记添加变量。

  

员工获得报酬(工作小时数)×(基本工资),每小时最多40小时   对于超过40的每小时,他们得到加班=(基本工资)×1.5   基本工资不得低于最低工资(每小时8.00美元)   如果是,则打印错误。如果小时数大于60,则打印错误消息。

这是我尝试解决方案:

public static void main(String[] arguments) {
    int startOT = 40; 
    int maxH = 60;
    double otPay = 1.5;
    int emp1Hours = 35, emp2Hours = 47, emp3Hours = 73;
    double emp1Pay = 7.50, emp2Pay = 8.20, emp3Pay = 10.00;

    double swer;
    if (emp1Hours > startOT){
        swer = emp1Pay * startOT + (emp1Pay * otPay) * (emp1Hours - startOT);
        System.out.println("Employee John Doe makes " + "$" + swer + " this week!");
    }else if (emp1Hours > maxH){
        System.out.println("@John Doe ERROR! Hours worked is invalid!");
    }
    else if (emp1Pay < 8){
        System.out.println("Invalid hourly pay ;(");
    }
    else {
        swer = emp1Pay * emp1Hours;
        System.out.println("Employee John Doe makes " + "$" + swer + " this week!");
    }

    double swerzie;
    if (emp2Hours > startOT){
        swerzie = emp2Pay * startOT + (emp2Pay * otPay) * (emp2Hours - startOT);
        System.out.println("Employee Jane Doe makes " + "$" + swerzie + " this week!");
    }else if (emp2Hours > maxH){
        System.out.println("@Jane Doe ERROR! Hours worked is invalid!");
    }
    else if (emp2Pay < 8){
         System.out.println("Invalid hourly pay ;(");
    }
    else {
        swerzie = emp2Pay * emp2Hours;
        System.out.println("Employee Jane Doe makes " + "$" + swerzie + " this week!");
    }

    double answer;
    if (emp3Hours > startOT){
        answer = emp3Pay * startOT + (emp3Pay * otPay) * (emp3Hours - startOT);
        System.out.println("Employee malcom smith makes " + "$" + answer + " this week!");
    }else if (emp3Hours == 73){
        System.out.println("@malcom smith ERROR! Hours worked is invalid!");
    }
    else if (emp3Pay < 8){
         System.out.println("Invalid hourly pay ;("); }
    else {
        answer = emp3Pay * emp3Hours;
        System.out.println("Employee malcom smith makes " + "$" + answer + " this week!");
    }
}

以下是该计划的输出:

-Invalid hourly pay ;(
-Employee Jane Doe makes $414.1 this week!
-Employee malcom smith makes $895.0 this week!

2 个答案:

答案 0 :(得分:7)

请参阅,您的代码重复(重复)所有逻辑和计算这是,呃,次优。

想象一个以hours_workedbase_pay为参数的过程,并打印所获得的总和或错误消息。然后将其应用于三个不同的员工三次。

有些事情如下:

from java.math import BigDecimal; // money is never float or double.

public static void calculateWage(String name, BigDecimal hourly_rate, int hours) {
    final int OVERTIME_THRESHOLD = 40;
    final int HOURS_LIMIT = 60;
    final BigDecimal MIN_HOURLY_RATE = new BigDecimal("8.00"); 
    // ^^^ again, never store money in a floating point form!


    if (hours > HOURS_LIMIT) {
        // what do you do?
    }

    if (hourly_rate.compareTo(MIN_HOURLY_RATE) < 0) { // less than
        // what do you do?
        // now think how to merge it with previous
    }

    if (hours > OVERTIME_THRESHOLD) {
        int overtime = hours - OVERTIME_THRESHOLD;
        // calculate two values and sum them up
    }
    else { // no overtime
        // calculate just one value
    }
}

public static void main(String[] args) {
    calculateWage("John", new BigDecimal("7.50"), 73);
    calculateWage("Jane", /* well, you see*/);
}

这段代码不是更具可读性和整洁性吗?你的也可以。

答案 1 :(得分:1)

代码的第一部分看起来很好:

 double emp1Pay = 7.50,...
 ...
 if (emp1Hours > startOT){
   ...
 else if (emp1Pay < 8){ System.out.println("Invalid hourly pay ;("); }

如果emp1Pay为&lt; 8:

,这将完全打印出您所期望的内容

“每小时工资无效;(”。

SUGGESTIONS:

1)在Eclipse调试器下一次一行地执行代码。关注正在发生的事情 - 以及为什么。

2)考虑一下“散布你的代码”。

我希望你的课程示例不使用那种编码风格 - 将所有内容聚集在一起使得它很难阅读。我只能想象初学者一定有多难。

这是一个更好的编码风格示例:

http://java.sun.com/docs/codeconv/html/CodeConventions.doc3.html

3)考虑将您的逻辑分解为单独的方法。不要复制代码(每个值一次),只需调用新方法三次(使用三组不同的参数 - 但只需一个代码块)。