Решить задачу с использованием цикла while Дан числовой ряд и некоторое число eps. Найти сумму тех членов ряда, модуль которых больше или равен заданному eps. Общий член ряда имеет вид: an=n!/(2*n)! Я составила программу, но он...

Решить задачу с использованием цикла while Дан числовой ряд и некоторое число eps. Найти сумму тех членов ряда, модуль которых больше или равен заданному eps. Общий член ряда имеет вид: an=n!/(2*n)! Я составила программу, но она не идет. выдает один и тот же ответ при вводе любого числа. помогите пожалуйста найти ошибку function a(n:integer):double; var i:integer; f1,f2:double; begin f1 := 1; for i := 1 to n do f1 := f1 * i; f2:=1; for i:=1 to 2*n do f2:= f2 * i; a := f1 / f2; end; var i:integer; eps,s,an:double; begin Write('eps='); Read(eps); s:=0; i:=1; while an>=eps do an:=a(i); if an>=eps then begin s:=s+an; Inc(i) end; Writeln('s=',s); end.
Гость
Ответ(ы) на вопрос:
Гость
Задача, аналогичная той, которую публиковали вчера. Только цикл repeat заменяем на while. Сначала немного математики. [latex]\displaystyle a_n= \frac{n!}{(2n)!}=\frac{\prod_{i=1}^ni}{\prod_{i=1}^{2n}i}=\frac{\prod_{i=1}^ni}{\prod_{i=1}^{n}i\times\prod_{i=n+1}^{2n}i}=\frac{1}{\prod_{i=n+1}^{2n}i}; \quad n\in\mathbb N[/latex] О модуле тут смысла нет говорить, поскольку все an - суть положительные величины на интервале (0;1). uses Crt; function ai(n:integer):real; var   i:integer;   p:real; begin   p:=1;   for i:=n+1 to 2*n do p:=p*i;   ai:=1/p end; var   i:integer;   eps,s,an:real; begin   ClrScr;   Write('eps='); Read(eps);   s:=0; i:=1; an:=eps+1;   while an>=eps do begin      an:=ai(i);      if an>=eps then begin s:=s+an; Inc(i) end   end;   Writeln('s=',s);   ReadKey end. Тестовые решения: eps=0.07 s= 5.8333333333E-01 eps=0.000001 s= 5.9229647667E-01 eps=1e-8 s= 5.9229653448E-01 Для контроля результата можно отметить, что сумма первых 1000 членов ряда равна приблизительно 5.922965365Е-01 Если раздражает наличие функции, можно и без нее: uses Crt; var   i,j:integer;   eps,s,an,p:real; begin   ClrScr;   Write('eps='); Read(eps);   s:=0; i:=1; an:=eps+1;   while an>=eps do begin     p:=1;     for j:=i+1 to 2*i do p:=p*j;     an:=1/p;     if an>=eps then begin s:=s+an; Inc(i) end   end;   Writeln('s=',s);   ReadKey end.
Не нашли ответ?
Ответить на вопрос
Похожие вопросы