2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Указатель на функцию.
Сообщение16.05.2015, 16:51 
Аватара пользователя


11/01/13
292
Задание:
Листок с заданиями писал(а):
В следующих задачах требуется оформить решение в виде функции, получающей в качестве параметра указатель на функцию
double (*f)(double x).

Листок с заданиями писал(а):
Вычислить корень уравнения $f(x)=0$ на данном отрезке с заданной точностью $\varepsilon$ методом хорд (секущих). Сравнить с точным ответом.

Предполагалось, что преподаватель будет проверять на $f(x)=\sin(x)$ на отрезке $[3;4]$ с точностью $10^{-20}$ (и этот тест после небольшой поправки, учитывающей деление на ноль, программа стала проходить). Но теперь нужно, чтобы всё работало для произвольной в разумных пределах функции, то есть для $f(x)=2\sin(x)+1$, например. Если непосредственно в main'е заменить $f(x)=\sin(x)$ на $f(x)=2\sin(x)+1$, то компилятор выдаёт ошибку
Компилятор писал(а):
1.1.3.c: In function ‘main’:
1.1.3.c:36:5: error: invalid operands to binary * (have ‘int’ and ‘__attribute__((const)) double (*)(double)’)
f=2*sin+1;

Так как кроме предыдущего семестра у меня больше не было опыта программирования, гугление мне не помогло, поэтому я решил обратиться сюда (и на cyberforum).
Что означает эта ошибка? Как её можно исправить?
Текст программы:
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double function(double a, double b, double eps, double (*f)(double x));
double function(double a, double b, double eps, double (*f)(double x))

{
        double R=0;
        int i=0;
        printf("BBeDute eps:\n");
        scanf("%lf", &eps);
        printf("BBeDute rpaHuubI\n");
        scanf("%lf%lf", &a, &b);
        while(fabs(b-a)>eps)
        {
                if(fabs(f(a)-f(b))<0.0000001)
                break;
                a=b-(b-a)*f(b)/(f(b)-f(a));
                b=a-(a-b)*f(a)/(f(a)-f(b));
                i=i+1;
        }
        R=b;
        printf("uTepaLIuu:%d\n", i);
        return R;
}

int main(void)
{
        double R=0;
        double a=0;
        double b=0;
        double d=0;
        double eps=0;
        double (*f)(double x);
        f=sin;
        R=function(a, b, eps, f);
        d=3.14159265359-R;
        printf("Pa3Huua c To4HbIm otBetom: %e\n", d);
        printf("x=%lf\n", R);
        return 0;
}
 

 Профиль  
                  
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 17:31 
Заслуженный участник


04/05/09
4587
Heart-Shaped Glasses в сообщении #1015969 писал(а):
Если непосредственно в main'е заменить $f(x)=\sin(x)$ на $f(x)=2\sin(x)+1$
Интересно, какую именно замену вы имеете в виду? В программе нет строчки $f(x)=\sin(x)$.
Я думаю, ваш ответ на этот вопрос повлияет на то, как вам будут здесь помогать. У меня есть сильное подозрение, что вы ищете халявы.

 Профиль  
                  
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 17:47 
Заслуженный участник


16/02/13
4196
Владивосток
Таки ж простите, но вопрос выдаёт столь полное и абсолютное незнание предмета, что ответить что-либо осмысленное не представляется возможным.
Можно, конечно, перевести текст сообщения на русский язык (а пишут вам, что операция умножения не определена для операндов типа целый и функция), но это вам не поможет.

 Профиль  
                  
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 19:26 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Компилятор английским языком говорит: оператор * не умеет умножать целое число (2) на указатель на функцию (sin). Напишите свою функцию $2\sin x + 1$ и передавайте ее куда хотите.

 Профиль  
                  
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 20:02 
Аватара пользователя


11/01/13
292
venco в сообщении #1015985 писал(а):
Интересно, какую именно замену вы имеете в виду? В программе нет строчки $f(x)=\sin(x)$.

Да, вы правы, я ошибся. Имелось ввиду $f=\sin;$.
venco в сообщении #1015985 писал(а):
Я думаю, ваш ответ на этот вопрос повлияет на то, как вам будут здесь помогать. У меня есть сильное подозрение, что вы ищете халявы.

Тогда я бы не стал создавать эту тему здесь.
iifat в сообщении #1015987 писал(а):
Таки ж простите, но вопрос выдаёт столь полное и абсолютное незнание предмета, что ответить что-либо осмысленное не представляется возможным.

Вы правы, с предметом я плохо знаком...
Xaositect в сообщении #1016012 писал(а):
Компилятор английским языком говорит: оператор * не умеет умножать целое число (2) на указатель на функцию (sin). Напишите свою функцию $2\sin x + 1$ и передавайте ее куда хотите.

Кажется, я понял. То есть что-то вроде этого, да?
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

double func(double x);
double func(double x)
{
        return 2*sin(x)+1;     
}


double function(double a, double b, double eps, double (*f)(double x));
double function(double a, double b, double eps, double (*f)(double x))

{
        double R=0;
        int i=0;
        printf("BBeDute eps:\n");
        scanf("%lf", &eps);
        printf("BBeDute rpaHuubI\n");
        scanf("%lf%lf", &a, &b);
        while(fabs(b-a)>eps)
        {
                if(fabs(f(a)-f(b))<0.0000001)
                break;
                a=b-(b-a)*f(b)/(f(b)-f(a));
                b=a-(a-b)*f(a)/(f(a)-f(b));
                i=i+1;
        }
        R=b;
        printf("uTepaLIuu:%d\n", i);
        return R;
}

int main(void)
{
        double R=0;
        double a=0;
        double b=0;
        double d=0;
        double eps=0;
        double (*f)(double x);
        f=func;
        R=function(a, b, eps, f);
        d=3.14159265359-R;
        printf("Pa3Huua c To4HbIm otBetom: %e\n", d);
        printf("x=%lf\n", R);
        return 0;
}

Вроде работает, спасибо!

 Профиль  
                  
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 20:17 
Заслуженный участник
Аватара пользователя


23/07/08
10910
Crna Gora
Heart-Shaped Glasses в сообщении #1016024 писал(а):
Используется синтаксис C
   printf("BBeDute eps:\n");
   printf("BBeDute rpaHuubI\n");
   printf("uTepaLIuu:%d\n", i);
   printf("Pa3Huua c To4HbIm otBetom: %e\n", d);
 
Зачем так писать?

 Профиль  
                  
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 20:32 
Аватара пользователя


28/01/12
467
Могу угадать ответ - консольное приложение, не хотел заморачиваться с setlocale

 Профиль  
                  
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 21:09 
Заслуженный участник
Аватара пользователя


23/07/08
10910
Crna Gora
Ааа, а я думал, это элемент какой-то субкультуры. :-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group