помогите исправить задачу пожалуйста
Найти сумму отрицательных членов последовательности....
последовательность ((-1)^(k-1)*x^(h-1)*e^(-p*k))/(k+1)!
где
x=x0+(i-1)*h;
p=max(a,b,c,d);
i=1,...,m
с клавы вводим значения- a=1.2 b=-0.5 c=-3.4 d=1.3 x0=1.4 h=0.2 m=5
n=7
то что смогла сделать, не понимаю что не так...
Код:
uses crt;
Var a, b, x0, h, p, x,ma, ak, s, c, d, p0,ss,ssum: real;
n, m, l, g, i, k,o,q: integer;
function fact(n:integer):longint;
begin
if q=1 then fact:=1
else fact:=fact(q-1)*q;
end;
begin
clrscr;
writeln('VVEDITE a, b, c, d, x0, h, m');
read(a, b, c, d, x0, h, m);
if a>b then p:=a
else p:=b;
if c>p then p:=c;
if d>p then p:=d;
{perebor X}
ssum:=0;
for i:=1 to m do
begin
x:=x0+(i-1)*h;
for k:=1 to n do
ss:=(power(-1,k-1)*power(x,k-1)*power(e,-k*i))/fact(k+1);
if ss<0 then ssum:=ssum+x;
writeln(ssum);
end;
end.
Найти сумму отрицательных членов последовательности
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
1. Вычислять факториал рекурсивно можно только для одной цели - объяснить, что такое рекурсия. На будущее - забудьте этот способ раз и навсегда!
функции power в Паскале нет (хотя хз, сто лет не работал, может, в новых версиях уже есть). Вообще a^b вычисляется как exp(b*log(a)). Не забудьте вручную обработать исключительные ситуации, вроде тех, когда аргументы равны нулю или отрицательные. Константы e тоже нет, но есть собственно функция экспоненты - exp.
Остальное вроде верно
Код: Выделить всё
function fact(n: integer): longint;
var i: integer;
begin
fact:=1;
for i:= 1 to n do
fact:=fact * i;
end;
Остальное вроде верно
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
все поправила как вы сказали
пишет ошибку..
Program1.pas(10) : Нельзя преобразовать тип function(n: integer): integer к integer
пишет ошибку..
Program1.pas(10) : Нельзя преобразовать тип function(n: integer): integer к integer
Полный листинг выкладывать не забывайте
It's a long way to the top if you wanna rock'n'roll
uses crt;
Var a, b, x0, h, p, x,ma, ak, s, c, d, p0,ss,ssum: real;
n, m, l, g, k,o,q: integer;
function fact(n: integer): longint;
var i: integer;
begin
fact:=1;
for i:= 1 to n do
fact:=fact * i;
end;
begin
clrscr;
writeln('VVEDITE a, b, c, d, x0, h, m');
read(a, b, c, d, x0, h, m);
if a>b then p:=a
else p:=b;
if c>p then p:=c;
if d>p then p:=d;
{perebor X}
ssum:=0;
for i:=1 to m do
begin
x:=x0+(i-1)*h;
for k:=1 to n do
ss:=(exp(k+1)*log(-1))*exp((k-1)*log(x))*exp((-k*i)*log(e))/fact(k+1);
if ss<0 then ssum:=ssum+x;
writeln(ssum);
end;
end.
Var a, b, x0, h, p, x,ma, ak, s, c, d, p0,ss,ssum: real;
n, m, l, g, k,o,q: integer;
function fact(n: integer): longint;
var i: integer;
begin
fact:=1;
for i:= 1 to n do
fact:=fact * i;
end;
begin
clrscr;
writeln('VVEDITE a, b, c, d, x0, h, m');
read(a, b, c, d, x0, h, m);
if a>b then p:=a
else p:=b;
if c>p then p:=c;
if d>p then p:=d;
{perebor X}
ssum:=0;
for i:=1 to m do
begin
x:=x0+(i-1)*h;
for k:=1 to n do
ss:=(exp(k+1)*log(-1))*exp((k-1)*log(x))*exp((-k*i)*log(e))/fact(k+1);
if ss<0 then ssum:=ssum+x;
writeln(ssum);
end;
end.
Поскольку ваш компилятор не отличает вызов функции от обращения к текущему результату функции, то можете использовать следующий код:
или стандартный вариант с локальными переменными заместо имени функции.
Код: Выделить всё
type plongint = ^longint;
function fact(n: integer): longint;
var i: integer;
begin
fact := 1;
for i := 1 to n do fact := plongint(longint(@i)+2)^ * i;
end;
It's a long way to the top if you wanna rock'n'roll