Прерывание работы циклов в Lazarus и Delphi - Pascal, Delphi, Lazarus - Программирование - Каталог статей - Учись!
Главная Регистрация Вход RSS
Приветствую Вас, Гость
Категории раздела
Реклама
Статистика
Яндекс.Метрика
Поделиться
Реклама
Вход на сайт
Популярное
[14.10.2015][ОГЭ]
Площадь четырёхугольника можно вычислить по формуле s=d1*d2*sin a/2 , где d1 и d2 — длины диагоналей четырехугольника, а —угол между диа (0)
[21.12.2014][ЕГЭ (П)]
Диагональ правильной четырёхугольной призмы наклонена к плоскости основания под углом 30°. Боковое ребро равно 3. Найдите диагональ призмы. (0)
[15.04.2015][ЕГЭ (П)]
В прямоугольном параллелепипеде ABCDA1B1C1D1 известны длины рёбер: АВ = 3, AD = 4, АА1 = 32. Найдите площадь сечения, про¬ходящего через вер (0)
[21.12.2014][ЕГЭ (П)]
В случайном эксперименте симметричную монету бросают триж¬ды. Найдите вероятность того, что решка выпадет все три раза (0)
[21.12.2014][ЕГЭ (П)]
Корень(9 - 4*корень(5)) - корень(5) или √9-4√5-√5 (0)
[14.10.2015][ОГЭ]
После уценки телевизора его новая цена составила 0,57 старой. На сколько процентов уменьшилась цена телевизора в результате уценки? (0)
[15.04.2015][ЕГЭ (П)]
13. Первый сплав содержит 5% меди, второй — 11% меди. Масса второго сплава больше массы первого на 4 кг. Из этих двух спла¬вов получили трет (0)
[11.03.2016][ОГЭ]
Найдите площадь квадрата, описанного около окружности радиуса 9. (0)
[14.10.2015][ОГЭ]
10. Отрезки АС и BD — диаметры окружности с центром О. Угол АСВ равен 78° . Найдите угол AOD. Ответ дайте в градусах (0)
[21.12.2014][ЕГЭ (П)]
В кубе ABCDA1B1C1D1 точки Е, F, Е1 и F1 являются серединами рёбер ВС, DC, B1C1 и D1C1 соответственно. Объём призмы, отсекаемой от куба плоск (0)
Главная » Статьи » Программирование » Pascal, Delphi, Lazarus

Прерывание работы циклов в Lazarus и Delphi

Для полного контроля работы циклов, необходима возможность в любое время прервать цикл или пропустить один из ходов.

Для этого  существуют две процедуры: Break и Continue.

Процедура Break полностью останавливает цикл.  Она очень удобна при поисковых задачах. Например, необходимо в одномерном массиве случайных чисел отыскать первый элемент кратный и 5 и 3. Размер массива равен 100 элементов. Понятно, что можно перебрать все элементы, но искомый элемент найдется быстрее, чем через 100 шагов и все остальные шаги будут лишним. Поэтому после нахождения искомого элемента необходимо будет прервать работу цикла.

Задаем массив:

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;

    Процедура поиска:

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 раз.

Процедура задания массива.

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;

Процедура возведения в степень положительных элементов массива:

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, так как в нем нет изначально условия остановки как в других циклах. Хотя и в них бывает необходимость ставить еще условия остановки.

Категория: Pascal, Delphi, Lazarus | Добавил: Ret-Ar (14.12.2013)
Просмотров: 2839 | Рейтинг: 0.0/0
-->