Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите найти ошибку, Построить таблицу значений заданной функ 
:(
    Опции темы
annasei
Дата 26.12.2016, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.12.2016

Репутация: нет
Всего: нет



Помогите плиз! значение правой части (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;
}

PM MAIL   Вверх
feodorv
Дата 27.12.2016, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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
???


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
annasei
Дата 27.12.2016, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.12.2016

Репутация: нет
Всего: нет



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

sum=0
??? 

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

Это сообщение отредактировал(а) annasei - 27.12.2016, 12:43
PM MAIL   Вверх
feodorv
Дата 28.12.2016, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



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



Это сообщение отредактировал(а) feodorv - 28.12.2016, 09:10


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 28.12.2016, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(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 );



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0698 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.