Вызов логической функции в цикле while

-7

У меня есть функция 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";
}
}

спросил(а) 2019-03-28T20:30:00+03:00 1 год, 6 месяцев назад
0
59

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

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

ответил(а) 2019-03-28T20:38:00+03:00 1 год, 6 месяцев назад
40

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

ответил(а) 2019-03-28T20:38:00+03:00 1 год, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема