在 C++ 中对字符串使用 OR 运算符

Using the OR Operator with Strings in C++

本文关键字:OR 运算符 字符串 C++      更新时间:2023-10-16

首先,我正在尝试为我的班级制作一个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;
}
...
}

并使用开关(字符串不支持,但charwchar支持):

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");
}
}