Зачем в коде нужна строчка? C++

109
22 апреля 2022, 01:40

Есть вот такой код. Немного непонятно, что делает второй цикл 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; 
}
Answer 1

Вот в этой строке кода

cin >> golf[i]

идёт считывание целого числа. Что будет, если мы введем не число, а слово? Например ten? cin увидит, что в вводе содержится не число и он прекратит считывание и заблокирует последующие попытки ввода (вместе с тем установит флаг ошибки и обнулит golf[i]). Чтобы преодалеть это, нам необходимо сделать следующие вещи:

  1. Сбросить флаг ошибки. Это делает строка cin.clear();. Это позволит нам снова получать ввод.
  2. После того, как сбросили флаг, в буфере ввода остался старый ввод, который и привел к ошибке. Чтобы убрать его, необходми считать из буфера всё до конца строки. Т.е. до нажатия Enter (что является символом новой строки ('\n')). Вот это и делает внутренний цикл while. Он извлекает из буфера по одному символу, пока не наткнётся на '\n'. После этого буфер будет пуст и можно будет снова ввести число.

Стоит ещё сказать, что выражение cin >> golf[i] возвращает обьект cin, который может быть преобразован в bool (true - ошибок нет, false - ошибки есть). Поэтому считывание числа находится в условии цикла. А оператор ! инверсирует значение. Т.е. внешний while выполнится тогда, когда возникнет ошибка ввода.
P.S. Вообще, внутренний while можно заменить строкой

cin.ignore(numeric_limit<streamsize>::max(), '\n');
READ ALSO
работа класса с другим классом(С++, ООП) [закрыт]

работа класса с другим классом(С++, ООП) [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

178
C++ Вопрос по реализации UDP чата

C++ Вопрос по реализации UDP чата

Нужно реализовать клиент-серверное приложение для обмена сообщениями между компьютерами (простой чат), используя при этом UDP пакеты и только...

198
Блокируются элементы дочернего окна в Qt C++

Блокируются элементы дочернего окна в Qt C++

У меня есть три окна: MainWindow, SelectPreset, PresetОкно SelectPreset вызывается из окна MainWindow

185
Пожалуйста найти ошибку. По возможности дорешать задачу

Пожалуйста найти ошибку. По возможности дорешать задачу

Дана квадратная матрицаЕсли в i-ой строке матрицы элемент принадлежащий главной диагонали отрицателен, то заменить этот элемент суммой элементов...

202