Прекъсване на оператора - Оператори - MQL4 Book - MQL4 Book
В някои случаи, например, при програмиране на циклични операции, е необходимо да се прекъсне изпълнението на цикъла, дори преди състоянието на оператора на цикъла да стане фалшиво. За да разрешите такива проблеми, трябва да използвате оператора 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 в низа: