Вызов логической функции в цикле while - PullRequest
0 голосов
/ 28 марта 2019

У меня есть функция bool с инструкциями if else внутри нее.Первое «if» возвращает «false», а else возвращает «true».Я хочу вызвать эту булеву функцию в другой функции с циклом while внутри.Я пробовал несколько раз, и я сделал это работает.Однако, когда я вызываю функцию, она все время возвращает 'true'.Как я могу это исправить?

bool secretCheck(string P1_name, string P2_name, char secret){
    secret =  'R', 'G', 'B', 'P', 'Y', 'M';
    if (secret != 'R' && secret != 'G' && secret != 'B' && secret != 'P' && secret != 'Y' && secret != 'M' && secret > 4){
        return false;   
    }
    else {
        return true;
    }
}

void secretLoop(string P1_name, string P2_name, char secret){
    while(!secretCheck(P1_name, P2_name, secret)){
        cout << "Invalid secret!"<< endl;
        cout << P1_name << ", please enter your secret: ";
        cin >> secret;
    }

    if(secretCheck(P1_name, P2_name, secret)) {
        cout << "Ok\n";
    }
}

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Я не уверен, что вы пытаетесь сделать с этой строкой:

secret =  'R', 'G', 'B', 'P', 'Y', 'M';

Символ может содержать один и только одно значение. В этом случае вы используете оператор запятой, который удаляет первое значение и возвращает второе выражение.

В этой строке secret равно всегда равно 'R', так как это эквивалентно:

secret = 'R'; // now secret is equal to the character 'R'

Затем в вашем if заявлении вы получили следующее:

secret != 'R' && /* ... */

Это всегда будет ложным, поскольку secret всегда равно 'R'.

Тогда есть убедительное сравнение:

secret > 4

Это также верно, поскольку при сравнении char и int будет сравниваться значение ASCII символа.


Чтобы сохранить несколько символов в переменной, она должна иметь тип std::string или std::vector:

std::vector<char> secret_characters = {'R', 'G', 'B', 'P', 'Y', 'M'};

И если вы хотите проверить, есть ли secret в списке secret_character, вы можете сделать это:

void is_secret(std::vector<char> const& secret_characters, char secret) {
    auto found = std::find(
        secret_characters.begin(), secret_characters.end(),
        secret
    );
    return found != secret_characters.end();
}

bool secretCheck(string P1_name, string P2_name, char secret){
    std::vector<char> secret_characters = {'R', 'G', 'B', 'P', 'Y', 'M'};
    if (is_secret(secret_characters, secret)) {
        return false;   
    } else {
        return true;
    }
}
0 голосов
/ 28 марта 2019

В вашей функции secretCheck вы присваиваете значение 'R' для secret, полностью перезаписывая все, что было раньше. Затем вы возвращаете false если secret != 'R'. Таким образом, вы никогда не вернете false, поскольку secret будет всегда быть 'R'. Непонятно, что вы пытались сделать в первой строке этой функции, тем более что смысл функции неясен (вы никогда не используете ни строковый аргумент). Я бы посоветовал убедиться, что ваша функция действительно выполняет задачу, которую вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...