Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> cin принимает только цифры 
:(
    Опции темы
Negent
Дата 22.6.2014, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 9.12.2011
Где: Симферополь

Репутация: нет
Всего: нет



Доброго времени суток!
Написал программу, которая считывает и выводит элементы массива... Всё просто, но на самом деле, мне бы чуть больше понимания, как работает кусок кода (программа рабочая).
Код:
Цитата

//Эта программа добивается ввода чисел, вместо всякой ерунды
#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");
}


А именно, вот этот кусок:
Цитата
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() 
PM MAIL WWW ICQ Skype   Вверх
NoviceF
Дата 23.6.2014, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(Negent @  22.6.2014,  12:13 Найти цитируемый пост)
Проверьте пожалуйста, ход рассуждений (только это, переписывать ничего не надо в коде!):
1. Примерно так.
2. Если введённое значение не подходит, то в очереди потока в cin, выставляется флаг, имеющий значение "ложь", что даёт запуск цикла "while". (истина = не-ложь)
3. Цикл "while (!cin)" операторами в теле цикла: cin.clear() очищает очередь символов , а while (cin.get()) выполняет сброс символа новой строки столько раз, пока они там есть. Continue выполняет новую и новую итерацию, пока там ещё есть символы новой строки. Сам cin.clear () не может выполнить очистку на символы новой строки.
4. Производится считывание временной переменной "value", если оно истинно, т.е. введено корректное значение (число), то флаг в условии цикла while (!cin) равен "истина".
5. Число присваивается элементу массива. При наличии корректного ввода, происходит выполнение цикла for (), без циклов while()  


1. Не совсем ввод, это считывание из потока, связанного с консолью.
2. Значения из потока извлекаются вот этим оператором http://www.cplusplus.com/reference/istream...operator%3E%3E/. При неудачном чтении у объекта потока выставляются соответствующие флаги, в случае неподходящего значения failbit. У объекта потока есть свойство на основании флагов ошибок быть преобразованым к булевому значению. При выставленном failbit (в случае неудачного чтения), преобразование потока к bool даст false.
3. Здесь неправильно. cin.clear() по умолчанию сбрасывает флаги ошибок http://www.cplusplus.com/reference/ios/ios/clear/. Про символ новой строки было бы корректно сказать, что он его пропускает (извлекает из потока и игнорирует), а не сбрасывает. cin.clear() не умеет и не должен что-либо читать или извлекать из потока. Ошибки сбрасываются для того, чтобы произвести следующее чтение, т.к. если флаг ошибки останется, бессмысленно повторять чтение.
4. Нет. Если чтение прошло удачно - цикл повторять не нужно, (!cin) возвращает true в случае ошибки чтения, чтобы его повторить, если чтение прошло успешно  (!cin) венёть ложь (false) и выполнение цикла прекратится.
5. Да.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0574 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.