Есть вот такой код. Немного непонятно, что делает второй цикл 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');
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Нужно реализовать клиент-серверное приложение для обмена сообщениями между компьютерами (простой чат), используя при этом UDP пакеты и только...
У меня есть три окна: MainWindow, SelectPreset, PresetОкно SelectPreset вызывается из окна MainWindow
Дана квадратная матрицаЕсли в i-ой строке матрицы элемент принадлежащий главной диагонали отрицателен, то заменить этот элемент суммой элементов...