Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- auto findYEllipse(float x)
- {
- static const float x0 = -9.5305f; //координаты
- static const int y0 = -7;
- static const int A = 31;
- static const int B = 38;
- struct out { float yPos; float yNeg; }; //Возвращает позитивный и негативный Y в структуре
- float xRelative = x - x0; //X относительно центра
- if (abs(xRelative) > A) // если х находится вне эллипса , то возвращается координата центра (для предотвращения исключений при х стремящемся к точке на эллипсе)
- return out{ y0 , y0 };
- float yRelative = B / A * sqrt(powf(A, 2) - powf(xRelative, 2)); //Y относительно центра
- return out{ y0 + yRelative, y0 - yRelative };
- };
- auto findXEllipse(float y)
- {
- static const float x0 = -9.5305f; //координаты
- static const int y0 = -7;
- static const int A = 31;
- static const int B = 38;
- struct out { float xPos; float xNeg; }; //Возвращает позитивный и негативный Y в структуре
- float yRelative = y - y0; //X относительно центра
- if (abs(yRelative) > B) //если y находится вне окружности, то возвращается координата центра(для предотвращения исключений при х стремящемся к точке на эллипсе)
- return out{ x0 , x0 };
- float xRelative = A / B * sqrt(powf(B, 2) - powf(yRelative, 2)); //Y относительно центра
- return out{ x0 + xRelative, x0 - xRelative };
- }
- auto findYCircle(float x)
- {
- const int x0 = 1; //координаты
- const float y0 = 10.9839f;
- const int R = 31;
- struct out { float yPos; float yNeg; }; //Возвращает позитивный и негативный Y в структуре
- float xRelative = x - x0; //X относительно центра
- if (abs(xRelative) > R) //если x находится вне окружности, то возвращается координата центра(для предотвращения исключений при х стремящемся к точке на эллипсе)
- return out{ y0, y0 };
- float yRelative = sqrt(powf(R, 2) - powf(xRelative, 2)); //Y относительно центра
- return out{ y0 + yRelative, y0 - yRelative };
- };
- auto findXCircle(float y)
- {
- const int x0 = 1; //координаты
- const float y0 = 10.9839f;
- const int R = 31;
- struct out { float xPos; float xNeg; }; //Возвращает позитивный и негативный X в структуре
- float yRelative = y - y0;
- if (abs(yRelative) > R) //если y находится вне окружности, то возвращается координата центра(для предотвращения исключений при х стремящемся к точке на эллипсе)
- return out{ x0 , x0 };
- float xRelative = sqrt(powf(R, 2) - powf(yRelative, 2));
- return out{ x0 + xRelative, x0 - xRelative };
- };
- float findYCirclePos(float x) //функция , возвращающая положительный Y на окружности при определенном X
- {
- return findYCircle(x).yPos;
- }
- float findYEllipsePos(float x) //функция , возвращающая положительный Y на эллипсе при определенном X
- {
- return findYEllipse(x).yPos;
- }
- float findYLine(float x) //функция , возвращающая значение Y при определенном X
- {
- static const float b = 10.3593f; //координаты
- static const float k = -0.4947f;
- float y = k * x + b;
- return y;
- }
- float rectangleMet(float startgap, float endgap, int stepcount, float (*function)(float)) //функция , находящая определенный интеграл методом прямоугольников
- {
- float step = (endgap - startgap) / stepcount; //шаг (элементарная длина основания прямоугольника)
- float height = 0; //сумма Y функции
- for (float i = startgap; i < (endgap - step / 2); i += step)
- height += function(i + step / 2);
- float area = height * step;
- return area;
- };
- float trapezMet(float startgap, float endgap, int stepcount, float (*function)(float)) //функция , находящая определенный интеграл методом трапеций
- {
- float step = (endgap - startgap) / stepcount; //шаг (элементарная длина основания прямоугольника)
- float height = 0; //сумма Y функции (средних линий трапеций)
- for (float i = startgap; i < (endgap - step / 2); i += step)
- height += (function(i) + function(i + step)) / 2;
- float area = height * step;
- return area;
- };
- float simpsonMet(float startgap, float endgap, int stepcount, float (*function)(float)) //функция , находящая определенный интеграл методом Симпсона
- {
- float step = (endgap - startgap) / stepcount; //шаг (элементарная длина основания прямоугольника)
- if (stepcount % 2 > 0) // если количество шагов нечетно , то ошибка
- throw std::exception("Count number must be 2n - even");
- float evenheight = 0; //Сумма Y функций четных измерений
- float oddheight = 0; //Сумма Y функций нечетных измерений
- bool even = false;
- for (float i = (startgap + step); i < (endgap - step / 2); i += step)
- {
- if (even)
- evenheight += function(i);
- else
- oddheight += function(i);
- even = !even;
- }
- float area = step / 3 * (function(startgap) + function(endgap) + 2 * evenheight + 4 * oddheight);
- return area;
- };
- float findArea(int stepcount, float (*areaMethod)(float, float, int, float (*)(float))) //функция , которая обрабатывает площадь закрашенных фигур с помощью определенного метода
- {
- float rightArea = areaMethod(0, 32, stepcount, findYCirclePos) - areaMethod(0, findXEllipse(0).xPos, stepcount, findYEllipsePos) - areaMethod(findXCircle(0).xPos, 32, stepcount, findYCirclePos);
- float leftArea = areaMethod(-30, -26.9175f, stepcount, findYCirclePos) + areaMethod(-26.9175f, 0, stepcount, findYLine) - areaMethod(-30, findXCircle(0).xNeg, stepcount, findYCirclePos);
- float Area = rightArea + leftArea;
- return Area;
- }
- int main()
- {
- setlocale(LC_ALL, "RU");
- std::cout << "Выполнил: Ивченко Д.Я. (КЗИ-21-1Б) - вариант 6" << std::endl
- << "\nСтандартный вывод (при n = 100):\nПо методу прямоугольников: " << findArea(100, rectangleMet)
- << "\nПо методу трапеций: " << findArea(100, trapezMet)
- << "\nПо методу Симпсона: " << findArea(100, simpsonMet) << std::endl;
- while (true)
- {
- // Вводим количество шагов и проверяем ввод:
- int stepinput = 0;
- std::string inp = "";
- do
- {
- std::cout << "\nВведите количество шагов (четное число): ";
- try
- {
- std::cin >> inp; // Ввод
- stepinput = std::stoi(inp); // Преобразование
- if ((stepinput % 2 > 0) || (stepinput < 2))
- throw std::exception();
- break; // Выход
- }
- catch (std::exception) // сбор ошибок в случае неудачи
- {
- std::cout << "Неверное количество шагов!" << std::endl;
- }
- } while (true);
- std::cout << "По методу прямоугольников: " << findArea(stepinput, rectangleMet)
- << "\nПо методу трапеций: " << findArea(stepinput, trapezMet)
- << "\nПо методу Симпсона: " << findArea(stepinput, simpsonMet) << std::endl;
- std::cout << "Продолжить? [any|n]: "; // Запрос повтора
- std::string answ = "n";
- std::cin >> answ;
- if ((answ == "n") || (answ == "no")) // Закрытие программы в случае отмены
- {
- return 0;
- }
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement