Я воздерживаюсь от ответа Свиниша, чтобы продемонстрировать, что это отличное место для использования функции:
bool getSnacks(int & snacks)
{
cout << "Movie theater snack purchased (Select 1-7): ";
cin >> snacks;
if (snacks < 1 || snacks > 7)
{
cout << "Invalid selection, please choose from 1 - 7" << endl;
return false;
}
return true;
}
Цикл while теперь становится
while (!getSnacks(snacks))
{
// does absolutely nothing!
}
или более компактным, но странно выглядящий
while (!getSnacks(snacks));
Это позволяет вам получить некоторую логику из функции main
и перейти к простой функции, которая проста для понимания и тестирования. Кроме того, вы можете немного обобщить эту функцию и, возможно, извлечь из нее некоторое повторное использование
bool getBoundedInt(int & val,
int min,
int max,
const std::string & prompt)
{
cout << " Please select " << prompt << " (Select "<< min << "-" << max << "): ";
cin >> val;
if (val < min || val > max)
{
cout << "Invalid selection, please choose from << min << " - " << max << endl;
return false;
}
return true;
}
И вы можете использовать эту функцию для получения всех видов информации, например
while (!getBoundedInt(snacks, 1, 7, "snack"));
while (!getBoundedInt(movie, 1, 9, "movie"));
while (!getBoundedInt(seat, 1, 42, "seat"));
Следующаяшаг будет заключаться в том, чтобы переместить цикл в функцию, чтобы функция не возвращалась, пока пользователь не предоставит приемлемое значение
int getBoundedInt(int min,
int max,
const std::string & prompt)
{
cout << " Please select " << prompt << " (Select "<< min << "-" << max << "): ";
int val;
while (true)
{
cin >> val;
if (val < min || val > max)
{
cout << "Invalid selection, please choose from << min << " - " << max << endl;
}
else
{
return val;
}
}
}
Теперь использование действительно простое:
snack = getBoundedInt(1, 7, "snack");
movie = getBoundedInt(1, 9, "movie");
seat = getBoundedInt(1, 42, "seat");
Но что, если пользователь вводит что-то совершенно недействительное, например, «резиновые бамперы Babybuggy»? Вам также понадобится некоторая защита около cin >> val;
, чтобы входные данные могли быть преобразованы в целое число.
Ваше приключение по проверке ввода (это поисковый запрос, который вы можете исследовать для получения дополнительной информации и идей) только началось.