繁体   English   中英

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

[英]How to use a for loop with an if-else statement

我必须编写一个名为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循环,但是我无法使其正常工作,因为该方法正在寻找一个return语句,并且不喜欢我里面的那个嵌套的for循环。 经过研究,我发现您不能在else-if内放入for语句。 既然如此,我该如何编码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循环的误解:

如果我正确理解了您,则您尝试这样做:

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循环感兴趣...

为了教学法,这是我的写法。

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)自动验证if (score < 63) 对于所有其他小于95(即63到94)的分数,代码应自行进行数学计算。 实际上,没有必要检查它是否在63到94之间,因为我们已经知道,如果进行此评估,那是因为该分数已经大于或等于63。它小于下一等级,即是否符合4分。

第四,一旦代码得出没有其他值合格的结论,就可以确保最后的值是最后的等级步骤,即4.0级。

希望我已经足够清楚地理解,并且这将有一天对某人有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM