Русский

Учебник по MQL4  Операторы  Оператор switch

Оператор switch


Некоторые программы предусматривают разветвление алгоритма по нескольким вариантам. В подобных случаях очень удобно использовать оператор switch, особенно, когда количество вариантов достигает десятков или сотен, а при использовании множества вложенных операторов if код получается очень громоздким.

Формат оператора switch


Оператор switch состоит из заголовка и исполняемого тела. Заголовок содержит название оператора и Выражение, обрамлённое круглыми скобками. Тело оператора содержит один или несколько вариантов case и один вариант default.

Каждый из вариантов case состоит из ключевого слова case, Константы, ":" (знака "двоеточие') и операторов. Количество вариантов case не ограничено.

Вариант default состоит из ключевого слова default, : (знака двоеточие) и операторов. Обычно вариант default указывается в теле оператора switch последним, но он может находиться и в любом другом месте тела или вообще отсутствовать.

   switch ( Выражение )                            // Заголовок оператора 
{ // Открывающая фигурная скобка
case Константа: Операторы // Один из вариантов case
case Константа: Операторы // Один из вариантов case
...
[default: Операторы] // Вариант без параметра
} // Закрывающая фигурная скобка

Значениями Выражения и Параметров могут быть только значения целого типа. В качестве Выражения может использоваться константа, переменная, вызов функции или выражение. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций.

Правило исполнения оператора switch


Передать управление первому из операторов, следующих за ":" (знаком двоеточия) того варианта case, значение Константы которого совпадет со значением Выражения, и далее последовательно исполнить все операторы, составляющие тело оператора switch. Проверка условия равенства Выражения и Константы производится в направлении сверху вниз и слева направо. Совпадение значений Констант разных вариантов case не допускается. Оператор break прекращает исполнение оператора switch и передаёт управление оператору, следующему за оператором switch.

Легко понять, что запись case Константа: представляет просто метку, на которую передаётся управление; и, начиная с этой метки, исполняются все операторы, составляющие тело оператора switch. Если же алгоритм программы предполагает исполнение группы операторов, соответствующих только одному из вариантов case, то последним в списке операторов, соответствующих одному варианту case, следует указать оператор break. Проследим работу оператора switch на примере.

Примеры применения оператора switch

Задача 18. Составить программу, в которой реализуются следующие условия: если курс поднялся выше заданного уровня, то выдать сообщение, в котором словами обозначено превышение над уровнем (до 10 пунктов); в остальных случаях сообщить, что курс не превышает заданный уровень.

Решение задачи с использованием оператора switch (эксперт pricealert.mq4):

//--------------------------------------------------------------------
// pricealert.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start() // Спец. функция start
{
double Level=1.3200; // Задан. уровень цены
int Delta=NormalizeDouble((Bid-Level)Point,0); // Превышение
if (Delta<=0) // Цена не выше уровня
{
Alert("Цена ниже уровня"); // Сообщение
return; // Выход из start()
}
//--------------------------------------------------------------------
switch(Delta) // Заголовок switch
{ // Начало тела switch
case 1 : Alert("Плюс один пункт"); break;// Варианты..
case 2 : Alert("Плюс два пункта"); break;
case 3 : Alert("Плюс три пункта"); break;
case 4 : Alert("Плюс четыре пункта"); break;//Здесь представлено
case 5 : Alert("Плюс пять пунктов"); break;//10 вариантов case,
case 6 : Alert("Плюс шесть пунктов"); break;//но в общем случае
case 7 : Alert("Плюс семь пунктов"); break;//количество case
case 8 : Alert("Плюс восемь пунктов");break;//не ограничено
case 9 : Alert("Плюс девять пунктов");break;
case 10: Alert("Плюс десять пунктов");break;
default: Alert("Более десяти пунктов"); // С case не совпало
} // Конец тела switch
//--------------------------------------------------------------------
return; // Выход из start()
}
//--------------------------------------------------------------------

В данном варианте решения задачи используется оператор switch, в каждом варианте case которого используется оператор break. В зависимости от значения переменной Delta управление передаётся на один из вариантов case, в результате чего исполняются операторы, соответствующие этому варианту: функция Alert() и оператор break. Оператор break прекращает исполнение оператора switch, т.е. передаёт управление за его пределы, а именно - оператору return, завершающему работу специальной функции start(). Таким образом, в зависимости от значения переменной Delta, срабатывает один из вариантов case, а остальные варианты оказываются не затронутыми.

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


Рис. 49. Функциональная схема оператора switch в эксперте pricealert.mq4.

На функциональной схеме хорошо видно, что благодаря наличию в каждом варианте case оператора break, после исполнения операторов любого из вариантов управление передаётся за пределы оператора switch. Подобный принцип построения алгоритма с применением оператора switch использован и в файле stdlib.mq4, поставляемом в составе клиентского терминала (..\experts\libraries\stdlib.mq4).

Рассмотрим другой случай, не предусматривающий использование break в каждом варианте case.

Задача 19. Дано 10 баров. Сообщить номера всех баров, начиная с n-го.

Закодировать решение этой задачи достаточно просто (скрипт barnumber.mq4):

//--------------------------------------------------------------------
// barnumber.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start() // Специальная функция start()
{
int n = 3; // Заданный номер
Alert("Номера баров, начиная с ", n,":");// Не зависит от n
//--------------------------------------------------------------------
switch (n) // Заголовок оператора switch
{ // Начало тела switch
case 1 : Alert("Бар 1"); // Варианты..
case 2 : Alert("Бар 2");
case 3 : Alert("Бар 3");
case 4 : Alert("Бар 4"); // Здесь представлено 10 ..
case 5 : Alert("Бар 5"); // ..вариантов case, но в ..
case 6 : Alert("Бар 6"); // ..общем случае количество..
case 7 : Alert("Бар 7"); // ..case не ограничено
case 8 : Alert("Бар 8");
case 9 : Alert("Бар 9");
case 10: Alert("Бар 10");break;
default: Alert("Задан неправильный номер");// С case не совпало
} // Конец тела switch
//--------------------------------------------------------------------
return; // Оператор выхода из start()
}
//--------------------------------------------------------------------

В операторе switch будет производиться перебор вариантов case до тех пор, пока не обнаружится равенство Выражения и Константы. Когда значение Выражения (здесь - это целое число 3) совпадает с одной из Констант (в данном случае - case 3), то исполнятся все операторы, которые следуют за двоеточием (case 3:), а именно: оператор вызова функции Alert("Бар 3"), следующие за ним Alert("Бар 4"), Alert("Бар 5") и т.д., пока не встретится оператор break, завершающий работу оператора switch.

В случае если значение Выражения не совпадает ни с одной из Констант, управление передаётся оператору, соответствующую варианту default:


Рис. 50. Функциональная схема оператора switch в скрипте barnumber.mq4.

В отличие от алгоритма, реализованного в предыдущей программе, в данном случае (рис. 50) в каждом варианте case не используется оператор break. Поэтому при совпадении значения Выражения со значением одной из Констант будут исполнены все операторы, начиная с операторов соответствующего варианта case. Использование оператора break в последнем варианте case имеет другую цель - не допустить исполнение операторов, соответствующих варианту default. Если же среди значений Констант не найдётся ни одной, равной Выражению, то управление будет передано оператору, соответствующему метке default.

Таким образом, если значение заданной переменной n находится в интервале значений от 1 до 10, то будут напечатаны номера всех баров, начиная с n, а если значение n находится за пределами указанного диапазона, то будет выдано сообщение о несоответствии.

Обратите внимание, Константы вариантов case не обязательно должны быть указаны в программе в порядке возрастания. Порядок следования вариантов case с соответствующими Константами определяется необходимостью программного алгоритма.