Вычислить и вывести на экран в виде таблицы значения функции - Pascal (80352)
Формулировка задачи:
Ребят, помогите решить задачку через рекуррентное уравнение, желательно с подробными объяснениями!
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда, на интервале от Хнач до Хкон с шагом dx и точностью. Таблицу снабдить заголовком и шапкой. Строка таблицы должна содержать значение аргумента, значение функции и количество просуммированных членов ряда:
Написал программу, но она не рабочая.. В чем ошибка(-и)???
Буду благодарен любой помощи
program lab2; {вычисление функции, заданной с помощью ряда}
uses crt;
var
xn, xk, dx, eps, ch, y, x:real; {ch - член ряда, y - значение аргумента}
n: integer; {n - число интераций}
begin
clrscr;
writeln('Введите x начальное, x конечное, шаг и точность');
readln(xn, xk, dx, eps);
{xn - x начальное, xk - x конечное, dx - шаг, eps - точность}
if(xn>xk) then
begin
writeln('Начальное значение аргумента больше конечного, программа сменит их местами');
x:=xn;
xn:=xk;
xk:=x;
end; {если xc>xn поменяем их местами}
if(xn<xk) then
begin
writeln;
writeln('Таблица значений функции');
writeln('+-----+-------------------+-----+');
writeln('| x | y | n |'); {шапка}
writeln('+-----+-------------------+-----+');
ch:=pi/2; {первый член ряда}
y:=ch; {начальное значение аргумента}
x:=xn;
xk:=xk+dx/2;
n:=0;
while abs(ch)>eps do {цикл с предусловием}
begin
ch:=ch*((-1)*((((2*n+1)*(2*n+1)*(x*x))/((2*n+2)*(2*n+3))))); {рекурентная формула} {очередной член ряда}
n:=n+1;
y:=y+ch;
if (abs(ch)<eps) and (x<=xk) then
begin
writeln('| ', x:3:2, '| ', y, ' | ', n:2, ' |'); {вывод данных}
ch:=pi/2;
y:=ch;
x:=x+dx;
n:=0;
end;
end;
writeln;
writeln('Нажмите Enter для выхода из программы');
readln;
end;
end.Решение задачи: «Вычислить и вывести на экран в виде таблицы значения функции»
textual
Листинг программы
uses math;
function readln_check(s: string; a, b: extended): extended;
var t: extended;
begin
repeat
write(s, ': (', a:0:15, '..', b:0:15, ']; ', s, ' = ');
readln(t)
until (t > a) and (t < b);
readln_check := t
end;
function arccos_Taylor(x, eps: extended; var n: integer): extended;
var a, t: extended;
begin
a := x;
t := a;
n := 0;
while abs(a) >= eps do
begin
inc(n);
a := (n - 0.5) / n * (n - 0.5) / (n + 0.5) * x * x * a;
t := t + a
end;
arccos_Taylor := pi / 2 - t;
inc(n)
end;
const lin = '+--------------------+-------------------+------------+-------------------+';
var x, xn, xk, dx, eps: extended;
n: integer;
begin
writeln('Введите границы интервала табуляции:');
xn := readln_check('Граница 1', -1, 1);
xk := readln_check('Граница 2', -1, 1);
if xn > xk
then begin
x := xn;
xn := xk;
xk := x
end;
dx := readln_check('Шаг', 0, 1);
xk := xk + dx / 2;
eps := readln_check('Точность', 0, 1);
writeln('Таблица:');
writeln(lin);
writeln('| x | y(x) | n | arccos(x) |');
writeln(lin);
x := xn;
while x < xk do
begin
writeln('| ', x:18:15, ' | ', arccos_Taylor(x, eps, n):0:15, ' | ', n:10, ' | ', arccos(x):0:15, ' |');
x := x + dx
end;
write(lin);
readln
end.
Объяснение кода листинга программы
- Объявляется функция
readln_checkс параметрамиs(строка),aиb(дробные числа). - Внутри функции
readln_checkпроисходит ввод значения переменнойtи проверка, пока оно не удовлетворяет условиям (t > a) и (t < b). - Затем программа возвращает значение
t. - Объявляется функция
arccos_Taylorс параметрамиx(дробное число),eps(дробное число) иn(целое число). - Внутри функции
arccos_Taylorпроисходит вычисление аппроксимации арккосинуса при помощи разложения в ряд Тейлора с точностьюeps. - Вычисленное значение возвращается функцией, а также увеличивается счетчик
n. - Затем объявляются переменные
x,xn,xk,dx,epsиn, а также константаlin. - Программа запрашивает у пользователя ввод границ интервала табуляции, шага и точности.
- Далее происходит вывод таблицы со значениями
x,y(x),nиarccos(x)для каждого шагаxв интервале отxnдоxk. - Программа останавливается в ожидании ввода пользователя.