Подскажите. Правильно ли будет работать... - страница 5

 
Правда, Yurixx. Но и твой код можно сделать лаконичнее. Я не буду предлагать варианты, но тут явно повторяется одна и та же логическая конструкция, которую можно сделать функцией.
 
Yurixx:

А как быть в советнике, который реализует более сложную логику, например, такого бинарного дерева:

if (x1>A)
{  if (x2>B)
   {  if (x3>C)
      {  if (x4>D) procedure_1(....);
         else procedure_2(....);
      }
      else
      {  if (x5>E) procedure_3(....);
         else procedure_4(....);
      }
   }
   else
   {  if (x6>F)
      {  if (x7>G) procedure_5(....);
         else procedure_6(....);
      }
      else
      {  if (x8>H) procedure_7(....);
         else procedure_8(....);
      }
   }
}
else
{  if (x9>I)
   {  if (x10>J)
      {  if (x11>K) procedure_9(....);
         else procedure_10(....);
      }
      else
      {  if (x12>L) procedure_11(....);
         else procedure_12(....);
      }
   }
   else
   {  if (x13>M)
      {  if (x14>N) procedure_13(....);
         else procedure_14(....);
      }
      else
      {  if (x15>O) procedure_15(....);
         else procedure_16(....);
      }
   }
}

Ничего не надо делать - ясный и прозрачный код, ничего лишнего, оптимально как по быстродействию, так и по затратам умственных и физических усилий программиста. Студент, можете садиться - вам 5!!!:-)

Главное, чтобы форматирование было, тогда видно где что начинается, где что заканчивается.

 
Mathemat:
Но и твой код можно сделать лаконичнее. Я не буду предлагать варианты, но тут явно повторяется одна и та же логическая конструкция, которую можно сделать функцией.

Без сомнений можно и лаконичнее и еще красивее. :-) Например, используя рекурсию. Но если, предположим, все процедуры в примере выполняют разные действия или отличаются наборами параметров, то мне очень интересно как вы это сделаете. В Си может быть, в MQL вряд ли.

Однако, повторяю еще раз вопрос, который спровоцировал Sart своим заявлением: можно ли это дерево if-ов переписать без вложений ? Ответ на него я пока так и не услышал. Кроме, конечно того, что написал Sart - надо менять логику. :-)

Все остальные замечания, при всей их справедливости, не в тему.

 

Любую конструкцию из вложенных if-ов можно написать с гораздо меньшим количеством вложений. Считаем, что condition уже объявлена и вычислена как bool. Конструкция

bool result;
if ( condition ) result = true; 
else             result = false;
эквивалентна такой строчке:

bool result = condition;
Если тип result другой - скажем, double:

double result, d1, d2;
if ( condition ) result = d1; 
else             result = d2;

то эквивалентный код без вложений таков:

double result, d1, d2;
double result = condition * d1 + (!condition) * d2;

Если тип возвращаемых данных не существует, например:

if ( condition ) { последовательность операторов 1 }; 
else             { последовательность операторов 2 };

то будет так:

void foo1() { последовательность операторов 1; return; }
void foo2() { последовательность операторов 2; return; }

а дальше я еще не придумал.

Конечно, я рассмотрел не все случаи, но принцип должен быть ясным.

 

Да ладно, Mathemat, это просто модельный пример.

И вопрос был адресован к Sart'у, но он уже от ответа ушел. Если вы не являетесь принципиальным борцом за торжество утверждения "Напишите код, скажем, с уровнем вложения 5, а я перепишу его Вам без вложений...", то не стОит тратить ни время, ни силы.

Переписать мой пример без вложений на самом дел очень просто. Достаточно написать 16 последовательных одинарных if-ов, в каждом из которых в условии будет сумма (&&) 4-х соответствующих операций сравнения, а исполняемым оператором будет соответствующая процедура. На языке медиков это называется удалять гланды через задний проход. :-)

 
Yurixx:

Да ладно, Mathemat, это просто модельный пример.

И вопрос был адресован к Sart'у, но он уже от ответа ушел. Если вы не являетесь принципиальным борцом за торжество утверждения "Напишите код, скажем, с уровнем вложения 5, а я перепишу его Вам без вложений...", то не стОит тратить ни время, ни силы.


Юрий ! Бросьте Вы все это. Каждый пишет как привык, как ему нравится. Да и, вообще, программирование, по-моему, дело второстепенное.

Запрограммировать можно все что угодно, были бы идеи. Если программа приносит прибыль, значит, говорят, автор - хороший программист.

А посмотрите на программу господина Решетова "Искуственный Интеллект". Да ведь эта программа, сама по себе, как программный продукт, не выносит никакой критики.

Она просто, с этой точки зрения, отвратительна. Но ведь никто и слова не сказал. А почему ? Потому, что идеи господина Решетова очень хороши.

Я, к примеру, сейчас, когда уловил суть всех возможностей этого языка, потерял к нему интерес и переключился на капитальное изучение теории: индикаторы, Волны Элиота и пр.

Когда появятся торговые идеи, тогда и будем программировать.

И еще - конечно, делать замечания на форуме с умным видом, легче чем кропотливо и по детски сидеть день за днем и штудировать теорию...Бывает такой грех и со мной , когда сильно устаю...

И еще, вот чтоя хочу сказать. Профессиональные программисты в своем большинстве , действительно, пишут плохие эксперты. А это происходит, именно от их любви к своему делу.

Они сидят месяцами вникая во все нюансы языка, и им это доставляет удовольствие. Мы все забываем зачем сюда пришли - ну очень интересно. Да так оно и есть - увлекательное дело.



С уважением - С.Д.
 
Integer:
  if(x1==x2){
      if(x3==x4){
         if(x5==x6){
            if(x7==x8){
               if(x9==x10){
                  OhYes=true;
               }
            }
         }
      }
  }

а я в последнее время вместо длинючих амперсандов (&&) делаю так:

  if(x1==x2)
  if(x3==x4)
  if(x5==x6)
  if(x7==x8)
  if(x9==x10){
      OhYes=true;
  }
фишка в том, что при изменении кода очень легко закоментировать условия..

а ещё для bool можно использовать умножение:

  if( (x1==x2)*(x3==x4)*(x5==x6)*(x7==x8)*(x9==x10) ) {
      OhYes=true;
  }

но куча вложенных иф-ов будет быстрее, так так для длинных выражений считаются все сразу, сместо экономного выхода при первом же false...

 
Integer:
Yurixx:

А как быть в советнике, который реализует более сложную логику, например, такого бинарного дерева:

if (x1>A)
{  if (x2>B)
   {  if (x3>C)
      {  if (x4>D) procedure_1(....);
         else procedure_2(....);
      }
      else
      {  if (x5>E) procedure_3(....);
         else procedure_4(....);
      }
   }
   else
   {  if (x6>F)
      {  if (x7>G) procedure_5(....);
         else procedure_6(....);
      }
      else
      {  if (x8>H) procedure_7(....);
         else procedure_8(....);
      }
   }
}
else
{  if (x9>I)
   {  if (x10>J)
      {  if (x11>K) procedure_9(....);
         else procedure_10(....);
      }
      else
      {  if (x12>L) procedure_11(....);
         else procedure_12(....);
      }
   }
   else
   {  if (x13>M)
      {  if (x14>N) procedure_13(....);
         else procedure_14(....);
      }
      else
      {  if (x15>O) procedure_15(....);
         else procedure_16(....);
      }
   }
}

Ничего не надо делать - ясный и прозрачный код, ничего лишнего, оптимально как по быстродействию, так и по затратам умственных и физических усилий программиста. Студент, можете садиться - вам 5!!!:-)

Главное, чтобы форматирование было, тогда видно где что начинается, где что заканчивается.

Насчет данного дерева, например в Object Pascal есть т.н. "процедурный тип":
type TProc=Procedure (x1:Integer);
 
var parr:array[boolean,boolean,boolean,boolean] of TProc;
правда не знаю, возможно ли такое в MQL, в Си, наверное, возможно.
Причина обращения: