我正在写一个接受字母评分的程序。A会得到4.0,B会得到3.0,以此类推。如果您输入B+或B-,则将分别采用减去.3或添加.3 (因此B+将为3.3)。
在我的代码中,当我测试像B+这样的字母时,它会给我.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;
}
}
发布于 2013-05-24 21:58:26
您应该首先处理您的字母评分,以便它正确地初始化gradeNum
。还要注意,substring(int index)
返回一个子序列,它从传递的索引开始,一直到字符串的末尾。因此,您的letterGrade
if块中没有一个与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-24 21:59:48
我一点也不喜欢这个设计。
为什么要付出一次又一次重新计算数值的惩罚呢?这没有任何意义。
当你得到字母值时,在构造函数中计算数值,并使等级不可变。
我还有另一个构造函数,它接受一个浮点数/双精度数并设置字母等级。
您也可以考虑将成绩设置为枚举,如下所示:
/**
* 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-24 22:01:24
当你收到你的信时,你用
String letterGrade = grade.substring(0);
但是你从来没有指定一个结束的位置。您可以执行以下操作
String letterGrade = grade.substring(0,1); // the end position is exclusive
here's some substring documentation
是的,您应该在设置字母值之后添加/减去对+
和-
的修改
https://stackoverflow.com/questions/16744116
复制相似问题