Помощь - Поиск - Пользователи - Календарь
Полная версия: Задачка про треугольники
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
gulldan
Всем привет
Перейду непосредственно к задаче:
Нужно при заданных значениях сторон треугольника определить его вид
сложность у меня возника при определение прямоугольного треугольника ,немогу понять как определить что он прямоугольный (зная только что стороны должны быть кратны 3 ,4 ,5 соответственно)
помогите пожалуйста rolleyes.gif
мисс_граффити
blink.gif почему они должны быть кратны 3,4,5?
Длина стороны - обязательно целое число, что ли?
gulldan
вроде треугольники со сторонами кратными 3.4.5 то он прямоугольный я неособо много знаю я еще ученик 11 класса,но если Вы правы тогда тем более незнаю..
Айра
Ну, по идее, в прямоугольном треугольнике квадрат гипотенузы равен сумме квадратов катетов, т.е. если у тебя строго выполняется это равенство, значит треугольник прямоугольный))
мисс_граффити
неужели до 11 класса еще не проходили теорему Пифагора?
gulldan
точно xD
забыл про нее...
спс
Neznaika
Извиняюсь, но если подкоренное выражение в формуле Герона, используемое для вычисления площади треугольника по трём его сторонам, меньше или равно нулю, то эти самые три стороны треугольник не образуют.
И дальнейшие проверки бесполезны.
Айра
Цитата
но если подкоренное выражение в формуле Герона ... то эти самые три стороны треугольник не образуют

Да, как-то про такую ситуацию и не сказали.. По-моему, можно пойти еще проще: "в треугольнике любая сторона меньше суммы двух других сторон", если это условие не выполняется, то нет и треугольника))
Lapp
Цитата(Айра @ 8.10.2007 23:33) *
По-моему, можно пойти еще проще: "в треугольнике любая сторона меньше суммы двух других сторон", если это условие не выполняется, то нет и треугольника))

Верно, только я бы на всякий случай подчеркнул тут слово "любая". Выполнение этого условия для одной или двух сторон недостаточна для существования треугольника, то есть проверять нужно все три:
TriangCanBeBuild := (a+b>=c) and (b+c>=a) and (c+a>=b);
. Дополнительная информация, если интересует, здесь: Можно ли построить треугольник .

Еще можно сказать, остроугольный треугольник или тупоугольный, все по той же теореме Пифагора. Берем наибольшую сторону и сравниваем ее с суммой квадратов остальных.

М
А вообще, не понимаю, что эта тема делает в Задачах. До моего поста она не имела к Паскалю никакого отношения - я ее за уши притянул.. gulldan, учти это, пожалуйста.

Neznaika
Наверно задача все же имеет отношение к программированию.
Но сначала математика.

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

Теорема 2.
Теорема косинусов или обобщённая теорема Пифагора.
c*c = a*a + b*b - 2*a*b*cosC, где С - угол напротив стороны c.
----------------------------------------------------------------------------------
Про косинус известно, что он больше нуля для [0:pi/2),
равен нулю при pi/2,
и меньше нуля для (pi/2,pi].
Следовательно, нужно узнать знак 2*a*b*cosC= a*a + b*b - c*c (так как выражение 2*a*b > 0,
то оно не помешает для вычисления знака косинуса, т.е. делить на него не нужно).
Иногда для обозначения знака используют функцию Sign(X), которая равна -1, 0 и 1
для отрицательных, нулевого и положительных значений X соответственно.
Тогда получим:
case Sign(a*a + b*b - c*c) of
-1 : Угол > pi/2
0 : Угол = pi/2
1 : Угол < pi/2
end.

Если например стророны треугольника объявить как массив Line = array[1..3] of LongInt
то после его сортировки по убыванию можно записать следующие операторы
(тип переменной X - LongInt):

X := Line[2]*Line[2] + Line[3]*Line[3] - Line[1]*Line[1];
if X < 0 then
Write('Треугольник тупоугольный.')
else
if X > 0 then
Write('Треугольник остроугольный.')
else
Write('Треугольник прямоугольный.')


===========================================================
Поправка. Весь массив сортировать не нужно, нужно только выделить в нём максимальный элемент,
то есть достаточно одного прохода:

if Line[3] > Line[2] then
begin
X := Line[2]; Line[2] := Line[3]; Line[3] := X
end;
if Line[2] > Line[1] then
begin
X := Line[1]; Line[1] := Line[2]; Line[2] := X
end;



Теперь можно сконструировать целую программу и поместить в архив...
Правда для не очень больших целых чисел можно решить эту задачу в уме.
Айра
Цитата
Верно, только я бы на всякий случай подчеркнул тут слово "любая".

Ага. Там должно быть "каждая", ошибочка вышла wink.gif
Цитата
Еще можно сказать, остроугольный треугольник или тупоугольный, все по той же теореме Пифагора. Берем наибольшую сторону и сравниваем ее с суммой квадратов остальных.

Т.е. если с^2>a^2+b^2, то треугольник тупоугольный, если меньше, то остроугольный?.. smile.gif
Lapp
Цитата(Айра @ 9.10.2007 18:31) *
Т.е. если с^2>a^2+b^2, то треугольник тупоугольный, если меньше, то остроугольный?.. smile.gif

Да. Neznaika, кажется, раскрыл это еще более подробно - хотя, точно это утверждать не могу, так как не нашел в себе сил дочитать его пост. Неясно, зачем столько теории для такой простой задачки..
Lapp
Все же нашел в себе силы прочитать пост Незнайки..
Возможно, это оффтоп, но я все же выскажу свое мнение, которое одновременно и админское, и пользовательское.

2 Neznaika:
Мне нравится твоя эрудиция. Я давно ищу возможность повысить тебе репутацию, но.. не могу.
Скажи, почему большинство твоих постов совершенно не по делу? На Форуме (по крайней, мере на этом) не принято повторять то, что уже сказано выше в теме (а особенно, без ссылки на автора). Также, не принято сильно выходить за рамки темы (без необходимости). Твой пост - сплошная математика, теория, хотя я указал, что это не приветствуется в разделе Задачи. Далее - что нового он привнес по сравнению последним предложением в моем посте?.. Ничего.
Я читаю твои ответы, читаю замечания Волво к ним. И в большинстве случаев Волво прав.. Будь так добр - умерь свой пыл, отвечай только по делу и только то, что еще не сказали до тебя. И тогда все будет хорошо.
Еще раз: я симпатизирую тебе. Но я буду понижать тебе репутацию, если будешь продолжать отвечать не по делу. Спасибо за внимание.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.