[英]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")
邏輯或運算的意思是“如果左側表達式為true, 或者右側表達式為true”。 就您的問題而言,如右圖所示,右側表達式將始終為true,因為"a"
不為零(即false)。
運算符優先級表示您無法采用這種方式。 gpaClassSet5[0] == "A" || "a"
gpaClassSet5[0] == "A" || "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
), 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");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.