Урок №5 Циклы и Условия (часть 1)

Уроки

            Доброго времени суток, уважаемые трейдеры! Добро пожаловать на пятый урок нашего курса. Мы  продолжаем с Вами осваивать язык MQL4. Программа, которую Вы пишите на MQL4 (или на любых других языках) выполняется сверху вниз (я имею ввиду откомпилированный файл). Оператор за оператором. 

             Оператор – это строчка кода, которая говорит компьютеру что-либо сделать.

Например:

Untitled-1

             Точка с запятой является очень важной частью оператора, но обычно очень легко забывается, потому является причиной 90% всех ошибок.

                   Принцип выполнение кода сверху вниз имеет исключения – это циклы и условия.

            Программа, которую Вы пишите, может, как человек, принимать решения в ответ на изменение обстоятельств. В таких случаях управление перепрыгивает из одной части программы в другую её часть.
Операторы, которые вызывают такие прыжки называются Операторами Контроля (контроллерами). Контроллеры состоят из циклов и условий.

Циклы

                   Циклы заставляют раздел программы выполнятся определённое число раз.
Такое повторение продолжается пока какое-то условие является истинным (true) и прекращается как только условие становится ложным (false).
Когда цикл завершается контроль переходит следующему за циклом оператору.

В MQL4 существует два вида циклов:

Цикл for

           Первый — это цикл for. Цикл for считается самым простым циклом, поскольку все его параметры собраны в одном месте. Цикл for выполняет определённый раздел кода фиксированное число раз.

Например:

Untitled-2

Как это работает?

              Оператор состоит из ключевого слова for, за этим следуют круглые скобки, в которых указаны 3 выражения, разделённые точками с запятыми:

for(j=0; j<15; j++)

             Эти три выражения – это: выражение инициализации, выражение проверки и выражение инкремента.

j = 0  – выражение инициализации
j < 15 – выражение проверки
j++   – выражение инкремента

Тело цикла – это код, который будет выполняться:

Print(j); – тело цикла.

               В нашем примере тело цикла выполняется 15 раз.

             Замечание: сразу после выражения for(…;…;…) точка с запятой НЕ ставится, т. к. это выражение + идущее после него тело цикла считаются единым оператором.

               Кстати, в этом заключается очень распространённая ошибка – оператор ; (просто точка с запятой) называется пустым оператором (он не говорит компьютеру что-либо делать), поэтому цикл for(…;…;…); имеет пустое тело. В основном это не то, чего мы хотим.

Выражение инициализации

           Выражение инициализации выполняется только один раз – когда цикл запускается. И его задача – снабдить переменную цикла начальным значением (в нашем случае – нулём).

                 Вы можете объявить переменную цикла вне самого цикла, как в нашем примере:

Untitled-3

Или Вы можете объявить её прямо внутри скобок цикла:

Untitled-4

                Две предыдущие строчки кода эквиваленты за тем исключением, что области видимости (об этом в уроке про переменные) переменной цикла в обоих случаях разные. Во втором случае переменная считается объявленной только внутри самого цикла.

В цикл for можно вставить больше одного выражения инициализации, разделив их запятой:

Untitled-5

Выражение проверки

          Выражение проверки – это выражение, которое построено на операциях сравнения и логических операциях (см. пред. урок).

        Проверка истинности выражения происходит после каждого прохождения цикла. Цикл продолжается, если выражение истинно, цикл завершается, если выражение ложно.

              В нашем примере тело цикла будет продолжать печатать i ( Print(i); ), пока условие j<15 верно. j пробежит значения 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14, затем j станет = 15 и цикл остановится. Контроль перейдёт оператору, следующему за циклом. Выражение инкремента только так называется. Его задача – изменять переменную цикла. В нашем случае оно увеличивает j на 1.

         Например, в следующем примере распечатаются числа 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1: int i; for(i=15;i>0,i<;i–)

Print(i);

            Выражение инкремента выполняется самым последним в списке шагов цикла.

post-798-0-37484000-1346244944

Схема 1. Цикл for.

             Как и в выражении инициализации, в выражении инкремента можно использовать более одного выражения, разделив их запятой:

Untitled-6

            Но выражение проверки может быть только одно.

Тело цикла

               Во всех предыдущих примерах в качестве тела цикла мы использовали только один оператор. В большинстве случаев этого недостаточно.

В тело цикла можно записывать много операторов, если их все взять в фигурные скобки:

Untitled-7

             В этом коде в теле цикла содержится два оператора. Программа будет выполнять 1й оператор, а за ним 2й при каждом прохождении цикла.

                   Не забывайте ставить точку с запятой в конце каждого оператора.

Оператор Break

               Если при выполнении цикла for (или цикла while, или оператора switch) встречается оператор break;, то цикл терминируется, а контроль переходит оператору, следующему за циклом. PS: break – это ключевое слово.

Например:

Untitled-8

             В этом примере цикл будет нормально выполняться пока i не достигнет значения 10. Как только это произойдёт, оператор break; остановит цикл. В результате, на экран распечатаются: 0,1,2,3,4,5,6,7,8,9.

Оператор Continue

              Оператор break; останавливает цикл, а оператор continue; переводит цикл на следующий шаг, игнорируя оставшиеся операторы тела цикла.

Например:

Untitled-9

               В этом примере цикл будет нормально выполняться пока i не достигнет значения 10. Как только это произойдёт, оператор continue; переведёт цикл на следующий шаг, и i=10 НЕ распечатается. В результате, на экран распечатаются: 0,1,2,3,4,5,6,7,8,9,11,12,13,14.

Важно!

                Часть или даже все управляющие выражения цикла for можно опускать.

Например:

Untitled-10

               Этот цикл равносилен циклу while, в котором выражение проверки всегда истинно.

               На этом мы с Вами переходим ко второму виду циклов, который представим прямо сейчас:

Цикл while

              Второй цикл – это цикл while. Цикл for обычно используется, когда Вы знаете, сколько раз цикл должен быть пройден. А что делать, если это не так? Для этого есть цикл while.

          В цикле while, как и в цикле for есть выражение проверки, но в нём нет выражений инициализации и инкремента.

Пример:

Untitled-11

              Переменная цикла была объявлена и проинициализирована ДО цикла. В отличии от цикла for, внутри скобок этого делать нельзя. Формально i++ НЕ является выражением инкремента, но нам нужно чтобы что-то в цикле менялось, чтобы мы когда-нибудь из него выбрались.

Как же приведённый пример работает?

            Оператор while содержит только выражение проверки, и он его проверяет после каждого прохождения цикла. Если оно истинно, цикл продолжится. Если оно ложно, цикл завершится и контроль перейдёт оператору, следующему за циклом.

                В приведённом примере цикл будет выполняться пока i не станет равным 16. Как только это произойдёт, проверка условия i<15 вернёт false, и цикл завершится.

Схема 2. Цикл while.

             Я уже говорилось,  цикл while похож на цикл for. Вот их сходства:

  1. В обоих можно использовать операторы break; и continue; .
  2. В обоих тело цикла может быть одиночным или составным. Во втором случае операторы тела цикла нужно брать в фигурные скобки.
  3.  Аналогом for(;;) является while(true).

             Вот и сейчас наш урок подошел к завершению. Очень надеюсь, что данный курс был не слишком сложным. Ну а в  следующем уроке мы продолжим рассматривать тему Циклы и Условия (часть 2).

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