Массив указателей на функции - C (СИ) (70275)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Подскажите пожалуйста, где ошибка в программе. Не могу разобраться с массивом указателей на функции. В строчках " x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative); " показывает ошибку.
#include <stdio.h>
#include <cmath>
#include <conio.h>
#include <stdlib.h>
int i;
int getch (); //Объявление прототипов функций
double Derivative(double, double, double(*func)(double x) )  ;
double secondDerivative(double x, double h, double(*Derivative)(double x) ) ;
double Newton(double, double, int, double, double (*func)(double x), double (*Derivative)(double, double, double(*func)(double x)), double (*secondDerivative)(double, double, double (*Derivative)(double, double, double(*func)(double x))));
double func1(double), func2(double), func3(double), func4(double), func5(double), func6(double), func7(double), func8(double);
void func()
{
int maxIteration, i, funcNum;
double x0,xn;// вычисляемые приближения для корня
double a, b, c, h, eps, func;// границы отрезка и необходимая точность
//Объявление массива ссылок на функции
double (*mas[8])(double) = {func1, func2, func3, func4, func5, func6, func7, func8};
printf( " Vvedite h " ); 
scanf( "%lf", &h ); // вводим шаг
printf( "  Vvedite eps " );
scanf( "%lf", &eps ); // вводим нужную точность вычислений
printf( "  Vvedite maximum number of iteration: " );
scanf( "%lf", &maxIteration );// вводим кол-во итераций
for(funcNum = 0; funcNum < 8; funcNum++)
{ 
printf("%d\n", funcNum);
if (mas[funcNum](a)*secondDerivative(a,h,mas[funcNum])>0) x0 = a; // для выбора начальной точки проверяем f(x0)*p2f(x0)>0 ?
else x0 = b;
c=(a+b)/2; 
if (mas[funcNum](c)*mas[funcNum](a)<0)
b=c;
if (mas[funcNum](c)*mas[funcNum](b)<0)
a=c;
x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative);
xn = x0-mas[funcNum](x0)/Derivative(x0, h, mas[funcNum]); // считаем первое приближение
while (fabs(x0-xn)>eps)
{
x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative);
x0=xn;
xn = x0-mas[funcNum](x0)/Derivative(x0,h,mas[funcNum]); // непосредственно формула Ньютона
} 
while( xn < 0 ) // пока не достигнем необходимой точности, будет продолжать вычислять
{
x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative);
x0+=h;
xn = x0-mas[funcNum](x0)/Derivative(x0,h,mas[funcNum]); // непосредственно формула Ньютона
while (fabs(x0-xn)>eps)
{
x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative);
x0=xn;
 
xn = x0-mas[funcNum](x0)/Derivative(x0,h,mas[funcNum]); // непосредственно формула Ньютона
}
printf("xn = %.9f\n",xn); 
printf("f(x0) = %.9f\n",mas[funcNum](x0)); 
printf("Number of iteration = %d\n\n",i);
} 
printf( "  Exit?=> " );
scanf( "%lf", &exit );
}
getch();
}
 
//Функции-уравнения, решаемые в задаче
double func1(double x) { return exp(-x) + pow(x, 2) + 2; }
double func2(double x) { return -pow((x-2), 2); }
double func3(double x) { return exp(x)-2*x-2; }
double func4(double x) { return sin(x) + x - 1; }
double func5(double x) { return exp(-pow(x,2));}
double func6(double x) { return 2*exp(-3*x) - x +1; }
double func7(double x) { return log(x) - x + 1; }
double func8(double x) { return log(x) - pow((x-1), 2); }
//Первая производная функции
double Derivative(double x, double h, double(*func)(double x))
{
double Derivative = ((func(x + h) - func(x - h))/(2*h));
return Derivative;
}
//Вторая производная функции
 
double secondDerivative(double x, double h, double(*Derivative)(double x) )
{
double secondDerivative = ((Derivative(x + h) - Derivative(x - h))/(2*h));
return secondDerivative;
}

Решение задачи: «Массив указателей на функции»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
typedef double(*func_t)(double);
 
int i;
double derivative(double, double, func_t)  ;
double second_derivative(double, double, func_t f) ;
double newton(double, double, func_t);
double func1(double), func2(double), func3(double), func4(double), func5(double), func6(double), func7(double), func8(double);
int main(void)
{
    int maxIteration, i, funcNum;
    double x0,xn;// вычисляемые приближения для корня
    double a, b, c, h, eps, func;// границы отрезка и необходимая точность
    //Объявление массива ссылок на функции
    double (*mas[8])(double) = {func1, func2, func3, func4, func5, func6, func7, func8};
    printf( " Vvedite h " ); 
    scanf( "%lf", &h ); // вводим шаг
    printf( "  Vvedite eps " );
    scanf( "%lf", &eps ); // вводим нужную точность вычислений
    printf( "  Vvedite maximum number of iteration: " );
    scanf( "%lf", &maxIteration );// вводим кол-во итераций
    for(funcNum = 0; funcNum < 8; funcNum++) { 
        printf("funcNum: %d\n", funcNum);
        if (mas[funcNum](a)*second_derivative(x0, h, mas[funcNum]) > 0) 
            x0 = a; // для выбора начальной точки проверяем f(x0)*p2f(x0)>0 ?
        else 
            x0 = b;
        c = (a + b) / 2; 
        if (mas[funcNum](c)*mas[funcNum](a) < 0)
            b=c;
        if (mas[funcNum](c)*mas[funcNum](b) < 0)
            a = c;
            xn = newton(x0, h, mas[funcNum]);
        while (fabs(x0-xn) > eps) {
            x0 = xn;
            xn = newton(x0, h, mas[funcNum]);
        } 
        while( xn < 0 ) {// пока не достигнем необходимой точности, будет продолжать вычислять
            x0+=h;
            xn = newton(x0, h, mas[funcNum]);
            while (fabs(x0-xn) > eps) {
                x0 = xn;
                xn = newton(x0, h, mas[funcNum]);
            }
            printf("xn = %.9f\n",xn); 
            printf("f(x0) = %.9f\n",mas[funcNum](x0)); 
            printf("Number of iteration = %d\n\n",i);
        } 
        printf( "  Exit?=> " );
        scanf( "%lf", &exit );
    }
    getchar();
}
 
//Функции-уравнения, решаемые в задаче
double func1(double x) { return exp(-x) + pow(x, 2) + 2; }
double func2(double x) { return -pow((x-2), 2); }
double func3(double x) { return exp(x)-2*x-2; }
double func4(double x) { return sin(x) + x - 1; }
double func5(double x) { return exp(-pow(x,2));}
double func6(double x) { return 2*exp(-3*x) - x +1; }
double func7(double x) { return log(x) - x + 1; }
double func8(double x) { return log(x) - pow((x-1), 2); }
 
//Первая производная функции
double derivative(double x, double h, func_t f)
{
    return (f(x + h) - f(x - h)/(2*h));
}
//Вторая производная функции
 
double second_derivative(double x, double h, func_t f)
{
    return (derivative(x, h, f) - derivative(x, h, f)/(2*h));
}
double newton(double x, double h, func_t f)
{
    return (x - f(x)/derivative(x, h, f));
}

Объяснение кода листинга программы

  1. Объявлен массив из 8 ссылок на функции типа double(*mas[8])(double).
  2. Ввод начальных значений: шаг (h), точность (eps), максимальное число итераций (maxIteration).
  3. Проверка, является ли точка x0, определенная как a, корнем: если f(x0)*second_derivative(x0, h, mas[funcNum]) > 0, то x0 = a, иначе x0 = b.
  4. Вычисление значения c, среднего арифметического a и b.
  5. Проверка, является ли точка c корнем: если f(c)*masfuncNum < 0, то b = c, иначе a = c.
  6. Вычисление приближенного значения корня xn с помощью функции newton(x0, h, mas[funcNum]).
  7. Начало цикла: пока разница между текущим и предыдущим приближениями x0 и xn больше заданной точности eps, вычисляется новое приближение xn с помощью функции newton(x0, h, mas[funcNum]).
  8. Если полученное значение xn меньше нуля, то выполняется вложенный цикл: пока разница между текущим и предыдущим приближениями x0 и xn больше заданной точности eps, вычисляется новое приближение xn с помощью функции newton(x0, h, mas[funcNum]).
  9. Вывод информации о найденном корне xn, значении функции f(x0) и количестве итераций.
  10. Завершение работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы