我有一个功能可以从成绩对象中获取成绩点值,并将其作为双倍返回,如下所示:
double Grade::getNumGrade()
{
double value;
if (strGrade == "A")
{
return 4.0;
}
else if (strGrade == "A-")
{
return 3.7;
}
else if (strGrade == "B+")
{
return 3.3;
}
else if (strGrade == "B")
{
return 3.0;
}
else if (strGrade == "B-")
{
return 2.7;
}
else if (strGrade == "C+")
{
return 2.3;
}
else if (strGrade == "C")
{
return 2.0;
}
else if (strGrade == "C-")
{
return 1.7;
}
else if (strGrade == "D+")
{
return 1.3;
}
else if (strGrade == "D")
{
return 1.0;
}
else if (strGrade == "D-")
{
return 0.7;
}
else if (strGrade == "F")
{
return 0.0;
}
}
strGrade
是成绩的字符串表示。但是这里有代码:
Grade jon = Grade("A+");
cout << jon.getNumGrade();
输出:
-1。#IND
构造函数只是确保第一个字母是大写,然后保存提供为strGrade
的字符串。不确定为什么会发生这种情况或如何解决它?
答案 0 :(得分:1)
正如NathanOliver指出的那样,
你永远不会在你的if语句中处理A +。
见
double value;
if (strGrade == "A")
{
return 4.0;
}
else if (strGrade == "A-")
{
return 3.7;
}
strGrade == A+.
但是,由于评论中已经回答了这个问题,我会尝试通过给你一些建议来证明这是一个答案。
你最后的条件,
else if (strGrade == "F")
{
return 0.0;
}
不应该是else if
。有很多很好的方法来处理错误处理(比如一个意外的输入),但是一个非常简单而有效的练习就是用else
来结束你的条件。例如,
//if all other conditionals thus far have returned false
else
{
... error handling here ...
}
如果您属于此else
,请记录错误和/或正常退出程序;至少,返回一个值并适当地处理它。
另外,请考虑根据某个条件被评估的可能性if else
,将您的true
应用于逻辑排序。更具体地说,如果您知道大多数学生将获得B +,那么将其作为第一个在if else
系列中评估的表达式。如果B-是下一个最常见的等级,那么将其作为第二个被评估的表达式;等等。此外,如果您知道某个成绩最不可能通过,请将 last 条件设为您检查。
答案 1 :(得分:1)
不确定为什么会发生这种情况或如何解决?
这种情况正在发生,因为您的函数没有为"A+"
情况返回值并暴露未定义的行为。
正如评论中所提到的,你应该看到编译器警告说明
Not all of your code paths return a value.
您可以修复在函数的最后一个大括号之前始终提供(合理的)返回值,或者为strGrade
的意外情况抛出异常。
BTW更简单的解决方案是使用std::map<std::string,double>
来保存关联值:
double Grade::getNumGrade() {
static std::map<std::string,double> numGrades = {
{ "A", 4.0 } ,
{ "A-", 3.7 } ,
{ "B+", 3.3 } ,
// ...
};
auto found = numGrades.find(strGrade);
if(found != numGrades.end()) {
return found->second;
}
return 0.0;
}
它看起来应该是一个自由或静态函数而不是类成员函数:
double getNumGrade(const std::string& strGrade) {