Решение системы уравнений: написать функцию, которая как параметр будет использовать другую функцию - C (СИ)

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

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

Ребята помогите разобраться с указателем на функцию! у меня решается система ДУ методом Рунге_кутта. я хочу написать функцию, которая как параметр будет использовать другую функцию. Пытаюсь организовать все это с помощью указателей - пока не получается.
Листинг программы
  1. double Speed(double Vk, double t, double teta, double y, double Wx, int rejim)
  2. double func_x(double Vk, double t, double teta, double y, double Wx, int rejim)
  3. double func_y(double Vk, double t, double teta, double y, double Wx, int rejim)
  4. double Runge (double (*point)(double, double, double, double, double, int))
  5. {
  6. double k1, k2, k3, k4;
  7. double Vk1, Vk2,Vk3, t1, teta1;
  8. k1 = point(Vk,t,teta,y,Wx,rejim);
  9. Vk1=Vk+(h*0.5)*k1;
  10. k2 = point(Vk1, t+0.5*h, teta,y,Wx,rejim);
  11. Vk2=Vk+(h*0.5)*k2;
  12. k3 = point(Vk2, t+0.5*h, teta,y,Wx,rejim);
  13. Vk4 = Vk + h*k3;
  14. k4 = point(Vk3, t+h, teta,y,Wx,rejim);
  15. return (Vk + (h/6)*(k1+2*k2+2*k3+k4));
  16. }
  17. int _tmain(int argc, _TCHAR* argv[])
  18. {
  19. ...
  20. ...
  21. Vk[i+1] = Runge (Speed (Vk[i], t, teta[i], y[i], Wx, 1));
  22. Teta[i+1]=Runge(Ugol( (Vk[i], t, teta[i], y[i], Wx, 1));
  23. x[i+1]=Runge(func_x( (Vk[i], t, teta[i], y[i], Wx, 1));
  24. y[i+1]=Runge(func_y( (Vk[i], t, teta[i], y[i], Wx, 1));
  25. ...
  26. ...
  27. }
Я понимаю, что функция Runge написано неправильно, потому что нельзя так писать параметры указателя. Но как сделать правильно - не понимаю... Объясните плиз

Решение задачи: «Решение системы уравнений: написать функцию, которая как параметр будет использовать другую функцию»

textual
Листинг программы
  1. #include <iostream>
  2.  
  3. double sum ( double x, double y )
  4. {
  5.     return x + y;
  6. }
  7.  
  8. double dif ( double x, double y )
  9. {
  10.     return x - y;
  11. }
  12.  
  13. /*
  14.  * Объявляем новый тип func - указатель на функцию с двумя аргументами
  15.  * типа double, возвращающими значение типа double
  16.  * Можно было бы обойтись без этого, определив прототип функции eval так:
  17.  * double eval( double (*func) (double, double), double x, double y)
  18.  */
  19. typedef double ( *func ) ( double, double );
  20.  
  21. double eval ( func f, double x, double y )
  22. {
  23.     return f ( x, y );
  24. }
  25.  
  26. int main()
  27. {
  28.     double x = 16.8, y = 2.345;
  29.     std::cout << "x = " << x << ", y = " << y << std::endl;
  30.     std::cout << "Evaluating the sum of x and y: " << eval ( sum, x, y ) << std::endl;
  31.     std::cout << "Evaluating the difference between x and y: " << eval ( dif, x, y )
  32.               << std::endl;
  33.     return 0;
  34. }

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

  1. Подключение заголовочного файла iostream для использования функций вывода
  2. Объявление двух функций: sum и dif, которые принимают два аргумента типа double и возвращают double
  3. Объявление нового типа данных func, который является указателем на функцию с двумя аргументами типа double, возвращающую значение типа double
  4. Объявление функции eval, которая принимает три аргумента: func (указатель на функцию), x (double), y (double) и возвращает double
  5. В функции main() объявляются три переменные: x (16.8), y (2.345), и указатель на функцию f, который будет использоваться в eval
  6. Вывод на консоль значений переменных x и y
  7. Вызов функции eval с аргументами sum, x, y, и вывод результата на консоль
  8. Вызов функции eval с аргументами dif, x, y, и вывод результата на консоль
  9. Возврат значения 0 из функции main(), что означает успешный конец работы программы

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


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

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

6   голосов , оценка 3.833 из 5

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

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

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