Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Цикл while




Функции 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 проверяется перед очередной итерацией. Итерации повторяются пока условие истинно.

 

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) – реализация итерационных вычислений когда число шагов (итераций) заранее неизвестно.

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

 

E – e sin(E) = M

 

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

 

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

 

с начальным приближением E0 = M. Итерации выполняют до тех пор, пока не будет достигнута заданная точность, например ½Ek+1 – Ek ½£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;

 

 




Поделиться с друзьями:


Дата добавления: 2015-04-29; Просмотров: 315; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.