bogdan2004333

Untitled

Nov 5th, 2022
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.40 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <locale.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7.  
  8. #define COLUMN_NUMBER 4 // число столбцов таблицы
  9. struct I_print {        // данные для печати результатов интегрирования
  10.     char *name;         // название функции
  11.     double i_sum;       // значение интегральной суммы
  12.     double i_toch;      // точное значение интеграла
  13.     int n;              // число разбиений области интегрирования  при котором достигнута требуемая точность
  14. };
  15.  
  16. void printDividingLine(const char horizontalSybmol, const char connectorSybmol, const int m, const int *wn) {
  17.     putchar(connectorSybmol);
  18.     for (int line_i = 0; line_i < m; line_i++) {
  19.         for (int line_j = 0; line_j < wn[line_i]; line_j++) {
  20.             putchar(horizontalSybmol);
  21.         }
  22.         putchar(connectorSybmol);
  23.     }
  24.     putchar('\n');
  25. }
  26.  
  27. void PrintTabl(struct I_print i_prn[], int k) {
  28.     const char SIDE_SYBMOL = '|';
  29.     const char HORIZONTAL_SYBMOL = '-';
  30.     const char CONNECTOR_SYBMOL = '+';
  31.  
  32.     int wn[COLUMN_NUMBER] = {12, 18, 18, 10};   // ширина столбцов таблицы
  33.     char *title[COLUMN_NUMBER] = {(char *) "Function", (char *) "Integral", (char *) "IntSum", (char *) "N "};
  34.     int size[COLUMN_NUMBER];
  35.     for (int i = 0; i < COLUMN_NUMBER; i++) {
  36.         size[i] = (int) strlen(title[i]);
  37.     }
  38.  
  39.     // шапка таблицы
  40.     printDividingLine(HORIZONTAL_SYBMOL, CONNECTOR_SYBMOL, COLUMN_NUMBER, wn);
  41.  
  42.     putchar(SIDE_SYBMOL);
  43.     for (int line_i = 0; line_i < COLUMN_NUMBER; line_i++) {
  44.         int half = (wn[line_i] - size[line_i]) / 2;
  45.         for (int line_j = 0; line_j < half; line_j++) {
  46.             putchar(' ');
  47.         }
  48.         printf("%s", title[line_i]);
  49.         for (int line_j = 0; line_j < half; line_j++) {
  50.             putchar(' ');
  51.         }
  52.         putchar(SIDE_SYBMOL);
  53.     }
  54.     putchar('\n');
  55.  
  56.     printDividingLine(HORIZONTAL_SYBMOL, CONNECTOR_SYBMOL, COLUMN_NUMBER, wn);
  57.  
  58.     // заполнение таблицы
  59.     for (int i = 0; i < k; i++) {
  60.         putchar(SIDE_SYBMOL);
  61.         printf("%12s", i_prn[i].name);
  62.         putchar(SIDE_SYBMOL);
  63.  
  64.         char i_toch[15];
  65.         sprintf(i_toch, "%.10f", i_prn[i].i_toch);
  66.         printf("%18s", i_toch);
  67.         putchar(SIDE_SYBMOL);
  68.  
  69.         char i_sum[15];
  70.         sprintf(i_sum, "%.10f", i_prn[i].i_sum);
  71.         printf("%18s", i_sum);
  72.         putchar(SIDE_SYBMOL);
  73.  
  74.         printf("%10d", i_prn[i].n);
  75.         putchar(SIDE_SYBMOL);
  76.         putchar('\n');
  77.         printDividingLine(HORIZONTAL_SYBMOL, CONNECTOR_SYBMOL, COLUMN_NUMBER, wn);
  78.     }
  79. }
  80.  
  81. //ранндом
  82. double irandom(int low, int up) {
  83.     int num = (rand() % (up - low + 1)) + low;
  84.     return num;
  85. }
  86.  
  87. //функции
  88. double f1(double x) {
  89.     return x;
  90. }
  91.  
  92. double f2(double x) {
  93.     return sin(22 * x);
  94. }
  95.  
  96. double f3(double x) {
  97.     return pow(x, 4);
  98. }
  99.  
  100. double f4(double x) {
  101.     return atan(x);
  102. }
  103.  
  104. //указатель на функцию
  105. typedef double (*TPF)(double);
  106.  
  107. //метод прямоугольников
  108. double IntRect(TPF f, double a, double b, double eps, int *n) {
  109.     double res1 = 0.0;
  110.     double res = 0.0;
  111.     double delta;
  112.     do {
  113.         double h = ((b - a) / *n);
  114.         double h1 = ((b - a) / (*n * 2));
  115.         for (int i = 0; i < *n; i++) {
  116.             res += f(a + h / 2 + i * h);
  117.         }
  118.         res *= h;
  119.         for (int i = 0; i < *n; i++) {
  120.             res1 += f(a + h1 / 2 + i * h1);
  121.         }
  122.         res1 *= h1;
  123.         delta = (fabs(res1 - res)) / 3;
  124.         *n *= 2;
  125.     } while (delta > eps && *n < 100000);
  126.     return res;
  127. }
  128.  
  129. //метод трапеций
  130. double InTrap(TPF f, double a, double b, double eps, int *n) {
  131.     double res = f(a) + f(b);
  132.     double res1 = f(a) + f(b);
  133.     double delta;
  134.     do {
  135.         double h = ((b - a) / *n);
  136.         double h1 = ((b - a) / (*n * 2));
  137.         for (int i = 0; i < *n; i++) {
  138.             res += 2 * f(a + i * h);
  139.         }
  140.         res *= h / 2;
  141.         for (int i = 0; i < *n; i++) {
  142.             res1 += 2 * f(a + i * h1);
  143.         }
  144.         res1 *= h1 / 2;
  145.         delta = (fabs(res1 - res)) / 3;
  146.         *n *= 2;
  147.     } while (delta > eps && *n < 100000);
  148.     return res;
  149. }
  150.  
  151. double a1, b1;
  152.  
  153. int main() {
  154.     int n = 1;
  155.     setlocale(LC_ALL, "Russian");
  156.     srand(time(0));
  157.     rand();
  158.     a1 = irandom(0, 1);
  159.     b1 = irandom(2, 3);
  160.     //массив указателей функций
  161.     TPF arrfunc[4] = {f1, f2, f3, f4};
  162.     //массив названий функций
  163.     char *arrfuncname[4] = {"y=x", "y=sin(22x)", "y=x^4", "y=arctan(x)"};
  164.     //массив погрешностей
  165.     double arreps[5] = {0.01, 0.001, 0.0001, 0.00001, 0.000001};
  166.     double x = (pow(b1, 2) - pow(a1, 2)) / 2.0;
  167.     double x1 = (cos(a1 * 22.0) - cos(b1 * 22.0)) / 22.0;
  168.     double x2 = (pow(b1, 5) - pow(a1, 5)) / 5.0;
  169.     double x3 = b1 * atan(b1) - a1 * atan(a1) - (log(b1 * b1 + 1) - log(a1 * a1 + 1)) / 2.0;
  170.     //массив функций для сравнения
  171.     double arrfunc1[4] = {x, x1, x2, x3};
  172.  
  173. //вывод метода прямоугольников
  174.     struct I_print saverect[4];
  175.     for (int i = 0; i < 5; i++) {
  176.         printf("Значение a: %.lf\nЗначение b: %.lf\nМетод прямоугольников. eps = %lf.\n", a1, b1, arreps[i]);
  177.         for (int j = 0; j < 4; j++) {
  178.             saverect[j].name = arrfuncname[j];
  179.             saverect[j].i_toch = arrfunc1[j];
  180.             saverect[j].i_sum = IntRect(arrfunc[j], a1, b1, arreps[i], &n);
  181.             saverect[j].n = n;
  182.             n = 1;
  183.  
  184.         }
  185.         PrintTabl(saverect, 4);
  186.     }
  187.     //вывод метода трапеций
  188.     struct I_print savetrap[4];
  189.     for (int i = 0; i < 5; i++) {
  190.         printf("Значение a: %.lf\nЗначение b: %.lf\nМетод трапеций. eps = %lf.\n", a1, b1, arreps[i]);
  191.         for (int j = 0; j < 4; j++) {
  192.             savetrap[j].name = arrfuncname[j];
  193.             savetrap[j].i_toch = arrfunc1[j];
  194.             savetrap[j].i_sum = InTrap(arrfunc[j], a1, b1, arreps[i], &n);
  195.             savetrap[j].n = n;
  196.             n = 1;
  197.  
  198.         }
  199.         PrintTabl(savetrap, 4);
  200.     }
  201.  
  202.  
  203.     return 0;
  204. }
Advertisement
Add Comment
Please, Sign In to add comment