• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Вычисление Значений Ряда(pascal)

  • Автор темы n1key
  • Дата начала
N

n1key

Написать программу производящую вычисления 10 значений ряда на отрезке [-3;5] . вывести на экран таблицу состоящую из 10 строк, в каждой из которых написан номер строки, значение х, значение у(х). Очередная сумма включается в ряд если она больше 0,00001.
wSA3BODa.jpg
Помогите решить
 
S

Senset

не задана точность вычислений или количество слагаемых
а... ой не дочитал, привык видеть E=0.00001

var x,e:real;
i:integer;

function y(x:real):real;
var k,h,result:real;
i:integer;
begin
result:=x;
h:=x;
k:=1/x;
i:=2;
while (h>e+e/2) do
begin
k:=k/x;
h:=i*k;
result:=result+h;
i:=i+1;
end;
end;

begin
x:=-3;
i:=1;
e:=0.00001;
while (x<5.25) do
begin
writeln(i,' ',x:0:5,' ',f(x):0:5);
i:=i+1;
x:=x+0.5;
end;
end.

Примерно так, нужно только причесать, проверить правильность и доработать с выводом ровно 10 строк

Вперед! Начало положено)
 
N

n1key

есть некий бред ввиде вот такого кода он неправльный на 100%
Код:
uses crt;
const e=0.00001;
var l,r,s,y,x,h,p,q: real;
i,k, n, d: integer;
function z(t:real):real;
begin
z:=x+2*1/(x*x)+3*1/(x*x*x)+4*1/(x*x*x*x)
end;
begin
clrscr;
writeln('rabotaet programma vych zna4 ryada');
writeln('| nomer stroki | zna4 X | zna4 y(x) |');
L:=-3;
R:=5;
h:=(R-L)/9;
x:=L;
while x<R do
begin
y:=1;
k:=2;
s:=e+1;
d:=1;
while abs(s)>e do
begin
p:=1;
q:=1;
for i:=1 to k do
p:=p*x;
for i:=1 to k do
q:=q*i;
s:=p/q;
k:=k+2;
y:=y+s;
end;
d:=d+1;
if y>e then
writeln (d, y:14:5, x:15:5, z(x):15:5);
x:=x+h;
end;
end.

Добавлено: спасиб... щас буду делать
 
S

Senset

накопление множителя x^... происходит в переменной k
шаг для вывода строки и подстановки x вы вроде посчитали
слагаемое в условии взято по модулю но не там где нужно, и не проинициировано нормально)

в общем посмотрите че я накатал - там причесать не сложно вроде
 
N

n1key

блин, еще проблема...
Код:
program ekz;
uses crt;
var e,k,h,result, x:real;
i :integer;
function y(x:real):real;
begin
y:=x+2*1/(x*x)+3*1/(x*x*x)+4*1/(x*x*x*x)
end;
begin
writeln('rabotaet programma vych zna4 ryada');
writeln(' #  |  zna4 X	 |  zna4 y(x) |');
result:=x;
h:=x;
k:=1/x;
i:=2;
while (h>e+e/2) do
begin
k:=k/x;
h:=i*k;
result:=result+h;
i:=i+1;
end;


begin
x:=-3;
i:=1;
e:=0.00001;
if (y(x)>e) then
begin
writeln(i,' ',x:0:5,' ',y(x):0:5);
i:=i+1;
end
else
x:=x+0.5;
end;
end.
как исправить деление на ноль... подскажите плиз
 
S

Senset

блин, еще проблема...
Код:
program ekz;
uses crt;
var e,k,h,result, x:real;
i :integer;
function y(x:real):real;
begin
y:=x+2*1/(x*x)+3*1/(x*x*x)+4*1/(x*x*x*x)
end;
begin
writeln('rabotaet programma vych zna4 ryada');
writeln(' #  |  zna4 X	 |  zna4 y(x) |');
result:=x;
h:=x;
k:=1/x;
i:=2;
while (h>e+e/2) do
begin
k:=k/x;
h:=i*k;
result:=result+h;
i:=i+1;
end;


begin
x:=-3;
i:=1;
e:=0.00001;
if (y(x)>e) then
begin
writeln(i,' ',x:0:5,' ',y(x):0:5);
i:=i+1;
end
else
x:=x+0.5;
end;
end.
как исправить деление на ноль... подскажите плиз

что-то не так в вашем коде... откуда 3 тела функции (begin...end, когда у вас их две)?
приведите код в "визуальный порядок"... а там уже посмотрим где нуль идет
 
N

n1key

Код:
program ekz;
uses crt;
var e,k,h,result, x:real;
i :integer;
function y(t:real):real;
begin
y:=t+2*1/(t*t)+3*1/(t*t*t)+4*1/(t*t*t*t)
end;
begin
writeln('rabotaet programma vych zna4 ryada');
writeln(' #  |  zna4 X	 |  zna4 y(x) |');
result:=x;
h:=x;
k:=1/x;
i:=2;
while (h>e+e/2) do
begin
k:=k/x;
h:=i*k;
result:=result+h;
i:=i+1;
end;

x:=1;
i:=1;
e:=0.00001;
if (y(x)>e) then
begin
writeln(i,' ',x:15:5,' ',y(x):15:5);
i:=i+1;
end
else
x:=x+0.5;
end.
как то так должно быть
 
S

Senset

ок, так лучше...
Теперь об ошибках:
1) изначально в паскале все глобальные переменные обнуляются... и вы нигде не присваиваете x значение начальное потому при делении k=1/x получаете k=1/0... понимаете как это исправить? но дело на самом деле не в этом... посмотрите пункт 3 и эта проблема при правильном подходе сама решится
2) сумма ряда высчитывается неверно... вы учитываете только 4 слагаемых, а нужно складывать до тех пор, пока слагаемое>0.00001
3) учитывать погрешность (0.00001) нужно прямо при подсчете значения функции, а не вне неё... посмотрите повнимательнее то, что я вам напечатал первый раз
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!