Advertisement
Leeen

Lab for Bezus №2 ver 2

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