C/C++

Задача о принадлежности точки некоторой области на С++

Дана точка на плоскости с координатами (х, у). Составить программу на С++, которая выдает одно из сообщений "Точка принадлежит области", "Точка не принадлежит области", "Точка на границе области" в зависимости от того, лежит ли точка внутри заштрихованной области, вне заштрихованной области или на ее границе.
Области задаются графически следующим образом:

Farruh Kadirov
Farruh Kadirov
67
  Ясно. Задача на программирование условных ветвлений.

  Сначала задаём квадрат в пределах: x ∈ [–23; 0], y ∈ [0; 23]. Потом внутри квадрата локализуем треугольник верхней полуплоскости относительно диагонали. Уравнение диагонали y = –x, значит, верхняя полуплоскость задаётся y ≥ –x.

  Составное условие попадания точки за пределы области:

    (y > 23 || x > 0 || y < -x)

• eсли это условие нарушается, значит точка принадлежит области или границе.

  Составное условие попадания точки внутрь области:

    (y < 23 && y > -x && x < 0)

• не забываем, что это условие противопоставляется первому, поэтому оно так упрощено!

  Условие попадания точки на границу области не требуется, поскольку оно противопоставляется двум другим.

  Таким образом блок локализации точки выглядит следующим образом:

if (y > 23 || x > 0 || y < -x) S = "не принадлежит";
else if (y < 23 && y > -x && x < 0) S = "принадлежит";
else S = "на границе";

✓ Кстати, то же самое можно оформить ввиде тернарной операции.

  И довольно простой вывод:

std::cout << "Точка " << S << " области";

  Осталось оформить решение внутри функции main(), объявить переменные x, y, S, запрограммировать ввод начальных данных (x, y) и добавить сверху:

#include <iostream>
#include <string>
Артур Багдасарян
Артур Багдасарян
16 172
Лучший ответ
Farruh Kadirov Благодарю Вас за подробное объяснение!!!
Артур Багдасарян Кстати, при желании можно не только оформить блок локализации точки ввиде тернарника, но и внести его в оператор вывода — это позволяет отказаться от переменной S.

✓ И. М. Х. О. ›⟩  Но выглядит это безобразно!!! В таком нагромождении легко запутаться; угроза случайных ошибок возрастает!
#include <iostream>
#include <string>
using namespace std;
double coord(const char* msg) {
cout << msg;
double value;
cin >> value;
cin.ignore(cin.rdbuf()->in_avail());
return value;
}
int main() {
const double a = 23;
string res = "inside";
string out = "outside";
string border = "on the border";
auto x = coord("x: ");
auto y = coord("y: ");
if (fabs(x) > a || fabs(y) > a) res = out;
else if (y < 0) res = out;
else if (x > 0) res = out;
else if (x == 0) res = border;
else if (y == a) res = border;
else if (y == -x) res = border;
else if (y < -x) res = out;
cout << "The point lies " << res << ".\n";
system("pause > nul");
}
Олжас Жусупов
Олжас Жусупов
76 236
Farruh Kadirov можно чуть проще?