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

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

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

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

22.06.2014, 12:14. Просмотров 1055. Ответов 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()
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2014, 12:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ввод только чисел в cin>>value (C++):

Ввод через cin нескольких чисел - C++
Здравствуйте. Требуется, чтобы пользователь ввел через запятую два числа. Используя scanf(), я бы написал примерно так:...

ввод только чисел - C++
Помогите отловить ненужные символы. void input_data(int number) // { if(number == 1) { }else if(number == 2) {

как осуществить ввод только чисел - C++
мне нужно чтобы при вводе я не мог ничего вводить кроме чисел и математических знаков(+,/,*,-)

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync - C++
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная &quot;защита от дурака&quot; на ввод. Не пойму предназначение cin.get() !=...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear() - C++
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не изучал, поэтому возникали некоторые проблемы....

Фильтр на ввод только целых неотрицательных чисел - C++
Как создать функцию, позволяющую вводить только целые неотрицательные числа в с++? Как она будет выглядеть?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BatonPro
30 / 30 / 24
Регистрация: 21.06.2014
Сообщений: 81
22.06.2014, 12:50 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Не совсем верно.
После неправильного ввода состояние потока становится ошибочным и дальнейший ввод из него невозможен.
cin.clear() - Сбрасывает состояние потока, делая его вновь доступным для ввода, при этом не очищает очередь символов.
В данном случае цикл:
C++
1
while (cin.get ()!= '\n') continue;
используется для очистки очереди символов.
cin.get() - читает 1 символ из потока, когда cin.get() считает символ '\n' - это будет означать что в потоке больше нет символов.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2014, 12:50
Привет! Вот еще темы с ответами:

Как разрешить ввод только чисел типа int? - C++
Доброго времени суток. Подскажите, пожалуйста, как разрешить ввод только чисел типа int. Преподаватель очень любит заваливать на этом,...

как осуществить ввод только нечетных целых чисел? - C++
вот в этой программе необходимо ввести n, которое нечетное целое # include &quot;iostream&quot; # include &lt;math.h&gt; # include &quot;iomanip&quot; #...

Ввод cin - C++
Я тут раньше задавал подобный вопрос, то тема умерла, по ходу. Здесь приведен листинг функции ввода калькулятора из книги Страуструпа. ...

Ввод в консоле только чисел(запрет ввода других символов) - C++
В консольном варианте с предложением пользователю ввести фразу, содержащую и цифры и буквы, чтоб потом программа после ввода исключала...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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