如何使用if-else语句的for循环

时间:2014-08-14 19:58:47

标签: java if-statement for-loop

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

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

2 个答案:

答案 0 :(得分:4)

解决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;
}

正如其他人所指出的那样,我也对你在哪里读到在for陈述中不可能使用else if循环感兴趣...

答案 1 :(得分:2)

为了教学,我就是这样写的。

<强> isOutOfRange()

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

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;
}

使用多个出口点的优点在于优选的简单功能,其中很容易理解,一旦获得结果,就不需要继续。代码买了它的来源并准备拿出来。当函数变得越来越复杂时,编写这样的多个退出点有时会更加混乱。确保尊重单一责任原则,可以避免过于复杂的功能。

最好有单个还是多个退出点?

说实话,这或多或少是一个主观问题。最好的答案是:“它取决于”。基于如上所述的某些标准,人们可以巧妙地决定何时使用它们。

  

旁注......

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

其次,一旦条件限定true,代码就会挥动其他条件并直接进入函数退出点。请注意,如果我在开始时验证了<= 100,那么一旦通过isOutOfRange()验证,它就会始终合格。

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

第四,一旦代码得出结论,没有其他值符合条件,可以确定最后的值是最终成绩步骤,等级4.0。

希望我已经足够清楚地理解了这一点,并且这有一天会成为某人的目的。