Даны действительные числа [latex]x, y[/latex]. Определить, принадлежит ли точка с координатами [latex]x, y[/latex] заштрихованной части плоскости.
Вычислил уравнения прямых по формуле :
[latex]\frac{x-x_{a}}{x_{b}-x_{a}}=\frac{y-y_{a}}{y_{a}-y_{b}}[/latex]Получил уравнения :
[latex]y=2x+3[/latex], [latex]y=-x[/latex], [latex]y=\frac{x-1}{3}[/latex]Плоскость разделил на верхнюю и нижнюю части осью ox([latex]y\geq 0[/latex], [latex]y\leq 0[/latex]), при помощи первых двух уравнений выделил заштрихованную область в верхней части, при помощи первого и третьего соответственно в нижней(изменив знак «=» на «≥» или «≤»(в зависимости от того где должна лежать точка для выполнения условия) ).
Тесты:
[latex]x[/latex] | [latex]y[/latex] | Результат: |
-2 | -1 | Точка входит в заштрихованную область. |
-2 | -1.001 | Точка не входит в заштрихованную область. |
-2 | -0.999 | Точка не входит в заштрихованную область. |
-1 | 1 | Точка входит в заштрихованную область. |
-1.001 | 1 | Точка не входит в заштрихованную область. |
-1 | 1.001 | Точка не входит в заштрихованную область. |
-1 | 0.999 | Точка входит в заштрихованную область. |
1 | 0 | Точка входит в заштрихованную область. |
1 | -0.001 | Точка не входит в заштрихованную область. |
Сам код:
1 2 3 4 5 6 7 8 9 10 11 |
using namespace std; int main() { double x, y; cin >> x >> y; if(y>=0 && y<=-x && x>=(y-3)/2 || y<=0 && x>=(y-3)/2 && y>=(x-1)/3) cout << "Точка входит в заштрихованную область."; else cout << "Точка не входит в заштрихованную область."; return 0; } |
Похоже, что программа написана верно, да и тесты хорошо составлены.
Но, к сожалению, у Вас совсем не описано в отчете как получено логическое выражение x>=-2 && x<=0 && y>=0 && y<=1 && y<=-x && x>=(y-3)/2 || x>=-2 && x<=1 && y>=-1 && y<=0 && x>=(y-3)/2 && y>=(x-1)/3. Выражение довольно сложное, действительно, вы правильно заметили, что его можно сделать короче. Как по мне, впрочем, подходит и такое, слегка избыточное, логическое выражение — т.к. в нем присутствует определенная логика, которую Вы и должны последовательно изложить в отчете.
Изначально я прописывал так: условия через «лог. и» для каждой прямой(предварительно вычислив формулы для составления неравенства) разделив условия для прямых «лог. или», но программа работала не верно в силу того что области прямой y=2x+3 и y=(x-1)/3 пересекаются, по этому я разделил плоскость на две части что и решило мою проблему.
Немного дополню и от себя.
Начну с приятного для нас всех — программа работает правильно!
Конечно, при такой скорости Вашей работы (одна программа в месяц) на окончание первого семестра у Вас уйдёт целый год. Но раз что-то получается, то есть по крайней мере принципиальная возможность продолжать учёбу. Это радует и вселяет надежду.
Теперь о грустном:
— Отсутствует пояснение. Одной «волшебной» формулы мало. Нужно объяснить как Вы её получили и как рассуждали.
— Судя по формуле (x>=-2 && x<=0 && y>=0 && y<=1 && y<=-x && x>=(y-3)/2 || x>=-2 && x<=1 && y>=-1 && y<=0 && x>=(y-3)/2 && y>=(x-1)/3), Вы разбили заштрихованную область на два треугольника. Один над осью Ох, другой под ней. Это означает, что условия y>=0 (для верхнего треугольника) и y<=0 (для нижнего) вполне уместны. Остальные стороны треугольников не являются вертикальными или горизонтальными. А значит условия где присутствует только х или только у не имеют отношения к задаче. Остаётся по три условия для каждого треугольника. Они соответствуют сторонам треугольников. Их и нужно оставить. Сможете переделать? - "Определить принадлежит ли точка заштрихованной области" -- это не ключевое слово. Это целое предложение. В метках допустимы только слова или словосочетания. Разбейте это предложение на слова и словосочетания и заведите каждое отдельно.
Все исправил.
Зачтено.