КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Названия цветов 9 страница
int L, // Длина нити S_etalon=1500000, // Заданная площадь (мм2) S, // Площадь прямоугольника a,b,s; // Текущие стороны и площадь //-------------------------------------------------------------------- while(true) // Внешний цикл по длинам нити { // Начало внешнего цикла L=L+1000; // Текущее значение нити в мм //-------------------------------------------------------------------- S=0; // Начальное значение.. //..для каждого размера for(a=1; a<L/2; a++) // Заголовок оператора цикла { // Начало внутреннего цикла b=(L/2) - a; // Текущие значения сторон s=a * b; // Текущее значение площади if (s<=S) // Выбираем большее значение break; // Выход из внутреннего цикла S=s; // Запоминаем лучшее значение } // Конец внутреннего цикла //-------------------------------------------------------------------- if (S>=S_etalon) // Выбираем большее значение { Alert("Подходит нить длиной ",L1000," м.");// Сообщение break; // Выход из внешнего цикла } } // Конец внешнего цикла //-------------------------------------------------------------------- return; // Оператор выхода из функции } //-------------------------------------------------------------------- Здесь внутренний цикл работает подобно тому, как и в решении предыдущей задачи. Оператор break используется для выхода из цикла for, когда достигнуто максимальное значение площади для нити заданной длины. Необходимо особо подчеркнуть, что оператор break, указанный во внутреннем цикле for, передаёт управление оператору, следующему за закрывающей фигурной скобкой цикла for, прекращая таким образом работу цикла. Это явление не оказывает никакого влияния на исполнение внешнего оператора цикла while. В момент, когда срабатывает оператор break во внутреннем цикле for, управление передаётся оператору if: if (S >= S_etalon) // Выбираем большее значение { Alert("Подходит нить длиной ",L1000," м.");// Сообщение break; // Выход из внешнего цикла } В операторе if производится проверка: является ли найденная площадь больше или равной заданному по условию задачи минимально допустимому значению 1.5 м 2? Если это так, то решение найдено и продолжать вычисления нет смысла; управление передаётся в тело оператора if. Исполняемую часть оператора if составляют всего два оператора, первый из которых выводит на экран сообщение о найденном решении:
С помощью второго оператора - break - осуществляется выход из внешнего цикла while и последующий выход из программы. Ниже представлена функциональная схема алгоритма, реализованного в программе area.mq4. На схеме видно, что из каждого цикла имеется нормальный и специальный выход. Каждый из операторов break прекращает работу своего цикла и никак не отражается на работе другого; каждому специальному выходу соответствует свой оператор break. Один и тот же оператор break не может использоваться для специального выхода из обоих циклов. В данном случае каждый из циклов имеет только один специальный выход, но в общем случае допускается использование нескольких операторов break, образующих несколько специальных выходов из одного цикла.
В этом примере алгоритм построен так, что фактически используется только специальный выход как из внутреннего, так и из внешнего цикла. Однако, не следует полагать, что использование оператора break обязательно приводит к построению алгоритмов, предполагающих только специальный выход. В алгоритмах других программ вполне возможно достижение условий, при которых происходит нормальный выход из цикла. Использование оператора break для передачи управления за пределы оператора switch рассматривается в разделе Переключатель switch. Оператор continue
Иногда при использовании цикла возникает необходимость досрочно закончить обработку текущей итерации и перейти к следующей, не выполняя при этом все оставшиеся операторы, составляющие тело цикла. В таких случаях используется оператор continue. Формат оператора continue
Оператор continue состоит из одного слова, заканчивается знаком ";" (точка с запятой). continue; // Оператор continue Правило исполнения оператора continue
Рассмотрим вариант практического использования оператора continue.
Алгоритм решения задачи очевиден: необходимо организовать цикл, в котором рассчитывалась бы сумма общего количества овец на первой ферме. По условию задачи перевод части овец на вторую ферму происходит в конце месяца, значит необходимо создать ещё один (внутренний) цикл, в котором вычислялось бы накопление в текущем месяце. По окончании месяца необходимо выяснить: превышен ли пороговый уровень в 50 000? И если это так, то нужно рассчитать количество овец, переводимых на вторую ферму в конце месяца, и общее количество овец на второй ферме. Рассматриваемый алгоритм реализован в скрипте sheep.mq4. Здесь оператор continue используется для расчётов во внешнем цикле. //-------------------------------------------------------------------- // sheep.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- int start() // Специальная ф-ия start() { //-------------------------------------------------------------------- int day, // Текущий день месяца Mons; // Искомое количест. месяцев double One_Farm =1000.0, // Количество на 1 ферме Perc_day =1, // Ежедневный подъём, % One_Farm_max=50000.0, // Пороговое значение Perc_exit =10, // Ежемесячный вывод, % Purpose =35000.0, // Необх. колич. на 2 ферме Two_Farm; // Количество на 2 ферме //-------------------------------------------------------------------- while(Two_Farm < Purpose) // Внешний цикл по истории { // Начало тела внешн. цикла //-------------------------------------------------------------- for(day=1; day<=30; day++) // Цикл по дням месяца One_Farm=One_Farm*(1+Perc_day/100);//Накопление на 1й ферме //-------------------------------------------------------------- Mons++; // Считаем месяцы if (One_Farm < One_Farm_max) // Если меньше допустимого,. continue; //.. то овец не переводим Two_Farm=Two_Farm+One_Farm*Perc_exit/100;//Количес. на 2 ферме One_Farm=One_Farm*(1-Perc_exit/100);// Остаток на 1 ферме } // Конец тела внешнего цикла //-------------------------------------------------------------------- Alert("Цель будет достигнута через ",Mons," мес.");//Вывод на экран return; // Выход из функции start() } //-------------------------------------------------------------------- В начале программы, как обычно, описаны и прокомментированы переменные. Собственно расчёт выполняется в цикле while, а после его окончания выводится соответствующее сообщение. Расчёты во внешнем цикле while будут происходить до тех пор, пока не будет достигнута цель, а именно, пока общее количество овец на второй ферме не достигнет ожидаемого значения 35 000. Внутренний цикл for очень прост: значение баланса увеличивается ежедневно на 1%. Никакого анализа суммы в этом цикле не выполняется, потому что по условию задачи перевод овец может происходить только в конце месяца. Таким образом, после выхода из цикла for переменная One_Farm имеет значение, равное количеству овец на первой ферме. Сразу после этого вычисляется значение переменной Mons, увеличивающееся на единицу при выполнении каждой итерации внешнего цикла while. В зависимости от текущего количества овец на первой ферме выполняется одно из двух вычислений: если количество овец на первой ферме превышает пороговое значение 50 000, то необходимо 10% овец с первой фермы перевести на вторую ферму; в противном случае - овец с первой фермы на вторую не переводить и продолжать разведение овец на первой ферме. Разветвление алгоритма осуществляется с помощью оператора if: if (One_Farm < One_Farm_max) // Если меньше допустимого,. Эти строки кода можно охарактеризовать так: если количество овец на первой ферме меньше порогового значения 50 000, то исполнить оператор, составляющий тело оператора if. При первой итерации количество овец на первой ферме оказывается меньше порогового значения, поэтому управление будет передано в тело оператора if, т.е. оператору continue. Исполнение оператора continue означает следующее: закончить текущую итерацию ближайшего выполняемого цикла (в данном случае это цикл в операторе while) и передать управление в заголовок оператора цикла. При этом следующие программные строки, также являющиеся составной частью тела оператора цикла while, выполняться не будут: Two_Farm = Two_Farm+One_Farm*Perc_exit/100;//Количес. на 2 ферме В этих строках осуществляется расчёт достигнутого количества овец на второй ферме и остаточное количество овец на первой ферме. На первой итерации выполнять эти расчёты нельзя, т.к. ещё не достигнуто пороговое количество овец 50 000 на первой ферме. Сущность оператора continue как раз и состоит в том, чтобы "переступить" через эти строки, не исполнять их в текущей итерации. В результате исполнения оператора continue управление передаётся в заголовок оператора цикла while. Далее происходит проверка условия в операторе цикла и начинается следующая итерация. Выполнение цикла будет продолжаться по тому же алгоритму до тех пор, пока количество овец на первой ферме не достигнет порогового значения. При этом на каждой итерации накапливается значение Mons. На некотором этапе расчётов количество овец на первой ферме достигнет или превысит пороговое значение 50 000 голов. В этом случае, при исполнении оператора if условие (One_Farm < One_Farm_max) окажется ложным, поэтому управление в тело оператора if передано не будет. Это значит, что оператор continue не исполнится, а управление будет передано на первую из двух последних строк тела цикла while: сначала будет вычислено количество овец на второй ферме, а затем остаточное количество овец на первой ферме. После этих вычислений очередная итерация цикла while закончится, и управление снова будет передано в заголовок цикла. Ниже представлена функциональная схема алгоритма, реализованного в скрипте sheep.mq4. На схеме наглядно видно, что в зависимости от исполнения условия в операторе if, управление либо сразу передаётся в заголовок цикла while (в результате исполнения continue), либо сначала выполняются некоторые операторы, а потом управление всё равно передаётся в заголовок цикла while. В обоих случаях выполнение цикла при этом не заканчивается.
На каждой очередной итерации в операторе цикла while, будет рассчитываться новое достигнутое значение переменой Two_Farm. Как только это значение превысит заданную величину (35 000), условие в операторе цикла while окажется ложным, поэтому вычисления в теле цикла while больше выполняться не будут, а управление будет передано ближайшему оператору, следующему за оператором цикла: Alert("Цель будет достигнута через ",Mons," мес.");//Вывод на экран Результатом исполнения функции Alert() будет строка следующего вида:
Оператор return заканчивает исполнение специальной функции start(), в результате чего управление будет передано клиентскому терминалу, а исполнение скрипта заканчивается - он будет выгружен из окна финансового инструмента. Представленный алгоритм предусматривает нормальный выход из цикла while. В более общем случае выход из цикла может происходить и в результате исполнения оператора break (специальный выход). Однако ни тот, ни другой способ завершения цикла никак не связаны с прерыванием текущей итерации с помощью оператора continue. В правиле исполнения оператора continue используется выражение "ближайшего оператора". Ошибочно полагать, что это означает близость программных строк. Посмотрим на код скрипта sheep.mq4. Оператор for находится "ближе" к оператору continue, чем заголовок цикла while. Однако это не имеет никакого значения: оператор continue никак не связан с циклом for, потому что находится за его пределами, вне его тела. В общем случае программа может содержать множество вложенных операторов цикла. Оператор continue всегда находится в теле какого-то из них. Но одновременно с этим оператор continue, являясь составной частью внутреннего оператора цикла, естественно, находится и внутри внешнего оператора цикла. Выражение "прекращает исполнение текущей итерации ближайшего оператора цикла" следует понимать так, что его действие распространяется на ближайший оператор цикла, внутри тела которого он находится. Чтобы проиллюстрировать это, несколько изменим условия задачи.
Решение задачи 17 реализовано в скрипте othersheep.mq4. В данном случае оператор continue используется для расчётов во внешнем и внутреннем циклах. //-------------------------------------------------------------------- // othersheep.mq4 // Предназначен для использования в качестве примера в учебнике MQL4. //-------------------------------------------------------------------- int start() // Специальная ф-ия start() { //-------------------------------------------------------------------- int day, // Текущий день месяца Mons; // Искомое количест. месяцев double One_Farm =1000.0, // Количество на 1 ферме Perc_day =1, // Ежедневный подъём, % One_Farm_max=50000.0, // Пороговое значение Perc_exit =10, // Разовый вывод, % Purpose =35000.0, // Необх. колич. на 2 ферме Two_Farm; // Количество на 2 ферме //-------------------------------------------------------------------- while(Two_Farm < Purpose) // До достижения цели { // Начало тела внешн. цикла //-------------------------------------------------------------- for(day=1; day<=30 && Two_Farm < Purpose; day++)// Цикл по дням { One_Farm=One_Farm*(1+Perc_day/100);//Накопл. на 1 ферме if (One_Farm < One_Farm_max) // Если меньше допустимого,. continue; //.. то овец не переводим Two_Farm=Two_Farm+One_Farm*Perc_exit/100;//Накопл. на 2 ферме One_Farm=One_Farm*(1-Perc_exit/100); //Остаток на 1 ферме } //-------------------------------------------------------------- if (Two_Farm>=Purpose) // Если цель достигнута,.. continue; //.. то месяцы не считаем Mons++; // Считаем месяцы } // Конец тела внешнего цикла //-------------------------------------------------------------------- Alert("Цель будет достигнута через ",Mons," мес. и ",day," дн."); return; // Выход из функции start() } //-------------------------------------------------------------------- Для решения задачи необходимо анализировать количество овец для каждого дня. С этой целью строки: if (One_Farm < One_Farm_max) // Если меньше допустимого,. continue; //.. то овец не переводим Two_Farm=Two_Farm+One_Farm*Perc_exit/100;//Накопл. на 2 ферме One_Farm=One_Farm*(1-Perc_exit/100); //Остаток на 1 ферме перенесены во внутренний цикл, организованный по дням месяца. Очевидно, что перевод некоторого количества овец на вторую ферму в данном случае происходит не в конце месяца, а в тот день, когда количество овец на первой ферме достигает заданного значения. Смысл использования здесь оператора continue тот же: "переступить" через строки, в которых выполняются вычисления, связанные с переводом овец с одной фермы на другую, т.е. не выполнять эти строки. Обратите внимание, цикл while, построенный по дням месяца, не прерывается независимо от факта перевода овец, потому что действие оператора continue распространяется на ближайший оператор цикла, в данном случае - на оператор цикла for. В качестве Условия в операторе цикла for используется сложное выражение: for(day=1; day<=30 && Two_Farm<Purpose; day++)// Цикл по дням Использование операции && ("и") означает, что цикл будет выполняться до тех пор, пока будут справедливы оба условия: месяц ещё не закончился, т.е переменная day остаётся в пределах от 1 до 30 включительно; количество овец на второй ферме не достигло заданного, т.е. переменная Two_Farm меньше Purpose (35 000). Если же хотя бы одно из условий не выполняется (становится ложным), цикл прекращается. Когда выполнение цикла for закончено (по любой из причин), управление передаётся оператору if: if (Two_Farm >= Purpose) // Если цель достигнута,.. Использование в этом месте кода оператора continue имеет простой смысл: продолжать считать месяцы только в том случае, если количество овец на второй ферме меньше ожидаемого. Если же цель уже достигнута, то значение переменной Mons не изменяется, а управление (в результате исполнения continue) передаётся в заголовок ближайшего оператора цикла, в этом случае - оператора цикла while. Использование операторов continue во вложенных циклах отражено на рис. 48. В данном примере каждый из циклов (внешний и внутренний) содержит один оператор continue, действие которого распространяется только на "свой" ближайший цикл, а на события в другом цикле не влияет. В общем случае в теле цикла могут использоваться несколько операторов continue, каждый из которых может прерывать текущую итерацию в результате выполнения какого-либо условия. Количество операторов continue в теле цикла не ограничено. Оператор switch
Некоторые программы предусматривают разветвление алгоритма по нескольким вариантам. В подобных случаях очень удобно использовать оператор switch, особенно, когда количество вариантов достигает десятков или сотен, а при использовании множества вложенных операторов if код получается очень громоздким. Формат оператора switch
Оператор switch состоит из заголовка и исполняемого тела. Заголовок содержит название оператора и Выражение, обрамлённое круглыми скобками. Тело оператора содержит один или несколько вариантов case и один вариант default. Каждый из вариантов case состоит из ключевого слова case, Константы, ":" (знака "двоеточие') и операторов. Количество вариантов case не ограничено. Вариант default состоит из ключевого слова default,: (знака двоеточие) и операторов. Обычно вариант default указывается в теле оператора switch последним, но он может находиться и в любом другом месте тела или вообще отсутствовать. switch ( Выражение ) // Заголовок оператора Значениями Выражения и Параметров могут быть только значения целого типа. В качестве Выражения может использоваться константа, переменная, вызов функции или выражение. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Правило исполнения оператора switch
Легко понять, что запись case Константа: представляет просто метку, на которую передаётся управление; и начиная с этой метки исполняются все операторы, составляющие тело оператора switch. Если же алгоритм программы предполагает исполнение группы операторов, соответствующих только одному из вариантов case, то последним в списке операторов, соответствующих одному варианту case, следует указать оператор break. Проследим работу оператора switch на примере. Примеры применения оператора switch
Решение задачи с использованием оператора 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, близкое к текущему курсу. На функциональной схеме хорошо видно, что благодаря наличию в каждом варианте case оператора break, после исполнения операторов любого из вариантов управление передаётся за пределы оператора switch. Подобный принцип построения алгоритма с применением оператора switch использован и в файле stdlib.mq4, поставляемом в составе клиентского терминала (..\experts\libraries\stdlib.mq4). Рассмотрим другой случай, не предусматривающий использование break в каждом варианте case.
Закодировать решение этой задачи достаточно просто (скрипт 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;
Дата добавления: 2014-12-29; Просмотров: 406; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |