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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2008, 14:20   #1
Эдуард
Пользователь
 
Регистрация: 18.02.2008
Сообщений: 15
По умолчанию Как выйти из бесконечного цикла!

Описание программы
Cначала программа генерирует случайным образом начальную популяцию особей. Для этого используется встроенная функция генератора случайных чисел (ГСЧ) С-компилятора. Причем, значения хромосом генерируется в заданных пределах, то есть коэффициент заполнения в диапазоне от 0,1 до 1, число ступеней от 1 до 10 и амплитуда напряжения каждого ПМ от 0 до 100В.
Затем, в бесконечном цикле запускаются функции. Производится расчет временных параметров – функция “calcT()”, то есть длительность импульса и длительность ступени , а также задержка включения каждого ПМ . Далее с помощью функции расчета амплитуд ступеней “calcUds()” заполняется массив Uds[j][i]. Зная амплитуды ступеней и временные параметры ступенчатого напряжения, формируется виртуальное ступенчатое напряжение по синусоидальному закону для каждой особи и делается выборка из 1024 отсчетов за период для реализации алгоритма БПФ – функция “calcS1()”. Для полученных напряжений вычисляются амплитуды гармоник с помощью функции реализующей БПФ - “fft()”, по которым уже рассчитывается коэффициент гармоник по формуле 3.2.
Получив все необходимые данные, программа переходит к функции “calcF()”, которая рассчитывает значения функции пригодности для каждой особи в поколении по формуле 3.1. Полученные значения функции пригодности проверяются функцией “stop()” на выполнение критерия остановки. В случае выполнения условия остановки, программа переходит к выводу полученных результатов – функция “output()”. Если критерий остановки не выполнился, то программа переходит к выполнению функции “Sel()” – селекция особей
Код:
//Функция вывода данных
void TForm1::output(TLabel*lb)
{

   lb->Caption="Программа выполнена";

   }

//Проверка критерия остановки
void TForm1::Stop()
{
   p++;
   //cout <<"\n p="<<p<<"\n ";
   for(i=0;i<u;i++)
	{
   	dF=fabs(10.0-F[i]);
      Imax=i;
      if(dF<0.1)
      {
      output(Label1);
      };
   }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{

randomize();

//------------------------------------------------------------------------------
   c=0;  //счетчик десяти последних поколений, кот. удовл. критерию выхода
   h=0;  //счетчик десяти поколений
   p=0; //счетчик поколений


   while(1)
   {
      calcUds();
      for(ii=0;ii<u;ii++)
      {
         calcT();//расчет временных параметров
         calcS1();
      	fft();
      }

		calcF();
      Stop();
      Sel();
      Cross();
      Muta();
   }   }
//------------------------------------------------------------------------------
Но при работе алгоритма в бесконечном цикле возникает одна проблема. После прохождения критерия остановки Stop() программа переходит к функции output()-т.е вывод результата, после чего программа должна остановиться, но она продолжает свою работу и возвращается в бесконечный цикл. Подскажите, какой применить оператор для остановки, или что необходимо сделать для того чтобы выполнение программы прекратилось .
Эдуард вне форума Ответить с цитированием
Старый 02.03.2008, 14:29   #2
_Dmitry
Участник клуба
 
Аватар для _Dmitry
 
Регистрация: 02.09.2007
Сообщений: 1,193
По умолчанию

функция break завершает цикл
_Dmitry вне форума Ответить с цитированием
Старый 02.03.2008, 14:38   #3
Эдуард
Пользователь
 
Регистрация: 18.02.2008
Сообщений: 15
По умолчанию

Но тут вот какая вещь,программа должно прекратить работать перейдя на функцию output()
Код:
void TForm1::output(TLabel*lb)
{
   lb->Caption="Kg["+String(Imax)+"]="+String(Kg[Imax]) ;
break;
   }
Но это ж неверно!Break в таких конструкциях не применют
Эдуард вне форума Ответить с цитированием
Старый 02.03.2008, 14:42   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Эдуард, ну а если, к примеру,
void TForm1::Stop() сделать bool TForm1::Stop() ...
B_N вне форума Ответить с цитированием
Старый 02.03.2008, 14:52   #5
Эдуард
Пользователь
 
Регистрация: 18.02.2008
Сообщений: 15
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Эдуард, ну а если, к примеру,
void TForm1::Stop() сделать bool TForm1::Stop() ...
Пардон, что это дает,поясните?
Эдуард вне форума Ответить с цитированием
Старый 02.03.2008, 14:55   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Эдуард Посмотреть сообщение
Пардон, что это дает,поясните?
Код:
if(Stop()) break;
B_N вне форума Ответить с цитированием
Старый 02.03.2008, 17:53   #7
Эдуард
Пользователь
 
Регистрация: 18.02.2008
Сообщений: 15
По умолчанию

Я правильно понял,что вы имели ввиду.Т.е после того как критерий остановки удволетварен,что в свою очередь значит dF<0.1,функция Stop() должна вернуть значение 1 или 0,и затем проверяется условие
if(Stop(значение)) break; и программа прекращает работу
Эдуард вне форума Ответить с цитированием
Старый 02.03.2008, 18:05   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Эдуард Посмотреть сообщение
Я правильно понял,что вы имели ввиду.Т.е после того как критерий остановки удволетварен,что в свою очередь значит dF<0.1,функция Stop() должна вернуть значение 1 или 0,и затем проверяется условие
if(Stop(значение)) break; и программа прекращает работу
Ну разумеется! Вы же сами написали: После прохождения критерия остановки Stop() программа переходит к функции output()-т.е вывод результата, после чего программа должна остановиться. output у Вас внутри Stop'а, так что после нее делать ничего не нужно - выходим из цикла.
B_N вне форума Ответить с цитированием
Старый 02.03.2008, 18:21   #9
Эдуард
Пользователь
 
Регистрация: 18.02.2008
Сообщений: 15
По умолчанию

А как правильно будет с точки зрения синтаксиса.Вот допустим у меня выполнилось условие dF<0.1,затем идет функция output(),и после чего Stop возвращает значение 1 т.е Stop(1),а потом проверка if (Stop(1)) break;
Код:
bool TForm1::Stop()
{
   p++;
   //cout <<"\n p="<<p<<"\n ";
   for(i=0;i<u;i++)
	{
   	dF=fabs(10.0-F[i]);
      Imax=i;
      if(dF<0.1)
      {
       output(Label1);
       return 1;
       }
   }
}

   

void __fastcall TForm1::Button1Click(TObject *Sender)
{

while(1)
   {
      calcUds();
      for(ii=0;ii<u;ii++)
      {
         calcT();//расчет временных параметров
         calcS1();
      	fft();
      }

      calcF();
      Stop();
      if(Stop(1)) break;
      Sel();
      Cross();
      Muta();
Но здесь определенно,я что то неправильно сделал)))
Эдуард вне форума Ответить с цитированием
Старый 02.03.2008, 18:26   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Какой еще "Stop(1)"! Просто "if(Stop()) break;", как я выше написал. Главное, не забывайте из Stop() еще и 0 возращать, если проверка не прошла, а то всё начнет глюками покрываться.
B_N вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание цикла. lexusus Общие вопросы C/C++ 6 27.05.2008 17:38
Пытаюсь выйти в инет с компа через мобилу, в момент соединения комп начинает виснуть Sava Свободное общение 5 29.04.2008 18:02
Выход из цикла RIO Помощь студентам 1 21.04.2008 22:55
Оператор цикла с предусловием While. Оператор цикла с пост условием Repeat McMilin Помощь студентам 7 11.11.2007 14:10
Паскаль. Сумма бесконечного ряда Tream Помощь студентам 4 13.10.2007 23:42