Advertisement
bochkareffsasha

lab4 daniil etition

Dec 29th, 2021
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.25 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #include <string>
  4.  
  5. auto findYEllipse(float x)
  6.  
  7. {
  8.     static const float x0 = -9.5305f; //координаты
  9.     static const int y0 = -7;
  10.     static const int A = 31;
  11.     static const int B = 38;
  12.     struct out { float yPos; float yNeg; }; //Возвращает позитивный и негативный Y в структуре
  13.     float xRelative = x - x0; //X относительно центра
  14.     if (abs(xRelative) > A) // если х находится вне эллипса , то возвращается координата центра (для предотвращения исключений при х стремящемся к точке на эллипсе)
  15.         return out{ y0 , y0 };
  16.     float yRelative = B / A * sqrt(powf(A, 2) - powf(xRelative, 2)); //Y относительно центра
  17.     return out{ y0 + yRelative, y0 - yRelative };
  18. };
  19.  
  20. auto findXEllipse(float y)
  21. {
  22.  
  23.     static const float x0 = -9.5305f; //координаты
  24.     static const int y0 = -7;
  25.     static const int A = 31;
  26.     static const int B = 38;
  27.     struct out { float xPos; float xNeg; }; //Возвращает позитивный и негативный Y в структуре
  28.     float yRelative = y - y0; //X относительно центра
  29.     if (abs(yRelative) > B) //если y находится вне окружности, то возвращается координата центра(для предотвращения исключений при х стремящемся к точке на эллипсе)
  30.         return out{ x0 , x0 };
  31.     float xRelative = A / B * sqrt(powf(B, 2) - powf(yRelative, 2)); //Y относительно центра
  32.     return out{ x0 + xRelative, x0 - xRelative };
  33. }
  34.  
  35. auto findYCircle(float x)
  36. {
  37.     const int x0 = 1; //координаты
  38.     const float y0 = 10.9839f;
  39.     const int R = 31;
  40.     struct out { float yPos; float yNeg; }; //Возвращает позитивный и негативный Y в структуре
  41.     float xRelative = x - x0; //X относительно центра
  42.     if (abs(xRelative) > R) //если x находится вне окружности, то возвращается координата центра(для предотвращения исключений при х стремящемся к точке на эллипсе)
  43.         return out{ y0, y0 };
  44.     float yRelative = sqrt(powf(R, 2) - powf(xRelative, 2)); //Y относительно центра
  45.     return out{ y0 + yRelative, y0 - yRelative };
  46. };
  47.  
  48. auto findXCircle(float y)
  49.  
  50. {
  51.     const int x0 = 1; //координаты
  52.     const float y0 = 10.9839f;
  53.     const int R = 31;
  54.     struct out { float xPos; float xNeg; }; //Возвращает позитивный и негативный X в структуре
  55.     float yRelative = y - y0;
  56.     if (abs(yRelative) > R) //если y находится вне окружности, то возвращается координата центра(для предотвращения исключений при х стремящемся к точке на эллипсе)
  57.         return out{ x0 , x0 };
  58.     float xRelative = sqrt(powf(R, 2) - powf(yRelative, 2));
  59.     return out{ x0 + xRelative, x0 - xRelative };
  60. };
  61.  
  62. float findYCirclePos(float x) //функция , возвращающая положительный Y на окружности при определенном X
  63. {
  64.     return findYCircle(x).yPos;
  65. }
  66.  
  67. float findYEllipsePos(float x) //функция , возвращающая положительный Y на эллипсе при определенном X
  68. {
  69.     return findYEllipse(x).yPos;
  70. }
  71.  
  72. float findYLine(float x) //функция , возвращающая значение Y при определенном X
  73. {
  74.     static const float b = 10.3593f; //координаты
  75.     static const float k = -0.4947f;
  76.     float y = k * x + b;
  77.     return y;
  78. }
  79.  
  80. float rectangleMet(float startgap, float endgap, int stepcount, float (*function)(float)) //функция , находящая определенный интеграл методом прямоугольников
  81. {
  82.     float step = (endgap - startgap) / stepcount; //шаг (элементарная длина основания прямоугольника)
  83.     float height = 0; //сумма Y функции
  84.     for (float i = startgap; i < (endgap - step / 2); i += step)
  85.         height += function(i + step / 2);
  86.     float area = height * step;
  87.     return area;
  88. };
  89.  
  90. float trapezMet(float startgap, float endgap, int stepcount, float (*function)(float)) //функция , находящая определенный интеграл методом трапеций
  91.  
  92. {
  93.     float step = (endgap - startgap) / stepcount; //шаг (элементарная длина основания прямоугольника)
  94.     float height = 0; //сумма Y функции (средних линий трапеций)
  95.     for (float i = startgap; i < (endgap - step / 2); i += step)
  96.         height += (function(i) + function(i + step)) / 2;
  97.     float area = height * step;
  98.     return area;
  99. };
  100.  
  101. float simpsonMet(float startgap, float endgap, int stepcount, float (*function)(float)) //функция , находящая определенный интеграл методом Симпсона
  102. {
  103.     float step = (endgap - startgap) / stepcount; //шаг (элементарная длина основания прямоугольника)
  104.     if (stepcount % 2 > 0) // если количество шагов нечетно , то ошибка
  105.         throw std::exception("Count number must be 2n - even");
  106.     float evenheight = 0; //Сумма Y функций четных измерений
  107.     float oddheight = 0; //Сумма Y функций нечетных измерений
  108.     bool even = false;
  109.  
  110.     for (float i = (startgap + step); i < (endgap - step / 2); i += step)
  111.     {
  112.         if (even)
  113.             evenheight += function(i);
  114.         else
  115.             oddheight += function(i);
  116.         even = !even;
  117.     }
  118.     float area = step / 3 * (function(startgap) + function(endgap) + 2 * evenheight + 4 * oddheight);
  119.     return area;
  120. };
  121.  
  122. float findArea(int stepcount, float (*areaMethod)(float, float, int, float (*)(float))) //функция , которая обрабатывает площадь закрашенных фигур с помощью определенного метода
  123. {
  124.     float rightArea = areaMethod(0, 32, stepcount, findYCirclePos) - areaMethod(0, findXEllipse(0).xPos, stepcount, findYEllipsePos) - areaMethod(findXCircle(0).xPos, 32, stepcount, findYCirclePos);
  125.     float leftArea = areaMethod(-30, -26.9175f, stepcount, findYCirclePos) + areaMethod(-26.9175f, 0, stepcount, findYLine) - areaMethod(-30, findXCircle(0).xNeg, stepcount, findYCirclePos);
  126.     float Area = rightArea + leftArea;
  127.     return Area;
  128. }
  129.  
  130. int main()
  131. {
  132.     setlocale(LC_ALL, "RU");
  133.     std::cout << "Выполнил: Ивченко Д.Я. (КЗИ-21-1Б) - вариант 6" << std::endl
  134.         << "\nСтандартный вывод (при n = 100):\nПо методу прямоугольников: " << findArea(100, rectangleMet)
  135.         << "\nПо методу трапеций: " << findArea(100, trapezMet)
  136.         << "\nПо методу Симпсона: " << findArea(100, simpsonMet) << std::endl;
  137.  
  138.     while (true)
  139.     {
  140.         // Вводим количество шагов и проверяем ввод:
  141.         int stepinput = 0;
  142.         std::string inp = "";
  143.         do
  144.         {
  145.             std::cout << "\nВведите количество шагов (четное число): ";
  146.             try
  147.             {
  148.                 std::cin >> inp; // Ввод
  149.                 stepinput = std::stoi(inp); // Преобразование
  150.                 if ((stepinput % 2 > 0) || (stepinput < 2))
  151.                     throw std::exception();
  152.                 break; // Выход
  153.             }
  154.             catch (std::exception) // сбор ошибок в случае неудачи
  155.             {
  156.                 std::cout << "Неверное количество шагов!" << std::endl;
  157.             }
  158.         } while (true);
  159.         std::cout << "По методу прямоугольников: " << findArea(stepinput, rectangleMet)
  160.             << "\nПо методу трапеций: " << findArea(stepinput, trapezMet)
  161.             << "\nПо методу Симпсона: " << findArea(stepinput, simpsonMet) << std::endl;
  162.         std::cout << "Продолжить? [any|n]: "; // Запрос повтора
  163.         std::string answ = "n";
  164.         std::cin >> answ;
  165.         if ((answ == "n") || (answ == "no")) // Закрытие программы в случае отмены
  166.         {
  167.             return 0;
  168.         }
  169.     }
  170. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement