Advertisement
CherMi

Lab 12 version 1.0

Nov 21st, 2019
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.15 KB | None | 0 0
  1.  
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #include <stdio.h>
  4. #include <locale.h>
  5. #include <math.h>
  6. #include <errno.h>
  7. #include <string.h>
  8. #include <stdlib.h>
  9.  
  10. double factorial(int n);
  11. double next_series_member(float x, int i);
  12. void print_table(float A, int M, double step, int N);
  13.  
  14. int main()
  15. {
  16.  
  17.     setlocale(LC_ALL, "RUSSIAN");
  18.     int cnt, n, i, N = 0;
  19.     double delta, sh = 0, precision = 0.000001;
  20.     float x;
  21.    
  22.     x = 3.28;
  23.     n = 0;
  24.     sh = 0;
  25.     delta = fabs(sinh(x) - sh);
  26.     while (delta > precision)
  27.     {
  28.         sh = sh + next_series_member(x, n);
  29.         n++;
  30.         delta = fabs(sinh(x) - sh);
  31.     }
  32.     if (n > N) N = n;
  33.  
  34.     x = 7.81;
  35.     n = 0;
  36.     sh = 0;
  37.     delta = fabs(sinh(x) - sh);
  38.     while (delta > precision)
  39.     {
  40.         sh = sh + next_series_member(x, n);
  41.         n++;
  42.         delta = fabs(sinh(x) - sh);
  43.     }
  44.     if (n > N) N = n;
  45.  
  46.     float A = 3;
  47.     double step = 0.1;
  48.     int M = 4;
  49.  
  50.     print_table(A, M, step, N);
  51.     return 0;
  52. }
  53.  
  54. void print_table(float A, int M, double step, int N)
  55. //Печатает таблицу значений sh(x) от 0 до A c шагом step. В таблице M строк.
  56. //При вычислении sh(x) используется N членов ряда.
  57. {
  58.     float x;
  59.     double sh;
  60.     int i, j;
  61.     char *err_msg = "An error has occured";
  62.     double cnt;
  63.  
  64.     cnt = A/step + 1; //Количество необходимых значений
  65.     cnt = ceil(cnt / M);
  66.  
  67.     j = 0; //Кол-во выведенных значений
  68.  
  69.     for (x = 0; x <= A; x += step) //От 0 до A с шагом step
  70.     {
  71.         sh = 0;
  72.         for (i = 0; i <= N; i++)
  73.         {
  74.             sh = sh + next_series_member(x, i);
  75.             if (errno == EDOM || errno == ERANGE) //Проверка на ошибки
  76.             {
  77.                 perror(err_msg);
  78.                 return -1;
  79.             }
  80.         }
  81.         printf("%f    ", sh);
  82.         j++;
  83.  
  84.         if (j == cnt) { //По 9 значений в строке
  85.             printf("\n");
  86.             j = 0;
  87.         }
  88.     }
  89. }
  90.  
  91. double next_series_member(float x, int i) //Возвращает i-ый член ряда разложения sh(x)
  92. {
  93.     return (pow(x, (2 * i + 1)) / factorial(2 * i + 1));
  94. }
  95.  
  96. double factorial(int n) //Возвращает факториал числа n
  97. {
  98.     if (n <= 1) return 1;
  99.     else return n * factorial(n - 1);
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement