Помощь - Поиск - Пользователи - Календарь
Полная версия: Нахождение суммы через функцию
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ART
Здравствуйте!
Такая проблема: Цель программы посчитать через функцию сумму (X(i)^i)/i. И через эту функцию найти S1 = сумме(X(i)^i)/i,S3 = сумме((X(i)-S1)^i)/i и S3 = сумме((X(i)-S2)^i)/i.
Программа нормально компилируется, но при запуске выдает ошибку "Runtime error 207 at 0000:007E". Причем выдает ее после вывода S1. Может я программу неправильно написал? Не могли бы вы посмотреть и объяснить, в чем проблема? Заранее благодарен...

Код

Program Lab8_2;
Uses crt;
Type mas = array [1..100] of real;
Var n,i:integer;
   S1,S2,S3:real;
   x:mas;

Function Sum_f(x1:mas; n1:integer):real;
Var S:real;

begin
 S:=x1[1];
 For i:=2 to n1 do
   Begin
     S:=S+exp(i*ln(x1[i]))/i;
   End;
 Sum_f:=S;
end;


Begin
 clrscr;
 Write('Enter n:');
 readln(n);
 writeln('n=',n);
 For i:=1 to n do
   Begin
     Writeln('Enter x[',i,']');
     readln(x[i]);
   End;

 S1:=Sum_f(x,n);
 Writeln('S1=',S1);

 For i:=1 to n do
   x[i]:=x[i]-S1;
 S2:=Sum_f(x,n);
 Writeln('S2=',S2);

 For i:=1 to n do
   x[i]:=x[i]-S2;
 S3:=Sum_f(x,n);
 writeln('S3=',S3);
 readkey;
End.
ART
Извините за 2 сообщения, кнопки заедает... sad.gif
volvo
С какими значениями прогонялась программа? Отрицательных не было случайно?

Run-time Error 207 может возникать при извлечении корня или взятии логарифма отрицательного числа. Извлечения корня не вижу, а вот Ln есть...

Хотя скорее всего изначально отрицательных не было а вот тут:
x[i]:=x[i]-S1;

или тут:
x[i]:=x[i]-S2;

значение какого-то x[i] становится меньше 0... В таком случае придется переписывать функцию возведения в степень через умножение, Ln не пойдет...
Дож
Попробуй так:
Код

Function Sum_f(x1:mas; n1:integer):real;
Var S:real;

begin
S:=x1[1];
For i:=2 to n1 do
  Begin
    S:=S+exp(i*ln(abs(x1[i])))/i;
  End;
Sum_f:=S;
end;
volvo
Дож,
ты подумал прежде чем написать?
По-твоему (-2)^5 = (2)^5 ???

Если уж извращаться, то вот так:
Function Sum_f(x1:mas; n1:integer):real;
Var S:real;
begin
S:=x1[1];
For i:=2 to n1 do
S:=S+(1 - 2*byte(x1[i] < 0)) * exp(i*ln(abs(x1[i])))/i;
Sum_f:=S;
end;
Дож
blink.gif Что-то я глючу... unsure.gif
ART
Переписал функцию вот так:
Код

Function Sum_f(x1:mas; n1:integer):real;
Var S:real;
   k:integer;
   Pr:real;

begin
 S:=x1[1];
 For i:=2 to n1 do
   Begin
     Pr:=x1[i];
     For k:=1 to i do Pr:=Pr*x1[i];
     S:=S+Pr/i;
   End;
 Sum_f:=S;
end;


Запустил, выводит уже другую ошибку.

Результат на экране такой:
Enter n:5
n=5
Enter x[1]
1
Enter x[2]
2
Enter x[3]
3
Enter x[4]
4
Enter x[5]
5
S1= 3.4130000000E+03
S2= 3.1323336732E+20
Runtime error 205 at 0000:00BF

Я так понимаю, что памяти для S3 уже просто не хватает!
Но что же тогда делать, ведь задание-то дали (см. выше)... sad.gif
volvo
Переходи на Extended вместо Real - у него гораздо больше диапазон значений.
Только {$n+} первой строкой программы не забудь поставить...
Guest
Спасибо! :D Теперь все работает, только мы ето не проходили и надеюсь, что препод не возмутится из-за этого... smile.gif
volvo
Ну, будет возмущаться, покажи ему результаты при Real и объясни, что размерности не хватает smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.