Advertisement
Leeen

Lab for Bezus №2

Sep 30th, 2018
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. // Лабораторная работа для Безуса № 2
  2. #include <iostream>
  3. #include <cmath>
  4. #include <vector>
  5.  
  6. #define PI 3.1415
  7.  
  8. using namespace std;
  9.  
  10. // Рассчет факториала
  11. double factorial(int n)
  12. {
  13.     if (n == 0) return 1;
  14.     else return n * factorial(n - 1);
  15. }
  16.  
  17.  
  18. // Рассчет последнего значения функции
  19. double  getValue(int n, int x)
  20. {
  21.     return (pow(2, (n / 2)) * cos((PI * n) / 4) * pow(x, n)) / factorial(n);
  22. }
  23.  
  24.  
  25. // Получение точности рассчета
  26. vector<double> lastEpsilon;
  27. double InputEpsilon(int n, int x, double sum)
  28. {
  29.     if (lastEpsilon.size() > n)
  30.         return lastEpsilon[n];
  31.     else {
  32.         double epsilon = abs((getValue(n + 1, x)) / sum);
  33.         lastEpsilon.push_back(epsilon);
  34.         return epsilon;
  35.     }
  36. }
  37.  
  38.  
  39.  
  40. // Получение суммы значений
  41. vector<double> savedSum;
  42. double getSum(int n, double x) {
  43.     if (savedSum.size() > n) {
  44.         return savedSum[n];
  45.     }
  46.     else
  47.     {
  48.         double sum = 0;
  49.         if (savedSum.size() > 0)
  50.             sum = savedSum[n - 1];
  51.         sum += getValue(n, x);
  52.         savedSum.push_back(sum);
  53.         return sum;
  54.     }
  55. }
  56.  
  57. // Метод вывода всех значений
  58. void output(int countIteration, double sum, double lastValue, double epsilon) {
  59.     cout << "Iteration: " << countIteration << endl;
  60.     cout << "Sum: " << sum << endl;
  61.     cout << "Last Value: " << lastValue << endl;
  62.     cout << "Epsilon: " << epsilon << endl;
  63. }
  64.  
  65.  
  66. // Поиск значения Эпсилон для введенного альфа
  67. int searchIndexEpsilon(vector<double> vector, double searchItem)
  68. {
  69.     for (int i = 0; i < vector.size(); i++)
  70.     {
  71.         if (vector[i] <= searchItem)
  72.             return i;
  73.     }
  74.  
  75.     return -1;
  76. }
  77.  
  78. // Ввод x
  79. double inputX() {
  80.     int x;
  81.     cout << "x: ";
  82.     cin >> x;
  83.     cin.clear();
  84.     if (cin.get() != '\n') {
  85.  
  86.         while (cin.get() != '\n');
  87.         cout << "Error inputing! try again" << endl;
  88.         return inputX();
  89.  
  90.     }
  91.     return x;
  92. }
  93.  
  94. // Ввод альфа
  95. double inputA() {
  96.     double a;
  97.     cout << "a: ";
  98.     cin >> a;
  99.     cin.clear();
  100.     if (cin.get() != '\n') {
  101.  
  102.         while (cin.get() != '\n');
  103.         cout << "Error inputing! try again" << endl;
  104.         return inputA();
  105.  
  106.     }
  107.     return a;
  108. }
  109.  
  110. int main()
  111. {
  112.     vector<double> savedValue;
  113.    
  114.     cout << "Enter a value for x and a" << endl;
  115.  
  116.     int lastX = 0;
  117.     double epsilon;
  118.     double sum = 0;
  119.     double lastValue;
  120.  
  121.     // Ввод параметра x и значения альфа
  122.     double x = inputX();
  123.     double alpha = inputA();
  124.  
  125.     int size = savedSum.size();
  126.  
  127.     // Если второе число больше 1, то принимаем его за число слагаемых ряда для суммирования
  128.     if (alpha >= 1)
  129.     {
  130.         for (int i = size; i < alpha; i++)
  131.         {
  132.             lastValue = getValue(i, x);
  133.             sum = getSum(i, x);
  134.             epsilon = InputEpsilon(i, x, sum);
  135.             output(size, sum, lastValue, epsilon);
  136.         }
  137.     }
  138.  
  139.     // Если введенное альфа меньше 1
  140.     else
  141.     {
  142.         int savedIndex = searchIndexEpsilon(lastEpsilon, alpha);
  143.         int currentEpsilon = 1;
  144.         if (savedIndex == -1)
  145.         {
  146.             while (currentEpsilon > alpha)
  147.             {
  148.                 lastValue = getValue(savedValue.size(), x);
  149.                 sum = getSum(savedSum.size(), x);
  150.                 currentEpsilon = InputEpsilon(lastEpsilon.size(), x, sum);
  151.                 output(lastEpsilon.size() - 1, sum, lastValue, currentEpsilon);
  152.             }
  153.         }
  154.     }
  155.  
  156.     system("pause");
  157.     return 0;
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement