Вычисление и вывод данных в виде таблицы
Программы циклической структуры
Средства разработки программ циклической структуры
Программой циклической структурыназывают такую программу, в которой операторы могут повторно, при изменяющихся значениях переменных выполняться несколько раз, образуя цикл. Различают следующие виды циклов (для их организации используются специальные сложные операторы - операторы циклов):
- цикл с заданным числом повторенийили цикл с параметром(операторы цикла for: оператор for to и оператор for downto),
- цикл с предусловием(оператор цикла while),
- цикл с постусловием(оператор цикла repeat until).
В циклах можно выделить управляющие части, определяющие начало и условия выполнения цикла, и части из одного или нескольких операторов (тело цикла), выполняющие необходимые преобразования данных. Цикл называют простым, если в его теле нет других циклов.
Циклы с параметром
Структура оператора цикла for to описывается синтаксической диаграммой
где используются следующие обозначения:
I – параметр цикла- переменная ординального(порядкового), в частности целого, типа,
В1 и В2 – выражения того же типа, что и параметр цикла, или совместимые с ним,
Oп – оператор, выполняемый внутри цикла.
Часть, предшествующая оператору Оп, - заголовок циклаявляется управляющей, а сам оператор Оп – телом цикла. Оператор Oп будет последовательно выполняться при автоматическом увеличении с минимальным шагом значения параметра цикла I от значения В1 до значения В2 включительно (для целых типов шаг равен 1). При В1>В2 оператор Oп не будет выполняться вообще.
Например, в цикле
for I:=0 to 6 do
WriteLn(I*10:2,Sin(I/18*Pi):8:2);
оператор WriteLn будет выполняться 7 раз при I, изменяющемся от 0 до 6 с шагом 1.
На экран будет выведена таблица, в первом столбце которой будут целые числа 0, 10, 20, …, 60, представляющие величины углов в градусах, а во втором – соответствующие им значения синуса:
0 0.00
10 0.17
20 0.34
30 0.50
40 0.64
50 0.77
60 0.87
Структура оператора цикла for downto описывается синтаксической диаграммой
а его работа отличается от оператора for to тем, что параметр цикла I не увеличивается, а уменьшается от В1 до В2, а оператор Oп не будет выполняться вообще при В1<В2.
Цикл с предусловием
Структура оператора цикла while описывается синтаксической диаграммой
где используются следующие обозначения:
БВ – булевское выражение,
Oп – оператор, выполняемый внутри цикла (тело цикла).
Заголовок цикла – конструкция, предшествующая оператору ОП, управляет выполнением цикла следующим образом: оператор Oп будет последовательно выполняться, пока выражение БВ имеет значение True, или не будет выполняться вообще, если до выполнения оператора while БВ имеет значение False.
Например, фрагмент программы
N:=0;
while N<=60 do
begin
WriteLn(N:2,Sin(N/180*Pi):8:2);
N:=N+10
end
буде выполнять ту же работу, что и оператор for to в предыдущем примере.
Цикл с постусловием
Структура оператора цикла repeat until описывается синтаксической диаграммой
Внутри такого цикла может находиться произвольное число операторов Оп, которые будут выполняться один или более раз до получения булевским выражением БВ значения True. Например, такую же таблицу, что и в первом примере с применением оператора for to, будет выводить следующий фрагмент программы:
N:=0;
repeat
WriteLn(N:2,Sin(N/180*Pi):8:2);
N:=N+10
until N>60;
В приведенных примерах переменные I и N изменялись по закону арифметической прогрессии. Нередко возникает необходимость иметь в цикле переменную – дополнительный параметр цикла, изменяющуюся по требуемому закону. Сделать это можно так: до входа в цикл этой переменной дается начальное значение, а внутри цикла значение переменной изменяется нужным образом с помощью оператора присваивания.
В следующем фрагменте программы
R:=5;
for K:=1 to N do
begin
. . . . . .
R:=R*1.2;
. . . . . .
end;
R - дополнительный параметр, который в цикле при N равном 4 будет последовательно получать значения 5; 6; 7,2; 8,64, изменяясь по закону геометрической прогрессии умножением предыдущего значения на 1,2.
Выход из цикла по условию, объявленному в его управляющей части, будем называть естественным. При этом для циклов с параметром (организованным операторами for) рекомендуется считать, что значение параметра становится неопределённым.
Существует возможность и досрочного выхода из любого цикла, организованного рассмотренными операторами, либо с помощью оператора безусловного перехода goto (их мы не будем использовать), либо с помощью оператора break. В этом случае текущее значение параметра цикла for сохраняется (считается определённым) и его можно использовать в дальнейших вычислениях.
В теле любого из рассмотренных циклов допускается использовать оператор continue. Его действие сводится к тому, что сразу происходит переход к очередному выполнению тела цикла (в циклах for с очередным значением параметра), или выход из цикла, если выполнено условие его завершения.
Вычисление и вывод данных в виде таблицы
Простейшими примерами применения операторов цикла на практике являются программы вычисления значений функций при изменяющихся значениях аргумента и вывода данных в виде таблиц с заголовками. В качестве аргумента обычно выступает переменная – дополнительный параметр, изменяющаяся в цикле по требуемому закону. В циклах while и repeat эта переменная используется в условиях завершения цикла.
При работе с вещественными данными необходимо иметь в виду, что их значения могут представляться с ошибкой, что эти ошибки могут зависеть от типа переменных, накапливаться при выполнении арифметических операций и приводить к непредусмотренному программистом выполнению программы. Рассмотрим два фрагмента программы вывода таблицы значений аргумента и функции, где аргумент - дополнительный параметр в цикле является вещественной переменной с именем Х:
1)
X:=0; H:=1/3; Xk:=5/3;//Все переменные типа Extended
while X<=Xk do
begin
WriteLn(X:6:2,Sin(X):8:2);
X:=X+H;
end;
2)
H:=1/3;X:=-H; Xk:=5/3;
repeat
X:=X+H;
WriteLn(X:6:2,Sin(X):8:2);
until X=Xk;
Казалось бы, оба фрагмента выведут на экран таблицы значений синуса для аргумента Х, изменяющегося от 0 до 5/3 включительно с шагом 1/3. Но в действительности первый фрагмент не выведет значения 5/3 и sin(5/3), а второй не обеспечит завершение выполнения цикла при Х=5/3, так что цикл продолжит выполняться и при больших значениях Х.
Во избежание подобных ситуаций следует вместо проверок вещественных данных на равенство использовать проверки на < (меньше) и/или > (больше) с некоторым достаточно малым запасом, превышающим точность представления чисел данного типа и не нарушающим логику работы программы. Например, в рассмотренные фрагменты программы можно изменить так
1)
X:=0; H:=1/3;
//Запас в H/2=1/6 больше ошибки представления вещественных чисел
Xk:=5/3+H/2;
while X<Xk do //и при Х=5/3 цикл будет выполнен.
begin
WriteLn(X:6:2,Sin(X):8:2);
X:=X+H;
end;
2)
H:=1/3;X:=-H;
//Запас в H/2 больше ошибки представления вещественных чисел
Xk:=5/3-H/2;
repeat
X:=X+H;
WriteLn(X:6:2,Sin(X):8:2);
until X>Xk; //и выход из цикла будет, и будет только при Х,
//равном 5/3, что больше Xk.
Рассмотрим решение этой же задачи вывода таблицы значений синуса, но при использовании оператора цикла for. Для этого потребуется заранее вычислить, сколько раз цикл должен выполняться, воспользовавшись формулой
,
где скобки обозначают округление,
N – искомое число повторений цикла,
X0 и X1 – начальное и конечное значения аргумента,
H – шаг изменения аргумента.
Так как в нашем случае Х0=0, Х1=5/3 и H =1/3, фрагмент программы с циклом for будет следующим
H:=1/3; X:=0;
N:=Round(5/3/H)+1;
for i:=1 to N do
begin
WriteLn(X:6:2,Sin(X):8:2);
X:=X+H;
end;