java for else_关于java:如何使用带有if-else语句的for循环

我必须编写一个名为getGrade的方法,它接受一个表示学生在课程中评分,并返回学生的数字课程成绩。它基于以下比例:

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。这是我的代码:

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");

}

}

}

你实际上不需要一个for循环。看看一个百分点与平均成绩之间的关系。你会看到,每增加一个百分比,平均成绩就会增加0.1。你真的只需要一个简单的算术表达式来计算所需的GPA。

实际上,您可以在else if中执行for语句。你在哪里看到你不能?

"在研究之后,我发现你不能把一个for语句放在一个else if中。"不确定你的研究把你引向何处,但这是错误的。但是正如@rayryeng指出的那样,有一种更简单的方法可以从分数到GPA。

我刚刚重读了你的问题。我想看看你在哪里发现不允许在else-if语句中放入for循环?这不可能比圣诞老人的存在更假。

在某些情况下,最好只在if语句中设置等级,并在函数结束时返回一次。否则,不需要使用grade变量。

@Willmauiller return grade = x.yz;看起来像是return 4.0;和grade = 4.0;的混合体,最后是return。

@三倍:同意。另外,为什么不直接返回值呢?它使代码比设置变量并返回变量更简洁。反正看起来很奇怪。正如你所说,这是一个混合体。为什么不这样或那样做呢?imho,最好在功能结束时返回到您有一个出口点的完整位置。不过,这可能是主观的。

@威尔马奎勒-我同意你的看法。我会直接返回值,因为它不那么容易混淆。

谢谢你的考虑。为了说明我的观点,我还发布了一个答案。Hth.

解决for环路误区:

如果我正确理解你,你会尝试这样做:

grade = 0.7;

for (int i = 63, i <= score; i++)

{

return grade + 0.1;

}

这个变量的问题是,return不等待for循环完成返回值,而是在调用时直接返回值。解决这个问题的方法是将return移动到语句的末尾,以实际返回完全计算的值。

我们甚至可以通过直接计算值跳过for循环:

else if(score >= 63 && score <= 94)

{

return 0.7 + (0.1 * (score - 62));

}

否则,这只是计算:

else if(score >= 63 && score <= 94)

{

grade = 0.7;

for (int i = 63, i <= score; i++)

{

grade += 0.1;

}

return grade;

}

正如其他人所指出的,我也对你读到的在else if语句中不可能使用for循环感兴趣…

为了教育学的目的,下面是我写作的方法。

IsOutOfFrange()

我建议提取这个方法,以使它明显地显示出意图是什么。虽然这里非常简单,但在其他一些场景中,它变得不那么明显,代码变得越来越难阅读。就我而言,养成这个习惯是很好的做法。

private bool isOutOfAllowedRange(score) { return score < 0 || 100 < score; }

单出口点

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;

}

在这种情况下,几乎不需要单一的出口点。单出口点很有用的场景是,当您必须处理结果值以进行计算或基于该值执行某些操作时,记录它或进行其他操作。遇到这样写的函数的人理解函数的控制流,知道无论发生什么,它都会在预期的地方退出。一旦一个条件符合true的条件,其余未经检查的条件将永远保持不变,直到新的分数出现。

多个出口点

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...

首先,这里说明的要点是不需要检查间隔。通过在开始时检查其是否超出预期范围,确保其余部分符合以下条件之一。

第二,只要条件符合true的条件,代码就会将其他条件挥手而去,直接进入函数出口点。注意,如果我在开始时验证了<= 100,一旦通过isOutOfRange()验证,它将始终是合格的。

第三,你可能会注意到,如果分数小于60,成功通过了第一次范围检查,这意味着我们已经知道分数是多少。此外,如果分数不低于60,则自动验证if (score < 63)。对于所有低于95分的分数,即63到94分之间的分数,代码应自行计算。实际上不需要检查它是否在63和94之间,因为我们已经知道如果进行这种评估,那是因为分数已经大于或等于63。唯一需要知道的是,它是否低于下一个年级,也就是说,它是否符合4年级的条件。

第四,一旦代码断定没有其他值符合条件,就可以确定末尾的值是最后一个等级步骤,等级4.0。

希望我已经足够清楚地被理解了,这将有一天为某人服务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值