Задача
 
Информатика в школе


Видео курсы для чайников фотошоп, joomla, wordpress, php, css 
  Главная  ●  Карта сайта
 
 

Задача "Треугольник"

[назад]

Заданы длины трех отрезков a, b, c. Необходимо определить, можно ли из них составить треугольник. В случае утвердительного ответа определить его тип: остроугольный, прямоугольный или тупоугольный.

Вход. Три целых числа a, b, c – длины трех отрезков.

Выход. Строка, содержащая информацию о треугольнике: “ACUTE”, если он остроугольный, “RIGHT” если прямоугольный и  “OBTUSE” если тупоугольный. Если из трех отрезков составить треугольник нельзя, то вывести “NONE”.

Пример входа

3 4 5

Пример выхода

RIGHT

 

Решение. Геометрия.

Анализ алгоритма

Из трех отрезков a, b, c можно составить треугольник, если выполняется неравенство треугольника: сумма длин двух любых сторон треугольника строго больше длины третьей.

Из теоремы Пифагора следует, что треугольник со сторонами a, b, c является прямоугольным, если выполняется одно из следующих равенств:

a2 = b2 + c2 или b2 = a2 + c2 или c2 = a2 + b2

Треугольник будет остроугольным, если квадрат каждой стороны строго меньше суммы квадратов двух других сторон. То есть одновременно выполняется три неравенства:

a2 < b2 + c2, b2 < a2 + c2, c2 < a2 + b2

Треугольник является тупоугольным, если существует такая сторона, квадрат которой строго больше суммы квадратов двух других сторон. То есть выполняется одно из трех неравенств:

a2 > b2 + c2 или b2 > a2 + c2 или c2 > a2 + b2

Условие тупоугольности можно не проверять: если треугольник не является ни остроугольным, ни прямоугольным, то он является тупоугольным. Для вывода результата воспользуемся типом string.

program triangle;

var

  a,b,c:integer;

  res:string;

begin

  readln(a,b,c);

  if ((a >= b + c) or (b >= a + c) or (c >= a + b))

      then res := 'NONE' else

  if ((a*a = b*b + c*c) or (b*b = a*a + c*c) or (c*c = a*a + b*b)) 

      then res := 'RIGHT' else

  if ((a*a < b*b + c*c) and (b*b < a*a + c*c) and (c*c < a*a + b*b))

      then res := 'ACUTE' else

  res := 'OBTUSE';

  writeln(res);

end.

 

Задача решена, но имеет один недостаток. При проверке типа треугольника приходится каждый раз проверять три условия: в каждом из условных операторов if стоит три выражения. Можно сделать так, что в каждом условном операторе будет стоять лишь одно условие. Подумайте, как это сделать?

Ответ на вопрос дает сортировка. Отсортируем по возрастанию длины исходных отрезков. Пусть у нас далее имеют место неравенства: a £ b £ c. Тогда для проверки неравенства треугольника достаточно проверить лишь a + b > c, так как оба других неравенства b + c > a и a + c > b выполняются. Для проверки прямоугольности достаточно проверить только равенство c2 = a2 + b2, так как при a £ b £ c гипотенузой может быть только сторона c. В случае тупоугольности наибольшей стороной может быть только c, поэтому для существования тупого угла в треугольнике достаточно выполнение условия c2 > a2 + b2. Треугольник будет остроугольным, если c2 < a2 + b2.

Например, в языке Си, отсортировать три числа можно так:

    int mas[3] = {a,b,c};

    sort(mas,mas+3);

Язык Паскаль вообще не имеет функций сортировки. Здесь, уже на элементарной задаче, мы столкнулись с бедностью языка Паскаль. Реализовать сортировку непосредственно операциями сравнения в этой задаче можно, так как число переменных не велико. Если бы их было больше – требовалось бы заводить массив и уже писать один из классических алгоритмов сортировки.

Если мы сможем эффективно отсортировать числа a, b, c, то программа примет вид:

 

program triangle;

var

  a,b,c:integer;

  res:string;

begin

  readln(a,b,c);

  { отсортировать a,b,c. Имеем: a <= b <= c }

  if c >= a + b then res := 'NONE' else

  if c*c = a*a + b*b then res := 'RIGHT' else

  if c*c < a*a + b*b then res := 'ACUTE' else

  res := 'OBTUSE';

  writeln(res);

end.

 [назад]

 

Книжные новинки
Как сделать свой сайт и заработать на нем Е. Мухутдинов
Копилка
Рабочие программы
Проекты MS Office
Презентации
Открытые уроки
Экзаменационные билеты
Элективные курсы
Бесплатный soft
 Инструкции по ТБ
Подготовка к олимпиадам по информатике
Методика подготовки
"Золотые" алгоритмы
Простые задачи для начинающих
Олимпиадные задачи с решениями
Книги
Среда программирования
Обучение программированию на С++
Справочник по языку Pascal
Обучение
Подготовка к ЕГЭ
Создание сайтов
Уроки FrontPage
Уроки Word 2003
Создание игр на Delphi
Печатаем вслепую

Информация

Наши интервью
Книга почета
Курсы повышения квалификации
Электронная библиотечка
Книжная полка
Статьи
Полезные ссылки
Обратная связь

Конкурсы

Олимпиада
Фотоконкурс
VIP
Персональный раздел профессора
Макаровой Н.В.
Персональный раздел профессора
Смыковской Т.К.