Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликуй программу в Маркете и продавай ее миллионам трейдеров!
Роман Стар
170
Роман Стар 2014.06.10 15:58 

Как реализовать такое?

int a = 1,
    b = 2,
    c = 3;

if ((a == 1 && (b == 2 || c == 3)) ||
    (a == 2 && (b == 2 && c == 2)) &&
    c == 3)
{
   // Выполняем что-то
}

Примерно такое.

Если есть А и оно равно 1 и Б = 2 или С = 3.
Или  если А = 2 и Б = 2 и С = 2.
И С = 3

Пример из воздуха, принцип сам важен. Чтобы не делать 2 проверки if`ами, нужно 2-е, 3-е условие сделать в одном операторе. Как? :)  

o_O
Модератор
23617
o_O 2014.06.10 16:25  
чисто академический интерес?
Роман Стар
170
Роман Стар 2014.06.10 16:53  
sergeev:
чисто академический интерес?


Программу пишу. Советника вернее. Есть условие, отличить, где мы торгуем, на Валюте или Фондах. От этого, если на Форексе - то ведем учет одной переменной, а если на Фондах - то задействуем другую переменную. + есть переменная общая для обоих инструментах.

Очень надо разобраться как строить логику условий и вложенных условий. 

o_O
Модератор
23617
o_O 2014.06.10 17:34  

почему приведенное вами условия не нравится?

Роман Стар
170
Роман Стар 2014.06.10 17:42  
sergeev:

почему приведенное вами условия не нравится?



Не работает. Это пример условие. В реальном условии по отдельности (3 блока) не выполняется, то есть ни одно из низ не выполняется - а оператор пропускает дальше.

Можно пример, как правильно сделать множественные условия, подобно моему сюжету? :). 

o_O
Модератор
23617
o_O 2014.06.10 17:54  

вы неясно изьясняетесь - что вам надо, сами привели уже готовую реализацию какой-то логики.

если вы считаете показанный код неверным - напишите словами подробно что вы хотите сравнить и что проверить.

---

PS ошибка может быть банальной - вы не поставили скобки для указания приоритета операций

Простак
315
Простак 2014.06.10 20:01  

Приоритеты операций && и || различны, это следует учитывать.

Также вычисление сложных логических операций имеет интересную особенность: далеко не все подвыражения могут вычисляться. Подвыражения вычисляются слева направо, с группировкой операций согласно приоритетов, причём, вычисляется минимум подвыражений, которые необходимо вычислить, чтобы общее значение выражения стало ясно. Здесь это названо "короткой оценкой".

Для того, чтобы всё понять самому, нужно поэкспериментировать с "визуализирующим" кодом, например:

#property strict

/******************************************************************************/
bool f(uint n, bool b) {
  Print("f", n, "(): ", b ? "true" : "false");
  return b;
}

/******************************************************************************/
void OnStart() {
  Print("Раз:");
  bool a = f(1, true) || f(2, true) && f(3, true);
  Print("a = ", a);

  Print("Два:");
  bool b = f(1, true) && f(2, true) && f(3, true);
  Print("b = ", b);

  Print("Три:");
  bool c = f(1, false) || f(2, false) && f(3, false);
  Print("c = ", c);

  Print("Четыре:");
  bool d = f(1, false) && f(2, false) && f(3, false);
  Print("d = ", d);
}

Функция f() - визуализирующая: если подвыражение вычислялось, то функция была вызвана, и она напишет об этом. Ей передаётся число, которое она напишет, чтобы видеть, какие вычислялись подвыражения, и логическое значение, которое она также сообщит и вернёт в качестве результата подвыражения.

Данный код даёт следующее (build 646, WinXP-32):

23:47:42 Script 1 EURUSDr,H1: loaded successfully
23:47:42 1 EURUSDr,H1: initialized
23:47:42 1 EURUSDr,H1: Раз:
23:47:42 1 EURUSDr,H1: f1(): true
23:47:42 1 EURUSDr,H1: a = true
23:47:42 1 EURUSDr,H1: Два:
23:47:42 1 EURUSDr,H1: f1(): true
23:47:42 1 EURUSDr,H1: f2(): true
23:47:42 1 EURUSDr,H1: f3(): true
23:47:42 1 EURUSDr,H1: b = true
23:47:42 1 EURUSDr,H1: Три:
23:47:42 1 EURUSDr,H1: f1(): false
23:47:42 1 EURUSDr,H1: f2(): false
23:47:42 1 EURUSDr,H1: c = false
23:47:42 1 EURUSDr,H1: Четыре:
23:47:42 1 EURUSDr,H1: f1(): false
23:47:42 1 EURUSDr,H1: d = false
23:47:42 1 EURUSDr,H1: uninit reason 0
23:47:42 Script 1 EURUSDr,H1: removed

В первом случае вычислилось только первое логическое подвыражение, потому что после этого стало ясно значение всего выражения, поскольку, в связи с приоритетами, группировка (показано с помощью скобок) происходит ТАК: "f(1, true) || (f(2, true) && f(3, true))", а НЕ так: "(f(1, true) || f(2, true)) && f(3, true)".

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

В третьем случае - два подвыражения, в четвёртом - одно.

Поэкспериментируйте, задавая различные возвращаемые значения подвыражениям, а также задавая различные логические операции между ними.

Для двух подвыражений, для трёх, как в этом примере, для четырёх...

Поприменяйте скобки для изменения группировки операций...

Методично пройдите все варианты, пока не окажетесь в состоянии заранее "предсказывать", как и что будет вычисляться для логических выражений любой сложности.

Ещё есть такая штука, как условное выражение (?:), оно используется в данном коде в функции f(), но оно не очень часто к месту, хотя порой - ну, очень к месту и очень удобно.

Алексей Тарабанов
7250
Алексей Тарабанов 2014.06.10 20:07  
Роман, скажи: "Спасибо", думать будем потом. 
Alexander
2441
Alexander 2014.06.11 02:26  
И как может С равняться 2 и 3 одновременно?  А для первого случая - просто повторение.  (два раза с=3)
Роман Стар
170
Роман Стар 2014.06.11 05:22  
simpleton:

Приоритеты операций && и || различны, это следует учитывать.

Также вычисление сложных логических операций имеет интересную особенность: далеко не все подвыражения могут вычисляться. Подвыражения вычисляются слева направо, с группировкой операций согласно приоритетов, причём, вычисляется минимум подвыражений, которые необходимо вычислить, чтобы общее значение выражения стало ясно. Здесь это названо "короткой оценкой".

Для того, чтобы всё понять самому, нужно поэкспериментировать с "визуализирующим" кодом, например:

Функция f() - визуализирующая: если подвыражение вычислялось, то функция была вызвана, и она напишет об этом. Ей передаётся число, которое она напишет, чтобы видеть, какие вычислялись подвыражения, и логическое значение, которое она также сообщит и вернёт в качестве результата подвыражения.

Данный код даёт следующее (build 646, WinXP-32):

В первом случае вычислилось только первое логическое подвыражение, потому что после этого стало ясно значение всего выражения, поскольку, в связи с приоритетами, группировка (показано с помощью скобок) происходит ТАК: "f(1, true) || (f(2, true) && f(3, true))", а НЕ так: "(f(1, true) || f(2, true)) && f(3, true)".

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

В третьем случае - два подвыражения, в четвёртом - одно.

Поэкспериментируйте, задавая различные возвращаемые значения подвыражениям, а также задавая различные логические операции между ними.

Для двух подвыражений, для трёх, как в этом примере, для четырёх...

Поприменяйте скобки для изменения группировки операций...

Методично пройдите все варианты, пока не окажетесь в состоянии заранее "предсказывать", как и что будет вычисляться для логических выражений любой сложности.

Ещё есть такая штука, как условное выражение (?:), оно используется в данном коде в функции f(), но оно не очень часто к месту, хотя порой - ну, очень к месту и очень удобно.


Да, благодарю :). Хороший пример, сейчас буду копаться.
Роман Стар
170
Роман Стар 2014.06.11 15:09  

Благодарю всех, как всегда - все получилось :).

if (((a == b && a > b) ||
   (a != b && b > b)) &&
   other_ifs == true)
{
   // ...
}
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий