Для полного контроля работы циклов, необходима возможность в любое время прервать цикл или пропустить один из ходов.
Для этого существуют две процедуры: Break и Continue.
Процедура Break полностью останавливает цикл. Она очень удобна при поисковых задачах. Например, необходимо в одномерном массиве случайных чисел отыскать первый элемент кратный и 5 и 3. Размер массива равен 100 элементов. Понятно, что можно перебрать все элементы, но искомый элемент найдется быстрее, чем через 100 шагов и все остальные шаги будут лишним. Поэтому после нахождения искомого элемента необходимо будет прервать работу цикла.
Задаем массив:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
var f:array[1..100] of integer; procedure TForm1.Button2Click(Sender: TObject); var i,g:integer; begin Randomize; for i:=1 to 100 do begin g:=random(500); f[i]:=g; Memo1.Lines.Append(inttostr(g)); end; end; |
Процедура поиска:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
procedure TForm1.Button1Click(Sender: TObject); var j:integer; begin for j:=1 to 100 do begin if (f[j] mod 5=0) and (f[j] mod 3=0) then \\ Если найден искомый элемент, то begin memo2.Lines.Append(inttostr(f[j])+' №'+inttostr(j)); \\ Записываем этот элемент и его номер break; \\ прекращаем работу цикла end; end; end; |
Вот окно программы после выполнения 23 циклов поиска:
Как видно из изображения цикл не выполнялся до конца, самое большое он выполнился 39 раз. Если сложить все количество выполнения циклов за 23 раза то получим 309. То есть наша программы 309 раз проверила число на кратность 5 и 3. А если бы после получения результата мы бы продолжали проверять до конца цикла программе пришлось бы выполнить поиск 2300 раз. Данная процедура позволяет не тратить лишнее время на обработку ненужной информации.
Процедура Continue не останавливает цикл полностью, она только прекращает выполнение данного шага цикла и передает управление заголовку цикла для выполнения следующего шага.
Вот простая задача6 из случайного массива выбрать положительные числа и возвести их в одиннадцатую степень. В массиве будет 10 элементов.
Если возводить каждый элемент в одиннадцатую степень, а потом выбирать из них положительные, то цикл выполнится 110 раз. А можно сначала проверить число, и если оно отрицательное прервать выполнение данного шага цикла и преступить к следующему. Это не даст циклу возведения в степень выполниться лишние 11 раз.
Процедура задания массива.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
var f:array[1..100] of integer; procedure TForm1.Button2Click(Sender: TObject); var i,g:integer; begin Randomize; for i:=1 to 100 do begin g:=random(10)-5; f[i]:=g; Memo1.Lines.Append(inttostr(g)); end; end; |
Процедура возведения в степень положительных элементов массива:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
procedure TForm1.Button1Click(Sender: TObject); var j,i,d:integer; begin for j:=1 to 10 do begin d:=1; if f[j]<0 then Continue; \\Прерываем выполнение шага цикла, так как элемент отрицательный for i:=1 to 11 do d:=d*f[j]; Memo2.Lines.Append(inttostr(d)); end; end; |
Вот окно программы после выполнения:
Как видно только три элемента были возведены в 11 степень. Это добавило только 33 шага работы программы и в общем получим всего 43 шага вместо 110.
Данные процедуры работают во всех видах циклов, но конечно чаще всего используются в цикле for, так как в нем нет изначально условия остановки как в других циклах. Хотя и в них бывает необходимость ставить еще условия остановки.
Об авторе