Вычисление суммы ряда

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
vbn
Сообщения: 18
Зарегистрирован: 02 янв 2015, 16:18

Написать программу вычисления суммы S(x) с точностью Изображение для-π≤x≤π. Задать условие корректности ввода переменной х.

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

#include <stdio.h>
#include <math.h>
#include <conio.h>
int main()
{
int sign, n=1.0,x;
double eps, sum, elem,p=3.14;
eps=0.0001;
sum=0;
printf("Vvedite x");
scanf("%d",&x);
if ((x>=-p) || (x<= p))
{
while(elem<eps)
{
elem=2/p-4/p*((cos(2*n)*x)/(1*n*(2*n)));
sum+=elem;
n+=2;
}
printf("sum=%lf",sum);
getch();
}
}
Недочет заключается в том что суммируется вся формула, а мне нужно суммировать только то что в скобках
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Это не единственный недочёт. Недочётов тут целая куча. Точнее будет сказать, что правильна программа только в двух местах: в том месте, где ты вводишь число и в том, где печатаешь результат. Всё остальное нужно переписывать.

1. Ну-ка скажи, какое число больше минус пи или меньше пи. Скажу по секрету, что под это условие подходит абсолютно любое число на числовой оси. Другими словами, твоё условие даёт истину при любых значений x. Когда же ты уже уяснишь разницу между "И" и "ИЛИ"...

2. Переменная elem не инициализирована перед циклом. А в условии цикла ты её сравниваешь с eps. Как ты думаешь, как будет вести себя программа? Вести она себя будет непредсказуемо, так как elem объявлена на стеке, а значит, если её не инициализировать, то будет хранить мусор.

3. Даже если ты поправишь предыдущей пункт и перенесёшь проверку условия в конец цикла, то цикл while не выполнится ни разу. Дело в том, что первое вычесленно значение elem, будет заведомо больше eps.

4. Даже если ты поправишь предыдущей пункт, то ничего не будет работать из-за кошмара в формуле. Зачем в тригонометрической функции стоит 2*n, если ты n и так увеличиваешь на два на каждой итерации? А возведение в квадрат меня вообще убило. Квадрат числа n - это чило n, умноженное на само себе. А у тебя что написано?

5. Теперь по поводу того "недочёта", который ты обозначил в своём сообщении. Твоя проблема решается достаточно просто. В цикле ты должен посчитать сумму самого ряда (то, что записано в скобках), а потом уже, после цикла, сделать вычисление S(x), зная x и зная значение суммы ряда в скобках, вычисленное перед этим.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Здесь много ошибок.
Начну с мелких: целочисленная переменная n почему-то инициализирована числом с плавающей точкой.
Переменная elem вообще не проинициализирована перед началом цикла while, хотя её значение присутствует в условии цикла.
Ну и главная логическая ошибка в алгоритме - это то, что в циклическом сложении участвуют выражения p/2 и 4/p, которых не должно быть в цикле.
Т.е. сначала в цикле суммируются выражения из скобок, затем полученный результат умножается на 4/p и потом уже это число вычитается из p/2.
Да и сама реализация вычисления элементов ряда должна выглядеть примерно так: cos(n*x)/(n*n)
Поумнеть несложно, куда труднее от дури избавиться.
Ответить