Помогите найти ошибку

 
0
 
C++
ava
annasei | 26.12.2016, 22:50
Помогите плиз! значение правой части (f(x)) не соответствует значению левой части функции.

Даны a, b, h, e (0<e<1). Построить таблицу значений заданной функции на
отрезке [a, b] с шагом h. Для вычисления функции использовать заданное
разложение функции. Функцию вычислять с точностью e. Считаем, что
заданная точность достигнута, если очередное слагаемое по модулю
меньше e. Использовать директиву препроцессорной обработки #define
для задания препроцессорного идентификатора.

x=2(sinx-(sin2x/2)+(sin3x/3)-...+((-1)^(n-1))(sinnx/n)+...)


#include<stdio.h>
#include<math.h>
#define PR printf("____________________________\n")
double ex(double e, double x)
{
double chisl, znam, znak=-1, sum=x;
    int n=1;
    int k=0;
    while(fabs(chisl/znam)>=e)
    {
            k++;
            if(k>1000)
            break;
       chisl=sin(n*x);
       znam=n;
       znak=-znak;
       sum=2*(znak*(chisl/znam));
       n++;
    }
   return sum;
}
int main()
{
    double a, b, h, e,f,z,x;/* a,b-начало и конец промежутка
                               h-шаг
                               е-точность
                               f-правая часть функции
                               z-левая часть функции
                               х-переменная */
do
{
    printf("Введите координаты отрезка [a,b]");
    scanf("%lf%lf",&a,&b);
}
while((a>b)||(((a<-M_PI)||(a>M_PI))||((b<-M_PI)||(b>M_PI))));//проверка промежутка
printf("введите шаг");
scanf("%lf",&h);
do
{
    printf("введите точность");
    scanf("%lf",&e);
}
while((e<=0)||(e>=1));//проверка точности
    PR;
printf(" |   x   |   f(x)   |   z(x)   | \n");
x=a;//присваение х переменной значение а
while(x<=b)//достижение х конца промежутка
{
    f=ex(e,x);//подсчет правой части
    z=x;
    PR;
    printf("| %lf | %0.5lf  |  %0.5lf   |\n",x,f,z);
    x=x+h;//увеличение переменной на шаг

}
return 0;
}
Kommentare (4)
ava
feodorv | 27.12.2016, 08:53 #
Цитата (annasei @  26.12.2016,  22:50 findReferencedText)
sum=2*(znak*(chisl/znam));

Наверное, предполагается так:
sum += 2*(znak*(chisl/znam));
ava
annasei | 27.12.2016, 12:42 #
Цитата (feodorv @  27.12.2016,  08:53 findReferencedText)
Почему не 



sum=0

??? 

если sum=0, то f(x) при любых значениях х равняется нулю, но по сути sum действительно должна =0, значит ошибка в чем то другом  :scratch_one-s_head 
ava
feodorv | 28.12.2016, 09:09 #
На это Вы не обратили внимание:
Цитата (feodorv @  27.12.2016,  08:53 findReferencedText)
sum += 2*(znak*(chisl/znam));

ava
feodorv | 28.12.2016, 09:24 #
Цитата (annasei @  27.12.2016,  12:42 findReferencedText)
значит ошибка в чем то другом

Ну так переменные chisl, znam не инициализированы, но вы сходу используете их значения:
Цитата (annasei @  26.12.2016,  22:50 findReferencedText)
    while(fabs(chisl/znam)>=e)
  {
  ...
  }

Судя по всему, мусор в неинициализированных значениях таков, что не выполняется условие fabs(chisl/znam)>=e, и тело цикла не выполняется ни разу.

Сделайте хотя бы так

do
{
...
} while( fabs(chisl/znam)>=e );
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden