【问题标题】:"else if" prints the last written "else if"\"else if\" 打印最后写的 \"else if\"
【发布时间】:2022-11-28 00:04:57
【问题描述】:

所以我正在制作这个简单的 Java 程序,它可以确定您是否拥有最高荣誉、高级荣誉、荣誉或无荣誉。下面是调试代码:

import java.util.Scanner;
        public class StudentInfo {
                    public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StudentInfo2 a = new StudentInfo2();

    System.out.print("Enter First Name: ");
        var setFirstname = sc.nextLine();

        System.out.print("Enter Last Name: ");
            String setLastname = sc.nextLine();

    System.out.print("Enter Math Grade: ");
        Double setMathgrade = sc.nextDouble();

    System.out.print("Enter Science Grade: ");
        Double setSciencegrade = sc.nextDouble();

    System.out.print("Enter Java Grade: ");
        Double setJavagrade = sc.nextDouble();

    System.out.print("Enter HTML Grade: ");
            Double setHTMLgrade = sc.nextDouble();

Double average = setMathgrade + setSciencegrade + setJavagrade + setHTMLgrade;

System.out.println("Fullname: " + setFirstname + " " + setLastname);
System.out.println("Average grade: " + average / 4);

if ((average >=98) && (average <=100))
{ 
    System.out.print("With Highest Honors"); 
    
}

else if ((average >=94) && (average <= 97))
{ 
    System.out.print ("With High Honors");
}

else if ((average >=90) && (average <=93)) 
        {
System.out.print("With Honors"); 
        
    }
        
else if (average >89) {
System.out.print("No Honors!");
}

}

}

目标是如果平均成绩高于 98,它将打印“最高荣誉”。 97-94 会打印“High Honors”,93-90 会打印“With Honors”,低于 89 的任何内容都会打印“No honors”。问题是,即使平均成绩高于 89,它仍然会打印“No honors”。

【问题讨论】:

  • 请花些时间缩进您的代码——您的 IDE 可能会帮助您自动执行此操作。它会让它很多更容易阅读你的代码。
  • if (average &gt;89) == anything below 89???来吧,先阅读你自己的代码,然后再将其发布到这里
  • 提示:当然还有average &gt; 89不是对应于“低于 89 的任何值”,您似乎忽略了一个事实,即您的平均值是 Double,而不是整数。它也根本不是一个平均值——它是只是一笔钱。 (您打印出 average / 4,但这不会更改 average 的值。)例如,如果平均值为 97.5,请考虑您要打印什么,以及您当前的代码如何处理它。
  • 简而言之,如果实际平均分超过 25(总分超过 100),您将获得“无荣誉”!
  • 然后就是平均 97.5(例如)的问题让你一无所获。 “if”树被过度指定;第二个“如果”(例如)应该只是if (average &gt;= 94),我们已经知道它小于 98(或大于 100,但编码的 100 的上限检查是其他漏洞)。

标签: java if-statement calculator


【解决方案1】:

第一的:

Double average = setMathgrade + setSciencegrade + setJavagrade + setHTMLgrade;

这不是平均数,而是总和。将此更改为:

Double average = (setMathgrade + setSciencegrade + setJavagrade + setHTMLgrade) / 4d;

接下来,通过排序和删除上限来关注您的 if/else 语句:

if(average >= 98.0) {
} else if(average >= 94.0) {
} else if(average >= 89.0) {
} else {
}

计算出的平均值将通过此 if-else-sequence 自上而下,并且将触发第一个匹配项或最终 else 块。

【讨论】: