Постановка задачи. Разработать программу для приближённого вычисления суммы бесконечного ряда при заданном аргументе x с заданной точностью e. Для перехода к следующему слагаемому использовать рекуррентное соотношение. Для проверки полученного результата вычислить также значение по контрольной формуле . Форматировать выходные данные в соответствии с введённой точностью.
Шаг 1. Общая структура программы
Программа на процедурном языке программирования состоит из данных и действий по их обработке.
program SeriesSum;
{ Описание данных – констант, типов и переменных }
begin
{ Обработка данных }
end.
Шаг 2. Разработка структуры данных
Из постановки задачи видно, что задаются аргумент x и точность e и надо получить сумму ряда s и значение y, вычисляемое по контрольной формуле.
program SeriesSum;
var
{ Входные данные }
x, e: real; { вещ x - аргумент, вещ e - точность }
{ Выходные данные }
s, y: real; { вещ s - сумма ряда, вещ y - значение по контрольной формуле }
begin
{ Обработка данных }
end.
Шаг 3. Разработка тестов
№ теста | Входные данные | Ожидаемые результаты | Смысл теста |
---|---|---|---|
1 | x = 0.2, e = 0.001 |
s = 0.187951 y = 0.187976 |
Выбираем несколько значение аргумента из возможного диапазона. Задаём разные значения точности. Количество совпадающих цифр в значениях s и у обычно зависит от введённой точности. |
2 | x = 0.5, e = 0.0001 |
s = 0.434167 y = 0.434143 |
|
3 | x = 0.9, e = 0.000001 |
s = 0.715687 y = 0.715687 |
Шаг 4. Разработка общей структуры программы
Программа должна состять из трёх основных частей – ввод исходных данных, получение результатов, вывод полученных результатов.
program SeriesSum;
var
{ Входные данные }
x, e: real; { вещ x - аргумент, вещ e - точность }
{ Выходные данные }
s, y: real; { вещ s - сумма ряда, вещ y - значение по контрольной формуле }
begin
{ Ввод исходных данных }
{ Вычисление суммы ряда и значения по контрольной формуле }
{ Вывод результатов }
end.
Шаг 5. Разработка ввода и вывода
Запрограммируем ввод и вывод согласно входной и выходной форме. Для проверки вывода напишем пока так называемую «заглушку» – она заменяет полноценные вычисления каким-либо простым присваиванием. В данном случае можно переменным s и y присвоить значение x. Для форматирования выходных данных в соответствии с введённой точность, необходимо вычислить количество знаков после запятой в переменной e. Это можно сделать через логарифм значения этой переменной.
Входная форма
Выходная форма
program SeriesSum;
var
{ Входные данные }
x, e: real; { вещ x - аргумент, вещ e - точность }
{ Выходные данные }
s, y: real; { вещ s - сумма ряда, вещ y - значение по контрольной формуле }
{ Промежуточные данные }
k: integer; { цел k - количество знаков после запятой }
begin
{ Ввод исходных данных }
write('Введите аргумент: ');
readln(x);
write('Введите точность: ');
readln(e);
{ Вычисление суммы ряда и значения по контрольной формуле – заглушка }
s := x;
y := x;
{ Вывод результатов }
k := ...
writeln('Сумма ряда = ', s:(k + 3):k);
writeln('Контрольная формула = ', y:(k + 3):k);
end.
Шаг 6. Разработка вычислительной части программы
Чтобы не вычислять сумму бесконечного ряда (что невозможно), будем вычислять сумму ряда с заданной точностью, для чего надо отбросить последние слагаемые, т.е. цикл прекращается, когда модуль очередного слагаемого становится меньше заданной точности. Для сокращения вычислений будем использовать рекуррентное соотношение, которое позволяет получить i-ое слагаемое, умножив (i – 1)-ое слагаемое на некоторое выражение (о рекуррентных соотношения см. соответствующее практическое занятие).
При разработке метода становится понятно, что для вычислений нужны также переменные для хранения очередного слагаемого и номера текущего слагаемого. Добавим эти промежуточные данные в раздел описания переменных.
program SeriesSum;
var
{ Входные данные }
x, e: real; { вещ x - аргумент, вещ e - точность }
{ Выходные данные }
s, y: real; { вещ s - сумма ряда, вещ y - значение по контрольной формуле }
{ Промежуточные данные }
a: real; { вещ a - слагаемое }
i: integer; { цел i - номер слагаемого }
k: integer; { цел k - количество знаков после запятой }
begin
{ Ввод исходных данных }
write('Введите аргумент: ');
readln(x);
write('Введите точность: ');
readln(e);
{ Вычисление суммы ряда }
a := x;
s := a;
i := 2;
while abs(a) > e do
begin
a := a * -x * (3 * i - 4) / (3 * i);
s := s + a;
i := i + 1;
end;
{ Вычисление значения по контрольной формуле }
y := 3 * power(1 + x, 1 / 3) - 3;
{ Вывод результатов }
k := ...
writeln('Сумма ряда = ', s:(k + 3):k);
writeln('Контрольная формула = ', y:(k + 3):k);
end.