На главную Напишите нам! Напишите нам!
25-08-2012

Работа с операторами цикла - Delphi (Lazarus).

Циклический процесс, или просто цикл, – это повторение одних и тех же дей- ствий. Последовательность действий, которые повторяются в цикле, называют телом цикла. Один проход цикла называют шагом, или итерацией. Переменные, которые изменяются внутри цикла и влияют на его окончание, называются параметрами цикла.

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

В языке Free Pascal для удобства программиста предусмотрены три оператора, реализующих циклический процесс:
while, repeat…
until и for.

Оператор цикла с предусловием while .. do

На рис. 3.25 изображена блок-схема алгоритма цикла с предусловием. Оператор, реализующий этот алгоритм в языке Free Pascal, имеет вид:

while выражение do оператор;

Работа с этим редактором очень похожа на редактор полей набора данных, но есть и отличия. В верхней части окна вы видите четыре кнопки, слева - направо:
здесь while .. do – зарезервированные слова языка Free Pascal, выражение – логическая константа, переменная или логическое выражение, оператор – любой допустимый оператор языка.

Работает оператор while следующим образом. Вычисляется значение выражения. Если оно истинно (True), выполняется оператор. В противном случае цикл заканчивается, и управление передается оператору, следующему за телом цикла. Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение ложно (False), цикл не выполнится ни разу.

Рисунок 3.25: Алгоритм циклической структуры с предусловием

Если в цикле надо выполнить более одного оператора, необходимо использо- вать составной оператор:

while условие do
begin
оператор_1;
оператор_2;

оператор_n;
end;

Рассмотрим пример. .

Пусть необходимо вывести на экран значения функции y=esin(x)cos(x) на отрезке [0;π] с шагом 0.1. Применим цикл с предусловием:

var x,y:real;
begin
{Присваивание параметру цикла
стартового значения.}
x:=0;
{Цикл с предусловием.}
while x<=pi do {Пока параметр цикла
не превышает конечное значение,
выполнять тело цикла.}
begin
{Вычислить значение y.}
y:=exp(sin(x))*cos(x);
{Вывод на экран пары х и y.}
writeln('x=', x,' y=', y);
{Изменение параметра цикла -
переход к следующему значению x.}
x:=x+0.1;
end; {Конец цикла.}
end.

В результате работы данного фрагмента программы на экран последовательно будут выводиться сообщения со значениями переменных x и y:

x= 0; y=1
x= 0.1; y=1.0995

x= 3.1; y=-1.0415

Оператор цикла с постусловием repeat … until

Если в цикле с предусловием проверка условия осуществляется до тела цикла, то в цикле с постусловием условие проверяется после тела цикла (см. рис. 3.26). Сначала выполняются операторы, являющиеся телом цикла, после чего проверяется условие, если последнее ложно, то цикл повторяется. Выполнение цикла прекратится, если условие станет истинным.

В языке Free Pascal цикл с постусловием реализован конструкцией

repeat
оператор;
until выражение;
здесь repeat .. until – зарезервированные слова языка Free
Pascal, выражение – логическая константа, переменная или логиче-
ское выражение, оператор – любой допустимый оператор языка.

Если тело цикла состоит более чем из одного оператора, то цикл с постусловием имеет вид:

repeat
оператор_1;
оператор_2;
.............
оператор_N;
until выражение;

Рисунок 3.26: Алгоритм цикла с постусловием

  

Работает цикл следующим образом. В начале выполняется оператор, представляющий собой тело цикла. Затем вычисляется значение выражения. Если оно ложно (False), оператор тела цикла выполняется еще раз. В противном случае цикл завершается, и управление передается оператору, следующему за циклом.

Таким образом, нетрудно заметить, что цикл с постусловием всегда будет выполнен хотя бы один раз в отличие от цикла с предусловием, который может не выполниться ни разу.

Если применить цикл с постусловием для создания подпрограммы, которая выводит значения функции y=esin(x)cos(x) на отрезке [0;π] с шагом 0.1. получим:

var
x,y:real;
begin
{Присваивание параметру цикла
стартового значения.}
x:=0;
{Цикл с постусловием.}
repeat {Начало цикла}
y:=exp(sin(x))*cos(x);
writeln('x=',x,' y=',y);
x:=x+0.1; {Изменение параметра цикла.}
until x>pi; {Закончить работу цикла,
когда параметр превысит конечное значение.}
end.

Оператор цикла for … do

Операторы цикла с условием обладают значительной гибкостью, но не слишком удобны для организации «строгих» циклов, которые должны быть выполнены заданное число раз. Оператор цикла for … do используется именно в таких случаях:

for i:= in to ik do оператор;
for i:= ik downto in do оператор;
где оператор – любой оператор языка, i, in и ik — переменная
целочисленного или перечислимого типов.

Переменную i называют параметром цикла. Переменные in и ik — диапазон изменения параметра цикла: in — начальное значение, а ik — конечное значение параметра цикла.

Шаг изменения цикла for всегда постоянен и равен интервалу между двумя ближайшими значениями типа параметра цикла (при целочисленном значении параметра цикла шаг равен 1).

В случае если тело цикла состоит более чем из одного оператора, необходимо использовать составной оператор:

for i:= in to ik do
begin
оператор_1;
оператор_2;
...........
оператор_n;
end;

Опишем (рис.3.27) алгоритм работы цикла for … do:

  • Параметру цикла i присваивается начальное значение in.
  • Если значение параметра цикла превосходит конечное значение (i>ik), то цикл завершает свою работу. В противном случае выполняется пункт 3.
  • Выполняется оператор.
  • Значение параметра цикла i изменяется на соответствующий шаг и осуществляется переход к п.2 и т. д.

Понятно, что этот алгоритм представляет собой цикл с предусловием

Рисунок 3.27: Алгоритм работы цикла for...do

В дальнейшем, чтобы избежать создания слишком громоздких алгоритмов, в блок-схемах цикл for будем изображать так, как показано на рис. 3.28

Рисунок 3.28: Представление цикла for...do с помощью блок-схемы

Фрагмент подпрограммы, приведенный далее, демонстрирует применение цикла

for:
var i:integer; c:char;
begin
{Вывод на экран чисел от 1 до 10.}
for i:=1 to 10 do writeln(i);
{Вывод на экран чисел от 10 до -10.}
for i:=10 downto -10 do writeln(i);
{Вывод на экран символов от a до r.}
for c:='a' to 'r' do writeln(c);
end;

Вернемся к задаче вывода значений функции на y=esin(x)cos(x) отрезке [0;π] с шагом 0.1. Как видим, здесь количество повторений цикла явно не задано. Однако это значение, можно легко вычислить. Предположим, что параметр цикла х принимает значения в диапазоне от xn до xk, изменяясь с шагом , тогда количество повторений тела цикла можно определить по формуле:


округлив результат деления до целого числа. Следовательно, фрагмент программы вывода значений функции y=esin(x)cos(x) на отрезке [0;π] с шагом 0.1. будет иметь вид:

var i,n:integer; x,y:real;
begin
{Количество повторений цикла:}
{n=(xk-xn)/dx+1; xk=pi, xn=0, dx=0.1}
n:=round((pi-0)/0.1)+1;
x:=0; {Начальное значение аргумента.}
{Цикл с известным числом повторений,}
{i – параметр цикла,
изменяется от 1 до n с шагом 1.}
for i:=1 to n do
begin {Начало цикла.}
{Вычисление значения функции }
y:=exp(sin(x))*cos(x);
{для соответствующего значения аргумента.}
writeln('x=',x,' y=',y);
x:=x+0.1; {Вычисление нового
значения аргумента.}
end; {Конец цикла.}
end.

Рекомендуем в повседневной деятельности:

Скачать - инструкцию по созданию загрузочной флешки = 50,02мин. 20.04.2014г.
Скачать - правила получение аттестата Webmoney  (30.61 MB) = 7. 5 мин. 11.01.2013г.
Скачать ссылки на каталоги - для регистрации сайта (69.5 MB) = 9. 7 мин. 01.10.2013г.
Скачать - wifi router настройка модема (41.72 MB) = 7 мин. 46 сек. 26.01.2013г.
Скачать - TDSSKiller диагностика, лечение систем (24,71 MB) = 6,02 мин. 01.12.2012г.
Скачать - пример готового проэкта в Lazarus (91,59 MB) = 1,31мин. 08.04.2013г.
Скачать - правила установки MySQL в Lazarus (20,17 MB) = 4,55 мин. 25.02.2013г.
Класс!
 
Система раскрутки
Яндекс.Метрика
Копирование возможно при указании прямой индексируемой гиперссылки