Задача: Из круга какого наименьшего радиуса можно вырезать треугольник со сторонами [latex]a,b,c[/latex]
Указание: Пусть [latex]c[/latex] — большая из сторон треугольника. Если угол [latex]C[/latex] — тупой, сторона совпадает с диаметром круга и его радиус: [latex]r=\frac {C}{2}[/latex] .
В противном случае имеем описанную окружность: [latex]r=\frac {abc}{4\sqrt {p(p-a)(p-b)(p-c)}}[/latex]
где [latex]p=\frac{(a+b+c)}{2}[/latex]
a | b | c | r | Комментарий: | |
6 | 8 | 11 | 5.5 | Пройден (Есть тупой угол С) | |
11 | 8 | 6 | 5.5 | Пройден (Есть тупой угол А) | |
8 | 11 | 6 | 5.5 | Пройден (Есть тупой угол B) | |
5.97 | 9.55 | 11.07 | 5.53894 | Пройден (Дробные значения) | |
3 | 3 | 4 | 2.01246 | Пройден (Равнобедренный без тупого угла) | |
3 | 3 | 6 | 3 | Пройден (Равнобедренный с тупым углом) | |
7 | 7 | 7 | 4.04145 | Пройден (Равносторонний) | |
1 | 1 | 20 | не треугольник | Не пройден (Не треугольник) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <cmath> int main() { double finding, a, b, c, r=0, p, cac, caa, cab, pi=3.141592; // переменные scanf("%lg%lg%lg", &a, &b, &c); // вводим данные о треугольнике p = (a+b+c)/2; // формула полупериметра finding = fmax(a, fmax (b,c)); // находим большую сторону cac = acos((pow(b,2)+pow(a,2)- pow(c,2))/(2*b*a))*180/pi; // вычисление угла caa = acos((pow(b,2)+pow(c,2)- pow(a,2))/(2*b*c))*180/pi; cab = acos((pow(a,2)+pow(c,2)- pow(b,2))/(2*a*c))*180/pi; if(((caa>90)||(cab>90)||(cac>90))&&((caa<180)||(cab<180)||(cac<180))&&((p-a>0)&&(p-b>0)&&(p-c>0))){ r= finding/2; printf("r=%lg\n", r); } else if ((p-a>0)&&(p-b>0)&&(p-c>0)){ r = (a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c))); printf("r=%lg\n", r); } else { puts("не треугольник");} return 0; } |
До ветвлений:
1. Вычисление каждого угла в получившемся треугольнике через теорему косинусов
2. Вычисление большей стороны треугольника
Алгоритм ветвлений:
Один из углов треугольника находится в сегменте (90, 180) | ||||
|
||||
Вывод |
Вывод: Программа выполняет поставленные задачей условия. Если хоть один угол находится в сегменте (90, 180), то [latex]r=\frac{finding}{2}[/latex] , где [latex]finding[/latex] это большая сторона треугольника (см. 8). В другом случае [latex]r=\frac{abc}{ 4\sqrt{ p(p-a)(p-b)(p-c)} }[/latex] . Если треугольник не существует — не выполняется и программа сообщает об этом.
В условии задачи не сказано, что [latex]c[/latex] — это максимальная сторона. Указание к задаче написано, учитывая это предположение, но оно в общем виде может не выполняться.
Всё переделал.
Не понимаю как функция nujno позволила избежать повторений в коде? Просто часть функции main вынесена в функцию nujno. Более того дублирование строки r = (a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c)));, к сожалению осталось.
Зачем проверка на равносторонний или равнобедренный треугольник? Как это меняет ситуацию? Если вопрос о том какую сторону из двух/трех равных считать максимальной, то он решается тривиально — любую из них.
Вообще решение задачи можно здорово упростить, если добиться чтобы максимальной стороной была сторона, например c, как в указании в задаче (зря кстати из статьи выбросили указание к задаче). Естественно, может оказаться, что максимальная сторона — это не c, тогда можно поменять местами максимальную сторону и c.
При редактировании записи в середине панели есть кнопки вставить/изменить ссылку и удалить ссылку.
Если проверено, что стороны не образуют треугольник, нужно напечатать об этом сообщение и, соответственно, не печатать r = 0.
Согласен, функция nujno(); уже не нужна (осталась с прошлых попыток написать код). Исправлю
Я делаю проверку на равнобедренность из таких соображений: даже если и выбирать любую из равнобедренных сторон, то работа с ней не даёт никакого смысла в случае острого угла, а тем более тупого.
Не понимаю для чего такие махинации с буквой с. От стороны мне нужно лишь деление её на 2, в случае если треугольник тупой. Да, оно уберёт 2 строки вычислений других углов, но тогда будет тяжелее обрабатывать равнобедренность, о которой уже говорил раннее.
По поводу r = (a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c))); Код сократил
Гиперссылка уже есть.
«где Biggetst это» — опечатка, кроме того Biggest, как мат. величина, должна быть формулой latex. Аналогично формула должна быть фрагменте в «Пусть С – большая».
Программа стала гораздо компактней и чище, к сожалению, исчезла проверка, что стороны a,b,c треугольника не образуют (была в прошлом варианте).
Учёл и и дополнил.
Не хотелось бы Вас расстраивать, но как я уже писал «Если проверено, что стороны не образуют треугольник, нужно напечатать об этом сообщение и, соответственно, не печатать r = 0.» Другой вопрос, как же это сделать? Если Вы вместо присвоения r = 0; просто напишете printf, выводящий нужное сообщение, потом сработает распечатка r. Можно, конечно, навесить на printf("r=%lg\n", r); дополнительное условие, что r!=0 или r>0, так как это выполнено для любого правильного ответа, иначе выводить, что треугольника не существует. Можно вместо присвоения r = 0; написать printf, выводящий нужное сообщение и затем в этой же ветке написать return 0; чтобы программа успешно закончила свое выполнение (или даже return 1; если вы считаете что нужно сообщить об ошибке операционной системе).
Также прошу обратить внимание на правило из Homework Assignment: «Формулы и символы отдельных переменных должны кодироваться в формате latex. » Значит даже одна переменная, например, C, должна быть формулой laTex.
Разве написанное в сообщении о детекции треугольника имеет какое-либо практическое значение? В любом случае дополнил и исправил.
Засчитано, 10 баллов.