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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2009, 10:39   #1
Николай Сергеевич
Пользователь
 
Аватар для Николай Сергеевич
 
Регистрация: 14.12.2009
Сообщений: 17
По умолчанию условие в цикле

Всем здравствуйте, подскажите пожалуйста как быть с условием для цикла.
Код:
int n;
	do { 
	 cout << "Введите номер: ";
	 cin >> n;
	 cin.clear();
	 if ((n <=1) || (n >= 30000)) cout << "Неправильно, нужно от 1 до 30000" << endl; }
	 while (!((n >=1) || (n <= 30000));
Если вводить цифру больше 30000, все корректно работает, но если вводить любую букву или любой символ, то условие (!((n >=1) || (n <= 30000)) не срабатывает. Подскажите пожалуйста какое нужно сделать условие, чтобы: введенное чило было от 1 до 30000, если был введен любой другой символ, цикл повторялся...
Просто я только начинаю изучать Visual C++...из старых воспоминаний паскаля, я думал что такое условие достаточно, оказывается нет...

Последний раз редактировалось Николай Сергеевич; 22.12.2009 в 10:53.
Николай Сергеевич вне форума Ответить с цитированием
Старый 22.12.2009, 11:19   #2
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от Николай Сергеевич Посмотреть сообщение
Всем здравствуйте, подскажите пожалуйста как быть с условием для цикла.
Код:
int n;
	do { 
	 cout << "Введите номер: ";
	 cin >> n;
	 cin.clear();
	 if ((n <=1) || (n >= 30000)) cout << "Неправильно, нужно от 1 до 30000" << endl; }
	 while (!((n >=1) || (n <= 30000));
Если вводить цифру больше 30000, все корректно работает, но если вводить любую букву или любой символ, то условие (!((n >=1) || (n <= 30000)) не срабатывает. Подскажите пожалуйста какое нужно сделать условие, чтобы: введенное чило было от 1 до 30000, если был введен любой другой символ, цикл повторялся...
Просто я только начинаю изучать Visual C++...из старых воспоминаний паскаля, я думал что такое условие достаточно, оказывается нет...
Уже по привычке
Код:
int n;
	do { 
	 cout << "Введите номер: ";
	 cin >> n;
	 cin.clear();
	 if ((n <=1) || (n >= 30000)) cout << "Неправильно, нужно от 1 до 30000" << endl; continue; }
	 while (0);
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 22.12.2009, 13:42   #3
Николай Сергеевич
Пользователь
 
Аватар для Николай Сергеевич
 
Регистрация: 14.12.2009
Сообщений: 17
По умолчанию

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

Последний раз редактировалось Николай Сергеевич; 22.12.2009 в 15:34.
Николай Сергеевич вне форума Ответить с цитированием
Старый 22.12.2009, 18:17   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Что значит не срабатывает условие? )
Код:
int n;
do {
   cout << "Введите номер: ";
   cin >> n;
   if(cin.fail()) // если ввести букву, то поток не считает её и оставит в буфере
      cin.sync(); // уберём букву из потока, чтобы не было зацикливания
   cin.clear();
   if( n <= 1 || n >= 30000 )
      cout << "Неправильно, нужно от 1 до 30000" << endl;
   } while( !( n > 1 && n < 30000) );
netrino вне форума Ответить с цитированием
Старый 23.12.2009, 09:02   #5
Николай Сергеевич
Пользователь
 
Аватар для Николай Сергеевич
 
Регистрация: 14.12.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Что значит не срабатывает условие? )
Код:
int n;
do {
   cout << "Введите номер: ";
   cin >> n;
   if(cin.fail()) // если ввести букву, то поток не считает её и оставит в буфере
      cin.sync(); // уберём букву из потока, чтобы не было зацикливания
   cin.clear();
   if( n <= 1 || n >= 30000 )
      cout << "Неправильно, нужно от 1 до 30000" << endl;
   } while( !( n > 1 && n < 30000) );
Ну, имею ввиду что частично не срабатывает, может не так выразился...если запускать цикл по твоему примеру, то если вводишь букву, то цикл летит...т.е. какое то зацикливание получается, пишется строчка "Неправильно, нужно от 1 до 30000" бесконечное количество раз...
Николай Сергеевич вне форума Ответить с цитированием
Старый 23.12.2009, 18:22   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

У меня работало, потому не обратил внимания на ошибку ) Исправил, теперь нормально должно:
Код:
	int n;
	do {
		cout << "Enter number: ";
		cin >> n;
		if(cin.fail()) { // если ввести букву, то поток не считает её и оставит в буфере
			cin.clear();
			cin.sync(); // уберём букву из потока, чтобы не было зацикливания
		}
		if( n <= 1 || n >= 30000 )
			cout << "Error 1 < n < 30000" << endl;
	} while( !( n > 1 && n < 30000) );
netrino вне форума Ответить с цитированием
Старый 24.12.2009, 08:33   #7
Николай Сергеевич
Пользователь
 
Аватар для Николай Сергеевич
 
Регистрация: 14.12.2009
Сообщений: 17
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
У меня работало, потому не обратил внимания на ошибку ) Исправил, теперь нормально должно:
Странно, у Вас работало, а у меня даже последний исправленный попрежнему бесконечно зацикливается...я контрольную то сделал, корректность воода там не нужно проверять, выясняю эту проблему лично для себя, потому что получается что не знаю даже как сделать нормальную проверку на ввод символов (мне простительно, я только начал изучать), но любопытство гложет...Буду благодарен, если кто-нибудь все таки прояснит почему так происходит...
Николай Сергеевич вне форума Ответить с цитированием
Старый 24.12.2009, 12:52   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А какой компилятор Вы используете? И кстати, n желательно инициализировать заведомо неверным значением( например 0 )
Тот вариант, что я предложил нормально работает на VS2008, BC++3.1 и MinGW, короче на windows, а вот в линуксовой консоли действительно зацикливается...
Когда вместо cin.sync() поставил cin.ignore(100, '\n'); то перестало, но как это пояснить честно говоря не знаю, линукс почти не использую, потому не знаю связанную с ним специфику )
netrino вне форума Ответить с цитированием
Старый 24.12.2009, 14:25   #9
Николай Сергеевич
Пользователь
 
Аватар для Николай Сергеевич
 
Регистрация: 14.12.2009
Сообщений: 17
По умолчанию

Visual C++ 6.0, работаю в Винде ХР, линукс я вовсе не знаю...
cin.ignore(100, '\n'); подставил вместо cin.sync(); и все заработало как по волшебству...спасибо огромное, за помощ, сохраню и буду пользоваться...жаль только что смысл не полностью понял...но примерно уяснил
Николай Сергеевич вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в цикле Oleg Romanchuk Помощь студентам 10 17.11.2009 06:34
массив в цикле for mazak Общие вопросы C/C++ 6 07.09.2009 21:35
Ошибка в цикле Belokuraya Microsoft Office Excel 11 18.08.2009 15:52
Проблема в цикле Fekla Общие вопросы C/C++ 4 28.06.2009 12:50
Color в цикле Roof Общие вопросы Delphi 8 06.08.2008 15:07