оптимизация — C ++ | Условия повторного использования

В настоящее время я пишу простую калькуляторную программу на C ++, и всякий раз, когда я хочу проверить, cin значения действительны и дают обратную связь пользователю, если указанный ввод недействителен, я должен повторно использовать условие как в моем цикле do-while, так и во вложенном операторе if, дающем обратную связь. Это чувствует себя излишним.

Вот код, о котором идет речь:

do  {
cout << "Enter operator: "; cin >> operatorSign;

if ( operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-' )
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";

} while ( operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-' );

Как видите, я дважды использовал одно и то же условие для обратной связи (если) а также продолжить цикл, если ввод неверен. У меня вопрос, как вы можете уменьшить избыточность кода выше? Вы можете хранить условия в переменной или что-то?

2

Решение

Что-то вроде

bool isValid;
do  {
isValid = true;
cout << "Enter operator: ";
cin >> operatorSign;

if ( operatorSign != '*' && operatorSign != '/' && operatorSign != '+' && operatorSign != '-' )
{
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
isValid = false;
}

} while (!isValid);
3

Другие решения

Да, вы можете хранить условия в переменной. Вроде, как бы, что-то вроде. bool переменные типа в C ++ могут хранить true/false ценности.

bool isInvalid = peratorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-';

а потом if (isInvalid) а также while (isInvalid)
Вы должны посмотреть, где вы устанавливаете переменную, хотя.

Однако я бы создал функцию, которая проверяет, является ли выбор верным, и вызывает его.

bool isInvalid(operatorSign)
{
return peratorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-';
}

а потом if (isInvalid(operatorSign)) а также while (isInvalid(operatorSign))

Я не хотел менять это слишком много за один раз, но, кажется, лучше создать isValid / isValid() и использовать их отрицание.

1

Просто напишите функцию

bool isOpInvalid(char op) {
return op != '*' && op != '/' && op != '+' && op != '-';
}

и измените цикл на

do {
cout << "Enter operator: ";
cin >> operatorSign;

if (isOpInvalid(operatorSign))
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";

} while (isOpInvalid(operatorSign));

или написать while петля

while (true) {
cout << "Enter operator: ";
cin >> operatorSign;

if (operatorSign != '*' && operatorSign != '/'
&& operatorSign != '+' && operatorSign != '-')
cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
else
break;
}
1

Еще один из многих способов использования лямбды:

// use zero value as an error indicator and initial condition
char operatorSign = '\0';

auto check_ok = [&]
{
switch(operatorSign)
{
case '*': case '/': case '+': case '-':
break;
default:
std::cout << "Must be a valid operator sign (*, /, + or -).\a\n\n";
operatorSign = '\0';
break;
}
};

while(!operatorSign)
{
cout << "Enter operator: "; cin >> operatorSign;
check_ok();
}
1
По вопросам рекламы [email protected]