簡體   English   中英

在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")

邏輯或運算的意思是“如果左側表達式為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;
    }
    ...
}

並帶有一個開關(字符串不支持,但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");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM