Задача. Даны действительный числа [latex]a[/latex], [latex]b[/latex], [latex]c[/latex], [latex]d[/latex], [latex]s[/latex], [latex]t[/latex], [latex]u[/latex]([latex]s[/latex] и [latex]t[/latex] одновременно не равны нулю). Известно, что точки [latex](a, b)[/latex] и [latex](c, d)[/latex] не лежат на прямой [latex]l[/latex], заданной уравнением [latex]sx+ty+u=0[/latex]. Прямая [latex]l[/latex] заданной уравнением [latex]sx+ty+u=0[/latex]. Прямая [latex]l[/latex] разбивает координатную плоскость на две полуплоскости. Выяснить, верно ли, что точки [latex](a, b)[/latex] и [latex](c, d)[/latex] принадлежат разным полуплоскостям.
В этой задаче надо воспользоваться тем, что две точки [latex](a, b)[/latex] и [latex](c, d)[/latex], не лежащие на прямой, определяемой уравнением [latex]sx + ty + u = 0[/latex], принадлежат одной полуплоскости, если [latex]sa + tb + u[/latex] и [latex]sc + td + u[/latex] – числа одного знака. Справедлив и более общий факт: если уравнение [latex]F(x, y) = 0[/latex] определяет прямую или кривую, разбивающую координатную плоскость на две части, то точки [latex](a, b)[/latex] и [latex](c, d)[/latex], не лежащие на этой линии, принадлежат одной и той же части плоскости, если [latex]F(a, b)[/latex] и [latex]F(c, d)[/latex]– числа одного знака.
a | b | c | d | s | t | u | Ответ |
5 | -4 | 2 | 9 | 6 | -3 | 7 | Обе точки принадлежат разным полуплоскостям. |
-5 | -4 | -6 | -3 | 2 | 7 | -1 | Обе точки принадлежат одной полуплоскости. |
-5 | -4 | -6 | -3 | 0 | 0 | -1 | Условие некорректно:s и t не должны одновременно равняются нулю. |
4 | 7 | 2 | 1 | -4 | 3 | -5 | Одна, либо обе из точек лежат на прямой, соответственно не принадлежат ни одной из полуплоскостей. |
В программу вводятся исходные данные, среди которых координаты точек [latex](a, b)[/latex] и [latex](c, d)[/latex]. Если набор значений будет таким, что выполнится уравнение прямой [latex]sx+ty+u=0[/latex], (где x— a и d. А y— b и d), то это значит, что одни из точек (или сразу две) принадлежат прямой и следовательно не принадлежат ни одной из полуплоскостей. Если результаты уравнений [latex](s*a)+(t*b)+u[/latex] и [latex](s*c)+(t*d)+u[/latex]- числа одного знака, то точки лежат в одной полуплоскости. Если же эти числа разного знака, то обе точки принадлежат разным полуплоскостям.
Код на C++:
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 26 27 28 29 30 31 32 |
#include <iostream> #include <math.h> using namespace std; int main() { double a,b,c,d,s,t,u,R,K; scanf("%lf %lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&s,&t,&u); if (s==0.00 && t==0.00) { printf ("Условие некорректно:s и t не должны одновременно равняются нулю. \n"); } else { R=(s*a)+(t*b)+u; K=(s*c)+(t*d)+u; if (R==0.00 || K==0.00) { printf ("Одна, либо обе из точек лежат на прямой, соответственно не принадлежит ни одной из полуплоскостей. \n"); } else if ((R>0.00 && K>0.00) || (R<0.00 && K<0.00)) { printf ("Обе точки принадлежат одной полуплоскости. \n"); } else { (R>0.00 && K<0.00) || (R<0.00 && K>0.00); printf ("Обе точки принадлежат разным полуплоскостям. \n"); } } return 0; } |
Код на 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import java.util.*; import java.lang.*; import java.io.*; class Brovko { public static void main (String[] args) throws java.lang.Exception { double a,b,c,d,s,t,u,R,K; Scanner in = new Scanner(System.in); a=in.nextDouble(); b=in.nextDouble(); c=in.nextDouble(); d=in.nextDouble(); s=in.nextDouble(); t=in.nextDouble(); u=in.nextDouble(); if (s==0 && t==0) { System.out.printf("Условие некорректно:s и t не должны одновременно равняются нулю. \n"); } else { R=(s*a)+(t*b)+u; K=(s*c)+(t*d)+u; if (R==0 || K==0) { System.out.printf ("Одна, либо обе из точек лежат на прямой, соответсвенно не пренадлежит ни одной из полуплоскостей. \n"); } else if ((R>0 && K>0) || (R<0 && K<0)) { System.out.printf ("Обе точки принадлежат одной полуплоскости. \n"); } else { if((R>0 && K<0) || (R<0 && K>0)); { System.out.printf ("Обе точки принадлежат разным полуплоскостям. \n"); } } } } } |
С программой можно ознакомится тут (C++)/тут (Java).
Программа работает. Молодец! Осталось поправить некоторые технические огрехи. Но это обязательно.
— Почти весь код (строки 8-30) излишне сдвинут вправо.
— s и t не везде в условии набраны в laTeX.
— Указание автора задачника тоже следует тоже набрать. Чтобы облегчить Вам задачу приведу текст указания полностью. останется только разметить [latex]… [/latex]:
В этой задаче надо воспользоваться тем, что две точки (a, b) и (c, d), не лежащие на прямой, определяемой уравнением sx + ty + u = 0 , принадлежат одной полуплоскости, если sa + tb + u и sc + td + u – числа одного знака. Справедлив и более общий факт: если уравнение F(x, y) = 0 определяет прямую или кривую, разбивающую координатную плоскость на две части, то точки (a, b) и (c, d), не лежащие на этой линии, принадлежат одной и той же части плоскости, если F(a, b) и F(c, d)– числа одного знака.
Я ухитрился дать одну и туже задачу двоим студентам Вам и Милану. Воспользуйтесь этим фактом и проверьте программы на тестах коллеги.
Технические огрехи устранены.
Тесты коллеги проверил- все работает 🙂
Тогда засчитываю