在C ++中使用带有字符串的OR运算符

时间:2014-02-13 06:58:41

标签: c++ arrays string comparison switch-statement

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

2 个答案:

答案 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;
    }
    ...
}

使用开关(字符串不支持,但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");
    }
}

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