Условие задачи
Принадлежит ли точка [latex] (x;y) [/latex] фигуре на рисунке?
Код
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> using namespace std; int main(){ double x,y,a; cin >> x >> y; a=x*x+y*y; if (((x>=0)&&(y>=0) && (a<=36))|| ((x>=0)&&(y<=0) && (y>=x-6))) cout << "Yes"; else cout << "No"; return 0; } |
Тесты
Входные данные |
Выходные данные |
|
x | y | |
9 | 0 | No |
-5 | 3 | No |
1 | 2 | Yes |
-3 | 5 | Yes |
1 | -1 | Yes |
4 | -4 | No |
Решение
- Сначала ищем длину отрезка ([latex] a [/latex]) от начала координат к точке [latex] (x;y) [/latex] по формуле: [latex]\sqrt{{({x}_{0}-x)}^{2}+{({y}_{0}-y)}^{2}}[/latex], где [latex]({x}_{0};{y}_{0})[/latex] — координаты начала координат.
- Дальше проверяем, если [latex]a^{2}\leq 36[/latex] (т.е. точка находится в круге, т.к радиус четверти круга равен 6, а, возведя [latex]a[/latex] в квадрат, радиус также нужно возвести в квадрат) и [latex] (x;y) [/latex] находятся в первой четверти координат, то программа выводит «Yes» (можем возвести радиус ([latex] a=\sqrt{x^{2}+y^{2}} [/latex] )в квадрат,т.к. радиус не может быть отрицательным).
- Также, если сумма [latex] x + y [/latex] в четвертой четверти координат не превышает 6, то точка принадлежит треугольнику и программа выводит «Yes».
- В том случае, если тока не принадлежит фигуре, программа выводит «No».
Ссылки
- Условие задачи;
- Код программы на Ideone.com.
— Условие для сектора окружности верное, а вот нижний треугольник Вы описали неверно. Зачем-то опять использовали уравнение окружности, хотя там прямая линия? Естественно, Вы не сделали ни одного теста для этого случая. Добавьте, пожалуйста в тесты точки (1;-1) и (4;-4).
— При проверке принадлежности кругу лучше избегать извлечения корня (долго и с погрешностью) проще возвести радиус в квадрат.
— В математике пишут [latex]\leq[/latex], а не [latex]<=[/latex].
— В формуле для расстояния пропущены скобки под корнем. Так конечно смешнее, но…
— В разных местах Вы по-разному обозначаете точку через её координаты. Мне кажется, что лучше остановиться на таком — (4;2).
Теперь займёмся отступами в программах — во всех Ваших программах есть эта проблема. Посмотрите здесь какие могут быть варианты.
Исправила недочеты:
1.Изменила описание для нижнего треугольника, а также добавила в тесты точки (1;-1) и (4;-4).
2.Возвела неравенство с корнем в квадрат.
3.Скорректировала знак неравенства и добавила недостающие скобки под корнем.
4.Постаралась сделать отступы (здесь и в остальных программах) согласно одному из стилей статьи.
Вы пишите:
«3. Возвела неравенство с корнем в квадрат.»
Обоснуйте. Почему здесь так можно сделать?
— С отступами совсем не получается разобраться? Нет времени? В четверг сделаете у доски доклад на тему отступов. Подготовьтесь, пожалуйста. Или придётся выступать экспромтом.
— Зачем здесь модули? (abs(x)+abs(y))<=6. Обычное уравнение прямой. Конечно всё будет работать правильно. Но бессмысленно брать модуль х если Вы проверили что число положительное. И зачем модуль у, если Вы знаете, что число отрицательное? Будьте проще. В программировании. - Рисунок нужно переделать. Т.е. выбросить. По сравнению с образцом, Вам нужно изменить одну строку path. Просто задайте отрезок, дугу окружности и замкните. Это совсем просто и очень коротко - несколько нажатий на клавиши. Либо исправьте имеющийся рисунок и готовьтесь объяснить, что значат все эти Ваши "points="210.28823852539062,253.5858154296875 294.1705017089844,253.5858154296875 210.28823852539062,167.9200897216797 126.40597534179688,253.5858154296875 210.28823852539062,253.5858154296875 " transform="rotate(-45.36493682861328 210.28823852539065,210.75296020507807)" и прочие художества.
Постаралась разобраться с отступами. С первого раза не удалось,но сейчас вроде бы получилось придерживаться одного стиля в оформлении.
Сделала небольшие изменения в коде и добавила в объяснение решения пояснение о возведении неравенства с корнем в квадрат.
Также,исправила рисунок.
Вот объясните, почему здесь у Вас отступ?
— Вы пишите «(x+y*(-1))<=6". А что плохого в том, чтобы просто написать x - y <= 6? - Два вложенных условных оператора с повторной проверкой того, что x неотрицательный это недопустимо. Вам приходится дважды писать один и тот же код. Пожалуйста, оставьте один условный оператор. Для этого объедините оба условия логической операцией или ||.
Объединила условия логической операцией или, а также исправила отступы.
Молодец. Всё хорошо.
Остался небольшой рефакторинг. Нужно объединить оба условных оператора в один при помощи &&.
Игорь Евгеньевич, исправила всё, объединив оба условных оператора.
Молодец. Зачтено.
Только определитесь куда входит y==0 в первую или во вторую часть условия. Сейчас в обе, а это невозможно.