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