2014 dxdy logo

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

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




 
 Указатель на функцию.
Сообщение16.05.2015, 16:51 
Аватара пользователя
Задание:
Листок с заданиями писал(а):
В следующих задачах требуется оформить решение в виде функции, получающей в качестве параметра указатель на функцию
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 
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 
Таки ж простите, но вопрос выдаёт столь полное и абсолютное незнание предмета, что ответить что-либо осмысленное не представляется возможным.
Можно, конечно, перевести текст сообщения на русский язык (а пишут вам, что операция умножения не определена для операндов типа целый и функция), но это вам не поможет.

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

 
 
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 20:02 
Аватара пользователя
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 
Аватара пользователя
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 
Аватара пользователя
Могу угадать ответ - консольное приложение, не хотел заморачиваться с setlocale

 
 
 
 Re: Указатель на функцию.
Сообщение16.05.2015, 21:09 
Аватара пользователя
Ааа, а я думал, это элемент какой-то субкультуры. :-)

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group