Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Программирование на языке C++. Принадлежит ли заданная точка области?

Дмитро Удалов Ученик (29), закрыт 1 год назад
Здравствуйте, нужна помощь в написании программы с использованием "if" и "else", которая говорила бы, принадлежит ли данная точка с координатами X,Y этой области. Использовать &&,||,! -нельзя. Буду благодарен.
Лучший ответ
Victor Surozhtsev Просветленный (35680) 4 года назад
Очень просто:
#include "iostream"
using namespace std;
bool f(double x,double y)
{ double z=x*x+y*y; if (x <= 0.5) if (y >= 0) if (z <= 1) return true; if (x >= 0.5) if (y >= 0) if (z >= 1) return true; return false; }
int main()
{ double x,y; for (;;) { cout << "x y > "; cin >> x >> y; if (f(x,y)) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }
Дмитро УдаловУченик (29) 4 года назад
Вы мой спаситель. Если не трудно, могли бы вы расписать более подробное решение с комментариями. Ибо сейчас эта тема - мой бедрок. А преподаватель не очень хорош.
Victor Surozhtsev Просветленный (35680) Дмитро Удалов, iostream - это заголовочный файл для вызова функций ввода-вывода и пишется не в кавычках " ", а в скобках < > (без пробелов !), но и в кавычках - не ошибка (так, вобщем, тоже можно !), а особенность парсера этого сайта, который стирает бóлее точную запись. Без using namespace std; можно обойтись, но тогда надо будет писать std::cout, std::cin и std::endl. Характеристическая функция точки (х, у) работает так, что последовательность if'ов заменяет собой логическую операцию &&. Её можно и переписать, так как штрихованная область лежит в первом и втором квадранте, то есть при y ≥ 0, а поэтому логику можно и поправить, хотя и так сойдёт! Неравенства нестрогие, так как я посчитал границы области ей принадлежащими. Бесконечный цикл for (;;) { } можно убрать..
Дмитро УдаловУченик (29) 4 года назад
А могли бы вы написать программу только с использованием if и else без for?
Victor SurozhtsevПросветленный (35680) 4 года назад
...но тогда программу надо будет всякий раз перепускáть для проверки вхождения в область новой пробной точки. Без ритуального return 0; можно обойтись - и без него всё прекрасно работает, но ведь главная функция main() типа int, так что у лучше пусть возвращает целый ноль.
Victor SurozhtsevПросветленный (35680) 4 года назад
Да, естественно, можно обойтись и без функции f(x,y), a x и y сделать типа float, вот только в моей системе программирования на C++ кликер стоит и поддерживаются настройки на вывод кириллицы. А в других системах надо писáть всякие там дурацкие сетлокейт-рус, так что даже не знаю, как всё будет работать, если я сделаю запрос на ввод типа: cout << "Введите координаты точки (x,y) >> ";
Дмитро Удалов Ученик (29) Victor Surozhtsev, Будьте добры, сделайте. А по окончанию работы можете скинуть ваши банковские реквизиты, чтобы я вас мог поблагодарить. Сколько не начинал учиться программировать - всегда застревал на этой теме. Но теперь я в вузе и отставать не стоит. ПОэтому хочу в этой теме разобраться на на примере.
Victor SurozhtsevПросветленный (35680) 4 года назад
В общем так:
#include < include > // без пробелов между < и >
using namespace std; int main()
{ float a=0.5,x,y,z; cout << "Введите координаты точки (x,y) >> "; cin >> x >> y; z=x*x+y*y; if (x <= a) if (y >= 0) if (z <= 1) cout << "Принадлежит" << endl; if (x >= a) if (y >= 0) if (z >= 1) cout << "Принадлежит" << endl; else cout << "Не принадлежит" << endl; return 0; }
Victor SurozhtsevПросветленный (35680) 4 года назад
*Тьфу ты!
#include < iostream >
Дмитро УдаловУченик (29) 4 года назад
Можешь пока банковские реквизиты дать. Соточку точно дам.
Victor Surozhtsev Просветленный (35680) Дмитро Удалов, а рабóтает ли всё это как надо? Проверять же нужно! У меня-то да и даже прáвильно, а вообще не знаю... Вася Куролесов вот тоже как-то свинью покупáл, так ему вместо необходимой ему свиньи негодяи-мошенники какую-то псину в мешке подложили ! И лучше уж перевод на мтс-овский телефон +79125980570, чем какие-то банковские реквизиты. Трубку же не беру - занят !..
Дмитро УдаловУченик (29) 4 года назад
Когда вводишь координаты, которые не входят в область, сообщение "Не принадлежит" не выводится в консоль. Недочет, который я заметил.
Victor Surozhtsev Просветленный (35680) Дмитро Удалов, ну вот! А я о чём говорил? Вот из-за такой вот ерунды обычно ракеты и падают! Основной вариант работает верно, в исправленном же варианте else в конце относится лишь к последнему if'у, а не ко всей цепочке if'ов! Пофиксить можно кучей вариантов, например, так: ... "Принадлежит" << endl; if (x >= a) { if (y >= 0) if (z >= 1) cout << "Принадлежит" << endl; goto konec; } cout << "Не принадлежит" << endl; } konec:return 0; }
Victor SurozhtsevПросветленный (35680) 4 года назад
*Да тьфу ты! Вобщем, фигурную скобку } перед konec не нужно !..
Дмитро УдаловУченик (29) 4 года назад
Кстати, денежки пришли?
Victor Surozhtsev Просветленный (35680) Дмитро Удалов, сообщение об этом поступило. Thanks !
inga zajoncИскусственный Интеллект (197046) 4 года назад
Зачем double?
Victor Surozhtsev Просветленный (35680) inga zajonc, за шкафом !..
Остальные ответы
inga zajonc Искусственный Интеллект (197046) 4 года назад
Если область просто окружность с центром в начале координат, находим положение точки в полярных координатах и с помощью одного if проверяем, не будет ли длина вектора больше радиуса:
if (sqrt(x*x+y*y) > r) cout >>"точка вне области";
Если кроме окружности имеем ещё прямую А, отсекающую от неё какой сегмент, проверяем, лежит ли точка ещё и с нужной стороны прямой А.
Для чего записываем уравнение прямой, (x-x0)(y1-y0)-(y-y0)(x1-x0), и если оно равно нулю, точка лежит на прямой, если меньше - правее, если больше - левее. Почему так разбирайтесь сами. x0,y0,x1,y1 - две точки, лежащие на этой прямой.
Если прямых две, проверяем обе.
inga zajoncИскусственный Интеллект (197046) 4 года назад
Если рассматривать уравнение окружности и уравнения прямых как единую систему уравнений решением будет одинаковый знак в решениях всех уравнений - только тогда точка окажется внутри области.
Похожие вопросы