codegod313

Ukaz_na_f

Jan 19th, 2020
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.11 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <windows.h>
  4. #include <locale.h>
  5.  
  6. double f(double);
  7. double pr(double(*)(double), double, double, double, int);
  8. double tr(double(*)(double), double, double, double, int);
  9.  
  10. int main()
  11. {   setlocale(LC_ALL, "Russian");
  12.     double a, b, eps;
  13.     int n;
  14.     double(*ff)(double);
  15.     puts("Введите границы a и b и точность вычисления интеграла eps");
  16.     scanf("%lf%lf%lf", &a, &b, &eps);
  17.     puts("Введите максимальное число итераций n");
  18.     scanf("%d", &n);
  19.     ff = f;
  20.     printf("  интеграл = %6.4lf\n", pr(ff, a, b, eps, n));
  21.     printf("  интеграл = %6.4lf\n", tr(ff, a, b, eps, n));
  22.     return 0;
  23. }
  24.  
  25. // использование указателя на функцию на примере
  26. // вычисления ИНТЕГРАЛА методом " ПРЯМОУГОЛЬНИКОВ "
  27. double pr(double(*fi)(double), double a, double b, double e, int n)
  28. {
  29.     double y2 = 0.0, y1, x, h = (b - a) / n;
  30.     do
  31.     {
  32.         y1 = y2; y2 = 0.0;
  33.         for (x = a; x<b; x += h)
  34.             y2 += (*fi)(x)*h;
  35.         h /= 2;
  36.     } while (fabs(y1 - y2)>e);
  37.     return y2;
  38. }
  39.  
  40. // использование указателя на функцию на примере
  41. // вычисления ИНТЕГРАЛА методом " ТРАПЕЦИЙ "
  42. double tr(double(*fi)(double), double a, double b, double e, int n)
  43. {
  44.     double y2 = 0, y1, x, h = (b - a) / n;
  45.     do
  46.     {
  47.         y1 = y2;
  48.         y2 = 0.5*((*fi)(a)+(*fi)(b));          //
  49.         for (x = a + h; x<b; x += h) y2 += (*fi)(x);  //
  50.         y2 *= h;
  51.         h /= 2.0;
  52.     } while (fabs(y1 - y2)>e);
  53.     return y2;
  54. }
  55.  
  56. double f(double x)
  57. {
  58.     return (x*x - 4.);       // вычисление значения ф-ции f(x)=x^2-4 в точке х
  59. }
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66. // использование указателя на функцию на примере
  67. // вычисления корня нелинейного уравнения методом " ПОЛОВИННОГО ДЕЛЕНИЯ "
  68.  
  69. //#include <stdio.h>
  70. //#include <math.h>
  71. //#include <conio.h>
  72. //double f(double);
  73. //double fun(double, double, double, double(*)(double));
  74. //
  75. //int main()
  76. //{
  77. //  setlocale(LC_ALL, "Russian");
  78. //  double a, b, eps;
  79. //  double(*ff)(double x);
  80. //
  81. //  puts("Введите границы a и b и точность вычисления корня");
  82. //  scanf("%lf%lf%lf", &a, &b, &eps);
  83. //  ff = f;
  84. //  printf("a= %5.2lf  b=%5.2lf  корень = %6.4lf\n", a, b, fun(a, b, eps, ff));
  85. //  getch();
  86. //}
  87. //double fun(double a, double b, double eps, double(*f1)(double))
  88. //{
  89. //  double fa, fb, c, fc;
  90. //  do
  91. //  {
  92. //      fa = (*f1)(a);           // нахождение значений функции в концах
  93. //      fb = (*f1)(b);           // выбранного интервала   [a,b]
  94. //      c = (a + b) / 2.0;         // деление отрезка [a,b] пополам
  95. //      fc = (*f1)(c);         // значение функции в середине отрезка
  96. //      if (fa*fc>0) a = c;       //  выбор границ [c,b]
  97. //      else if (fb*fc>0) b = c;  //  выбор границ [a,c]
  98. //      else
  99. //      {
  100. //          puts("точный корень"); return c;
  101. //      }
  102. //  } while (fabs(a - b)>eps);  // пока не достигнута точность  eps
  103. //  return c;
  104. //}
  105. //
  106. //double f(double x)
  107. //{
  108. //  return (x*x - 3.);       // вычисление значения ф-ции f(x)=x^2-3 в точке х
  109. //}                        // [ нахождение квадратного кореня из 3 ]
  110.  
  111. //
  112. //// использование массива указателей на функции на примере
  113. //// организации диалогового меню
  114. //#include <stdio.h>
  115. //#include <string.h>
  116. //#include <conio.h>
  117. //void funk1();
  118. //void funk2();
  119. //void funk3();
  120. //void(*spisok[])() =        // объявляется и инициализируется
  121. //    {funk1, funk2, funk3}; // массив указателей на функции
  122. //int menu();
  123. //
  124. //int main()
  125. //{
  126. //  setlocale(LC_ALL, "Russian");
  127. //  int i;
  128. //  puts("начало работы");
  129. //  do
  130. //  {
  131. //      i = menu();              // выбор номера из списка
  132. //      if (i<0 || i>2) break;
  133. //      //spisok[i]();           // вызов i-ой функции через указатель на нее
  134. //      // (*spisok[i])();       // верно
  135. //      // *spisok[i]();         // ошибка
  136. //  } while (i >= 0 && i<3);
  137. //  puts("окончание работы");
  138. //}
  139. //int menu()
  140. //{
  141. //  char c;
  142. //  int i;
  143. //  do
  144. //  {
  145. //      system("CLS");
  146. //      puts("1    funk1");
  147. //      puts("2    funk2");
  148. //      puts("3    funk3");
  149. //      puts("0    выход");
  150. //      c = (char)getch();   // можно без преобразования к char
  151. //  } while (!strchr("0123", c));
  152. //  return c - 49;           // возвращаем выбранный номер
  153. //}
  154. //
  155. //void funk1()
  156. //{
  157. //  puts("выполняется функция   funk1");
  158. //  getch();
  159. //}
  160. //void funk2()
  161. //{
  162. //  puts("выполняется функция   funk2");
  163. //  getch();
  164. //}
  165. //void funk3()
  166. //{
  167. //  puts("выполняется функция   funk3");
  168. //  getch();
  169. //}
  170. //
  171. //
Add Comment
Please, Sign In to add comment