1

我正在编写一个需要字母等级的程序。A 得到 4.0,B 得到 3.0,以此类推。如果您输入 B+ 或 B-,它将分别减去 0.3 或加上 0.3(因此 B+ 将是 3.3)。

在我的代码中,当我测试像 B+ 这样的字母时,它给了我 0.3,而不是实际返回实际成绩的减去值。我究竟做错了什么?

public class Grade {
    private String grade;
    private double gradeNum;

    // Constructor
    public Grade(String showGrade) {
        grade = showGrade;
        gradeNum = 0;
    }

    // getNumericGrade method to return grade number
    public double getNumericGrade() {
        String suffix;
        suffix = grade.substring(1);

        if(suffix.equals("+")) {
            gradeNum = gradeNum + .3;
        } else if(suffix.equals("-")) {
            gradeNum = gradeNum - .3;
        }

        String letterGrade = grade.substring(0);

        if(letterGrade.equalsIgnoreCase("A")) {
            gradeNum = 4.0;
        } else if(letterGrade.equalsIgnoreCase("B")) {
            gradeNum = 3.0;
        } else if(letterGrade.equalsIgnoreCase("C")) {
            gradeNum = 2.0;
        } else if(letterGrade.equalsIgnoreCase("D")) {
            gradeNum = 1.0;
        } else if(letterGrade.equalsIgnoreCase("F")) {
            gradeNum = 0.0;
        } else {
            System.out.println("Invalid letter grade");
        }

        return gradeNum;
    }
}
4

5 回答 5

3

您应该首先处理您的字母等级,以便gradeNum正确初始化。另请注意,它substring(int index)返回一个子序列,该子序列从传递到字符串末尾的索引开始。因此,您的letterGradeif 块中没有一个与 A+、B- 等输入相匹配。

if (grade == null || !grade.matches("[A-F][+-]?")) // if grade wasn't specified, or
{// if grade is not between A to F *optionally* followed by a + or - sign
    System.out.println("Invalid letter grade");
    return gradeNum;
}

String letterGrade = grade.substring(0, 1); // pass 1 to exclude + or -

if (letterGrade.equalsIgnoreCase("A"))
{
    gradeNum = 4.0;
}
else if(letterGrade.equalsIgnoreCase("B"))
{
    gradeNum = 3.0;
}
else if(letterGrade.equalsIgnoreCase("C"))
{
  gradeNum = 2.0;
}
else if(letterGrade.equalsIgnoreCase("D"))
{
    gradeNum = 1.0;
}
else if(letterGrade.equalsIgnoreCase("F"))
{
    gradeNum = 0.0; // return from here if you want F = F- = F+
    return gradeNum; // if you want to invalidate F- and F+ look below
}
/* else // not required; already validated by using regex above
{
    System.out.println("Invalid letter grade");
    return gradeNum; // don't forget to RETURN from here
}*/

然后进行后缀处理,添加或减去gradeNum现在已正确初始化的后缀。

String suffix;
suffix = grade.substring(1);
if (suffix.isEmpty()) { // return early if there's no suffix
    return gradeNum;
} else if (gradeNum == 0.0) { // to invalidate F- and F+
    System.out.println("Invalid letter grade");
    return gradeNum;
}
if(suffix.equals("+") && gradeNum != 4.0) // don't increment if grade is A+ (= A = 4.0)
{
    gradeNum = gradeNum + .3;
}
else if (suffix.equals("-"))
{
    gradeNum = gradeNum - .3;
}
return gradeNum;
于 2013-05-24T21:58:26.410 回答
1

我根本不喜欢这个设计。

为什么要支付一次又一次重新计算数值的罚款?这是没有意义的。

使 Grade 不可变,并在获取字母值时在构造函数中计算数值。

我还有另一个构造函数,它将采用浮点/双精度并设置字母等级。

您可能还考虑将 Grade 设为枚举,如下所示:

/**
 * Grade encapsulates symbols with values
 * @author Michael
 * @link http://stackoverflow.com/questions/16744116/java-grade-class-letter-grade-to-number/16744210#16744210
 * @since 5/24/13 6:01 PM
 */
public enum Grade {
    APLUS("A+", 4.3),
    A("A", 4.0),
    AMINUS("A-", 3.7),
    BPLUS("B+", 3.3),
    B("B", 3.0),
    BMINUS("B-", 2.7),
    CPLUS("C+", 2.3),
    C("C", 2.0),
    CMINUS("C-", 1.7),
    DPLUS("D+", 1.3),
    D("D", 1.0),
    DMINUS("D-", 0.7),
    F("F", 0.0);

    private final String symbol;
    private final double value;

    Grade(String symbol, double value) {
        this.symbol = symbol;
        this.value = value;
    }

    public String getSymbol() {
        return symbol;
    }

    public double getValue() {
        return value;
    }
}
于 2013-05-24T21:59:48.043 回答
1

当你收到你的信时,你使用

String letterGrade = grade.substring(0);

但是您从不指定结束位置。您可以执行以下操作

String letterGrade = grade.substring(0,1);  // the end position is exclusive

这是一些子字符串文档


是的,您应该在设置字母值后添加/减去您的+和修改-

于 2013-05-24T22:01:24.020 回答
0

您需要重新订购代码:

private String grade;
private double gradeNum;

// Constructor
public Grade(String showGrade)
{
  grade = showGrade;
  gradeNum = 0;
}


// getNumericGrade method to return grade number
public double getNumericGrade()
{
    String letterGrade = grade.substring(0);

    if (letterGrade.equalsIgnoreCase("A"))
    {
        gradeNum = 4.0;
    }

    else if(letterGrade.equalsIgnoreCase("B"))
    {
        gradeNum = 3.0;

    }

    else if(letterGrade.equalsIgnoreCase("C"))
    {
      gradeNum = 2.0;
    }

    else if(letterGrade.equalsIgnoreCase("D"))
    {
        gradeNum = 1.0;
    }

    else if(letterGrade.equalsIgnoreCase("F"))
    {
        gradeNum = 0.0;
    }


    else
    {
        System.out.println("Invalid letter grade");
        return -1.0;
    }



    String suffix;
    suffix = grade.substring(1);

    if(suffix.equals("+"))
    {
        gradeNum = gradeNum + .3;

    }

    else if (suffix.equals("-"))
    {
        gradeNum = gradeNum - .3;
    }







    return gradeNum;

}
于 2013-05-24T21:55:57.363 回答
-1

编写一个要求用户输入字母等级编号的java程序程序将根据下表显示输入字母编号的等效字母等级和点

于 2021-03-24T20:37:34.330 回答