Современное программирование предлагает пользователям использовать самые разнообразные языки программирования. Но основой основ является Паскаль.Данный язык был разработан в 1971 году в Университете Цюриха профессором Никлаусом Виртом. Его предназначение изначально было учебным. Имея достаточно четко выраженную структуру и систему предоставления данных Паскаль имел ограничения в функциях ввода - вывода, при создании подпрограмм.

Управляющие операторы языка

Практическое занятие. Использование циклических операторов.

Задание 1. Разработать программу вычисления n первых натуральных чисел. Сумма определяется методом накопления. Количество суммируемых чисел известно, поэтому используем цикл с заданным количеством повторений. При каждом проходе к сумме будем добавлять переменную цикла, которая будет изменяться от 1 до n. Перед циклом переменную суммы необходимо обнулить.

Схема алгоритма вычисления суммы n натуральных чисел.

Текст программы выглядит так:

Program ex;

Var i, n, S:integer;

Begin

WriteLn (`Введите n`)

ReadLn (n);

S:=0;

for i:=1 to n do

S:=S+i;

WriteLn (`Сумма`, n, `чисел равна`, S);

End.

Задание 2. Разработать программу, определяющую сумму ряда: 1-1/x+1/x2-1/x3+... с заданной точностью е (епсилон).

Из соответствующих разделов математики известно, что суммой ряда называется предел, к которому стремится последовательность частичных сумм данного ряда, если он существует. Если такой предел существует, то ряд называется сходящимся, в противном случае - расходящийся. Также известно, что знакопеременный ряд сходится если:

|rn|>|rn+1|, где: rn и rn+1 - соответственно n и n+1 члены ряда.

Кроме того, доказано, что:

|S-Sn|<=|rh+1|, где: S - сумма ряда, Sn - сумма n членов ряда.

Следовательно, для получения требуемого результата будем накапливать частичную сумму элементов ряда, пока очередной член ряда не станет меньше заданной погрешности:

|rn| < e.

Алгоритм определения суммы ряда с заданной точностью

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

Поскольку количество повторений цикла определить нельзя, попробуем перобразовать неструктурный цикл к циклу - пока. для этого необходимо операцию S=S+R продублировать: одну копию поместить до цикла, а вторую в конце цикла. Операторы S=0 и S=S+R, записанные до цикла заменим оператором S=1, так как в этот момент R=1. Условие выхода из цикла также неьходимо заменить на противоположное. Окончательный вариант фрагмента алгоритма с циклом пока показан на схеме:

Его реализация с помощью программы будет выглядеть следующим образом:

Program ex;

Var S, R, x, eps:real;

Begin

WriteLn (`Введите x и эпсилон`);

ReadLn (x, eps);

if abs (x)>1 then {если x>1, то ищем сумму ряда}

Begin

S:=1;

R:=1;

While abs(r)>eps do

Begin

R:=-R/x

S:=S+R

end;

WriteLn (`При x=`, x:6:2, `S=`, S:8:2, `а R=`, R:8:6)

end

else WriteLn (`Ряд расходится.`)

End.

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

Структурный вариант алгоритма с использованием цикла - до.

Ниже представлена соответствующая программа:

Program ex;

var S, R, X, eps:real;

Begin

WriteLn (`Введите x и эпсилон`);

ReadLn (x, eps);

if x>1 then

begin

S:=0;

R:=1;

repeat

S:=S+R

R:=-R/x

until abs (R*x)<=eps;

WriteLn (`При x=`, x:6:2, `S=`, S:8:2, `а R=`, R:8:6)

end

else WriteLn (`Ряд расходится`);

End.

Hosted by uCoz