Найти сумму отрицательных членов последовательности

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

Ответить
Олесенька
Сообщения: 7
Зарегистрирован: 30 ноя 2012, 17:10

22 ноя 2013, 18:10

помогите исправить задачу пожалуйста

Найти сумму отрицательных членов последовательности....
последовательность ((-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.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

25 ноя 2013, 11:45

1. Вычислять факториал рекурсивно можно только для одной цели - объяснить, что такое рекурсия. На будущее - забудьте этот способ раз и навсегда!

Код: Выделить всё

function fact(n: integer): longint;
var i: integer; 
begin 
   fact:=1;
   for i:= 1 to n do 
     fact:=fact * i;
end;
функции power в Паскале нет (хотя хз, сто лет не работал, может, в новых версиях уже есть). Вообще a^b вычисляется как exp(b*log(a)). Не забудьте вручную обработать исключительные ситуации, вроде тех, когда аргументы равны нулю или отрицательные. Константы e тоже нет, но есть собственно функция экспоненты - exp.
Остальное вроде верно
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Олесенька
Сообщения: 7
Зарегистрирован: 30 ноя 2012, 17:10

26 ноя 2013, 20:08

все поправила как вы сказали
пишет ошибку..
Program1.pas(10) : Нельзя преобразовать тип function(n: integer): integer к integer
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

26 ноя 2013, 23:13

Полный листинг выкладывать не забывайте
It's a long way to the top if you wanna rock'n'roll
Олесенька
Сообщения: 7
Зарегистрирован: 30 ноя 2012, 17:10

26 ноя 2013, 23:45

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.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

27 ноя 2013, 10:00

Поскольку ваш компилятор не отличает вызов функции от обращения к текущему результату функции, то можете использовать следующий код:

Код: Выделить всё

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
Ответить