首先,我正在尝试为我的班级制作GPA计算器。
我知道如何比较字符串,所以我很擅长。我遇到的问题是我正在尝试设置一个情况,所以当用户输入除字母等级值以外的任何内容时,它将返回错误消息。我已经设置了两个数组,一个存储字符串值,另一个存储整数值。我们的想法是使用字符串数组来存储输入的成绩字母输入,然后使用它们来确定每个类的GPA值。然后它会将该值存储到整数数组中。我讨厌讨厌,但这里只是第一部分的代码:
void gpaCalSetClassNum5(){
string mathWeight5;
string scienceWeight5;
string historyWeight5;
string englishWeight5;
string elective1Weight5;
string elective2Weight5;
string gpaClassSet5[] = {"null", "null", "null", "null", "null"};
int gpaClassSet5int[] = {};
cout << "Enter the grade value of each of your classes." << endl;
/////////////////////////
MATH:
cout << "Math" << endl;
cin >> gpaClassSet5[0];
if (gpaClassSet5[0] == "A") {
gpaClassSet5int[0] = 4;
} else if (gpaClassSet5[0] == "a") {
gpaClassSet5int[0] = 4;
} else if (gpaClassSet5[0] == "B") {
gpaClassSet5int[0] = 3;
} else if (gpaClassSet5[0] == "b") {
gpaClassSet5int[0] = 3;
} else if (gpaClassSet5[0] == "C") {
gpaClassSet5int[0] = 2;
} else if (gpaClassSet5[0] == "c") {
gpaClassSet5int[0] = 2;
} else if (gpaClassSet5[0] == "D") {
gpaClassSet5int[0] = 1;
} else if (gpaClassSet5[0] == "d") {
gpaClassSet5int[0] = 1;
} else if (gpaClassSet5[0] == "F") {
gpaClassSet5int[0] = 0;
} else if (gpaClassSet5[0] == "f") {
gpaClassSet5int[0] = 0;
} else if (gpaClassSet5[0] != ){
cout << "Did you enter a letter grade value?" << endl;
goto MATH;
}
cout << "You have selected " << gpaClassSet5[0] << ", or " << gpaClassSet5int[0] << endl;
cout << "Is this class weighted? Use Y/N." << endl;
cin >> mathWeight5;
if (mathWeight5 == "Y" || "y") {
gpaClassSet5int[0] = gpaClassSet5int[0] + 1;
}
我正在寻找这个的简化版本。为什么我不能使用类似的东西:
if(gpaClassSet5[0] == "A" || "a"){
//stuff//
}
我需要一个简化版本,因为像开关一样,我想使用不同的输入来做不同的事情 - 但是如果没有输入任何列出的值,最终会有默认值。< / p>
我该怎么做?如何在C ++中设置switch
?
很抱歉,如果这个问题有点愚蠢,我就会进入C ++,这些自制程序真的是我唯一的做法。
此处有完整的程序代码:http://justpaste.it/ee4u
答案 0 :(得分:3)
因为这不是指定C ++的工作方式,所以需要进行两次比较:
if(gpaClassSet5[0] == "A" || gpaClassSet5[0] == "a")
逻辑OR运算表示“如果左侧表达式为真,或右侧表达式为真”。在您的问题中使用代码的情况下,右侧表达式将始终为真,因为"a"
不为零(即假)。
答案 1 :(得分:2)
运算符优先级表示你不能这样做。 gpaClassSet5[0] == "A" || "a"
与(gpaClassSet5[0] == "A") || ("a")
相同。
如果您不想两次写gpaClassSet5[0]
,如果不介意性能损失,可以使用正则表达式
std::regex_match(gpaClassSet5[0], std::regex("A|a"));
如果您针对很多可能的匹配进行测试,这会变得更加明智:
std::regex_match(gpaClassSet5[0], std::regex("A|Grade A|1|Excellent|Outstanding|Perfect|Perfect Score)"));
如果你没有使用C ++ 11(没有std::regex
),你可以使用来自boost.org的boost::regex
。
或者您可以使用更紧凑的逻辑解决您的特定代码示例:
char gradeLetter = std::tolower(gpaClassSet5[0])
if (gradeLetter >= 'a' && gradeLetter <= 'd')
gpaClassSet5int[0] = 4-(gradeLetter -'a');
else if (gradeLetter == 'f')
gpaClassSet5int[0] = 0;
else
{
cout << "Did you enter a letter grade value?" << endl;
goto MATH;
}
提取函数以摆脱goto
并使代码更易于阅读:
int ConvertLetterToNumericGrade(char gradeLetter)
{
char lower = std::tolower(gradeLetter);
if (lower >= 'a' && lower <= 'd')
return 4-(lower -'a');
if (lower == 'f')
return 0;
throw std::runtime_error("cannot convert invalid grade letter");
}
void gpaCalSetClassNum5()
{
...
while (true)
{
cin >> gpaClassSet5[0];
try { gpaClassSet5int[0] = ConvertLetterToNumericGrade(gpaClassSet5[0]); }
catch (const std::runtime_error& )
{
cout << "Did you enter a letter grade value?" << endl;
continue;
}
break;
}
...
}
使用开关(字符串不支持,但char
和wchar
支持):
int ConvertLetterToNumericGrade(char gradeLetter)
{
switch (gradeLetter)
{
case 'a':
case 'A':
return 4;
case 'b':
case 'B':
return 3;
case 'c':
case 'C':
return 2;
case 'd':
case 'D':
return 1;
case 'f':
case 'F':
return 0;
default:
cout << "Did you enter a letter grade value?" << endl;
throw std::runtime_error("cannot convert invalid grade letter");
}
}
RESP。
int ConvertLetterToNumericGrade(char gradeLetter)
{
switch (std::tolower(gradeLetter))
{
case 'a': return 4;
case 'b': return 3;
case 'c': return 2;
case 'd': return 1;
case 'f': return 0;
default:
cout << "Did you enter a letter grade value?" << endl;
throw std::runtime_error("cannot convert invalid grade letter");
}
}