КАТЕГОРИИ: Архитектура-(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; Просмотров: 350; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |