Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите найти ошибку


Автор: 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;
}

Автор: feodorv 27.12.2016, 08:53
Цитата(annasei @  26.12.2016,  22:50 Найти цитируемый пост)
sum=2*(znak*(chisl/znam));

Наверное, предполагается так:
Код
sum += 2*(znak*(chisl/znam));


Добавлено через 2 минуты и 16 секунд
Цитата(annasei @  26.12.2016,  22:50 Найти цитируемый пост)
sum=x

Почему не 
Код
sum=0
???

Автор: annasei 27.12.2016, 12:42
Цитата(feodorv @  27.12.2016,  08:53 Найти цитируемый пост)
Почему не 

sum=0
??? 

если sum=0, то f(x) при любых значениях х равняется нулю, но по сути sum действительно должна =0, значит ошибка в чем то другом  smile 

Автор: feodorv 28.12.2016, 09:09
На это Вы не обратили внимание:
Цитата(feodorv @  27.12.2016,  08:53 Найти цитируемый пост)
sum += 2*(znak*(chisl/znam));


Автор: feodorv 28.12.2016, 09:24
Цитата(annasei @  27.12.2016,  12:42 Найти цитируемый пост)
значит ошибка в чем то другом

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

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

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

do
{
...
} while( fabs(chisl/znam)>=e );

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