Одной из важных задач, решаемых с помощью циклического алгоритма – вычисление суммы большого числа слагаемых.
Пример 3.15. Вычислить сумму .
Для решения данной задачи воспользуемся методом накопления суммы. Суть его состоит в следующем. Положим S = 0 – это начальное значение S, когда вычисление суммы еще не начато. Далее вычислим следующее выражение: S + , значение которого равно 1, присвоим его переменной S. На языке PASCAL эта ото действие можно записать в виде оператора
S := S + 1/sqr(1);
После выполнения этой операции значение S будет равно 1, т.е. первому слагаемому.
Теперь вычислим выражение: S + , значение которого, снова присвоим переменной S. На языке PASCAL эта ото действие можно записать в виде оператора
S := S + 1/sqr(2);
При выполнении этой операции к старому значению S = 1 прибавится второе слагаемое, и результат запишется в S. После выполнения этой операции значение S будет равно , т.е. сумме первых двух слагаемых.
Аналогично, после выполнения оператора
S := S + 1/sqr(3);
мы получим сумму 3-х слагаемых, и т.д. Для вычисления всей суммы надо 20 раз повторить следующий оператор
S := S + 1/sqr(k);
увеличивая при этом каждый раз значение k на 1. Окончательно получаем следующий алгоритм:
1. Положить S = 0, k = 1.
2. Вычислить S + и записать результат в S.
3. Увеличить k на 1.
4. Если k £ 20, повторить шаг 2, иначе СТОП.
На PASCAL этот алгоритм удобно записать с помощью цикла repeat, т.к. в данном варианте алгоритма проверка условия прекращения цикла происходит после выполнения действия.
var S : real;
k: integer;
Begin
S:= 0; k :=1;
repeat S:= S + 1/sqr(k);
k := k + 1;
until k > 20;
writeln(‘ S = ’, S:10:5):
End.
Задачу примера 3.15 можно решить с помощью другого варианта циклического алгоритма.
1. Положить S = 0, k = 1.
2. Если k > 20, то СТОП, иначе продолжить.
3. Вычислить S + и записать результат в S.
4. Увеличить k на 1.
5. Повторить шаг 2.
На PASCAL этот алгоритм удобно записать с помощью цикла while, т.к. в данном варианте проверка условия прекращения цикла происходит до выполнения действия.
var S : real;
k: integer;
Begin
S:= 0; k :=1;
while k <= 20 do
begin S:= S + 1/sqr(k);
k := k + 1;
end;
writeln(‘ S = ’, S:10:5):
End.
В приведенных примерах количество повторений тела цикла можно оценить еще до его выполнения. Однако, во многих задачах количество этих повторений заранее не известно и вычислено быть не может. Операторы repeat и while позволяют организовывать такие циклы. В следующих двух примерах рассмотрим нахождение суммы бесконечного ряда с заданной точностью.
Пример 3.16.Найти сумму членов бесконечно убывающей геометрической прогрессии с точностью до слагаемого, меньшего заданной величины e:
z = 1 + x + x2 + x3 +…+ xn + …
При нахождении суммы такого ряда не следует вычислять отдельно каждый элемент. Достаточно установить зависимость, по которой из предыдущего элемента образуется следующий. Обозначим через an = xn – n-й член прогрессии, тогда
an+1 = xn+1 = an × x; a0 = 1.
Такой подход позволяет сократить количество вычислительных операций и уменьшить время счета. Сумму будем накапливать в переменной S, которую предварительно необходимо обнулить, как и в предыдущем примере.
Условие окончания цикла – |an | £ e., которое означает, что последнее слагаемое по модулю меньше e. Так как слагаемые данного выражения убывают, то и все следующие слагаемые малы, значит, сумма от последующих сложений практически не увеличится и процесс накопления суммы можно прекратить.
Ниже приведены два варианта программы. В первом варианте использован оператор while, во втором – repeat. В программах an обозначено именем а.
Первый вариант
Var
x, s, eps, a : real;
Begin
write ('введите х и epsilon - ');
readln (x, eps);
s:=0;
a:=1; { задание параметру цикла его начального значения }
while abs(a) > eps do{ проверка условия выхода из цикла }
Begin
s := s + a; a := a * x;
end;
writeln ('сумма прогрессии = ', s:10:3)
End.
Второй вариант
Var
x, s, eps, a : real;
Begin
write ('введите х и epsilon - ');
readln (x, eps);
s := 0;
a := 1; { задание параметру цикла его начального значения }
Repeat
s := s + a; a := a * x;
until abs(a) < eps; { проверка условия выхода из цикла }
writeln ('сумма прогрессии = ', s:10:3)
End.
Пример 4.18.Выполнить задание, приведённое в примере 4.15, используя оператор for.
var s: real;
n, k : integer;
Begin
n:= 20; s:=0;
for k := 1 to n do
s := s + 1/sqr(k);
writeln ('s = ', s:10:3);
End.
Тема 4.Структурированные типы данных
Структурированные или сложные типы данных, в отличие от простых типов, содержат более одной компоненты, т.е. состоят из нескольких элементов. Из существующих в PASCAL структурированных типов мы рассмотрим только наиболее используемый тип – “массив”.