Прекъсване

В някои случаи, например, при програмиране на циклични операции, е необходимо да се прекъсне изпълнението на цикъла, дори преди състоянието на оператора на цикъла да стане фалшиво. За да разрешите такива проблеми, трябва да използвате оператора break.

Формат на изявлението за прекъсване

Прекъсването се състои от една дума и завършва с; (точка и запетая).

Правилото за изпълнение на оператора break

Изявлението за прекъсване може да бъде илюстрирано със следния пример.

Безкраен брой правоъгълници с различни размери могат да бъдат сгънати от едно парче конец. Като се има предвид, че според условията на проблема точността на изчислението е 1 mm, можем да разгледаме само 499 опции. Първият, "най-тънкият" правоъгълник ще бъде 1 х 499 мм, вторият 2 х 498 мм и така нататък, а последният ще бъде 499 х 1 мм. Трябва да прегледаме всички тези правоъгълници и да изберем един от тях с максималната площ.

Лесно е да се види, че в разглеждания набор от правоъгълници има дублирани размери. Например първият и последният правоъгълник са с еднакъв размер: 1 x 499 (същите като 499 x 1). По същия начин размерът на втория правоъгълник е същият като размера на втория до последния и т.н. Трябва да съставим алгоритъм, за да прегледаме всички оригинални опции, но няма нужда да преглеждаме дублиращите се.

Като начало, нека направим предварителна оценка: ние ще определим как площта на правоъгълника ще зависи от неговия размер. Лесно е да се види, че първият правоъгълник, с размер на страницата 1 х 499, ще има най-малката площ. Освен това, с увеличаване на малката страна, площта на правоъгълниците ще се увеличава. След достигане на определена стойност площите на правоъгълниците ще започнат да намаляват. Тази зависимост е показана на фиг. 44:

оператора

Фигура: 44. Зависимост на размера на площта на правоъгълник от размера на едната страна.

Разглеждайки фиг. 44, лесно е да се стигне до заключението, че е необходимо да се търси максималната площ, като се премине през опциите, като се започне с първата, само докато площта в процеса на изчисленията се увеличава. Веднага след като започне да намалява, е необходимо да прекратите търсенето и да излезете от цикъла на търсене чрез опциите. По-долу е скрипт правоъгълник.mq4, който реализира такъв алгоритъм.

Променливите a, b и s са текущи променливи, чиито стойности се итерират. Променливите A, B и S са желаните стойности. В началото на цикъла се изчислява втората страна б и площ с текущия правоъгълник.

Операторът if проверява условието за излизане от цикъла:

Ако току-що изчислената площ на текущия правоъгълник с има повече площ С, изчислена при предишната итерация, тогава това е новата стойност с и се превръща в най-добрия постигнат резултат. В този случай състоянието на оператора if не се изпълнява и контролът се прехвърля към най-близкия оператор след оператора if. Тези редове запомнят най-добрите постигнати резултати:

Когато се достигне най-близката затваряща фигурна скоба, итерацията завършва и контролът се предава в заглавката на оператора for, за да се изпълни Expression_2 и да се провери условието. Ако по време на проверка размерът на страната и все още не е нараснал до определените граници, тогава цикълът ще продължи.

Повторните циклични изчисления ще продължат, докато настъпи едно от събитията: или размерът на страната и надвишава допустимите граници (в съответствие с Условието на извлечението) или размера на изчислената площ с ще бъде по-малко от достигнатата по-рано стойност, съхранявана в променливата С. Ние имаме всички основания да вярваме, че цикълът ще излезе първо от условието на оператора if:

Всъщност операторът за цикъл for е съставен по такъв начин, че да изброява всички възможни опции без изключение (половината от дължината на L/2 нишката е сумата от двете страни). В същото време максималната площ на правоъгълника ще бъде достигната някъде в средата на итерирания набор от опции. И веднага щом се случи това събитие (площта на текущия правоъгълник с ще бъде по-малко или равно на достигнатата по-рано стойност С), в рамките на изпълнението на оператора if, контролът ще бъде прехвърлен в оператора break, който от своя страна ще прехвърли контрола извън оператора for в низа:

В резултат на изпълнението на вградената функция Alert () ще бъде отпечатан следният ред:

След това управлението ще бъде прехвърлено на оператора за връщане, в резултат на което специалната функция start () ще завърши работата си. Това от своя страна ще доведе до края на скрипта и неговото разтоварване от клиентския терминал от прозореца на финансовия инструмент.

В този пример операторът break прекратява (прехвърля контрола извън) оператора за цикъл for, а именно оператора на цикъл, вътре в който се намира. По-долу е дадена функционална диаграма на цикъл for, който използва специален изход:

оператори

Фигура: 45. Функционална диаграма на цикъла for с помощта на оператора break (правоъгълник.mq4).

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

Трудно е да се надцени възможността за специален изход от цикъла в езика MQL4. В нашия пример използването на оператора за прекъсване ни позволи да съставим алгоритъм, в който се извършват само необходимите изчисления. Алгоритъм, написан без специален изход от цикъла, би бил неефективен - в този случай биха се извършили многократни изчисления, което би довело до неразумно загуба на изчислителни ресурси и време. Засенчената област на фиг. 44 ясно показва областта на параметрите, които не са били обработени в разглежданата програма (почти половината от всички изчисления!), Което не е попречило да се получи правилния резултат.

Необходимостта от използване на ефективни алгоритми става особено очевидна, когато времето на изпълнение на програмата се разтегне за секунди или дори минути, което може да се окаже по-дълго от интервала от време между отметките. В този случай все още съществува риск от пропускане на обработката на някои значими кърлежи и в резултат на това загуба на инициатива в управлението на търговията. Освен това намаляването на времето за изчисление е особено остро при тестване на програми на тестера за стратегии. Тестването на сложни програми спрямо голям обхват от исторически данни може да отнеме часове и дни. Намаляването на времето за тестване наполовина в тази ситуация се оказва много важна възможност.

Правилото гласи, че операторът break прекратява най-близкия външен оператор. Нека да видим как работи програма, която използва вложени цикли.

При този проблем е необходимо последователно да се итерира по наличните дължини на нишките, за всяка от които е необходимо да се изчисли максимално постижимата площ. Решението на проблем 15 е приложено в скрипта area.mq4. Опциите за решение са подредени в два цикъла - във външния и във вътрешния. Външният контур се повтаря по дължината на конеца на стъпки от 1000 mm, докато вътрешният контур намира максималната площ за текущата дължина на конеца. В този случай инструкцията за прекъсване се използва за излизане от външния и вътрешния цикъл.

Вътрешният цикъл работи тук по същия начин, както при решаването на предишния проблем. Операторът break се използва за излизане от цикъла for, когато е достигната максималната площ за нишка с дадена дължина. Трябва да се подчертае, че инструкцията за прекъсване, посочена във вътрешната за цикъл, прехвърля контрола към оператора след затварящата къдрава скоба на цикъла for, като по този начин завършва цикъла. Това явление няма ефект върху изпълнението на външния оператор на цикъл while.

В момента, в който се задейства операторът break във вътрешния цикъл for, управлението се прехвърля към оператора if:

В оператора if се прави проверка: намерената площ по-голяма ли е или равна ли е на минималната допустима стойност от 1,5 m 2, посочена от изявлението за проблема? Ако е така, тогава решението е намерено и няма смисъл да продължаваме изчисленията; контролът се прехвърля в тялото на оператора if. Изпълнимата част на оператора if се състои само от два израза, първият от които показва съобщение за намереното решение:

С помощта на втория оператор - прекъсване - излизане от външния контур докато и последващото излизане от програмата. По-долу е дадена функционална диаграма на алгоритъма, реализиран в програмата area.mq4.

оператори

Фигура: 46. ​​Функционална схема на програмата, която реализира възможността за специален изход от вътрешния и външния контур (area.mq4).

Диаграмата показва, че има нормален и специален изход от всеки цикъл. Всеки от инструкциите за прекъсване прекратява работата на своя цикъл и по никакъв начин не засяга работата на другия; всеки специален изход има свой собствен оператор за прекъсване. Един и същ оператор за прекъсване не може да се използва за конкретно излизане от двата контура. В този случай всеки от контурите има само един специален изход, но в общия случай е разрешено да се използват няколко инструкции за прекъсване, които образуват няколко специални изхода от един цикъл.

В този пример алгоритъмът е конструиран така, че всъщност се използва само специален изход както от вътрешния, така и от външния контур. Не бива обаче да се предполага, че използването на инструкцията за прекъсване непременно води до изграждането на алгоритми, които приемат само специален изход. В алгоритмите на други програми е напълно възможно да се постигнат условия, при които се получава нормален изход от цикъла.

Използването на инструкцията за прекъсване за прехвърляне на управление извън оператора за превключване е обсъдено в раздела Превключвателят.