Зачем в коде нужна строчка? C++
Есть вот такой код. Немного непонятно, что делает второй цикл while. Да и правильно ли в целом написан код? Когда я ввожу цифры программа игнорируют оба цикла while, заносит их в массив и переходит к следующий интерации for. Но что будет, если я введу символы с клавиатуры? Символы запишутся в массив или благодаря циклам произойдет очистка этого массива,а потом я смогу снова ввести цифры с клавиатуры и уже они запишутся в массив? Поясните пожалуйста
#include <iostream>
const int Max = 5;
int main()
{
using namespace std;
int golf[Max];
cout << "Please enter your golf scores.\n";
cout << "You must enter " << Max << " rounds.\n";
int i;
for (i = 0; i < Max; i++)
{
cout << "round #" << i+1 << ": ";
while (!(cin >> golf[i])) {
cin.clear();
while (cin.get() != '\n')
continue;
cout << "Please enter a number: ";
}
}
double total = 0.0;
for (i = 0; i < Max; i++)
total += golf[i];
cout << total / Max << " = average score "
<< Max << " rounds\n";
return 0;
}
Ответы (1 шт):
Вот в этой строке кода
cin >> golf[i]
идёт считывание целого числа. Что будет, если мы введем не число, а слово? Например ten? cin увидит, что в вводе содержится не число и он прекратит считывание и заблокирует последующие попытки ввода (вместе с тем установит флаг ошибки и обнулит golf[i]). Чтобы преодалеть это, нам необходимо сделать следующие вещи:
- Сбросить флаг ошибки. Это делает строка
cin.clear();. Это позволит нам снова получать ввод. - После того, как сбросили флаг, в буфере ввода остался старый ввод, который и привел к ошибке. Чтобы убрать его, необходми считать из буфера всё до конца строки. Т.е. до нажатия Enter (что является символом новой строки (
'\n')). Вот это и делает внутренний циклwhile. Он извлекает из буфера по одному символу, пока не наткнётся на'\n'. После этого буфер будет пуст и можно будет снова ввести число.
Стоит ещё сказать, что выражение cin >> golf[i] возвращает обьект cin, который может быть преобразован в bool (true - ошибок нет, false - ошибки есть). Поэтому считывание числа находится в условии цикла. А оператор ! инверсирует значение. Т.е. внешний while выполнится тогда, когда возникнет ошибка ввода.
P.S. Вообще, внутренний while можно заменить строкой
cin.ignore(numeric_limit<streamsize>::max(), '\n');