Ю2.6

Условие

Четырёхугольник [latex]ABCD[/latex] задан координатами своих вершин на плоскости: [latex]A(x_a,y_a)[/latex], [latex]B(x_b,y_b)[/latex] и [latex]C(x_c,y_c)[/latex], [latex]D(x_d,y_d)[/latex]. Определить тип четырёхугольника: прямоугольник, параллелограмм, трапеция, произвольный четырёхугольник. Учесть погрешность вычислений.

Замечание:  Для устранения дополнительных источников погрешности рекомендуется использовать аппарат векторной алгебры: коллинеарность, равенство и ортогональность векторов — сторон четырёхугольника.

Входные данные

В одной строке заданы 8 чисел [latex]x_a, x_b, x_c, x_d, y_a, y_b, y_c, y_d[/latex] — координаты вершин четырёхугольника [latex]ABCD[/latex],  значения которых не превышают по модулю [latex]50[/latex].

Выходные данные

  1. В первой строке вывести: «Тип четырёхугольника: «(без кавычек).
  2. Во второй строке вывести:  «Произвольный четырёхугольник» или «Прямоугольник» или «Параллелограмм» или «Трапеция»(без кавычек). Одно исключает другое.

Также условие задачи можно посмотреть, скачав ознакомительную версию задачника А.Юркина здесь.

Тестирование

Координаты [latex]x_a, x_b, x_c, x_d, y_a, y_b, y_c, y_d[/latex] Вердикт (тип четырёхугольника)
1. -5 -4 -1 -2 -4 3 -1 -8 Параллелограмм
2.  -2 -3 7 3 -2 1 7 1  Трапеция
 3. 0 0 1 1 0 1 1 0  Прямоугольник
 4.  50 -20 3 -50 7 6 2 3  Произвольный четырёхугольник
5. 2 -3 -6 -1 4 7 6 3 Параллелограмм
6. 1 -5 6 20 2 0 13 -9 Произвольный четырёхугольник
7. 0 1 2 1 0 1 1 0 Параллелограмм
8. -6 0 6 0 1 5 -4 -8 Прямоугольник

Реализация

Алгоритм решения

  1. Задан четырёхугольник [latex]ABCD[/latex] с такими координатами вершин: [latex]A(x_a,y_a)[/latex], [latex]B(x_b,y_b)[/latex], [latex]C(x_c,y_c)[/latex] и [latex]D(x_d,y_d)[/latex]. В данной задаче будет уместным использование аппарата векторной алгебры.  Пусть стороны четырёхугольника — векторы.
  2. Очевидно, что для того, чтобы определить тип данного четырёхугольника, необходимо воспользоваться известными свойствами, а именно: свойствами прямоугольника, параллелограмма и трапеции. Так как в задаче используется аппарат векторной алгебры, обращаемся к таким свойствам векторов, как коллинеарность и равенство.
  3. Сразу же установим: является ли четырёхугольник трапецией. Проверим одну из двух пар сторон на параллельность. Для этого воспользуемся условием коллинеарности векторов на плоскости: [latex]\frac{a_x}{b_x}=\frac{a_y}{b_y}[/latex], если [latex]a_i, b_i\ne0[/latex].  Координаты векторов [latex]\vec{b}[/latex] и [latex]\vec{d}[/latex] должны быть пропорциональны, что означает, что соответствующие стороны параллельны. Следовательно, [latex]\frac{x_c — x_b}{x_d — x_a}=\frac{y_c — y_b}{y_d — y_a}[/latex]. Или же координаты векторов [latex]\vec{a}[/latex] и [latex]\vec{c}[/latex] должны быть пропорциональны. Проверяем: [latex]\frac{x_b — x_a}{x_c — x_d}=\frac{y_b — y_a}{y_c — y_d}[/latex]. Если условие не выполняется, четырёхугольник произвольный. Если, напротив, координаты хотя бы одной пары векторов пропорциональны, четырёхугольник является трапецией.
  4. Если четырёхугольник — параллелограмм, то обе пары его противоположных сторон параллельны. Проверим, выполняется ли: [latex]\frac{x_b — x_a}{x_c — x_d}=\frac{y_b — y_a}{y_c — y_d}[/latex] и [latex]\frac{x_c — x_b}{x_d — x_a}=\frac{y_c — y_b}{y_d — y_a}[/latex]. Если условие выполняется, то заданный четырёхугольник — параллелограмм.
  5. Частным случаем параллелограмма является прямоугольник. Диагонали [latex] AC, BD[/latex] обозначим как [latex] l, m[/latex] соответственно. Пусть [latex] l, m[/latex] — векторы.  Вычислим длины векторов [latex]\vec{l}[/latex], [latex]\vec{m}[/latex], пользуясь формулой.  Получаем: [latex]\vec{|l|}= \sqrt{(x_c — x_a)\cdot (x_c -x_a) + (y_c — y_a)\cdot (y_c -y_a)}[/latex], [latex]\vec{|m|}= \sqrt{(x_d — x_b)\cdot (x_d -x_b) + (y_d — y_b)\cdot (y_d -y_b)}[/latex]. При условии, что [latex]\vec{l}=\vec{m}[/latex], имеем прямоугольник.

Более детально со свойствами и видами четырёхугольников можно ознакомиться здесь, а с основными сведениями из векторной алгебры — здесь.

Для запроса на выполнение следует перейти по ссылке.

 

 

15 thoughts on “Ю2.6

  1. — В какой-то момент Вы увлеклись и перестали выделять нижние индексы.
    — У Вас 4 возможных варианта ответа. Значит должно быть не более трёх условных операторов. Уберите лишний.
    — На моих тестах не работает. Для 0 0 0 1 1 1 1 0 говорит — трапеция, а для 0 0 1 1 2 1 1 0 — произвольный четырёхугольник. Вроде должно быть прямоугольник и параллелограмм. А свои тесты рисовали на бумаге?

    P.S. Вика, я уже объяснял, почему важно всё делать только самостоятельно? Я, конечно, не могу точно сказать, что это делал какой-то другой человек. Но у каждого автора свой уникальный стиль и лексика, что позволяет нам отличать Тургенева от Пелевина. Даже если обложки книг перепутать.
    Обучение — это протез утраченной гениальности. Не давайте другим носить Ваши протезы.

    • Спасибо за замечания, я исправлю.
      Игорь Евгеньевич, неужели есть основания так полагать? Вся работа проделана мной и только мой, в этом Вы можете быть уверены, что касается и всех предыдущих задач. Если у Вас по-прежнему будут сомнения, я готова написать код при Вас, хотя понимаю существующую вероятность того, что могу его просто выучить, так сказать. Тогда я сделать ничего не могу, но, главное, что совесть моя чиста.

    • Ошибки исправлены, а именно:
      -нижние индексы выделены;
      -лишний условный оператор убран;
      Что касается третьего пункта, программа считает и выводит верный результат. «Для 0 0 0 1 1 1 1 0 говорит – трапеция, а для 0 0 1 1 2 1 1 0 – произвольный четырёхугольник». Так и должно быть. Дело в том, что значения координат вводятся в такой последовательности: xa, xb, xc, xd, ya, yb, yc, yd. Возможно, это и стало причиной недоразумения. Опираясь на этот факт и проведя вычисления, я проверила оба случая. В первом: сторона BC четырёхугольника не равна стороне AD. Следовательно, данный четырёхугольник является трапецией, а не прямоугольником. Во втором случае: координаты векторов не пропорциональны, что свидетельствует о том, что четырёхугольник произвольный и не является параллелограммом.

      • — Действительно, Вы сами определяете в каком порядке водить координаты. В условии это не оговаривалось. Я переставил координаты в соответствии с Вашим порядком задания для A(0;0), B(0;1), C(1;1), D(1;0). Полагаю, что это единичный квадрат в первой четверти. Кодирую 0 0 1 1 0 1 1 0. И программа прекращает работу. Видимо делит на ноль. Нужно в условии коллинеарности избавиться от деления.
        — У трапеции параллельной является одна из пар противоположных сторон. Т.е. не обязательно AB и CD. Мне кажется Вы этого не учитываете. В результате любая Ваша трапеция перестаёт ею быть при другом именовании точек. Конкретный пример. Это трапеция: 0 0 1 1 2 0 0 1? А программа её не узнаёт. А тут 0 1 1 0 0 0 1 2 эти же точки опознаёт как трапецию. Т.е. распознаётся только та трапеция для которой первіе две точки составляют основание, но не боковую сторону.
        — Нет проверки на выпуклость. В результате эти песочные часы 0 1 0 1 0 1 1 0 классифицируются как параллелограмм.
        По коду. В этом участке:

        следует отказаться от return в 28-й строке (как и везде ранее) и просто добавить else в 30-ю.
        И ввода значений в 26-й остался от какой-то пробной версии.

  2. Опять не получается. Появился какой-то «Другой тип четырёхугольника (ромб или квадрат)». Давайте подойдём к делу педантично. Раз слёту не вышло.

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

    Как мне кажется там всё просто (для перечисленных случаев.
    1. Самая нетребовательная — трапеция. Проверка параллельности одной из двух пар сторон. Но есть частный случай: параллелограмм.
    2. Параллелограмм? Если условие трапеции выполнено, проверяем вторую пару сторон, если параллельны — то выполнены условия параллелограмма. Но есть частный случай: прямоугольник.
    3. Прямоугольник? Если диагонали равны, то прямоугольник.

    Получается такая структура программы.

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

  3. Вика, мы занимаемся почти 3 месяца. Нужно найти время и прочесть, как делать отступы. Займитесь самоанализом — выясните, что мешает Вам расставлять отступы в соответствии с вложенностью одного оператора внутрь другого и чем я мог бы Вам здесь помочь.

  4. Да, хорошо. Желательно определить для себя, ставить ли фигурные скобки если оператор один или не ставить. У Вас иногда они есть, иногда нет.

    Теперь по программе. Я ввёл 0 0 1 1 0 1 1 -1. Думал это трапеция. Программа со мной не согласна. Рассудите нас, пожалуйста.

Добавить комментарий