Современное программирование предлагает пользователям использовать самые разнообразные языки программирования. Но основой основ является Паскаль.Данный язык был разработан в 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. |