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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2011, 11:41   #1
kirza
 
Регистрация: 15.08.2010
Сообщений: 5
По умолчанию Как улучшить код

Подскажите как представить ниже приведенный код в виде процедуры:
Код:
//3
repeat
//2
repeat
//1
repeat
i:=i+1;
if {(f_4DD(grad1,grad2,grad3,grad4,grad5,grad6) > 0) and } (q_des_5_464(Z) < 31) then begin
//**************
if (ches_5_464(Z) > max_D) then begin
max_D:=ches_5_464(Z);
opt_5_464[tm,0]:=Z[0];
opt_5_464[tm,1]:=Z[1];
opt_5_464[tm,2]:=Z[2];
opt_5_464[tm,3]:=ches_5_464(Z);
opt_5_464[tm,4]:=q_des_5_464(Z);
end;
//**********
end;
ProgressBar1.Position:=ProgressBar1.Position+1;
Update;
Z[0]:=Z[0]+stp;
if (abs(Z[0]) < 0.00001) then
Z[0]:=0;
until (Z[0] > 1.00001);
Z[0]:=-1;
ProgressBar1.Position:=0;
//
//2
i:=i+1;
if {(f_4DD(grad1,grad2,grad3,grad4,grad5,grad6) > 0) and } (q_des_5_464(Z) < 31) then begin
//**************
if (ches_5_464(Z) > max_D) then begin
max_D:=ches_5_464(Z);
opt_5_464[tm,0]:=Z[0];
opt_5_464[tm,1]:=Z[1];
opt_5_464[tm,2]:=Z[2];
opt_5_464[tm,3]:=ches_5_464(Z);
opt_5_464[tm,4]:=q_des_5_464(Z);
end;
//**********
end;
ProgressBar2.Position:=ProgressBar2.Position+1;
Update;
Z[1]:=Z[1]+stp;
if (abs(Z[1]) < 0.00001) then
Z[1]:=0;
until (Z[1] > 1.00001);
Z[1]:=-1;
ProgressBar2.Position:=0;
//
//3
i:=i+1;
if {(f_4DD(grad1,grad2,grad3,grad4,grad5,grad6) > 0) and } (q_des_5_464(Z) < 31) then begin
//**************
if (ches_5_464(Z) > max_D) then begin
max_D:=ches_5_464(Z);
opt_5_464[tm,0]:=Z[0];
opt_5_464[tm,1]:=Z[1];
opt_5_464[tm,2]:=Z[2];
opt_5_464[tm,3]:=ches_5_464(Z);
opt_5_464[tm,4]:=q_des_5_464(Z);
end;
//**********
end;
ProgressBar3.Position:=ProgressBar3.Position+1;
Update;
Z[2]:=Z[2]+stp;
if (abs(Z[2]) < 0.00001) then
Z[2]:=0;
until (Z[2] > 1.00001);
l:=Z[2]-1;
Z[2]:=-1;
ProgressBar3.Position:=0;
Хорошо еще, что здесь только 3 повтора, а нужно штук 20 и с рекурсией что-то никак сочинить не могу.

Последний раз редактировалось Stilet; 15.01.2011 в 11:54.
kirza вне форума Ответить с цитированием
Старый 16.01.2011, 00:42   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.gunsmoker.ru/2011/01/blog-post.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 16.01.2011, 00:59   #3
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Полностью поддерживаю пост GunSmoker... ну раз уж попросил, то вот накидал:
Код:
procedure f(ai: byte);
begin
  if ai>0 then
  begin
    f(ai-1);
    Z[ai-1]:=-1;
  end;
  repeat
    i:=i+1;
    if {(f_4DD(grad1,grad2,grad3,grad4,grad5,grad6) > 0) and } (q_des_5_464(Z) < 31) then
    begin
      //**************
      if (ches_5_464(Z) > max_D) then
      begin
        max_D:=ches_5_464(Z);
        opt_5_464[tm,0]:=Z[0];
        opt_5_464[tm,1]:=Z[1];
        opt_5_464[tm,2]:=Z[2];
        opt_5_464[tm,3]:=ches_5_464(Z);
        opt_5_464[tm,4]:=q_des_5_464(Z);
      end;
      //**********
    end;
    ProgressBar1.Position:=ProgressBar1.Position+1;
    Update;
    Z[ai]:=Z[ai]+stp;
    if (abs(Z[ai]) < 0.00001) then
    Z[ai]:=0;
  until (Z[ai] > 1.00001);
end;
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 16.01.2011, 10:37   #4
kirza
 
Регистрация: 15.08.2010
Сообщений: 5
По умолчанию

Спасибо, что откликнулись. До приведенного Вами решения я сам сумел догадаться. Однако оно дает выполнение не вложенных, а последовательных циклов. Перемещение блока
Код:
if ai>0 then
  begin
    f(ai-1);
    Z[ai-1]:=-1;
  end;
внутрь цикла зацикливает процедуру, т.к. параметр ai после принятия последнего значения остается неизменным. Найти выход пока не могу рассчитываю на Вашу помощь.

Почитал тут: http://www.cyberforum.ru/cpp-beginne...ead228201.html и все получилось!!!!!

Последний раз редактировалось Stilet; 16.01.2011 в 12:56.
kirza вне форума Ответить с цитированием
Старый 16.01.2011, 16:42   #5
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Цитата:
внутрь цикла зацикливает процедуру, т.к. параметр ai после принятия последнего значения остается неизменным.
не совсем понял о чем это вы?
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 16.01.2011, 22:35   #6
kirza
 
Регистрация: 15.08.2010
Сообщений: 5
По умолчанию

Я о том, что если воткнуть вызов рекурсии в приведенном Вами решении после repeat, то происходит зацикливание. Чтобы его устранить, надо было добавить принудительный "выброс" в проверку условия
Код:
procedure f(ai: byte);
begin
  if ai=3 {к примеру 3 вложенных цикла} then
exit;
  repeat
f(ai+1)
    i:=i+1;
    if {(f_4DD(grad1,grad2,grad3,grad4,grad5,grad6) > 0) and } (q_des_5_464(Z) < 31) then
    begin
      //**************
      if (ches_5_464(Z) > max_D) then
      begin
        max_D:=ches_5_464(Z);
        opt_5_464[tm,0]:=Z[0];
        opt_5_464[tm,1]:=Z[1];
        opt_5_464[tm,2]:=Z[2];
        opt_5_464[tm,3]:=ches_5_464(Z);
        opt_5_464[tm,4]:=q_des_5_464(Z);
      end;
      //**********
    end;
    ProgressBar1.Position:=ProgressBar1.Position+1;
    Update;
    Z[ai]:=Z[ai]+stp;
    if (abs(Z[ai]) < 0.00001) then
    Z[ai]:=0;
  until (Z[ai] > 1.00001);
Z[ai]:=-1;
end;
По крайней мере в таком виде у меня все работает!
kirza вне форума Ответить с цитированием
Старый 16.01.2011, 23:46   #7
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Код:
procedure f(ai: byte);
var i: integer;
begin
  repeat
  if ai>0 then
  begin
    f(ai-1);
      Z[ai-1]:=-1;
    end;
    i:=i+1;
    if {(f_4DD(grad1,grad2,grad3,grad4,grad5,grad6) > 0) and } (q_des_5_464(Z) < 31) then
    begin
      //**************
      if (ches_5_464(Z) > max_D) then
      begin
        max_D:=ches_5_464(Z);
        opt_5_464[tm,0]:=Z[0];
        opt_5_464[tm,1]:=Z[1];
        opt_5_464[tm,2]:=Z[2];
        opt_5_464[tm,3]:=ches_5_464(Z);
        opt_5_464[tm,4]:=q_des_5_464(Z);
      end;
      //**********
    end;
    ProgressBar1.Position:=ProgressBar1.Position+1;
    Update;
    Z[ai]:=Z[ai]+stp;
    if (abs(Z[ai]) < 0.00001) then
    Z[ai]:=0;
  until (Z[ai] > 1.00001);
end;
Вызов для тройного вложения:
Код:
f(2);
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 18.01.2011, 21:57   #8
kirza
 
Регистрация: 15.08.2010
Сообщений: 5
По умолчанию

Кстати, уважаемый SNUPY, думаю Вы заметили дурацкий кусок в моём коде:
Код:
if (abs(Z[ai]) < 0.00001) then
    Z[ai]:=0;
  until (Z[ai] > 1.00001);
У меня
Код:
Z[ai]
изменяется от -1 до 1 с шагом
Код:
stp
(частности 0,05), но почему-то получается не 0, а число близкое к нему и не 1, а что-то вроде 1,00000007548. Почему так случайно не знаете и как от этого избавиться?
kirza вне форума Ответить с цитированием
Старый 18.01.2011, 22:38   #9
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

как объявлены Z и Stp ?
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 19.01.2011, 11:59   #10
kirza
 
Регистрация: 15.08.2010
Сообщений: 5
По умолчанию

Код:
type
    TX = array[0..5] of real;
...
  procedure optimize_ches_4_447_new(var Z: TX; stp: real; tm, inx: byte; var max_D: real);
...
var
  Form3: TForm3;
  Z: TX;
kirza вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как улучшить форум. Гриха О форуме и сайтах клуба 2798 30.11.2011 03:03
Вопрос по символьным массивам. Как улучшить код. Aerial Общие вопросы C/C++ 4 13.04.2010 10:54
Как улучшить макрос? Highlander Microsoft Office Excel 1 23.01.2010 12:15
Как улучшить fps ? minatavr84 Компьютерное железо 2 26.03.2009 23:59
Как улучшить качество скриншота Arkuz Мультимедиа в Delphi 6 10.03.2009 18:52