Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Negent
9 / 9 / 1
Регистрация: 01.11.2011
Сообщений: 21
#1

Ввод только чисел в cin>>value - C++

22.06.2014, 12:14. Просмотров 1020. Ответов 1
Метки нет (Все метки)

Доброго времени суток!
Написал программу, которая считывает и выводит элементы массива... Всё просто, но на самом деле, мне бы чуть больше понимания, как работает кусок кода (программа рабочая).
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Эта программа добивается ввода чисел, вместо всякой ерунды
#include <iostream>
#include "stdafx.h"
using namespace std;
 
void main ()
{
    int Ar[5];
    int value;
    for (int i=0; i<5; i++)
    {
        cout<<"Ar["<<i+1<<"]: ";
        cin>>value;
        while (!cin)
        {
            cout<<"Enter again A["<<i+1<<"]: ";
            cin.clear ();
            while (cin.get ()!= '\n') continue;
            cin>>value;
        }
        Ar[i] = value;
    }
    cout<<"Exit!"<<endl;
    for (int i=0; i<5; i++)
    cout<<"A["<<i+1<<"]: "<<Ar[i]<<endl;
    system ("pause");
}
А именно, вот этот кусок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (int i=0; i<5; i++)
    {
        cout<<"Ar["<<i+1<<"]: ";
        cin>>value;
        while (!cin)
        {
            cin.clear ();
            while (cin.get ()!= '\n') continue;
            cout<<"Enter again A["<<i+1<<"]: ";
            cin>>value;
        }
        Ar[i] = value;
    }
Проверьте пожалуйста, ход рассуждений (только это, переписывать ничего не надо в коде!):
1. Ввод значения во временную переменную "value".
2. Если введённое значение не подходит, то в очереди потока в cin, выставляется флаг, имеющий значение "ложь", что даёт запуск цикла "while". (истина = не-ложь)
3. Цикл "while (!cin)" операторами в теле цикла: cin.clear() очищает очередь символов , а while (cin.get()) выполняет сброс символа новой строки столько раз, пока они там есть. Continue выполняет новую и новую итерацию, пока там ещё есть символы новой строки. Сам cin.clear () не может выполнить очистку на символы новой строки.
4. Производится считывание временной переменной "value", если оно истинно, т.е. введено корректное значение (число), то флаг в условии цикла while (!cin) равен "истина".
5. Число присваивается элементу массива. При наличии корректного ввода, происходит выполнение цикла for (), без циклов while()
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2014, 12:14     Ввод только чисел в cin>>value
Посмотрите здесь:
Ввод через cin нескольких чисел C++
C++ ввод только чисел
как осуществить ввод только чисел C++
Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync C++
C++ Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Фильтр на ввод только целых неотрицательных чисел C++
C++ Как разрешить ввод только чисел типа int?
как осуществить ввод только нечетных целых чисел? C++
Ввод cin C++
C++ Ввод в консоле только чисел(запрет ввода других символов)
C++ Ввод текста по cin
Корректный ввод с cin C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BatonPro
30 / 30 / 24
Регистрация: 21.06.2014
Сообщений: 81
22.06.2014, 12:50     Ввод только чисел в cin>>value #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Не совсем верно.
После неправильного ввода состояние потока становится ошибочным и дальнейший ввод из него невозможен.
cin.clear() - Сбрасывает состояние потока, делая его вновь доступным для ввода, при этом не очищает очередь символов.
В данном случае цикл:
C++
1
while (cin.get ()!= '\n') continue;
используется для очистки очереди символов.
cin.get() - читает 1 символ из потока, когда cin.get() считает символ '\n' - это будет означать что в потоке больше нет символов.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru