Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 18.10.2019
Сообщений: 20

Вычислить сумму с заданной точностью

16.12.2019, 12:56. Показов 1953. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написала программу, но не могу понять, правильно ли она считает. Задание таково: дана общая формула члена ряда. Вычислить с помощью рекурсии сумму ряда с заданной точностью ε (0 < ε < 1). Вывести на экран вычисленную сумму и количество использованных при ее вычислении членов ряда.
Формула такая: (-1)^n / 4*n!*(2n-1)


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Program Recursia8;
 
var n, znak: integer; //n-кол-во элементов ряда; znak- отвечает за знак в формуле;
     j: integer; //счётчик цикла;
    ch: real; 
    E: real; //заданная точность;
    s:real; //s- сумма;
    pov, flag: integer; //pov- отвечает за повторение программы; flag- указывает на ошибку при вводе диапазона;
    rpt: integer;
 
function fact (x: integer): integer; //функция для факториала;
begin
    if (x>1) then
    x:=x*(fact(x-1))
   else
    x:=1;
    fact:=x;
end;
 
Begin
    repeat
       flag:=0; //обнуляем ошибку;
       write('Введите точность вычислений (0<E<1): ');
       readln(E);
       if (E>1) or (E<0) then flag:=1; //проверяем диапазон введённой точности вычислений;
       if (E=0) or (E=1) then flag:=1;
       if flag <>0 then writeln('пожалуйста, введите E в диапазоне от 0 до 1 не включая');
    until flag=0;
    S:=0; //обнуляем сумму;
    ch:= 1;
    j:=1;
    While (abs(ch)>E) Do
    Begin
        if (j mod 2 =0) then znak:=1
       else
        if (j mod 2 <> 0) then znak:= -1;
        ch:=(znak/((4*fact(n))*(2*n-1)));
        S:=S+ch; //добавляем к сумме текущий элемент;
        j:= j+1; //переходим к следующему элементу;
        n:= n+1; //считаем кол-во элементов;
    end;
    writeln('сумма = ', s);
    writeln('Количество элементов равно = ', n);
    writeln;
    writeln('конец программы.');
end.

Проверьте, пожалуйста!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2019, 12:56
Ответы с готовыми решениями:

Вычислить сумму ряда с заданной точностью
Даны действительные числа (x не равен 0, e&gt;0) Вычислить с точностью e \sum_{k=1}^\infty \frac{(-1)^kx^k}{x^3+k^3}

Вычислить сумму ряда с заданной точностью
1.1.46. l n(1-x)=-(x+x2/ 2 +x3/3 + …+ xn/n) для х&lt;1 вот собственно говоря программа. program Project1; {$APPTYPE CONSOLE} ...

Вычислить бесконечную сумму с заданной точностью e (е > 0).
функция: arctg x Ряд: x-x^3/3+x^5/5+..+(-1)^(n*2n+1)/(2n+1) Диапазон: х(по модулю)&lt;1 Выбрать погрешность Е из диапазона 0,01..0,00001...

1
Модератор
10373 / 5661 / 3398
Регистрация: 17.08.2012
Сообщений: 17,299
17.12.2019, 09:19
Нет, не правильно, так как для определения (-1)n Вы используете j, а для вычислений по формуле используете n. Фактически, Вы вычисляете


https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
S=\sum_{n=0}^{\infty}\frac{(-1)^{n+1}}{4(2n-1)n!}<br />

а не

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
S=\sum_{n=1}^{\infty}\frac{(-1)^n}{4(2n-1)n!}<br />

, как планировалось. Перед входом в цикл у Вас j=1, но n=0, потому что n до цикла Вы не меняли, а глобальные числовые переменные инициализируются нулём. Да, кстати, для определения (-1)n достаточно
Pascal
1
if j mod 2 =0 then znak:=1 else znak:= -1;
только вот этого не нужно, правильнее найти рекуррентное соотношение для членов ряда.

Поглядим внимательнее... Очень странно...

В задании Вы пишете (-1)^n / 4*n!*(2n-1). Этот ряд расходится, поэтому задача сразу теряет смысл. В программе у Вас (-1)^n / (4*n!*(2n-1)). А вот этот ряд как раз сходится. Будьте внимательнее, не ошибайтесь.

Объявлять глобальные переменные до подпрограмм можно только в случае крайней необходимости, поскольку этот необдуманный поступок порождает трудно обнаруживаемые ошибки из-за перекрытия областей видимости локальных и глобальных переменных. У Вас от этого ошибок не возникло, но всё же...

Для вычисления суммы подобного ряда не следует вычислять факториал непосредственно, поскольку уже 25! невозможно вычислить точно с применением любых стандартных числовых типов данных. А уж вычислять факториал с помощью целочисленных типов - так и вовсе является алгоритмической ошибкой, поскольку при x > 25 будет арифметическое переполнение, и результат работы программы будет ошибочным. В Вашей программе такое случится при E=1e-27. Ну да, 10-27 уже за пределами веса младшего разряда машинного представления суммы, и вводить такое смысла не имеет, но... Просто табу недостаточно, а программа должна выдерживать прямое попадание в её интерфейс самого необученного академика.

И, да, вычисление факториала с помощью рекурсии - это что, равносильно вычислению суммы ряда с помощью рекурсии? Что-то я в этом не уверен.

Кстати, лучше факториал вычислять, как его все вычисляют:
Pascal
1
2
3
4
5
function fact(x: integer): real; //функция для факториала;
begin
  if x > 1 then fact := x * fact(x - 1)
  else fact := 1
end;
Вывод: Ваша программа не соответствует заданию, и после исправления может выдать неверный результат из-за алгоритмической ошибки.

Короче, программу Вашу - в топку.

Попробуем написать что-нибудь удобоваримое вместо Вашей неудачной программы.

Находим рекуррентное соотношение:

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
S=\sum_{n=1}^{\infty}\frac{(-1)^n}{4(2n-1)n!}=\sum_{n=1}^{\infty}\frac{(-1)^n}{8(n-0.5)n!}=\sum_{n=1}^{\infty}a_n<br />

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
a_1=\frac{(-1)^1}{8(1-0.5)1!}=-0.25;\ \ \ a_n=\frac{(-1)^n}{8(n-0.5)n!};\ \ \ a_{n-1}=\frac{(-1)^{n-1}}{8(n-1.5)(n-1)!};<br />

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\frac{a_n}{a_{n-1}}=\frac{\frac{(-1)^n}{8(n-0.5)n!}}{\frac{(-1)^{n-1}}{8(n-1.5)(n-1)!}}=\frac{(1.5-n)}{n(n-0.5)}\ \Rightarrow \ \boxed{a_n=\frac{(1.5-n)}{n(n-0.5)}a_{n-1}}<br />

Так как возвращаемых значений более одного (сумма и количество членов), в данном случае в качестве рекурсивной подпрограммы удобнее использовать процедуру.

Пишем программу:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure sum(var sk: real; var k: integer; a, eps: real);
begin
  sk := sk + a;
  if abs(a) > eps then
    begin
      inc(k);
      sum(sk, k, (1.5 - k) * a / k / (k - 0.5), eps)
    end
end;
 
var
  s, e: real;
  n: integer;
 
begin
  repeat
    write('Точность вычислений 0 < E < 1;  E = ');
    readln(e)
  until (0 < e) and (e < 1);
  s := 0;
  n := 1;
  sum(s, n, -0.25, e);
  write('Sum = ', s:0:15, ',  n = ', n);
  readln
end.
Лишние элементы интерфейса я выбросил в Ганг.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.12.2019, 09:19
Помогаю со студенческими работами здесь

Вычислить бесконечную сумму с заданной точностью Е (е > 0 )
Вычислить бесконечную сумму с заданной точностью Е(е &gt; 0 ). Считать что требуемая точность достигнута, если насколько первых слагаемых и...

Вычислить сумму ряда с заданной точностью
Помогите вычислить сумму ряда Добавлено через 2 минуты http://i006.***********/0912/5f/feaabca39e14.jpg вот задание, видать эту...

Вычислить сумму ряда с заданной точностью
\frac{x^1}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!}+...+\frac{x^n}{n!} Вычислить формулу с точностью до 0.001, определив количество проходов...

Вычислить сумму ряда с заданной точностью
Задали задачу по паскалю а я не могу решить((( помогите пожалуйста)))

Вычислить сумму ряда с заданной точностью
Требуется помощь, заранее спасибо. Даны действительные числа x и ε (x≠0, ε&gt;0). Вычислить с точностью ε и указать количество...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru