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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2011, 01:35   #1
Lanx
 
Регистрация: 06.04.2011
Сообщений: 8
По умолчанию Неверно работает цикл. Почему — не представляю себе

Код:
#include "Group.h"
int f1 ()
 {
  int n = 0;
  bool flag = true;
  while (flag)
  {
   cout << "Enter number of groups, that you would like to add to a database:"; cin >> n;
   if(!cin.fail()) flag = false; else cout << "Not a natural numer. Try again ";
  }
  return n;
 }
int main()
{
 int m = f1();
 return 0;
}
Функция f1 создает локальную булевую переменную, присваивая ей значение "истина" Далее входит в цикл, который выполняется до тех пор, пока булевая переменная истинна. итак, первая итерация: истинно -> выполняем. Выводит строку, все как положено. Ввожу, допустим "Fhfgjh". cin.fail(), естественно, возвратит истину, то есть выполняется блок else: выводит строку. Далее, т.к. значение локальной булевой переменной не изменилось, а то есть "истина", происходит вторая итерация. но должна опять выводиться строка, опять записываться введенное в n и снова проверяться, а у меня запускается бесконечный цикл, который, видимо, совсем не повторяет "cin >> n", а постоянно читает старое, неверное значение. Почему он пропускает "cin >> n"? Ведь каждый раз оно должно быть разное. Вторая итерация просто не дает мне возможность ввести, сразу берет почему-то значение n из предыдущей итерации и выводит бесконечно строки. Как так?!

Последний раз редактировалось Lanx; 04.06.2011 в 02:58.
Lanx вне форума Ответить с цитированием
Старый 04.06.2011, 01:53   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Код:
cin.flush();
спасет отца русской демократии -)

ЗЫ.
Код:
while (flag == true)
ну что это такое?.. это все равно что написать
Код:
пока (истина == истина)
просто
Код:
while (flag)
будет вполне достаточно.
И с проверкой cin.fail() точно так же, только там отрицание добавить надо. Или поменять местами блоки... или вообще совместить условие проверки с присваиванием значения флагу:
Код:
if (flag = cin.fail()) 
    cout << "Not a natural number. Try again\n";
cin.flush();
Если уж вводить булевские переменные, так надо ими пользоваться, а не удалять гланды, извините, ректально -)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 04.06.2011, 02:04   #3
Lanx
 
Регистрация: 06.04.2011
Сообщений: 8
По умолчанию

Спасибо, исправил переменные. там сделал (!cin.fail()). Но что за cin.flush()? У меня не находит такого метода в cin. И, собственно, почему у меня так ведет себя цикл? Я подобные циклы в интернете находил, когда в инфу искал. Что я делаю не так, собственнО?
Lanx вне форума Ответить с цитированием
Старый 04.06.2011, 12:11   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
Сообщение от Lanx Посмотреть сообщение
Спасибо, исправил переменные. там сделал (!cin.fail()). Но что за cin.flush()? У меня не находит такого метода в cin. И, собственно, почему у меня так ведет себя цикл? Я подобные циклы в интернете находил, когда в инфу искал. Что я делаю не так, собственнО?
mea culpa...
Прошу прощения, не для того потока указал метод. Конечно же, flush -- метод не istream, а ostream...

Увы, похоже и это не помогает. Сейчас гляну внимательнее... тяжело после пятницы внимательно смотреть -)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 04.06.2011, 12:55   #5
Lanx
 
Регистрация: 06.04.2011
Сообщений: 8
По умолчанию

Помогите, пожалуйста. Жизненно необходимо заставить цикл работать, т.к. нужно проверять введенную строку на выполнение условия отсутствия символов, кроме цифр. Я же сам здесь все делал, объясните, пожалуйста, в чем проблема и как решить. В интернете еще советовали кое-какие решения, но я ничего не понял. flush у меня нету. нашел, что проблема в том, что флаг cin уже не сбрасывается. Но почему оно мне не дает хотя бы ввести? ведь в цикле ясно есть "cin", а это эквивалентно выводу командной строки для ввода чего-нибудь! может, кто-то считает меня недалеким, но я только учусь, первый курс, извините, если вопрос смешно выглядит в ваших глазах! просто действительно нет времени читать всё с самых основ. Этот цикл бы очень помог мне в работе. Как его заставить нормально работать?!
Lanx вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает цикл? JasperCRT Общие вопросы Delphi 2 24.05.2011 18:18
Почему не работает цикл? Marsik Помощь студентам 0 18.11.2009 15:01
Цикл работает не полностью почему? foE Компоненты Delphi 2 07.06.2009 14:32
Почему не работает цикл??? kobolok Помощь студентам 1 06.05.2009 12:24
Почему не работает цикл????? Marsik Помощь студентам 2 22.06.2008 14:16