Ю2.32

Задача:  Из круга какого наименьшего радиуса можно вырезать треугольник со сторонами   [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. Вычисление большей стороны треугольника

Алгоритм ветвлений:

Один из углов треугольника  находится в сегменте (90, 180)
Правда Не правда
[latex]r=\frac {C}{2}[/latex] . [latex]r=\frac{abc}{ 4\sqrt{ p(p-a)(p-b)(p-c)} }[/latex]
Вывод

 

Проверить программу на ideone

Вывод: Программа выполняет поставленные задачей условия. Если хоть один угол находится в сегменте (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]   . Если треугольник не существует — не выполняется и программа сообщает об этом.

Божик Семен
Божик Семен

Latest posts by Божик Семен (see all)

9 thoughts on “Ю2.32

  1. В условии задачи не сказано, что [latex]c[/latex] — это максимальная сторона. Указание к задаче написано, учитывая это предположение, но оно в общем виде может не выполняться.

  2. Не понимаю как функция 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 треугольника не образуют (была в прошлом варианте).

  3. Не хотелось бы Вас расстраивать, но как я уже писал «Если проверено, что стороны не образуют треугольник, нужно напечатать об этом сообщение и, соответственно, не печатать 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.

    • Разве написанное в сообщении о детекции треугольника имеет какое-либо практическое значение? В любом случае дополнил и исправил.

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