Задача: Даны действительные числа [latex]a,b,c,d,e,f,g,h.[/latex] Известно, что точки [latex](e,f)[/latex] и [latex](g,h)[/latex] различны. Известно также, что точки [latex](a,b)[/latex] и [latex](c,d)[/latex] не лежат на прямой [latex]l[/latex], проходящей через точки [latex](e,f)[/latex] и [latex](g,h)[/latex]. Прямая [latex]l[/latex] разбивает координатную плоскость на две полуплоскости. Выяснить, верно ли, что точки [latex](a,b)[/latex] и [latex](c,d)[/latex] принадлежат одной и той же полуплоскости.
a | b | c | d | e | f | g | h | Комментарий: |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | (a,b) и (c,d) принадлежит разным полуплоскостям |
2 | 3 | 7 | 5 | 6 | 3 | 5 | 2 | (a,b) и (c,d) принадлежат одной полуплоскости |
3 | 1545 | 3455 | 4 | 42 | 656,1 | 3445 | 1,56 | (a,b) и (c,d) принадлежат разным полуплоскостям |
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <math.h> using namespace std; int main() { double a, b, c, d, e, f, g, h; //Описание переменных для хранения входных данных. a, b, c, d, e, f, g, h - координаты точек плоскости. double f1, f2; //Описание формул, для нахождения координат точек. scanf("%lf %lf %lf %lf %lf %lf %lf %lf", &a, &b, &c, &d, &e, &f, &g, &h); //Чтение из стандартного потока. // f=(x-e)(h-f)-(y-f)(g-e) - уравнение прямой. f1=(a-e)*(h-f)-(b-f)*(g-e); //Подставляем в f(x,y) точку (a,b) f2=(c-e)*(h-f)-(d-f)*(g-e); //Подставляем в f(x,y) точку (c,d) if (f1>0 && f2>0 || f1<0 && f2<0) printf("Yes"); else printf("No"); return 0; } |
По условию задачи нужно выяснить, верно ли, что точки [latex](a,b)[/latex] и [latex](c,d)[/latex] принадлежат одной и той же полуплоскости. Вводим переменные с типом данных «float», так как координаты входят в множество действительных чисел. Определяем взаимное расположение точек с помощью уравнения прямой: [latex]f=(x-e)(h-f)-(y-f)(g-e)[/latex] .
Если точки лежат в одной полуплоскости, то [latex](a-e)*(h-f)-(b-f)*(g-e)[/latex] и
[latex](c-e)*(h-f)-(d-f)*(g-e)[/latex] – должны быть числами одного знака, если же их знаки противоположны, то точки лежат в разных полуплоскостях.
Для выполнения программы и проверки тестов можно воспользоваться следующим объектом.
Код программы на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) { double a, b, c, d, e, f, g, h, f1, f2; Scanner in = new Scanner(System.in); a = in.nextDouble(); b = in.nextDouble(); c = in.nextDouble(); d = in.nextDouble(); e = in.nextDouble(); f = in.nextDouble(); g = in.nextDouble(); h = in.nextDouble(); f1=(a-e)*(h-f)-(b-f)*(g-e); f2=(c-e)*(h-f)-(d-f)*(g-e); if (f1>0 && f2>0 || f1<0 && f2<0) System.out.println("Yes"); else System.out.println("No"); } } |
— Забыли про laTeX в условии.
— Старайтесь использовать double. Вы теряете в точности и ничего не выигрываете.
— «Для нахождения координат точек…» — что-то вы перемудрили. Координаты ведь известны.
— «воспользуемся формулой уравнения » — так не говорят
Оценку ставлю, но если не исправите замечания за неделю, то снижу вдвое.
Задача отредактирована.
— По Java коду. Вполне достаточно просто вызывать nextDouble() для чтения очередного числа.
— Расставьте правильно отступы в коде.
Исправил код.