Цикл с предусловием
Наиболее общим в Delphi является цикл с предусловием, реализуемый оператором WHILE…DO. Вот его общий вид:
WHILE условие DO
оператор;
Цикл с предусловием имеет интересную особенность: если в начале его работы условие оказалось ложным, то цикл вообще не будет выполнятьсяни разу.
В качестве условия может выступать любое логическое выражение или переменная типа BOOLEAN. Работает такой цикл следующим образом. Сначала проверятся условие (отсюда и название – цикл с предусловием). Если условие истинно, то выполняется оператор (он называется "тело цикла"), а затем программа "пятится назад", снова оказывается на операторе WHILE..DO, снова проверяет условие… и так далее до тех пор, пока условие не станет ложным. Как только это случится, цикл прекращается, и начинает выполняться оператор, следующий за телом цикла.
Таким образом, инструкции, находящиеся между begin и end, выполняются до тех пор, пока условие истинно (значение выражения условие равно true)
Обратите внимание: Для того чтобы инструкции цикла, находящиеся между begin и end, были выполнены хотя бы один раз, необходимо, чтобы перед выполнением инструкции while выражение условие было истинно. Для того чтобы цикл завершился, необходимо, чтобы последовательность инструкций между begin и end изменяла значения переменных, входящих в выражение условие.
Рассмотрим пример использования цикла WHILE. Пусть мы суммируем ряд натуральных чисел 1+2+3+… и хотим узнать, на каком числе этого ряда сумма превысит 100. Программа будет выглядеть следующим образом:
VAR s:WORD; { сумма }
i: WORD; { текущее число ряда }
BEGIN
s:=0; { сумму обязательно обнуляем!!! }
i:=1; { начинаем суммировать с единицы }
WHILE s<100 DO
BEGIN
s:=s+i;
i:=i+1
END;
Label1.Caption:='Сумма превысит 100 при i='+IntToStr(i)
end;
Кстати, сумма превысит 100 при i=15, так как . Обратите внимание на операторные скобки BEGIN..END. Они позволяют поместить в тело цикла более одного оператора (разумеется, если в теле цикла только один оператор, BEGIN…END не нужны).
Рис. 1. Обозначение цикла с предусловием на блок-схемах.
На блок-схемах все циклы изображаются в виде крышки гроба, самого гроба и лежащего в нем тела цикла. Обозначения же зависят от вида цикла. Для цикла с предусловием блок-схема выглядит, как показано на рис. 1.
Следующая программа вычисляет значение числа p с задаваемой пользователем точностью. В основе алгоритма вычисления лежит тот факт, что сумма ряда 1-1/3+1/5-1/7+1/9+, если взять достаточно много его членов, приближается к значению p/4. В программе очередной член ряда, с номером n, вычисляется по формуле: 1/(2*n-1) и умножается на минус один, если его номер четный (определить, является ли n четным можно, например, проверкой остатка от деления n на 2). Вычисление заканчивается тогда, когда значение очередного члена ряда становится меньше, чем заданная точность вычисления. Вид диалогового окна программы приведен на рис.
Пользователь вводит точность вычисления в поле ввода (Edit1). После щелчка на командной кнопке Вычислить (Buttoni) программа вычисляет значение числа p и выводит результат в поле метки (Label2).
Как и в предыдущих примерах, основную работу выполняет процедура обработки события onClick, текст которой приведен ниже.
{Вычисление числа p с заданной точностью}
procedure TFonnl.ButtonlClick(Sender: TObject);
pi: real; {вычисляемое значение p}
t: real; {точность вычисления}
n: integer; {номер члена ряда}
elem:real; { значение члена ряда}
begin
pi:=0; n:=l; t:=StrToFloat(Edit1.Text); elem:=t+l; {чтобы начать цикл}
While elem >= t do begin
elem:=l/(2*n-l) ;
if (n MOD 2) = 0 then pi:=pi-elem else pi:=pi+elem;
n:=n+l;
end;
pi:=pi*4;
Label2.Caption:= 'ПИ равно '+ FloatToStr(pi) + #13
+ 'Просуммировано '+IntToStr(n)+' членов ряда.';
end;
Дата добавления: 2015-03-19; просмотров: 778;