Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 02 26 Основы программирования в Delphi.docx
Скачиваний:
19
Добавлен:
16.08.2019
Размер:
205 Кб
Скачать
☆

Цикл repeat

Цикл repeat почти идентичен циклу while. Отличие состоит в том что здесь условие цикла проверяется в точке окончания, т.е. после каждого выполнения операторов тела цикла.

В качестве примера рассмотрим предыдущее упражнение, но теперь вместо while применим repeat:

procedure TForm1.Button1Click(Sender: TObject);

var

I : Integer;

begin

I := 5;

Memo1.Clear;

repeat

Memo1.Lines.Add('До перехвата '+

IntToStr(I) + ' сек.');

Dec(I);

until I = -1;

Memo1.Lines.Add('Цель с радара исчезла');

end;

В результате выполнения этого кода мы увидим в окне блокнота результат аналогичный предыдущему упражнению. Отметим, что в цикле repeat нет надобности ограничивать тело цикла словами begin – end так как их роль здесь выполняют ключевые слова repeat и until.

Область применения цикла repeat – реализация итерационных вычислений когда число шагов (итераций) заранее неизвестно. Приведем пример подпрограммы, которая реализует итерационный метод решения уравнения Кеплера с циклом repeat.

function SolveEquation_Repeat(const e,M : real):real;

{ Решение уравнения Кеплера в цикле repeat }

const

Eps = 1e-9;

var

Eold,Enew : real;

Stop : boolean;

begin

Eold := M;

Stop := false;

repeat

Enew := M + e * Sin(Eold);

Stop := Abs(Eold-Enew)<=Eps;

Eold := Enew;

until Stop;

Result := Enew;

end;

Какой из двух циклов использовать – решает программист. В качестве критерия выбора здесь можно использовать ту особенность циклов while и repeat, что while может не выполняться вообще, а тело цикла repeat безусловно выполняется один раз.

Синтакис цикла repeat имеет следующий вид

repeat

statements;

until cond_expr;

Цикл repeat повторяет выполнение блока операторов, обозначенных как statements пока условие cond_expr есть False. Исходное состояние цикла необходимо подготовить до входа в него. Среди операторов statements должен быть такой, который модифицирует условие цикла. В противном случае возможен бесконечный цикл и зависание системы. Повторение блока statements прекращается в точке until при cond_expr=true.

Управление циклами

Для управления циклами в Object Pascal имеются две весьма полезные процедуры.

Процедура Continue используется для пропуска группы операторов, расположенных между точкой ее вызова и концом цикла. Например, в зависимости от какого–то условия часть операторов тела цикла выполнять не надо. В такой ситуации можно воспользоваться процедурой Continue:

var

Done : Boolean;

Error : Boolean;

begin

Done := False;

{Начало цикла}

while not Done do

begin

{Здесь находится безусловно выполняемый код }

Error := SomeFunction; {формируем условие}

if Error then Continue; {пропуск до конца если Error=true}

{ Здесь находятся операторы, которые не надо выполнять

при Error=true }

end; {конец цикла}

end;

Процедура Break прерывает выполнение цикла независимо от текущего его состояния.

Пусть в целочисленном массиве нам надо найти заданное число. Принудительно завершая цикл сразу как только заданное число найдено, мы попутно можем узнать и запомнить индекс элемента массива, в котором оно записано:

var

MyArray : array [0..99] of Integer;

Index : Integer;

SearchNumber : Integer;

I : Integer;

Diagnostics : string;

const

sCaption = ’Заданное число ’;

begin

FillArray; { Процедура инициализации массива }

Index := -1;

{Ввод искомого числа из компонента Edit1}

SearchNumber := StrToInt(Edit1.Text);

Diagnostics := sCaption + Edit1.Text + ’ ’;

for I := 0 to High(MyArray) do

begin

if MyArray[I] = SearchNumber then

begin

Index := I;

Break;

end;

end;

if Index <> -1 then

Label1.Caption:= Diagnostics +

’- содержит элемент номер ’+

IntToStr(Index)

else

Label1.Caption := Diagnostics + ’- не найдено. ’;

end;

Процедуры Continue и Break можно вызывать только в теле цикла for, while или repeat. На вызов любой из этих процедур вне цикла компилятор отреагирует сообщением об ошибке:

Error: BREAK or CONTINUE outside of loop.