Прерывание работы циклов в Lazarus и Delphi - Pascal, Delphi, Lazarus - Программирование - Каталог статей - Учись! Slider en CSS3 et JS

^
Категории раздела
случайная задача
[28.10.2014][Олимпиады]
.В треугольнике АВС проведена биссектриса ВВ1. Пусть М – такая точка плоскости, что отрезок МВ1 пересекает сторону ВС в точке К, ВМ = АВ1 (0)
[05.05.2015][ЕГЭ (П)]
В правильной четырёхугольной пирамиде все рёбра равны 8. Найдите площадь сечения пи¬рамиды плоскостью, проходящей через сере¬дины боковых рё (0)
[26.01.2016][ЕГЭ (П)]
Площадь параллелограмма равна 14 Найдите площадь четырехугольника, вершинами которого являются середины сторон данного параллелограмма. (0)
[14.10.2015][ОГЭ]
Площадь четырёхугольника можно вычислить по формуле s=d1*d2*sin a/2 , где d1 и d2 — длины диагоналей четырехугольника, а —угол между диа (0)
[11.03.2016][ОГЭ]
Сумма двух углов равнобедренной трапеции равна 218°, Найдите больший угол трапеции. Ответ дайте в градусах. (0)
[11.10.2013][ЕГЭ (П)]
ЕГЭ Математика B6 (0)
[10.01.2016][ЕГЭ (П)]
Заказ на 140 деталей первый рабочий выполняет на 4 часа быстрее, чем второй. Сколько деталей в час делает второй рабочий если известно, что (0)
[11.02.2016][ОГЭ]
В прямоугольном треугольнике катет и гипотенуза равны соответственно 12 и 20. Найдите другой катет этого треугольника. (0)
Реклама
Статистика
Яндекс.Метрика


Онлайн всего: 39
Гостей: 39
Пользователей: 0

копирайт
Copyright Игорь Ret-Ar Матыцин © 2017
 
поделиться
Мы Вконтакте
Google+
реклама
Свидетельство
Вход на сайт
Популярное
[14.10.2015][ОГЭ]
Площадь четырёхугольника можно вычислить по формуле s=d1*d2*sin a/2 , где d1 и d2 — длины диагоналей четырехугольника, а —угол между диа (0)
[21.12.2014][ЕГЭ (П)]
Диагональ правильной четырёхугольной призмы наклонена к плоскости основания под углом 30°. Боковое ребро равно 3. Найдите диагональ призмы. (0)
[21.12.2014][ЕГЭ (П)]
В случайном эксперименте симметричную монету бросают триж¬ды. Найдите вероятность того, что решка выпадет все три раза (0)
[15.04.2015][ЕГЭ (П)]
В прямоугольном параллелепипеде ABCDA1B1C1D1 известны длины рёбер: АВ = 3, AD = 4, АА1 = 32. Найдите площадь сечения, про¬ходящего через вер (0)
[21.12.2014][ЕГЭ (П)]
Корень(9 - 4*корень(5)) - корень(5) или √9-4√5-√5 (0)
[21.12.2014][ЕГЭ (П)]
В кубе ABCDA1B1C1D1 точки Е, F, Е1 и F1 являются серединами рёбер ВС, DC, B1C1 и D1C1 соответственно. Объём призмы, отсекаемой от куба плоск (0)
[15.04.2015][ЕГЭ (П)]
13. Первый сплав содержит 5% меди, второй — 11% меди. Масса второго сплава больше массы первого на 4 кг. Из этих двух спла¬вов получили трет (0)
[14.10.2015][ОГЭ]
После уценки телевизора его новая цена составила 0,57 старой. На сколько процентов уменьшилась цена телевизора в результате уценки? (0)
[14.10.2015][ОГЭ]
10. Отрезки АС и BD — диаметры окружности с центром О. Угол АСВ равен 78° . Найдите угол AOD. Ответ дайте в градусах (0)
[01.11.2015][ОГЭ]
Два катета прямоугольного треугольника равны 17 и 4. Найдите его площадь (2)
ГДЗ
Главная » Статьи » Программирование » 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)
Просмотров: 2711 | Рейтинг: 0.0/0