【问题标题】:Letter grade to number grade using switch/if statements?使用 switch/if 语句从字母等级到数字等级?
【发布时间】:2015-12-22 02:11:05
【问题描述】:

我的任务是创建一个 java 程序,用户在其中输入等级(D- 到 A+)并获得分数(0.7 到 4.3)

  • 如果用户输入“A”,他们会得到 4....“B” = 3....“C” = 2....“D” = 1。

  • 如果用户在字母后输入“+”或“-”,则最终得分增加或减少0.3

  • 因此,例如,如果用户输入“C+”,他们会得到“2.3”的分数

到目前为止,它仅在用户不添加“+”或“-”时才有效。

所以如果用户只输入一个字母,它就可以工作。

出于某种奇怪的原因,如果用户在字母后输入“+”或“-”,则输出将分别为“0.3”或“-0.3”。

我不知道为什么。我和我的 AP Comp Sci 老师都被难住了。

这是我的代码的相关片段

String letterGrade;
double numericGrade;
Scanner reader = new Scanner(System.in);
public boolean getLetterGrade()
{
    System.out.print("Enter a letter grade: ");
    letterGrade = reader.nextLine();
    return (letterGrade.length() < 3) && (("+".equals(letterGrade.substring(1))) || ("-".equals(letterGrade.substring(1))) || (letterGrade.length() == 1));
}
public double getNumericGrade()
{
    numericGrade = 0.0;
    switch(letterGrade.substring(0).toUpperCase())
    {
        case "A":
            numericGrade += 4.0;
            break;
        case "B":
            numericGrade += 3.0;
            break;
        case "C":
            numericGrade += 2.0;
            break;
        case "D":
            numericGrade += 1.0;
            break;
        case "F":
            numericGrade += 0.0;
            break;
    }
    if ("-".equals(letterGrade.substring(1)))
        numericGrade -= 0.3;
    if ("+".equals(letterGrade.substring(1)))
        numericGrade += 0.3;
    return numericGrade;
}

我的猜测是 numericGrade 在 switch 语句之后被重置为 0,对我来说没有明显的原因。

【问题讨论】:

  • 尝试利用 IDE 为您提供的调试功能,并逐步了解 numericGrade 的每一步。
  • switch 语句永远不会以“A+”成功,因为 substring(0) 获取整个字符串,而不仅仅是第一个字符

标签: java string if-statement int switch-statement


【解决方案1】:

String.substring(int position)从位置开始返回子字符串,如果使用“1234”.substring(1),它将返回“234”

在这种情况下,您使用的是 "C+".substring(0),它返回 C+ 而不是 C,您需要 String.charAt(0)String.substring(0, 1)

这就是修复 +/- 所需的全部内容,但请注意,如果输入的字符串长度为 1(只是一个字母等级,A/B/C/D/F),那么您的程序将崩溃,因为您的 if 语句尝试访问第二个字符。如果输入的字符串太短,请检查长度并尽早返回

【讨论】:

  • 谢谢,这似乎解决了问题。据我了解,如果在没有第二个字符的情况下调用 if 语句,则 if 语句将返回 -1?不是这样吗?
  • 我的错,如果你使用letterGrade.substring(1, 2),仅仅使用letterGrade.substring(1)不会抛出错误。如果输入是空字符串,它会导致错误,并且为它添加​​某种形式的错误处理并不是一个坏主意
【解决方案2】:

试试这个,一个简单的等级解释器。如果您想了解更多此类问题的详细信息,可以查看解释器设计模式

public class Grades {
private double score = 0;
public double calculate(char c) throws IllegalArgumentException{
    switch(c){
        case 'A':
            score += 4; 
            break;
        case 'B':
            score += 3;
            break;
        case 'C':
            score += 2;
            break;
        case 'D':
            score += 1;
            break;
        case '+':
            score += 0.3;
            break;
        case '-':
            score -= 0.3;
            break;
        default:
            throw new IllegalArgumentException("Invalid Argument");
    }

    return score;
}

public static void main(String args[]){
    Scanner reader = new Scanner(System.in);
    Grades grade = new Grades();
    String line = reader.nextLine();
    while(!line.equals("exit")){

        //validate argument here..
        double value;
        for ( int i = 0; i < line.length(); i++){
            value = grade.calculate(line.charAt(i));

        }
        System.out.println("Grade = " + value);
        line = reader.nextLine();
    }
    reader.close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-18
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多