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

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

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

Здравствуйте! Подскажите пожалуйста, где ошибка в программе. Не могу разобраться с массивом указателей на функции. В строчках " x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative); " показывает ошибку.
Листинг программы
  1. #include <stdio.h>
  2. #include <cmath>
  3. #include <conio.h>
  4. #include <stdlib.h>
  5. int i;
  6. int getch (); //Объявление прототипов функций
  7. double Derivative(double, double, double(*func)(double x) ) ;
  8. double secondDerivative(double x, double h, double(*Derivative)(double x) ) ;
  9. 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))));
  10. double func1(double), func2(double), func3(double), func4(double), func5(double), func6(double), func7(double), func8(double);
  11. void func()
  12. {
  13. int maxIteration, i, funcNum;
  14. double x0,xn;// вычисляемые приближения для корня
  15. double a, b, c, h, eps, func;// границы отрезка и необходимая точность
  16. //Объявление массива ссылок на функции
  17. double (*mas[8])(double) = {func1, func2, func3, func4, func5, func6, func7, func8};
  18. printf( " Vvedite h " );
  19. scanf( "%lf", &h ); // вводим шаг
  20. printf( " Vvedite eps " );
  21. scanf( "%lf", &eps ); // вводим нужную точность вычислений
  22. printf( " Vvedite maximum number of iteration: " );
  23. scanf( "%lf", &maxIteration );// вводим кол-во итераций
  24. for(funcNum = 0; funcNum < 8; funcNum++)
  25. {
  26. printf("%d\n", funcNum);
  27. if (mas[funcNum](a)*secondDerivative(a,h,mas[funcNum])>0) x0 = a; // для выбора начальной точки проверяем f(x0)*p2f(x0)>0 ?
  28. else x0 = b;
  29. c=(a+b)/2;
  30. if (mas[funcNum](c)*mas[funcNum](a)<0)
  31. b=c;
  32. if (mas[funcNum](c)*mas[funcNum](b)<0)
  33. a=c;
  34. x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative);
  35. xn = x0-mas[funcNum](x0)/Derivative(x0, h, mas[funcNum]); // считаем первое приближение
  36. while (fabs(x0-xn)>eps)
  37. {
  38. x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative);
  39. x0=xn;
  40. xn = x0-mas[funcNum](x0)/Derivative(x0,h,mas[funcNum]); // непосредственно формула Ньютона
  41. }
  42. while( xn < 0 ) // пока не достигнем необходимой точности, будет продолжать вычислять
  43. {
  44. x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative);
  45. x0+=h;
  46. xn = x0-mas[funcNum](x0)/Derivative(x0,h,mas[funcNum]); // непосредственно формула Ньютона
  47. while (fabs(x0-xn)>eps)
  48. {
  49. x0=Newton(a, b, maxIteration, h, mas[funcNum], *Derivative, *secondDerivative);
  50. x0=xn;
  51. xn = x0-mas[funcNum](x0)/Derivative(x0,h,mas[funcNum]); // непосредственно формула Ньютона
  52. }
  53. printf("xn = %.9f\n",xn);
  54. printf("f(x0) = %.9f\n",mas[funcNum](x0));
  55. printf("Number of iteration = %d\n\n",i);
  56. }
  57. printf( " Exit?=> " );
  58. scanf( "%lf", &exit );
  59. }
  60. getch();
  61. }
  62. //Функции-уравнения, решаемые в задаче
  63. double func1(double x) { return exp(-x) + pow(x, 2) + 2; }
  64. double func2(double x) { return -pow((x-2), 2); }
  65. double func3(double x) { return exp(x)-2*x-2; }
  66. double func4(double x) { return sin(x) + x - 1; }
  67. double func5(double x) { return exp(-pow(x,2));}
  68. double func6(double x) { return 2*exp(-3*x) - x +1; }
  69. double func7(double x) { return log(x) - x + 1; }
  70. double func8(double x) { return log(x) - pow((x-1), 2); }
  71. //Первая производная функции
  72. double Derivative(double x, double h, double(*func)(double x))
  73. {
  74. double Derivative = ((func(x + h) - func(x - h))/(2*h));
  75. return Derivative;
  76. }
  77. //Вторая производная функции
  78. double secondDerivative(double x, double h, double(*Derivative)(double x) )
  79. {
  80. double secondDerivative = ((Derivative(x + h) - Derivative(x - h))/(2*h));
  81. return secondDerivative;
  82. }

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>
  4.  
  5. typedef double(*func_t)(double);
  6.  
  7. int i;
  8. double derivative(double, double, func_t)  ;
  9. double second_derivative(double, double, func_t f) ;
  10. double newton(double, double, func_t);
  11. double func1(double), func2(double), func3(double), func4(double), func5(double), func6(double), func7(double), func8(double);
  12. int main(void)
  13. {
  14.     int maxIteration, i, funcNum;
  15.     double x0,xn;// вычисляемые приближения для корня
  16.     double a, b, c, h, eps, func;// границы отрезка и необходимая точность
  17.     //Объявление массива ссылок на функции
  18.     double (*mas[8])(double) = {func1, func2, func3, func4, func5, func6, func7, func8};
  19.     printf( " Vvedite h " );
  20.     scanf( "%lf", &h ); // вводим шаг
  21.     printf( "  Vvedite eps " );
  22.     scanf( "%lf", &eps ); // вводим нужную точность вычислений
  23.     printf( "  Vvedite maximum number of iteration: " );
  24.     scanf( "%lf", &maxIteration );// вводим кол-во итераций
  25.     for(funcNum = 0; funcNum < 8; funcNum++) {
  26.         printf("funcNum: %d\n", funcNum);
  27.         if (mas[funcNum](a)*second_derivative(x0, h, mas[funcNum]) > 0)
  28.             x0 = a; // для выбора начальной точки проверяем f(x0)*p2f(x0)>0 ?
  29.         else
  30.             x0 = b;
  31.         c = (a + b) / 2;
  32.         if (mas[funcNum](c)*mas[funcNum](a) < 0)
  33.             b=c;
  34.         if (mas[funcNum](c)*mas[funcNum](b) < 0)
  35.             a = c;
  36.             xn = newton(x0, h, mas[funcNum]);
  37.         while (fabs(x0-xn) > eps) {
  38.             x0 = xn;
  39.             xn = newton(x0, h, mas[funcNum]);
  40.         }
  41.         while( xn < 0 ) {// пока не достигнем необходимой точности, будет продолжать вычислять
  42.             x0+=h;
  43.             xn = newton(x0, h, mas[funcNum]);
  44.             while (fabs(x0-xn) > eps) {
  45.                 x0 = xn;
  46.                 xn = newton(x0, h, mas[funcNum]);
  47.             }
  48.             printf("xn = %.9f\n",xn);
  49.             printf("f(x0) = %.9f\n",mas[funcNum](x0));
  50.             printf("Number of iteration = %d\n\n",i);
  51.         }
  52.         printf( "  Exit?=> " );
  53.         scanf( "%lf", &exit );
  54.     }
  55.     getchar();
  56. }
  57.  
  58. //Функции-уравнения, решаемые в задаче
  59. double func1(double x) { return exp(-x) + pow(x, 2) + 2; }
  60. double func2(double x) { return -pow((x-2), 2); }
  61. double func3(double x) { return exp(x)-2*x-2; }
  62. double func4(double x) { return sin(x) + x - 1; }
  63. double func5(double x) { return exp(-pow(x,2));}
  64. double func6(double x) { return 2*exp(-3*x) - x +1; }
  65. double func7(double x) { return log(x) - x + 1; }
  66. double func8(double x) { return log(x) - pow((x-1), 2); }
  67.  
  68. //Первая производная функции
  69. double derivative(double x, double h, func_t f)
  70. {
  71.     return (f(x + h) - f(x - h)/(2*h));
  72. }
  73. //Вторая производная функции
  74.  
  75. double second_derivative(double x, double h, func_t f)
  76. {
  77.     return (derivative(x, h, f) - derivative(x, h, f)/(2*h));
  78. }
  79. double newton(double x, double h, func_t f)
  80. {
  81.     return (x - f(x)/derivative(x, h, f));
  82. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы