Задача: Треугольник задан координатами своих вершин на плоскости: [latex]A(x_{a}, y_{a})[/latex], [latex]B(x_{b}, y_{b})[/latex], [latex]C(x_{c}, y_{c})[/latex]. Определить, является он прямо-, остро-, или тупоугольным.
Замечание: Не следует отбрасывать экстремальные случаи, когда вершины треугольников совпадают или лежат на одной прямой. Например, треугольник с нулевой стороной обладает свойством прямоугольника и имеет два прямых угла!
Тесты:
[latex]x_{A}[/latex] | [latex]y_{A}[/latex] | [latex]x_{B}[/latex] | [latex]y_{B}[/latex] | [latex]x_{C}[/latex] | [latex]y_{C}[/latex] | Результат | комментарий |
0 | 1 | 0 | 2 | 0 | 3 | тупоугольный | пройден |
1 | 4 | 3 | 2 | 6 | 2 | тупоугольный | пройден |
6 | 2 | 6 | 2 | 6 | 4 | прямоугольный | пройден |
2 | 1 | 2 | 3 | 5 | 3 | прямоугольный | пройден |
5 | 5 | 5 | 5 | 5 | 5 | невозможно определить тип треугольника | пройден |
2 | 1 | 3 | 4 | 4 | 1 | остроугольный | пройден |
2 | 1 | 1 | 3 | 4 | 4 | остроугольный | пройден |
Ссылка на С++ : http://ideone.com/LfWkbB
Ссылка на Java: http://ideone.com/yrS444
Код:
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 |
#include <iostream> #include <cmath> using namespace std; int main(){ double xA, yA, xB, yB, xC, yC, AB, BC, CA, alpha, beta, gamma; cin >> xA >> yA >> xB >> yB >> xC >> yC; if ((xA==xB) && (xB==xC) && (yA == yB) && (yB == yC)) { cout << ("Невозможно определить тип треугольника"); } else if ((xA==xB && yA==yB) || (xB==xC && yB==yC) || (xC==xA && yC==yA)) { cout << ("прямоугольный"); } else { AB = sqrt((xB-xA)*(xB-xA)+(yB-yA)*(yB-yA)); BC = sqrt((xC-xB)*(xC-xB)+(yC-yB)*(yC-yB)); CA = sqrt((xA-xC)*(xA-xC)+(yA-yC)*(yA-yC)); alpha = (AB*AB + CA*CA - BC*BC)/(2*AB*CA); beta = (AB*AB + BC*BC -CA*CA)/(2*AB*BC); gamma = (CA*CA + BC*BC - AB*AB)/(2*CA*BC); { if (( alpha == 0 ) || (beta == 0) || (gamma == 0)) { cout << ("прямоугольный") ; } if ((alpha < 0)||(beta < 0) || (gamma < 0)) { cout << ("тупоугольный") ; } if ((alpha > 0) && (beta > 0) && (gamma > 0)) { cout << ("остроугольный") ; } } } return 0; } |
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 44 45 46 47 48 49 50 |
import java.util.*; import java.lang.*; import java.io.*; import java.math.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { double xA, yA, xB, yB, xC, yC, AB, BC, CA, alpha, beta, gamma; Scanner in = new Scanner(System.in); xA = in.nextDouble(); yA = in.nextDouble(); xB = in.nextDouble(); yB = in.nextDouble(); xC = in.nextDouble(); yC = in.nextDouble(); if ((xA==xB) && (xB==xC) && (yA == yB) && (yB == yC)) { System.out.printf ("Невозможно определить тип треугольника"); } else if ((xA==xB && yA==yB) || (xB==xC && yB==yC) || (xC==xA && yC==yA)) { System.out.printf ("прямоугольный"); } else { AB = Math.sqrt((xB-xA)*(xB-xA)+(yB-yA)*(yB-yA)); BC = Math.sqrt((xC-xB)*(xC-xB)+(yC-yB)*(yC-yB)); CA = Math.sqrt((xA-xC)*(xA-xC)+(yA-yC)*(yA-yC)); alpha = (AB*AB + CA*CA - BC*BC)/(2*AB*CA); beta = (AB*AB + BC*BC -CA*CA)/(2*AB*BC); gamma = (CA*CA + BC*BC - AB*AB)/(2*CA*BC); { if (( alpha == 0 ) || (beta == 0) || (gamma == 0)) { System.out.printf ("прямоугольный") ; } if ((alpha < 0)||(beta < 0) || (gamma < 0)) { System.out.printf ("тупоугольный") ; } if ((alpha > 0) && (beta > 0) && (gamma > 0)) { System.out.printf ("остроугольный") ; } } } } } |
Решение :
Для начала проверяем такое условие при котором мы не можем определить тип треугольника, если же оно не выполняется , то треугольник прямоугольный
8 9 10 11 12 13 14 |
if ((xA==xB) && (xB==xC) && (yA == yB) && (yB == yC)) { cout << ("Невозможно определить тип треугольника"); } else if ((xA==xB && yA==yB) || (xB==xC && yB==yC) || (xC==xA && yC==yA)) { cout << ("прямоугольный"); |
Если не одно из этих условий не выполняется, то мы ищем стороны треугольника и по теореме косинусов находим косинус угла. Далее выполняем три таких условия, при которых определяется какой треугольник : остро- тупо- или прямоугольный
25 26 27 28 29 30 31 32 33 34 35 36 |
if (( alpha == 0 ) || (beta == 0) || (gamma == 0)) { cout << ("прямоугольный") ; } if ((alpha < 0)||(beta < 0) || (gamma < 0)) { cout << ("тупоугольный") ; } if ((alpha > 0) && (beta > 0) && (gamma > 0)) { cout << ("остроугольный") ; } |
Похоже на правду, но я не понимаю, зачем извлекать корни при подсчете длин сторон, чтобы потом использовать опять же квадраты этих длин. Корень — это дорогостоящая операция, теряющая точность.
Да, Вы делите на произведение длин, но поскольку Вам нужен только знак косинуса, а стороны всегда имеют положительную дину, на них можно не делить.
Чтобы не быть голословным, приведу тест, который Ваша программа не проходит:
0 0
4194300 2097150
3145725 4194300
Как легко заметить, данный треугольник является прямоугольным.
И еще: не стоит сравнивать double-переменные на равенство. Лучше воспользоваться конструкцией fabs(x — y) < eps.
Поддерживаю. Надеюсь, Вы найдёте время поправить.