Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2009, 19:27   #1
stenl1
Форумчанин
 
Аватар для stenl1
 
Регистрация: 26.06.2009
Сообщений: 354
По умолчанию Объясните цикл: while (!(cin >> golf[i])) =?

Код:
#include <iostream>
using namespace std;
const int Max = 5;
int main()
{
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; // в какой цикл возращается в for,while,внутреней while
	cout << "Please enter a number: ";
}
}
double total = 0.0;
for (i = 0; i<Max; i++)
total += golf[i];
cout << total / Max << " averege score " << Max << " rounds \n";
cin.get();
cin.get();
return 0;
}
PS.Если че не правильно выражаюсь не обесудте ,я тока учусь
stenl1 вне форума Ответить с цитированием
Старый 20.10.2009, 23:28   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от stenl1 Посмотреть сообщение
Код:
while (!(cin >> golf[i]))
{
	cin.clear();
	while (cin.get() != '\n')
  continue; // в какой цикл возращается в for,while,внутреней while
	cout << "Please enter a number: ";
}
cin >> golf[i] - чтение из потока в i-й элемент массива целых чисел golf.
В случае ошибки(например при вводе букв вместо цифр) cin вернёт false.
while(!(cin >> golf[i])) - продолжать цикл, пока cin не вернёт true(то есть выполнится без ошибок.
cin.clear() - когда возникает ошибка при считывании, то выставляется флаг ошибки. Вызов метода clear очищает этот флаг, дабы можно было дальше нормально работать с потоком.
while(cin.get() != '\n')
continue;
Этот цикл нужен, чтобы вытащить из входного потока те неправильные символы, которые ввёл пользователь(ведь, если cin вернула false(произошла ошибка), то все введённые символы так и остались во входном потоке и на следующий итерации будут опять считываться они же, что приведёт к бесконечному числу ошибочного чтения cin-ом и, как следствие, к бесконечному циклу. В этом цикле мы считываем посимвольно всё, что есть во входном потоке до '\n'(перевод строки)
continue в данном случае возвращает во внутренний while. По сути можно было бы просто опустить этот оператор, а записать так:
while(cin.get() != '\n');
так как никаких полезных действий он не выполняет в данном случае.
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
объясните цикл stenl1 Общие вопросы C/C++ 5 30.06.2009 17:06
cin??? Paul_AG Общие вопросы C/C++ 4 24.04.2009 14:02
Не опознается cin Stellvertreter Общие вопросы C/C++ 5 14.10.2008 08:10
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34