Урок №7: Условия и циклы

Условный оператор if

Конструкция практически любого алгоритма подразумевает наличие условий, поэтому для организации вычислений в зависимости от какого-либо условия в MQL предусмотрен условный оператор if, который в общем виде записывается следующим образом:

if (условие) выражение_1; else выражение_2;

Здесь условие — это логическое выражение, переменная или константа.

Работает условный оператор следующем образом. Сначала вычисляется значения выражения, записанного в виде условия. Если оно имеет значение истина (true), выполняется выражение_1. В противном случае (значение ложное (false) ) выражение_2. 

Например, чтобы сравнить значения переменных a и b нужно написать следующую часть  программного кода:

//+------------------------------------------------------------------+
//| Expert function                                                  |
//+------------------------------------------------------------------+
bool check(int a, int b)
{
   if (a > b)
    return true;

   return false;
} 

В данном случае условие(a > b) помещено в скобках после оператора if. В этой конструкции код «return true;» будет выполняться в том случае, если «a» будет больше «b». Следующая строка «return false;» уже не относится к коду который будет выполняться при выполнении условия. В конструкциях условия при выполнении данного условия будет выполняться только одна строка кода, если код не обрамлён в фигурные скобки, то есть если не сформировано тело кода выполняемого при условии.

Для сравнения равенства значений используется знак «==». Не путайте знак проверки равенства «==» и оператор присваивания «=».

//+------------------------------------------------------------------+
//| Expert function                                                  |
//+------------------------------------------------------------------+
bool IsEqual(int a, int b)
{
   if (a == b)
     return true;

   return false;
}

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

if (условие) { выражение_1; выражение_2; … }

else { выражение_1; выражение_2; … }

Альтернативная ветвь else в условном операторе может отсутствовать, если в ней нет необходимости.

//+------------------------------------------------------------------+
//| Expert function |
//+------------------------------------------------------------------+
int GetValue(int a, int b)
{
   int result;

   if(a > b)
   {
      result = 1;
      return(result);
   }
   else if(a < b)
   {
      result = 2;
      return(result);
   }
   else
   {
      return(3);
   }
}

В этом примере происходит проверка значений «a» и «b» и возврат результата в зависимости от выполнения условий:

Если (a > b), то в переменную result записывается значение «1» и возвращаем результат с выходом из функции

Иначе Если (a < b), то в переменную result записывается значение «2» и возвращаем результат с выходом из функции

Иначе в переменную result записывается значение «3» с возвратом результата и выход из функции.

 

Операторы switch, case, break, default

Конструкция switch case используется для выбора ветвления кода, в условии которого применяется выбор по целочисленным значениям. Это означает, что switch case может применяться для просто целочисленных значений, перечислений и выбора по коду символа.

switch (выражение)
{
     case значение_1: операторы_1; break;
     case значение_2: операторы_2; break;
     case значение_3: операторы_3; break;
      …
     case значение_n: операторы_n; break;
     default: операторы; break;
}

Пример:

bool check(int x)
{
   switch (x) 
   {
      case 0:
        return true;
  
      case 50:
        x = 0:
        break;

      case 100:
        return false;

      default:
        return false;
   }
}

В выше представленном коде переменная x проверяется на равенство числам 0, 50, 100. Оператор default выполняет выбор кода, который выполняется в том случае, если ни одно из условий не подошло. Заметьте также, что в блоке кода с «case 50:» добавлен оператор break , этот оператор выполняет выход из условия, тогда как оператор return выполняет выход из функции. Если не добавлять оператор break, то выполнение кода продолжится и в блоке «case 100:» . Благодаря этой особенности конструкции switch case имеется возможность объединения условий, для которых необходимо выполнить один и тот же код.

Пример:

bool check(int x)
{
    switch (x) 
    {
       case 0:
       case 50:
       case 100:
         return true;

       default:
         return false;
    }
}

Таким образом для «x» равного 0, 50, 100 функция вернёт true, тогда как для всех остальных значений функция будет возвращать false.

Также код для выбора case в этой конструкции можно оборачивать в блоки кода, что позволит ограничить область видимости и использовать объявление переменных с одинаковыми именами.

int check(int x)
{
    switch (x) 
    {
       case 0:
       {
          int y = 1;
          return(y);
       }

       case 50:
       {
          int y = 2;
          return(y);
       }

       case 100:
       {
          int y = 3;
          return(y);
       }

       default:
          return(x);
    }
}

Таким образом, ограничив область видимости, мы получаем возможность использовать переменные с одинаковыми именами в условиях case. Но не забывайте, что за пределами области видимости, ограниченной фигурными скобками переменная «y» в данном случае существовать не будет.

Теперь рассмотрим оператор break в связке со switch. Он необходим для того, чтобы осуществить выход из оператора switch. Если он не указан, то будут выполняться следующие операторы из списка, несмотря на то, что значение, которым они помечены, не совпадает со значением выражения.

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

Задача

Необходимо написать функцию, задача которой будет состоять в возврате текущего дня недели.

Пример:

string StrDayOfWeek()
{
    string sDayOfWeek = "";
    int dow = DayOfWeek();

    switch(dow)
    {
       case 0:
          sDayOfWeek = "Воскресенье";
          break;
       case 1:
          sDayOfWeek = "Понедельник";
          break;
       case 2:
          sDayOfWeek = "Вторник";
          break;
       case 3:
          sDayOfWeek = "Среда";
          break;
       case 4:
          sDayOfWeek = "Четверг";
          break;
       case 5:
          sDayOfWeek = "Пятница";
          break;
       case 6:
          sDayOfWeek = "Суббота";
          break;
    }
    
    return(sDayOfWeek);
}

 

Оператор цикла while

Оператор while повторяет код в своём теле до тех пор, пока выполняет условие.

while(выражение)
оператор;

Пример:

int i=0;
 
while(i<10)
{
   i=i+1;
}

В данном коде «i» будет равно 10 после выполнения цикла.

Примечание

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

Пример:

while(k<n && !IsStopped()) 
{ 
   y=y*x; 
   k++; 
}

 

Оператор do

Оператор do используется совместно с оператором while и позволяет выполнить тело цикла хотя бы один раз, до того, как будет выполнена проверка условия цикла.

do
оператор;
while(выражение);

Пример:

int i=15;
 
do
{
   i=i-5;
   Print(i);
}
while(i>0 && i<13);

В данном коде переменная I изначально не соответствует условию и в обычном цикле while код тела цикла не выполнился, но поскольку здесь используется do-while цикла, то проверка будет произведена после выполнения тела цикла. В результате вывод Print будет следующим:

10
5
0

Вы можете спросить, почему в выводе присутствует 0? Ведь это не подходит по условию. Опять же из-за того, что проверка выполняется после выполнения кода в теле цикла. То есть выполнилось тело цикла, а потом уже выполнилась проверка, по результату которой цикла завершает свою работу.

Примечание

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

Пример:

//--- вычисление последовательности чисел Фибоначчи 
int counterFibonacci=15; 
int i=0,first=0,second=1; 
int currentFibonacciNumber; 

do 
{ 
   currentFibonacciNumber=first+second; 
   Print("i = ",i," currentFibonacciNumber = ",currentFibonacciNumber); 
   first=second; 
   second=currentFibonacciNumber; 
   i++; // без этого оператора получится бесконечный цикл!! 
} 
while(i<counterFibonacci && !IsStopped());

Оператор цикла for

Оператор for состоит из трех выражений и выполняемого оператора:

for(выражение1; выражение2; выражение3)
    оператор;

Выражение1 описывает инициализацию цикла. Выражение2 — проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.

Оператор for эквивалентен следующей последовательности операторов:

 

выражение1;
while(выражение2)
{
    оператор;
   выражение3;
};

Любое из трех или все три выражения в операторе for могут отсутствовать, однако разделяющие их точки с запятыми (;) опускать нельзя. Если опущено выражение2, то считается, что оно постоянно истинно. Оператор for(;;) представляет собой бесконечный цикл, эквивалентный оператору while(1). Каждое из выражение1 и выражение3 может состоять из нескольких выражений, объединенных оператором запятая ‘,’.

Примечание

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

Примеры:

for(x=1;x<=7000; x++) 
{ 
   if(IsStopped()) 
     break; 

   Print(MathPower(x,2)); 
}

другой пример:

for(;!IsStopped();) 
{ 
   Print(MathPower(x,2)); 
   x++; 

   if(x>10) 
     break; 
}

и ещё один пример:

for(i=0,j=n-l;i<n && !IsStopped();i++,j--)
{
   a[i]=a[j];
}

 

Оператор продолжения continue

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

Пример:

//--- сумма всех ненулевых элементов 
int func(int array[]) 
{ 
   int array_size=ArraySize(array); 
   int sum=0; 

   for(int i=0;i<array_size; i++) 
   { 
      if(a[i]==0) 
         continue; 

      sum+=a[i]; 
   } 

   return(sum); 
}

 

 

 

Written by 

Добавить комментарий