How to use a for loop with an if-else statement
我必须编写一个名为getGrade的方法,它接受一个表示学生在课程中评分,并返回学生的数字课程成绩。它基于以下比例:
1 2 3 4 5 6 7 8 9 10 11 | Score Grade <60 0.0 60-62 0.7 63 0.8 64 0.9 65 1.0 ... 92 3.7 93 3.8 94 3.9 >= 95 4.0 |
我的输出将是:
"学生的分数是X;学生的分数是Y。"
X分(0-100),Y分(0.0-4.0)
除了63-94分,我什么都想清楚了。似乎这里必须有一个for循环,但我无法让它工作,因为该方法正在查找返回语句,并且不喜欢嵌套for循环中的语句。经过研究,我发现你不能把for语句放在else if中。在这种情况下,我该如何编码分数63-94。这是我的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public class Exercise12 { public static void main(String[] args) { for(int i = 55; i <= 100 ; i++) { System.out.println("Student's score is:" + i + "\tStudent's grade is" + getGrade(i)); } } public static double getGrade(int score) { double grade = 0.0; if(score < 60 && score > 0) { return grade = 0.0; } else if (score >= 60 && score <= 62) { return grade = 0.7; } else if(score >= 63 && score <= 94) { //nested for loop was here } else if(score >= 95 && score <= 100) { return grade = 4.0; } else { throw new IllegalArgumentException("Invalid values. Scores" + "must be between 0 and 100"); } } } |
解决
如果我正确理解你,你会尝试这样做:
1 2 3 4 5 | grade = 0.7; for (int i = 63, i <= score; i++) { return grade + 0.1; } |
这个变量的问题是,
我们甚至可以通过直接计算值跳过for循环:
1 2 3 4 | else if(score >= 63 && score <= 94) { return 0.7 + (0.1 * (score - 62)); } |
否则,这只是计算:
1 2 3 4 5 6 7 8 9 | else if(score >= 63 && score <= 94) { grade = 0.7; for (int i = 63, i <= score; i++) { grade += 0.1; } return grade; } |
正如其他人所指出的,我也对你读到的在
为了教育学的目的,下面是我写作的方法。
IsOutOfFrange()
我建议提取这个方法,以使它明显地显示出意图是什么。虽然这里非常简单,但在其他一些场景中,它变得不那么明显,代码变得越来越难阅读。就我而言,养成这个习惯是很好的做法。
1 | private bool isOutOfAllowedRange(score) { return score < 0 || 100 < score; } |
单出口点
1 2 3 4 5 6 7 8 9 10 11 12 | public double getGrade(int score) { double grade; if (isOutOfAllowedRange(score)) throw new IllegalArgumentException("Score must be between 0 and 100."); else if (score < 60) grade = .0; else if (score < 63) grade = .7; else if (score < 95) grade = .7 + (.1 * (scrore - 62)); // From ThreeFx else grade = 4.0; return grade; } |
在这种情况下,几乎不需要单一的出口点。单出口点很有用的场景是,当您必须处理结果值以进行计算或基于该值执行某些操作时,记录它或进行其他操作。遇到这样写的函数的人理解函数的控制流,知道无论发生什么,它都会在预期的地方退出。一旦一个条件符合
多个出口点
1 2 3 4 5 6 7 8 | public double getGrade(int score) { if (isOutOfAllowedRange(score)) throw new IllegalArgumentException("Score must be between 0 and 100."); else if (score < 60) return .0; else if (score < 63) return .7; else if (score < 95) return .7 + (.1 * (scrore - 62)); // From ThreeFx else return 4.0; } |
使用多个出口点的优点是功能更简单,这样很容易理解一旦获得结果,就不需要继续。代码已经购买了它的目的,并准备删除。当函数变得越来越复杂时,编写这样的多个出口点有时会更加混乱。确保尊重单一责任原则,可以避免功能过于复杂。
最好有一个或多个出口点吗?
老实说,这或多或少是一个主观问题。最好的答案应该是:"视情况而定"。根据上面所描述的某些标准,可以很聪明地决定何时使用它们。
On a side note...
首先,这里说明的要点是不需要检查间隔。通过在开始时检查其是否超出预期范围,确保其余部分符合以下条件之一。
第二,只要条件符合
第三,你可能会注意到,如果分数小于60,成功通过了第一次范围检查,这意味着我们已经知道分数是多少。此外,如果分数不低于60,则自动验证
第四,一旦代码断定没有其他值符合条件,就可以确定末尾的值是最后一个等级步骤,等级4.0。
希望我已经足够清楚地被理解了,这将有一天为某人服务。