Отправляет email-рассылки с помощью сервиса Sendsay

Всё о работе в Интернет

  Все выпуски  

Занятие 28.


Сегодня мы с вами, уважаемые подписчики, продолжим изучение множественных ветвлений на примерах задач определения типов треугольников.

Кроме того, мы продолжим процесс углубления наших знаний, связанных с типами величин в языке Паскаль.

ОПРЕДЕЛЕНИЕ ТИПОВ ТРЕУГОЛЬНИКОВ

1. Решение задачи “Тип треугольника – 1”.

Задача V.2.4. “Тип треугольника – 1”. Заданы стороны треугольника abc. Построить алгоритм и подпрограмму, определяющую его тип по отношению к сторонам.

При решении этой задачи можно воспользоваться известным из геометрии правилом определения типа треугольника по отношению к его сторонам в зависимости от соотношения их длин:

-       если все три стороны треугольника равны между собой a = b = c, то треугольник равносторонний;

-       если любые две строны треугольника равны между собой, то есть a = b,  или a = c, или b = c, и при этом треугольник не равносторонний, то тогда он равнобедренный; 

-       если все строны треугольника различны, то есть a <> b, b <> с и a <> с, то такой треугольник разносторонний.

Разумеется, указанное правило справедливо, если треугольник с данными сторонами существует. Это следует считать ограничением значений исходных данных задачи. Впрочем, об этом прямо сказано в условии задачи: “Заданы стороны треугольника…”.

Алгоритм решения задачи целесообразно строить в виде функции целочисленного типа, значениями которой являются варианты типов треугольника, закодированные целыми числами от 1 до 3 (1 – равносторонний, 2 – равнобедренный, 3 – разносторонний).

Для определения значений вариантов подходит команда выбора. При этом очень внимательно следует отнестись к порядку следования её ветвей.

Было бы ошибкой, например, начать с анализа того, является ли треугольник равнобедренным. Дело в том, что условие (a=b) или (a=c) или (b=c) делит все множество значений аргументов на две части нерационально. Одна часть содержит как равнобедренные, так и равносторонние треугольники, вторая часть не содержит ни тех, ни других.

Начать можно либо с проверки, является ли треугольник равносторонним (a=b) и (b=c), либо с проверки, является ли треугольник разносторонним (a<>b) и (b<>с) и (a<>с). Лучше начать с проверки (a=b) и (b=c), так как это условие короче. В результате из рассмотрения исключаются равносторонние треугольники.

Затем можно выполнить проверку, является ли треугольник равнобедренным (a=b) или (a=c) или (b=c), либо проверку, является ли он разносторонним (a<>b) и (b<>с) и (a<>с). Из них лучше выбрать первую, как более простую в записи. Таким образом, из рассмотрения исключаются и равнобедренные треугольники. То, что остаётся, автоматически соответствует разностороннему треугольнику и может быть указано в альтернативной ветви команды выбора.

Алгоритм решения задачи и его перевод на Паскаль выглядят следующим образом:

алг ТипТр_1 ( a, b, c: вещ ): нат
нач
   выбор
      при (a = b) и (b = c): ТипТр_1 := 1
      при (
a = b) или (a = c) или (b = c): ТипТр_1 := 2
      иначе ТипТр_1 := 3
   кв
кон

Function Type_Triangle_1 ( a,b,c: Real ): Byte;
Begin
   If (a=b) And (b=c) Then Type_Triangle_1 := 1
      Else If (a=b) Or (a=c) Or (b=c) Then Type_Triangle_1 := 2
         Else Type_Triangle_1 := 3
End;

2. Решение задачи “Тип треугольника – 2”.

Задача V.2.5. “Тип треугольника – 2”. Заданы значения углов треугольника A и B (в градусах). Построить алгоритм и подпрограмму, определяющую его тип по отношению к углам.

При решении этой задачи можно воспользоваться известным из геометрии правилом определения типа треугольника по отношению к его углам в зависимости от соотношения их величин:

-       если все три угла треугольника острые, то есть A < 90°, и B < 90°, и C < 90°, то треугольник остроугольный;

-       если один из углов прямой, то есть A = 90°, или B = 90°, или C = 90°, то треугольник прямоугольный;

-       если один из углов тупой, то есть A > 90°, или B > 90°, или C > 90°, то треугольник тупоугольный.

Разумеется, указанное правило справедливо, если треугольник с данными углами существует. Это следует считать ограничением значений исходных данных задачи. Впрочем, об этом прямо сказано в условии задачи: “Заданы углы треугольника…”.

Алгоритм решения задачи целесообразно строить в виде функции целочисленного типа, значениями которой являются варианты типов треугольника, закодированные целыми числами от 1 до 3 (1 – остроугольный, 2 – прямоугольный, 3 – тупоугольный).

Для определения значений вариантов подходит команда выбора. Поскольку условием задачи задаётся всего два угла треугольника, то предварительно должно быть вычислено значение и третьего его угла.

Интересно то, что для данной задачи порядок следования ветвей команды выбора может быть произвольным, поскольку все они практически равноценны.

Алгоритм решения задачи и его перевод на Паскаль выглядят следующим образом:

алг ТипТр_2 ( A, B: вещ ): нат
нач
C: вещ
  
C := 180 – AB
   выбор
      при (
A < 90) и (B < 90) и (C < 90): ТипТр_2 := 1
      при (
A = 90) или (B = 90) или (C = 90): ТипТр_2 := 2
      иначе ТипТр_2 := 3
   кв
кон

Function Type_Triangle_2 ( A, B: Real ): Byte;
   Var C: Real;

Begin

   If (A<90) And (B<90) And (C<90) Then Type_Triangle_2 := 1
      Else If (A=90) Or (B=90) Or (C=90) Then Type_Triangle_2 := 2
         Else Type_Triangle_2 := 3
End;

Решение данной задачи приведём также и в виде программы:

{$B+,D+,E+,I+,L+,N+,Q+,R+,X-}
Program V_02_05;
   Function Type_Triangle_2 ( A,B: Real ): Byte;
      Var C: Real;
   Begin
      C := 180-A-B;
      If (A<90) And (B<90) And (C<90) Then Type_Triangle_2 := 1
         Else If (A=90) Or (B=90) Or (C=90) Then Type_Triangle_2 := 2
            Else Type_Triangle_2 := 3
   End;
   Var A,B: Real;
Begin
   Write('Введите значения углов треугольника A и B в градусах: ');
   ReadLn(A,B);
   Case Type_Triangle_2(A,B) Of
      1: WriteLn('Треугольник остроугольный');
      2: WriteLn('Треугольник прямоугольный');
      3: WriteLn('Треугольник тупоугольный')
   End
End.

3. Нестандартные порядковые типы в Паскале.

Простейший нестандартный тип можно образовать, используя имя стандартного типа. Для этого в тексте программы следует создать раздел типов и внести в него соответствующую запись, например: Type NType = Integer. В результате в программе оказывается возможным использовать нестандартный тип NType, имеющий все свойства стандартного типа Integer.     

К популярным нестандартным порядковым типам относятся перечисляемый и интервальный.

Перечисляемый тип задаётся перечнем всех своих значений. Значениями типа являются идентификаторы. При определении такого типа следует выбрать идентификатор для него самого, а также построить список всех возможных его значений в виде списка идентификаторов.

Например: Type Name = (Ivan, Peter, Sidor, Mari). Теперь в разделе переменных можно описать, например, такую: Var X: Name. Переменная X в программе может принимать значения лишь из числа перечисленных идентификаторов, например, := Mari.

Никакие операции с величинами этого типа не предусмотрены. Ввести с клавиатуры или вывести на экран значения этого типа невозможно. Переменные и константы перечисляемого типа можно использовать в программе в качестве содержательных меток.

Интервальный тип образуется посредством указания определённого интервала значений (отрезка типа) из того или иного стандартного порядкового типа, называемого в данном случае базовым. Интервал записывают с помощью двух граничных значений (сначала наименьшего, а затем наибольшего) через горизонтальное двоеточие. Например:

Type
  
Letter = A’..’Z’;  {отрезок базового типа Char}
  
Date = 1..31;         {отрезок базового типа Byte}
  
Centre = –5..5;     {отрезок базового типа ShortInt}

Интервальный тип сохраняет все свойства соответствующего базового типа с учётом граничных значений.

Такой тип мы с вами уже использовали на прошлом занятии для записи оператора варианта.

Значениям переменных, для которых был определён перечисляемый либо интервальный тип, выход за допустимые границы запрещён. Разумеется, этот запрет действует только в том случае, если при настройке компилятора был включен контроль ситуаций выхода значений переменных за пределы допустимого диапазона в процессе выполнения программы, или в программе была использована директива компиляции {$R+}.

Уважаемые подписчики! На следующем занятии мы с вами продолжим рассмотрение задач на определение типов треугольников.

Уважаемые подписчики! При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.

С уважением, Александр.

 


В избранное