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

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

  Все выпуски  

Занятие 29.


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

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

ПРОДОЛЖАЕМ ОПРЕДЕЛЯТЬ ТИПЫ ТРЕУГОЛЬНИКОВ

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

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

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

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

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

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

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

Обращаем внимание, что вышеприведённое правило практически совпадает с правилом определения типа треугольника по отношению к его сторонам в зависимости от соотношения их длин. Разумеется, за исключением того, что вместо сторон фигурируют углы. Это позволяет для определения типа треугольника обратиться ко вспомогательному алгоритму-функции V.2.4  ТипТр_1 (см. материалы предыдущего занятия). Предварительно следует вычислить значение третьего угла треугольника.

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

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

алг ТипТр_3 ( A, B: вещ ): нат
нач
C: вещ
   С := 180–AB
   ТипТр_3 := ТипТр_1 (A, B, C)
кон

Function Type_Triangle_3 ( A, B: Real ): Byte;
   Var C: Real
Begin
   C := 180–A–B
   Type_Triangle_3 := Type_Triangle_1 (A, B, C)
End;

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

Задача V.3.6. “Тип треугольника – 4”. Построить алгоритм и подпрограмму, которая по трём заданным сторонам треугольника a, b и c определяет его тип по отношению к углам.

Тип треугольника по отношению к углам в зависимости от заданных сторон может быть определён исходя из общеизвестной теоремы Пифагора:

-       если квадрат одной из сторон равен сумме квадратов двух других, то этот треугольник прямоугольный;

-       если квадрат одной из сторон больше суммы квадратов двух других, то этот треугольник тупоугольный;

-       если квадрат каждой стороны меньше суммы квадратов двух других, то этот треугольник остроугольный.

Очевидно, что использование этих условий для решения данной задачи приводит к чересчур громоздкой записи и большому количеству повторяющихся вычислений. Чтобы убедиться в этом, достаточно посмотреть на логическое выражение, соответствующее хотя бы первому из перечисленных условий: (a*a=b*b+c*c) или (b*b=a*a+c*c) или (c*c=a*a+b*b).

Алгоритм можно сделать более компактным, если по известным сторонам предварительно вычислить косинусы углов, а затем уже на их основании сделать вывод о типе треугольника. При этом мы сможем воспользоваться, как вспомогательным, уже имеющимся у нас алгоритмом CosineAa,b,cвещ ): вещ, определяющим косинус угла треугольника, лежащего против первой из трёх указанных в числе его параметров сторон (см. материалы занятия 14). Более того, манипулировать косинусами удобнее, поскольку приходится анализировать только их знаки. Соответствующие условия таковы:

-       если косинусы всех углов положительны, то треугольник остроугольный;

-       если косинус одного из углов равен нулю, то треугольник прямоугольный;

-       если косинус одного из углов отрицателен, то треугольник тупоугольный.

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

алг ТипТр_4 ( a, b, c: вещ ): нат
нач
CA, CB, CC: вещ
   СA := CosineA(a,b,c); СB := CosineA(b,c,a); СC := CosineA(c,a,b); 
   выбор
      при (
CA > 0) и (CB > 0) и (CC > 0): ТипТр_4 := 1
      при (
CA = 0) или (CB = 0) или (CC = 0): ТипТр_4 := 2
      иначе ТипТр_4 := 3
   кв
кон

Function Type_Triangle_4 (a,b,c: Real): Byte;
   Var CA,CB,CC: Real;
Begin
   CA := CosineA(a,b,c); CB := CosineA(b,c,a); CC := CosineA(c,a,b);
   If (CA>0) And (CB>0) And (CC>0) Then Type_Triangle_4 := 1
      Else If (CA=0) Or (CB=0) Or (CC=0) Then Type_Triangle_4 := 2
         Else Type_Triangle_4 := 3
End;

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

{$B+,D+,E+,I+,L+,N+,Q+,R+,X-}
Program V_03_06;
   Function CosineA ( a, b, c: Real ): Real;
      Var x: Real;
   Begin
      x := b*b + c*c - a*a;
      x := Int(x*1E10)/1E10;
      CosineA := x / ( 2*b*c)
   End;
   Function Type_Triangle_4 (a,b,c: Real): Byte;
      Var CA,CB,CC: Real;
   Begin
      CA := CosineA(a,b,c); CB := CosineA(b,c,a); CC := CosineA(c,a,b);
      If (CA>0) And (CB>0) And (CC>0) Then Type_Triangle_4 := 1
         Else If (CA=0) Or (CB=0) Or (CC=0) Then Type_Triangle_4 := 2
            Else Type_Triangle_4 := 3
   End;
   Var a,b,c: Real;
Begin
   Write('Введите стороны треугольника a,b,c: ');
   ReadLn(a,b,c);
   Case Type_Triangle_4(a,b,c) Of
     
1: WriteLn('Треугольник остроугольный');

      2: WriteLn('Треугольник прямоугольный');
      3: WriteLn('Треугольник тупоугольный');
   End
End.

3. Характеристика вещественных типов.

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

В отличие от порядковых, значения вещественных типов приближённы. Представление вещественного числа имеет две составляющие: мантиссу и порядок. От допустимого количества разрядов мантиссы зависит возможная точность числа. От допустимых значений порядка зависит диапазон представления чисел. Чем мощнее вещественный тип (чем больше объём его значения), тем выше точность и шире диапазон чисел. Однако, в общем случае, для данного вещественного типа ни предельные значения порядка, ни предельное количество разрядов мантиссы не являются строго фиксированными. В определённых пределах они взаимосвязаны между собой.

В таблице представлены характеристики значений вещественного типа. При этом диапазон значений порядка указан для мантиссы, равной единице, а точность (количество десятичных разрядов) мантиссы указана для нулевого порядка.

Идентификатор

Наименование

Объём значения

Диапазон значений порядка

Количество разрядов мантиссы

Single

одинарной точности

4

–45..38

8

Real

обычной точности

6

–38..38

13

Double

двойной точности

8

–323..308

16

Extended

повышенной точности

10

–4931..4932

19

Если порядок числа указать меньшим предельного, то значение числа автоматически трансформируется в нуль. Если же значение порядка указать большим предельного, то появляется сообщение о переполнении. 

Особое место занимает “вещественный” тип Comp. Его значения имеют целочисленное представление. Но, поскольку объём его значения составляет 8 байт, то процедуры, функции и операции, определённые для порядковых типов, для типа Comp не работают. Свойства значений этого типа требуют отдельного рассмотрения.

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

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

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


В избранное