А60е

ЗадачаБезымянный

Пусть [latex]D[/latex] — заштрихованная часть плоскости (рис.) и пусть [latex]u[/latex] определяется по  [latex] x [/latex] и  [latex] y [/latex] следующим образом (запись [latex] (x, y)[/latex] [latex] \in[/latex] [latex]D [/latex] означает, что точка с координатами [latex] x ,y [/latex] принадлежит [latex] D [/latex]).
[latex]u=\left\{\begin{matrix}x+y,&\left(x,y\right)\in D\\x-y,&\left(x,y\right)\notin D\end{matrix}\right.[/latex]
Код C++
Код C++ на Ideone: www.ideone.com/s6vMul

Код Java

Код Java на Ideone: A60e

 Комментарии

 Для всех трех функций необходимо  проверить чтобы заданная ордината была больше [latex]y=x^{2}[/latex]  и одновременно меньше [latex]y=e^{-x}[/latex] , [latex]y=e^{x}[/latex].

Тесты

x y Результат Комментарий
0 0 0 Пройден
0 1 1 Пройден
34 45 -11 Пройден

Related Images:

А59а

Задача:

Даны действительные числа [latex]x[/latex], [latex]y[/latex]. Определить, принадлежит ли точка с координатами  [latex]x[/latex], [latex]y[/latex] заштрихованной части плоскости.

Снимок

 

x y x*x+y*y r Результат Комментарий
1 1 2 1 Не принадлежит Пройден
0 0 0 1 Принадлежит Пройден
0,5 0,3  0,34 1  Принадлежит  Пройден

 

 

Решение:

Уравнение окружности задается формулой: [latex]\left(x-x_{0} \right)^{2}+\left(y-y_{0} \right)^{2}=r^{2}[/latex].

Так как у нас единичный круг, то [latex]r=1[/latex] и уравнение окружности можно записать следующим образом: [latex]x^{2}+y^{2}=r[/latex].

Что бы точка принадлежала окружности, нужно чтоб выполнялось условие [latex]x^{2}+y^{2}\leq r[/latex].

Если же [latex]x^{2}+y^{2}>r[/latex], то точка не будет принадлежать заштрихованной части.

Работу программы можно посмотреть тут.

 

 

Related Images:

А59з

Задача. Даны действительные числа [latex]x, y[/latex]. Определить, принадлежит ли точка с координатам [latex]x, y[/latex] заштрихованной части плоскости (рис. ниже).

ыфв

Объявляем две переменные [latex]x,y[/latex] типа [latex]double[/latex] (точки могут иметь дробные координаты). Читаем координаты точки. В условии проверяем три пункта:

  1. Лежит ли [latex]y[/latex] выше [latex]-2[/latex] [latex](y>=-2)[/latex].
  2. Находится ли точка между двумя прямыми [latex](|x|<=1)[/latex].
  3. Лежит ли точка ниже диагоналей,описанных функцией [latex]y=|x|[/latex].

Если все эти три условия соблюдены, то точка находится в закрашенной области, иначе вне этой области.

Реализация на Java:

 

 

Related Images:

A59б

Задача:

Для задачи (А.59(б)

Даны действительные числа

Определить, принадлежит ли точка с координатами x, y  заштрихованной области.

X  Y  Ответ
-0.65 -0.75  Yes
-0.95 -0.59 No
700 8 No
0 0 No
0.56 0.75 Yes
1,0011 1,0012 No
0.6 0 Yes

Код программы на С++

Код программы на Java

Поскольку заштрихованная область это круг с «вырезанным кругом» внутри, то для того чтобы определить лежит ли точка в нужной нам области нам достаточно сравнить сумму квадратов координат точек с квадратом радиуса двух окружностей, которые и являются нашими границами.

Если точка лежит на самой окружности, мы считаем что она принадлежит нужной нам области.

Сравнивая полученную величину с радиусами большого и малого круга мы можем уверенно сказать находится ли точка в нужной нам окрестности.

 

Related Images:

Образец: Принадлежит ли точка треугольнику?

Задача. Даны три попарно не совпадающие и не лежащие на одной прямой точки [latex]A, B[/latex] и [latex]C[/latex], заданные своими координатами. Определить принадлежит ли точка [latex]D(x_d,y_d)[/latex] треугольнику [latex]ABC[/latex].
Сразу заметим, что задача легко обобщается для любого выпуклого многоугольника.

Тесты

В тестах нужно обязательно отразить следующие случаи:

  1. Точка строго вне треугольника
  2. Точка строго внутри треугольника
  3. Точка совпадает с одной из вершин треугольника
  4. Точка лежит на одной из сторон треугольника
  5. Точка лежит на продолжении одной из сторон треугольника
  6. Одна из сторон треугольника параллельна одной из осей координат
  7. Две стороны треугольника параллельны осям координат
xa ya xb yb xc yc xd yd Принадлежит?
-1 -1 1 -1 0 1 2 2 нет
-2 -2 1 -1 0 1 0 0 да
-1 -1 1 -1 0 1 0 1 да
-1 -1 1 -1 0 1 0.5 0 да
-1 -1 1 -1 0 1 1 3 нет
-1 -1 1 -1 0 1 0 0 да
0 0 2 0 0 2 1 1 да
0 0 2 0 0 2 5 5 нет

Плохое решение

В школьных учебниках такие задачи часто рекомендуют решать проверкой условия [latex]S_{ABC}=S_{ABD}+S_{BCD}+S_{CAD}[/latex]. При компьютерной реализации это приводит к необходимости сравнения двух действительных чисел на равенство. Эта крайне неприятная операция может быть проделана только с определённой степенью достоверности. Т.е. придётся проверять не превышает ли некоторого «с потолка» выбранного малого числа абсолютное [latex] \left| S_{ABD}+S_{BCD}+S_{CAD}-S_{ABC} \right| < \varepsilon[/latex] или относительное [latex]\left| 1-\frac{S_{ABD}+S_{BCD}+S_{CAD}}{S_{ABC}} \right| < \varepsilon[/latex] отклонение. Оставим эти вопросы для курса численных методов и методов приближённых вычислений и не будем идти по этому пути.

Неплохое решение

Начнём с простого наблюдения:

Все точки треугольника (и любого выпуклого многоугольника) должны лежать по одну сторону от прямой, проходящей через каждую его сторону.

Запишем уравнение прямой, проходящей, например, через точки [latex]A[/latex] и [latex]B[/latex]. Получим [latex] \left( x-x_A \right) \left( y_B-y_A \right)-\left( y-y_A \right) \left( x_B-x_A \right) = 0[/latex]. Уравнение я записал в такой форме, чтобы не приходилось выполнять деление и переживать о нуле в знаменателе.

Неважно как называть стороны, важно научиться их различать.

Неважно как называть стороны, важно научиться их различать.

Теперь для любой точки [latex] \left( x;y \right)[/latex] мы можем вычислить левую часть приведенного равенства. Для точек, лежащих на прямой мы должны получать ноль. В тоже время прямая разобьёт плоскость на две полуплоскости. Точки лежащие в одной полуплоскости будут давать положительные значения. А точки из другой полуплоскости — отрицательные.
Мы готовы проверить первое условие — принадлежит ли точка [latex]D \left( x_d,y_d \right) [/latex] той же полуплоскости, что и точка [latex]C \left( x_c,y_c \right) [/latex] относительно прямой [latex] \left( AB \right) [/latex]? Для этого подставим обе точки в левую часть приведенного выше уравнения прямой и убедимся, что получены значения одного и того же знака. А если одна из точек даст точно ноль? Это означает, что точка лежит на прямой. По условию задачи это может быть только точка [latex]D[/latex]. Тогда она принадлежит треугольнику независимо от знака выражения, вычисленного для точки [latex]C[/latex].

Обратите внимание, что мы не утверждаем, что для любой точки на прямой наши приближённые вычисления обязаны дать точный ноль. Это было бы неверно. Мы только утверждаем, что если проведенные с доступной нам точностью вычисления всё же дали точный ноль, то мы вынуждены считать данную точку лежащей на данной прямой.

Естественно, что нам придётся записать аналогичные условия для двух оставшихся сторон треугольника (или для всех оставшихся сторон выпуклого многоугольника).

Плохой код

Начнём с того, что объявим переменные и прочитаем их значения. После этого запишем одно очень громоздкое условие, которое и проверяет принадлежность.

Нажмите здесь, чтобы выполнить этот код.

Приведенный код имеет существенные недостатки. Нам пришлось трижды записывать уравнение прямой проходящей через две точки и дважды подставлять в каждое из них координаты, чтобы проверить знак. Это значит, что нам пришлось шесть раз написать некоторую формулу с различными подстановками. При том подходе, что мы использовали имеем две проблемы. Во-первых, условие стало слишком сложным, чтобы его можно было легко воспринять. Во-вторых, и это гораздо хуже, такой код в [latex]\frac { 1-{ \left( 1-p \right) }^{ 6 } }{ p }[/latex] раз увеличивает вероятность совершить ошибку. Забавно, но это означает, что вероятность ошибки начинающего программиста увеличивается вдвое, а у опытного — в шесть раз. Хорошо, что опытные программисты не пишут такой код.

Неплохой код

Воспользуемся тем, что мы уже умеем создавать собственные функции для того, чтобы несколько сократить объём кода и сделать его более лёгким для восприятия.
Запишем условие на языке программирования С++:

Нажмите здесь, чтобы выполнить этот код.
Трудно сказать, стал ли код боле понятным или лаконичным. Однако можно точно сказать, что в нём отсутствуют повторяющиеся алгоритмические блоки. Все участки кода написаны строго по одному разу. Это уменьшает вероятность ошибки.

Чеширский код

Этот код содержит пока не изученные вами конструкции. Из-за этого он может показаться немного загадочным. Но если продолжать грызть гранит науки, то всё легко освоите. Или можно подождать...

Этот код содержит пока не изученные вами конструкции. Из-за этого он может показаться немного загадочным. Но если продолжать грызть гранит науки, то всё легко освоите. Или можно подождать…

Возможно слишком смело называть это хорошим кодом, но мы сделаем ещё один шаг в нужном направлении. В прошлом коде мы избавились от повторов в кодировании алгоритма. Однако остались повторы в кодировании данных. Вы заметили, что у нас четыре пары переменных? Т.е. просматривается структура состоящая из пары координат x и y, которую стоит объединить и назвать «точкой». Такие структуры в программировании на Си описывают с помощью ключевого слова struct. Это полезная промежуточная структура перед переходом к объектно-ориентированному программированию при помощи классов.

Нажмите здесь, чтобы выполнить этот код.
Вы заметили как забавно увеличивается размер программы по мере того, как мы пытаемся сделать его более логичным и наглядным? Это характерно для маленьких программ. Такие дополнительные структуры становятся всё более оправданными для больших и огромных программ.

Related Images:

А60б

Задача:  Пусть [latex]D[/latex] — заштрихованная часть плоскости и пусть [latex]u[/latex] определяется по [latex]x[/latex] и [latex]y[/latex] следующим образом ( запись [latex](x, y)\epsilon D[/latex] означает, что точка с координатами [latex]x[/latex], [latex]y[/latex] принадлежит [latex]D[/latex]):

[latex]u=\left\{\begin{matrix}-3, \text{if} (x, y)\epsilon D\\ y^{2} \end{matrix}\right.[/latex]

Даны действительные числа [latex]x[/latex] и [latex]y[/latex]. Определить  [latex]u[/latex].

Код на С++:

 

Тесты:

[latex]x[/latex] [latex]y[/latex] Результат

[latex]u[/latex]

[latex]0[/latex] [latex]0[/latex] [latex]-3[/latex]
[latex]0[/latex] [latex]1[/latex] [latex]1. 00[/latex]
[latex]1[/latex] [latex]0[/latex] [latex]-3[/latex]
[latex]-1[/latex] [latex]0[/latex] [latex]0. 00[/latex]
[latex]0[/latex] [latex]-1[/latex] [latex]-3[/latex]
[latex]0,6[/latex] [latex]0,8[/latex] [latex]0. 64[/latex]
[latex]0,5[/latex] [latex]-0,5[/latex] [latex]-3[/latex]

 

Код на Java:

 

 

Безымянный

Для того, чтобы определить находится ли нужная точка с координатами [latex](x,y)[/latex] в заштрихованной части графика, нужно задать такое условие, чтобы эта точка находилась в круге [latex]x^{2}+y^{2}=1[/latex] и была ниже прямой [latex]y=\frac{x}{2}[/latex].

Отсюда следует, что если [latex]x^{2}+y^{2}\leqslant1[/latex] и [latex]y\leqslant\frac{x}{2}[/latex], то точка принадлежит заштрихованной части круга.

Результат [latex]u[/latex] выводится с точностью до двух знаков после запятой.

Запустить код и проверить тесты можно тут: http://ideone.com/N3UoQ7.

Related Images: