使用Java中的嵌套if语句从数字输入计算字母等级

使用Java中的嵌套if语句从数字输入计算字母等级,java,nested-if,Java,Nested If,我的家庭作业任务是创建一个程序,该程序接受0-100之间的数字输入,并在适当的情况下返回字母和+/-。我们将使用嵌套的if语句来实现这一点。我试图创建一个外部if语句,该语句将返回字母级别,后面是嵌套的if语句,该语句将返回+/-部分 我收到的输出从6543到00不等。我复制了下面的代码。谁能给我指一下正确的方向吗?我觉得这有点乱 import java.util.Scanner; import java.lang.Math; public class Grade { public s

我的家庭作业任务是创建一个程序,该程序接受0-100之间的数字输入,并在适当的情况下返回字母和+/-。我们将使用嵌套的if语句来实现这一点。我试图创建一个外部if语句,该语句将返回字母级别,后面是嵌套的if语句,该语句将返回+/-部分

我收到的输出从6543到00不等。我复制了下面的代码。谁能给我指一下正确的方向吗?我觉得这有点乱

import java.util.Scanner;
import java.lang.Math;

public class Grade {
    public static void main (String [] args) {

        Scanner scan = new Scanner (System.in);

//Prompt user to enter grade

        System.out.println("Please enter your grade ");
        int grade = scan.nextInt();
        byte grade1 = (0);
        byte note = (0);

//Determine letter and +/-

        if ( grade <= 100 && grade >= 90 ) {
            grade1 = 'A';
            if (grade <= 100 && grade >= 96) {
                note = '+';
            }
            else if (grade <= 94 && grade >= 90) {
                note = '-';
            }
        }

        else if ( grade <= 80 && grade >= 89 ) {
            grade1 = 'B';
            if (grade <= 89 && grade >= 86) {
                note = '+';
            }
            else if (grade <= 84 && grade >= 80) {
                note = '-';
            }
        }

        else if ( grade <= 70 && grade >= 79 ) {
            grade1 = 'C';
            if (grade <= 79 && grade >= 76) {
                note = '+';
            }
            else if (grade <= 74 && grade >= 70) {
                note = '-';
            }
        }        

        else if ( grade <= 60 && grade >= 69 ) {
            grade1 = 'D';
            if (grade <= 69 && grade >= 66) {
                note = '+';
            }
            else if (grade <= 64 && grade >= 60) {
                note = '-';
            }
        }

        else if ( grade <= 59 ) {
            grade1 = 'F';
        }

//Print out grade

        System.out.println("You have a " + grade1 + note + " in the class.");

// End program
        scan.close();
        System.exit(0);        
    }
}
import java.util.Scanner;
导入java.lang.Math;
公营班级{
公共静态void main(字符串[]args){
扫描仪扫描=新扫描仪(System.in);
//提示用户输入等级
System.out.println(“请输入您的成绩”);
int grade=scan.nextInt();
字节等级1=(0);
字节注释=(0);
//确定字母和+/-
如果(等级=90){
一级=‘A’;
如果(等级=96){
注=“+”;
}
否则,如果(等级=90){
注='-';
}
}
其他条件(等级=89){
一级=‘B’;
如果(等级=86){
注=“+”;
}
否则,如果(等级=80){
注='-';
}
}
否则,如果(等级=79){
一级=‘C’;
如果(等级=76){
注=“+”;
}
否则,如果(等级=70){
注='-';
}
}        
否则,如果(等级=69){
一级=‘D’;
如果(等级=66){
注=“+”;
}
否则,如果(等级=60){
注='-';
}
}
其他如有需要(职系)
else如果(等级=89){

花点时间考虑一下这个问题。我想你打算让例如
85
引发这个问题,对吧

85小于或等于80吗?我不认为是。它也不是89或更高。事实上,没有任何数字会满足这个条件

翻转你的
符号:)


第二个问题是grade1和note是字节,它们是数字,所以“你有一个”+(一些数字)+(一些其他数字)+“在类中”总是会打印“你有一个12345677在类中”,也就是说,这些都是数字。我不知道你为什么认为
byte
会在这里起作用。再试试
char

这里有另一个建议,让我们减少代码的复杂度。只要你按升序计算数字等级,你就不需要一个低分和一个高分通用电气

if (grade >= 90) {
    // you know it's an A so decide what type
    grade1 = 'A';
    if (grade >= 96) {
        note = '+';
    } else if (grade <= 94) {
      // note that here it can'be less than 90 since you're
      // already in the >= 90 conditional block
        note = '-';
    }
// it wasn't an A so continue on
} else if (grade >= 80) {
   // must be a B so determine what type
    grade1 = 'B';

    // Can't be >= 90 since you already processed that case.
    // Had it succeeded, you wouldn't be here.
    if (grade >= 86) {
        note = '+';
    } else if (grade <= 84) {
    // can't be less than 80 since you are in 
    // the >= 80 conditional block.
        note = '-';
    }
    // so continue on in that manner.

} else if (grade >= 70) {
...
...
使用键作为阈值和值作为等级输入等级。明确添加结束等级。其他等级添加到其范围的顶部。选择的等级是索引
i/10-6
处的字符,并为给定范围添加适当的后缀

map.put(100,"A+");
map.put(59, "F");
for (int i = 65; i <= 100; i+= 10) {
    String grade = grades.charAt(i/10-6)+"";
    map.put(i+4, grade+"+");
    map.put(i, grade);
    map.put(i-1,grade+"-");
}
印刷品

100 A+
99 A+
98 A+
97 A+
96 A+
95 A
94 A-
93 A-
92 A-
91 A-
90 A-
89 B+
88 B+
87 B+
86 B+
85 B
84 B-
83 B-
82 B-
81 B-
80 B-
我觉得这有点乱

import java.util.Scanner;
import java.lang.Math;

public class Grade {
    public static void main (String [] args) {

        Scanner scan = new Scanner (System.in);

//Prompt user to enter grade

        System.out.println("Please enter your grade ");
        int grade = scan.nextInt();
        byte grade1 = (0);
        byte note = (0);

//Determine letter and +/-

        if ( grade <= 100 && grade >= 90 ) {
            grade1 = 'A';
            if (grade <= 100 && grade >= 96) {
                note = '+';
            }
            else if (grade <= 94 && grade >= 90) {
                note = '-';
            }
        }

        else if ( grade <= 80 && grade >= 89 ) {
            grade1 = 'B';
            if (grade <= 89 && grade >= 86) {
                note = '+';
            }
            else if (grade <= 84 && grade >= 80) {
                note = '-';
            }
        }

        else if ( grade <= 70 && grade >= 79 ) {
            grade1 = 'C';
            if (grade <= 79 && grade >= 76) {
                note = '+';
            }
            else if (grade <= 74 && grade >= 70) {
                note = '-';
            }
        }        

        else if ( grade <= 60 && grade >= 69 ) {
            grade1 = 'D';
            if (grade <= 69 && grade >= 66) {
                note = '+';
            }
            else if (grade <= 64 && grade >= 60) {
                note = '-';
            }
        }

        else if ( grade <= 59 ) {
            grade1 = 'F';
        }

//Print out grade

        System.out.println("You have a " + grade1 + note + " in the class.");

// End program
        scan.close();
        System.exit(0);        
    }
}
是的,条件语句往往具有这种效果。对于具有多个分支的代码和重复次数较多的代码,这些术语是“高”的(请注意,其中有许多分支具有
note='-';
note='+';
,这些分支大多可以移到一个分支中,并在确定字母等级后追加)

虽然一开始编写这样的代码很有启发性(在本例中是必需的),但很高兴看到有更好的方法来实现结果。对于讨厌的分支逻辑,典型的解决方案是找到一个模式并使用某种类型的查找表。在本例中,字符串
“ffffff dcbaa”
让我们通过将分数除以10并索引到字符串中来枚举5个可能的等级桶。我们可以通过将分数的模数乘以可用等级桶的数量来确定分数在0-10范围内的位置,从而确定
+
/
-

这是一个完整的例子,有一些测试。它并非完美无瑕,还有一些恼人的边缘情况需要编写显式条件,但我们已经成功地将十几个嵌套的、容易出错的分支减少到了2个(第三个分支被添加来测试前提条件)

还要注意的是,代码从
main
移到了一个可重用的函数中,我们可以根据需要多次调用。用户输入/交互是一个完全独立的模块,最好尽可能远离程序逻辑

我还努力尽可能地避开代码,将它们放在函数顶部的常量中。在某些用例中,这些可能是参数,以使我们的函数更具适应性,但似乎可以肯定的是,评分系统在这个应用程序的生命周期内是固定的

class Grader {
    public static String getGrade(int score) {
        final int MAX_SCORE = 100;
        final int MIN_SCORE = 0;
        final var GRADES = "FFFFFFDCBAA";
        final int BUCKETS = GRADES.length() - 1;

        if (score < MIN_SCORE || score > MAX_SCORE) {
            var msg = "score must be between " + MIN_SCORE + 
                      " and " + MAX_SCORE + " inclusive";
            throw new IllegalArgumentException(msg);
        }

        final char letter = GRADES.charAt(score / BUCKETS);
        final int adjustment = score % BUCKETS - BUCKETS / 2;

        if (adjustment == 0 || letter == GRADES.charAt(0)) {
            return "" + letter;
        }

        return letter + (adjustment < 0 && score != MAX_SCORE ? "-" : "+");
    }

    public static void main(String[] args) {
        var tests = new int[] {
            0, 16, 59, 60, 72, 75, 89, 90, 93, 95, 96, 100
        };

        for (int test : tests) {
            System.out.println(test + " => " + getGrade(test));
        }
    }
}

为什么
grade1
note
byte
类型,而不是
char
byte
是一种整数类型,即它代表一个整数。因此,如果我们打印
byte
,它会打印为一个数字。您可能想要的是
char
而不是
byte
。旁注:我们可以o使用
char
s作为数字,然后我们得到字符的unicode UTF-8数值。非常感谢。这是我的第一个编程类,到目前为止,在我们完成的几乎所有程序中,我们只使用了,int,byte和double。我确信在一开始的某个时候提到,这些只返回数字,但我不知道我不记得有人特别提到过,而且我的课堂幻灯片或笔记中也没有提到。数学纯粹是疏忽,经过几个小时的研究,我甚至没有注意到。我真的很感谢反馈!
class Grader {
    public static String getGrade(int score) {
        final int MAX_SCORE = 100;
        final int MIN_SCORE = 0;
        final var GRADES = "FFFFFFDCBAA";
        final int BUCKETS = GRADES.length() - 1;

        if (score < MIN_SCORE || score > MAX_SCORE) {
            var msg = "score must be between " + MIN_SCORE + 
                      " and " + MAX_SCORE + " inclusive";
            throw new IllegalArgumentException(msg);
        }

        final char letter = GRADES.charAt(score / BUCKETS);
        final int adjustment = score % BUCKETS - BUCKETS / 2;

        if (adjustment == 0 || letter == GRADES.charAt(0)) {
            return "" + letter;
        }

        return letter + (adjustment < 0 && score != MAX_SCORE ? "-" : "+");
    }

    public static void main(String[] args) {
        var tests = new int[] {
            0, 16, 59, 60, 72, 75, 89, 90, 93, 95, 96, 100
        };

        for (int test : tests) {
            System.out.println(test + " => " + getGrade(test));
        }
    }
}