Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Вычисление функции


Автор: Anonymous 2.5.2006, 14:28
Ещё раз здравствуйте, профессионалы, любители и новички. У меня возник ещё один вопрос, что собственно не удивительно. 
Итак, есть функция - прикрепленна в виде картинки, так как написать не смог.
Надо вычислить S. 
Вот что у меня получилось:
Код

Program Zadanie;
Var
  n,i,S,a : integer;
  fact: longint;
begin
  write ('Input i= ');
  readln (i);
  fact:=1;
  for i:=1 to i do
    fact: = fact*i;
  writeln ('Factorial i!= ',fact);
  begin
    write ('Input n= ');
    writeln ('Input a= ');
    if a=0 then 
    writeln ('ERROR');
    for i:=1 to n do
      S:=0;
    S:=S+a^i/fact;
    writeln ('S= ',S);
  end;
end.

Вот такая программка. Только не хочет она запускаться. Пишет   "Invalid qualifier"
Кто может, направьте в нужное русло.
Заранее благодарен.  

Автор: Anonymous 2.5.2006, 14:57
Цитата

begin
write ('Input n= ');
writeln ('Input a= ');


Ну, кроме того, что тут забыл написать
readln (n);
readln (a);
Что не так ещё? 
Насколько я понял, вся проблема в ^ , я написал небольшой примерчик, типа S=a^i. Так там такая же ерунда. Если поставить вместо ^ знак + или *, то всё получается, а с ^ не работает.  

Автор: e-moe 2.5.2006, 17:26
a в степени b можно вычислять так: exp(b*ln(a))
хотя осторожно... 

Автор: volvo877 2.5.2006, 18:07
Anonymous, подумай, а нужно ли вообще тебе возводить A в степень? Не проще сделать так:
Код
Var next: real;
...
next := A;
S := next; { A^1 / 1! }

For i := 2 to N do begin
  next := next * A / i;
  s := s + next;
end;

?

Кстати, рекурсии я в твоей программке не увидел... 

Автор: Anonymous 3.5.2006, 09:48
Да, volvo, ты прав...
Вот, исправился, только снова не хочет.
Код
Program Z3;
Var
i,n,a: integer;
St,F: longint;
SumRes:real
function
fact (n:integer): longint;
begin
  write ('input n= ');
  readln (n);
  if n=1 then fact:=1 
  else fact:=n*fact(n-1);
end;
  function
  stepen (a,n:integer): longint;
begin
  if n=1 then stepen:=a
  else stepen:=a*stepen(a,n-1);
end;
  function
  sum (a,n:integer):real;
begin
  if n=1 then sum:=a 
  else
   begin
    St:=stepen (a,n);
    F:=fact(n);
    Sum:=sum(a,n-1)+St/F;
   end;
end;
begin
  write ('input a,n= ');
  read (a,n);
  if (a=0) or (n<0) then
  write ('ERROR');
   begin
    SumRes:=sum(a,n);
   end;
end.

Проблема в том, что запускается, но постоянно просит ввести "n". В чём загвоздка? Если сможете, объясните наглядно.

M
Snowy
Пожалуйста, используйте кнопку "Код"
  

Автор: volvo877 3.5.2006, 10:39
Цитата(Anonymous @  3.5.2006,  08:48 Найти цитируемый пост)
запускается, но постоянно просит ввести "n". В чём загвоздка?

Ну, ты же сам просишь вводить N внутри рекурсивной функции... Перепиши Fact вот так:
Код
function fact(n: integer): longint;
begin
  if n=1 then fact:=1
  else fact:=n*fact(n-1);
end;


и будет тебе счастье. А с вещественными значениями a программа точно не должна работать? Только с целыми? 

Автор: Anonymous 3.5.2006, 11:39
а может быть любым числом. Это я так написал, чтобы жизнь себе упростить. Ещё такой вопрос: а где мне вводить тогда n?

Добавлено @ 11:42 
Ещё одно. Я исправил, как ты сказал, но ничего не получилось снова. Программа просит ввести а и n , я ввожу и всё... Дальше возвращаюсь в программу нажатием Alt F5 , там ничего кроме введённых мной а и n больше нет.  smile  Why? 

Автор: Romikgy 3.5.2006, 12:01
Код

rogram Zadanie;    
Var    
  n,i,S,a : integer;    
  fact: longint;

function fact(n: integer): longint;    
begin    
  if n=1 then fact:=1    
  else fact:=n*fact(n-1);    
end;
    
begin    
  
  begin    
    write ('Input n= ');    
    writeln ('Input a= ');    
    if a=0 then    
    writeln ('ERROR');
  S:=0;    
    for i:=1 to n do    
     
    S:=S+exp(i*ln(a))/fact(i);    
    writeln ('S= ',S);    
  end;    
end.
 

Автор: volvo877 3.5.2006, 12:06
Цитата(Anonymous @  3.5.2006,  10:39 Найти цитируемый пост)
возвращаюсь в программу нажатием Alt F5 , там ничего кроме введённых мной а и n больше нет. Why?  
Потому, что результат не печатаешь:
Код
Program Z3;
Var
i, n: integer;
F: longint;
St, a, SumRes:real;

function fact (n:integer): longint;
begin
  if n=1 then fact:=1
  else fact:=n*fact(n-1);
end;

function stepen(a: real; n: integer): real;
begin
  if n=1 then stepen:=a
  else stepen:=a*stepen(a,n-1);
end;

function sum(a: real; n:integer): real;
begin
  if n=1 then sum:=a
  else begin
    St:=stepen (a,n);
    F:=fact(n);
    Sum:=sum(a,n-1)+St/F;
  end;
end;

begin

  write ('input a,n= ');
  read (a,n);
  if (a=0) or (n<0) then write ('ERROR')
  else begin
    SumRes:=sum(a,n);
    writeln('s = ', sumres:10:5); { <--- Это кто делать должен ? }
  end;

end.

 

Автор: Anonymous 3.5.2006, 12:20
volvo, второй раз спасаешь мне жизнь. Благодарю. Теперь такой вопрос (знаю, что надоел уже) : как покрасивее округлить, потому как выдаёт нечто такое :   2.00000000000000Е+0000, а хотелось бы покрасивее 

Автор: e-moe 3.5.2006, 13:45
Цитата(Anonymous @  3.5.2006,  11:20 Найти цитируемый пост)
как покрасивее округлить, потому как выдаёт нечто такое :   2.00000000000000Е+0000, а хотелось бы покрасивее  

Например так
Код

writeln(s:3:3);

Подробнее читай в хелпе ;) 

Автор: Anonymous 3.5.2006, 13:57
e-moe, Спасибо. smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)