在 C++ 中对字符串使用 OR 运算符
Using the OR Operator with Strings in C++
首先,我正在尝试为我的班级制作一个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//
}
我需要一个简化版本,因为就像开关一样,我想使用不同的输入来做不同的事情——但最终有一个默认值,以防列出的任何值没有输入。
我该怎么做?如何在C++中设置switch
?
对不起,如果这个问题有点愚蠢,我正在进入C++,这些自制的程序真的是我唯一的练习。
完整的程序代码在这里:http://justpaste.it/ee4u
因为这不是指定C++工作的方式,所以您需要做两次比较:
if(gpaClassSet5[0] == "A" || gpaClassSet5[0] == "a")
逻辑 OR 运算表示"如果左手表达式为真,或右手表达式为真"。在您的代码中,就像您的问题一样,右侧表达式将始终为真,因为"a"
不为零(即假)。
运算符优先级表示您不能这样做。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");
}
}
或
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");
}
}
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- C++重载|(按位OR)运算符,返回常数值
- 在 while 循环中使用字符串(OR 运算符)
- 按位 OR 运算符
- 带有逻辑 OR 运算符的 if 条件的缩写?
- C++ OR 运算符的未知行为
- 将逻辑 OR 与 cout 运算符一起使用
- 使用 OR 运算符赋值
- 我可以在regex中使用带有or运算符的前瞻性断言吗
- 在 C++ 中对字符串使用 OR 运算符
- 我在C++中使用删除运算符时遇到问题。我在运行时不断收到"double free or corruption (fasttop)"错误
- 逻辑 OR 和逗号运算符是否等效?
- 如果两者都会给出相同的结果,我应该更喜欢加法或逻辑 OR 运算符吗?
- 由于某种原因,使用 OR 运算符执行操作不起作用
- 我是否正确地将枚举值与C++的"or"运算符进行比较?
- 按位 AND/OR 运算符正在追加
- 为什么在c++中不应重载逗号、地址、逻辑AND和逻辑OR运算符
- "Or"运算符如何工作?(C++)
- "if"语句"or"运算符不起作用
- 使用 OR 运算符将多个 for 循环合并为一个