Задача
Условие взято отсюда
Четырёхугольник [latex]ABCD[/latex] задан на плоскости целочисленными координатами вершин. Определите тип четырёхугольника: квадрат, ромб, прямоугольник, параллелограмм, трапеция, произвольный четырёхугольник. Из характеристик указать наиболее частную.
Тесты
[latex]a_1[/latex] [latex]a_2[/latex] | [latex]b_1[/latex] [latex]b_2[/latex] | [latex]c_1[/latex][latex]c_2[/latex] | [latex]d_1[/latex] [latex]d_2[/latex] | Ответ |
0 0 | 1 0 | 1 1 | 0 1 | квадрат |
0 -3 | 2 0 | 0 3 | -2 0 | ромб |
0 0 | 4 0 | 4 1 | 1 4 | прямоугольник |
0 0 | 10 0 | 12 4 | 2 4 | пaраллелограмм |
0 0 | 2 0 | 1 1 | 0 1 | трапеция |
0 0 | 0 2 | 1 1 | 1 0 | трапеция |
-4 -5 | -15 7 | 5 8 | 6 -7 | произвольный |
0 0 | 1 0 | 10 20 | -5 7 | произвольный |
Код
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 |
#include <iostream> using namespace std; int main() { int a1, a2, b1, b2, c1, c2, d1, d2; double AB, BC, CD, DA, AC, BD, A, B, C, D; cin >> a1 >> a2 >> b1 >> b2 >> c1 >> c2 >> d1 >> d2; AB= ((a1-b1)*(a1-b1)+(a2-b2)*(a2-b2)); //длина стороны во второй степени BC= ((b1-c1)*(b1-c1)+(b2-c2)*(b2-c2)); CD= ((c1-d1)*(c1-d1)+(c2-d2)*(c2-d2)); DA= ((d1-a1)*(d1-a1)+(d2-a2)*(d2-a2)); AC= ((a1-c1)*(a1-c1)+(a2-c2)*(a2-c2)); //длина диагонали во второй степени BD= ((b1-d1)*(b1-d1)+(b2-d2)*(b2-d2)); if(AB==CD && BC==DA) { if (AB==BC){ if(AC==BD){ cout << "квадрат"; } else { cout << "ромб"; } } else if (AC==BD){ cout<< "прямоугольник"; } else{ cout << "параллелограмм"; } } else if ( ((a1-b1)*(c2-d2)==(a2-b2)*(c1-d1)) || ((a1-d1)*(b2-c2)==(a2-d2)*(b1-c1)) ){ cout << "трапеция"; } else { cout << "произвольный"; } return 0; } |
Решение
Для начала стоит найти длины всех сторон:
[latex]AB^{2}=((a1-b1)^{2}+(a2-b2)^{2})[/latex]. (аналогично для остальных сторон)Затем можно найти длины диагоналей четырёхугольника
[latex]AC^{2}=((a1-c1)^{2}+(a2-c2)^{2})[/latex]. (аналогично для [latex]BD[/latex]).Через условие задаем равность противоположных сторон [latex]AB=CD[/latex] и [latex]BC=DA[/latex]:
- У ромба смежные стороны равны, но если у ромба диагонали равны, то это квадрат;
- Если четырёхугольник не является квадратом, но диагонали равны, то это прямоугольник;
- В противном случае — параллелограмм.
Если одна из пар противополижных сторон параллельны, то данный четырёхугольник — трапеция. Впротивном случае — произвольный четырёхугольник.
Код на ideone
— Нет ссылки на код в ideone.com. Если код не работает, то лучше работу оставлять в состоянии черновика. Зачем публиковать если пока не решили задачу? Вопросы мне можно задавать по почте.
— Должно быть [latex]a_1[/latex], а не [latex]a_1[/latex]. А ещё лучше [latex]a_x[/latex] и [latex]a_y[/latex].
— В программе находятся не длины, а квадраты длин. Впрочем если проверять на равенство, то так даже лучше — равны квадраты неотрицательных величин, значит равны и сами эти величины.
— Вы ведь в курсе, что квадрат это частный случай ромба и они оба частный случай параллелограмма, который частный случай трапеции , которая частный случай произвольного четырёхугольника. Тут еще примешивается прямоугольник, как частный случай параллелограмма. А квадрат не только вариант ромба, но и прямоугольника. Естественно, нужно выводить только наиболее частную характеристику. Т.е. для квадрата, нужно написать «квадрат». Хотя условия для трапеции тоже будут выполнены.
— Вы пишите «Через условие задаем равность противоположных сторон». Лучше так: «Проверяем условие равенства противоположных сторон». Тогда в предложении появится смысл.
— Вы пишите: «Ромб: смежные стороны равны, противоположные стороны параллельны». А потом в программе условие параллельности, Вы будете проверять с использованием деления и получать иногда деление на ноль. Зачем? У ромба все стороны равны. Это единственное условие легко проверить через квадраты длин сторон, которые Вы уже нашли.
— Вы пишите «Параллелограмм: смежные стороны и диагонали между собой не равны». Это не свойство параллелограмма и не признак его.
Что нужно сделать.
— Разобраться «кто чей частный случай».
— Найти (вспомнить) простые признаки для каждого вида четырёхугольников.
— Написать программу с проверкой от более общих к частным случаям. Учтите, что квадрат является и ромбом и прямоугольником — его можно проверять на любой из этих двух веток вложенности условных операторов.
— Добавьте такие два теста для трапеции
0 0 2 0 1 1 0 1
0 0 0 2 1 1 1 0
24-я строка. Проверка на прямоугольник . Зачем так сложно? Просто проверить равенство диагоналей.
32-я строка. Как всё было хорошо и тут опять вставили возможность деления на ноль. Зачем? Нужно использовать Обобщённую теорему Фалеса. Параллельные прямые, пересекающие стороны угла, отсекают от сторон угла пропорциональные отрезки. Т.е. противоположные стороны образуют пропорцию.
Я исправила деление на умножение.
Я немножко не понимаю как использовать теорему Фалеса, но программа работает нормально.
Программа работает нормально. Согласен. Но такой стиль называется «эклектика». В программировании это не приветствуется.
Что я имею в виду? Вы отлично управились со всеми типами четырёхугольников виртуозно манипулируя длинами сторон и диагоналей. Но когда дело доходит до трапеций, Вы спотыкаетесь и переходите на координаты вершин.
Что делать? Продолжить фразу «Диагонали трапеции связаны со сторонами соотношением…»