В настоящее время я пишу простую калькуляторную программу на 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 != '-' );
Как видите, я дважды использовал одно и то же условие для обратной связи (если) а также продолжить цикл, если ввод неверен. У меня вопрос, как вы можете уменьшить избыточность кода выше? Вы можете хранить условия в переменной или что-то?
Что-то вроде
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);
Да, вы можете хранить условия в переменной. Вроде, как бы, что-то вроде. 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()
и использовать их отрицание.
Просто напишите функцию
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;
}
Еще один из многих способов использования лямбды:
// 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();
}