Есть вот такой код. Немного непонятно, что делает второй цикл 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;
}
Вот в этой строке кода
cin >> golf[i]
идёт считывание целого числа. Что будет, если мы введем не число, а слово? Например ten? cin увидит, что в вводе содержится не число и он прекратит считывание и заблокирует последующие попытки ввода (вместе с тем установит флаг ошибки и обнулит golf[i]). Чтобы преодалеть это, нам необходимо сделать следующие вещи:
cin.clear();. Это позволит нам снова получать ввод.'\n')). Вот это и делает внутренний цикл while. Он извлекает из буфера по одному символу, пока не наткнётся на '\n'. После этого буфер будет пуст и можно будет снова ввести число.Стоит ещё сказать, что выражение cin >> golf[i] возвращает обьект cin, который может быть преобразован в bool (true - ошибок нет, false - ошибки есть). Поэтому считывание числа находится в условии цикла. А оператор ! инверсирует значение. Т.е. внешний while выполнится тогда, когда возникнет ошибка ввода.
P.S. Вообще, внутренний while можно заменить строкой
cin.ignore(numeric_limit<streamsize>::max(), '\n');
Сборка персонального компьютера от Artline: умный выбор для современных пользователей