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

Функции Pred и Succ

Функции Pred и Succ применяются к данным перечислимого типа, например – Char, byte, integer и т.д. Функция Pred возвращает значение, которое предшествует значению ее аргумента. Например, Pred(10) вернет число 9, Pred(100) вернет 99, и т.д.

Следующие три цикла идентичны:

var

X : Integer;

begin

X := 10;

for I := 0 to 9 do DoSomething;

for I := 0 to X - 1 do DoSomething;

for I := 0 to Pred(X) do DoSomething;

end;

Когда счетчик цикла изменяется от 0 и надо сделать 10 итераций, легко ошибиться в сторону «лишней» итерации. Использование Pred с одной стороны, может решить проблему с лишней итерацией, а с другой стороны, Pred(X) элегантней чем X – 1.

Функция Succ возвращает значение, которое следует за ее аргументом. В циклах с уменьшением счетчика полезно применять Succ так:

for I := 100 downto Succ(X) do DoSomething;

Цикл while

Условие цикла while проверяется перед очередной итерацией. Итерации повторяются пока условие истинно.

var

X : Integer;

begin

X := 0;

while X < 1000 do

begin

X := DoSomeCalculation;

DoSomeMore;

end;

{ ...продолжение }

end;

В этом примере подразумевается, что функция DoSomeCalculation, рано или поздно, вернет значение 1,000. Пока эта функция возвращает числа меньше 1,000, цикл продолжается. Как только переменная X примет значение большее или равное 1,000, условие цикла станет ложным и повторение операторов тела цикла прекратится – произойдет переход к оператору, следующему за телом цикла.

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

В общем случае в качестве условия цикла рекомендуется использовать логическую переменную. Ее значение надо устанавливать в теле цикла:

var

Stop : Boolean;

begin

Stop := False;

while not Stop do begin

DoSomeStuff;

Stop := SomeFunctionReturningABoolean;

DoSomeMoreStuff;

end;

end;

Если в какой–то момент времени выполнения программы переменная Stop примет значение true – выполнение цикла прекратится.

Применение цикла while иллюстрирует следующая программа. Создайте новый проект и поместите на форму кнопку (Button) и блокнот (Memo). Дважды щелкните на кнопке и напишите следующий код обработчика события:

procedure TForm1.Button1Click(Sender: TObject);

var

I : Integer;

begin

I := 5;

Memo1.Lines.Clear;

while I > -1 do

begin

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

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

Dec(I);

end;

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

end;

Запустите программу и в окне блокнота увидите текст:

До перехвата 5 сек.

До перехвата 4 сек.

До перехвата 3 сек.

До перехвата 2 сек.

До перехвата 1 сек.

До перехвата 0 сек.

Цель с радара исчезла

В этой программе объявлена переменная I, которой перед входом в цикл присвоено значение 5. Далее начинается цикл. На каждой итерации цикла в компонент Memo1 добавляется строка текста, а значение переменной I уменьшается на 1. Как только переменная I станет равной -1, итерации прекращаются и в Memo1 выводится заключительная строка.

Нетрудно сообразить, что точно такого же результата можно добиться и с помощью цикла for . . . downto.

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

Рассмотрим подпрограмму, которая реализует итерационный метод решения уравнения Кеплера

Ee sin(E) = M

где e и M – заданные вещественные значения, а неизвестной является вещественная переменная E. Для решения этого уравнения применяется метод последовательных приближений (итераций) по схеме

Ek+1 = M + e sin(Ek), k=0,1,2,. . .

с начальным приближением E0 = M. Итерации выполняют до тех пор, пока не будет достигнута заданная точность, например Ek+1Ek 10-9.

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

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

const

Eps = 1e-9;

var

Eold,Enew : real;

Stop : boolean;

begin

Eold := M;

Stop := false;

while not Stop do

begin

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

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

Eold := Enew;

end;

Result := Enew;

end;

Синтаксис цикла while имеет вид

while cond_expr do

begin

statements;

end;

Тело цикла (statements) выполняется итеративно пока условие цикла cond_expr есть True. Исходное состояние условия цикла необходимо обеспечить до входа в него. В теле цикла должны присутствовать операторы, так или иначе влияющие на состояние условия цикла. В противном случае получим бесконечный цикл (зависание системы).

Когда условное выражение cond_expr становится ложным, цикл прекращается.

Если тело цикла состоит из единственного оператора, ключевые слова begin и end необязательны.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]