С помощью такого оператора реализуются циклы, количество повторений которых заранее известно или может быть легко определено.
Пример 1. Вычислить путем многократного умножения ( - целое положительное число).
Блок-схема программы представлена на следующей странице.
Здесь i – параметр цикла, т.е. переменная, которая управляет количеством его повторений. В подготовительном блоке параметру цикла назначается определенное начальное значение, модифицирующий блок изменяет значение параметра, управляющий блок проверяет условие окончания цикла.
Пример 2.Вычислить и отпечатать значения функции для , изменяющегося от начального значения до конечного значения с шагом .
Количество вычислений функции :
,
где квадратные скобки определяют целую часть вещественного числа.
В этом примере количество выполнений цикла заранее не указывается, но легко определяется по значениям исходных данных.
Блок-схема решения задачи:
Для компактности изображения блок-схемы подготовительную, модифицирующую и управляющую части цикла рисуют одним блоком, который называют оператором цикла. На представленной ниже блок-схеме - соответственно начальное значение, конечное значение и шаг изменения параметра цикла. Если = 1 , то его можно не показывать на блок-схеме.
Блок-схема для примера 2 будет иметь вид:
Синтаксическая диаграмма оператора цикла с параметром:
Имя переменной на диаграмме - это параметр цикла. Он должен иметь ординальный тип и должен быть описан в том же блоке, где находится сам оператор цикла.
Выражение 1 - начальное значение параметра, выражение 2 - его конечное значение. Эти выражения должны быть ординального типа, совместимого с типом параметра цикла.
Если в операторе цикла используется зарезервированное слово to, то шаг изменения параметра цикла равен +1; для downto этот шаг равен -1.
Блок "Оператор" в синтаксической диаграмме - это тело цикла. В частном случае это может быть составной или пустой оператор.
В теле цикла параметр не должен изменяться. Начальное и конечное значения параметра вычисляются только один раз, до начала цикла.
При нормальном завершении цикла значение его параметра считается неопределенным.
Работу оператора цикла можно отобразить следующей блок-схемой:
а) Вариант toб) Вариант downto
Из блок-схемы можно вывести такие заключения:
1) если в теле цикла изменяются переменные, входящие в состав выражений 1 или 2, то это не отражается на количестве повторений цикла;
2) если начальное значение параметра цикла больше его конечного значения (вариант to), то цикл ни разу не выполняется;
3) в варианте downto цикл ни разу не выполняется, если начальное значение параметра цикла меньше его конечного значения.
Пример 1а. Паскаль-программа для примера 1:
ProgramMult;
Var x,y : real;
i,n : word;
Begin
Ввод и печать x, n
y:=1;
Fori:=1tondo
y:=y*x;
Печать y
End.
Пример 2а. Паскаль-программа для примера 2:
Program Table;
Var x,xn,xk,hx,y : real;
i,n : word;
Begin
Ввод и печать xn, xk, hx
n:=Round((xk-xn)/hx)+1; x:=xn;
For i:=1 to n do
Begin
y:=exp(sqrt(x))*sqr(sin(x));
Печать x,y
x:=x+hx
End;
End.
Пример 3. Вычисление факториала y=n! =
Vari,n : byte;
y : longint;
Begin
Read(n);
y:=1;
For i:=2 to n do
y:=y*i;
Writeln(‘y = ‘,y)
End.
Пример 4. Вычисление двойного факториала y=n!!
Двойной факториал – это произведение четных чисел при четном значении переменной n или произведение нечетных чисел при нечетном n.
Vari,n : byte;
y : longint;
Begin
y:=1;
For i:=2 to n do
Ifodd(i) = odd(n)then
y:=y*i;
Writeln(‘y = ‘,y)
End.
Пример 5. Вычислить ряд
четырьмя способами:
1) последовательно слева направо;
2) последовательно справа налево;
3) слева направо отдельно положительные и отрицательные элементы, затем их вычитание;
4) то же, но справа налево.
Program Summa;
Var SumLR, { сумма, все слева направо }
SumRL, { сумма, все справа налево }
SumLRNeg, { сумма, отрицательные эл-ты, слева направо }
SumLRPos, { сумма, положительные эл-ты, слева направо }
SumRLNeg, { сумма, отрицательные эл-ты, справа налево }
SumRLPos, { сумма, положительные эл-ты, справа налево }
ElemLRNeg, { очередной отриц.элемент, слева направо }
ElemLRPos, { очередной полож.элемент, слева направо }
ElemRLNeg, { очередной отриц.элемент, справа налево }
ElemRLPos { очередной полож.элемент, справа налево }
Примечание. Для описания вещественных переменных использован тип single вместо типа real, чтобы более четко показать влияние погрешности представления вещественных значений на результат вычислений (в типе single мантисса имеет длину три байта вместо пяти, как в типе real, что определяет меньшее количество значащих цифр в представлении вещественного числа).
Программа печатает следующие результаты:
SumLR 0.6930732
SumRL 0.6930972
SumLRPos-SumLRNeg 0.6931019
SumRLPos-SumRLNeg 0.6930976
Наиболее точная здесь сумма - SumRL.
Разница результатов связана с тем, что при сложении вещественных чисел, представленных как числа с плавающей запятой, может происходить потеря значащих цифр, если эти числа имеют различные порядки.
Рассмотрим, как изменяется число 1/9000 при сложении его с числом 1/8998 или с числом 1/3. Мантиссу будем представлять с семью десятичными цифрами.
1/9000 = 0,0001111111 = 0,1111111 ×
1/8998 = 0,0001111357 = 0,1111357 ×
1/3 = 0,3333333 = 0,3333333 ×
a) 0, 1 1 1 1 1 1 1 ×
+ 0, 1 1 1 1 3 5 7 ×
¾¾¾¾¾¾¾¾¾
0, 2 2 2 2 4 6 8 ×
б) 0, 1 1 1 1 1 1 1 × 0, 0 0 0 1 1 1 1 ×
+ 0, 3 3 3 3 3 3 3 × Þ + 0, 3 3 3 3 3 3 3 ×
¾¾¾¾¾¾¾¾¾ ¾¾¾¾¾¾¾¾¾
0, 3 3 3 4 4 4 4 ×
Во втором случае в первом слагаемом потеряны три значащие цифры.
В программе Summa при движении справа налево накапливаемая сумма и очередное слагаемое имеют одинаковый порядок, при движении слева направо эти порядки все более и более различаются. Поэтому при сложении справа налево практически не происходит потеря значащих цифр.