И сегодня мы с вами, уважаемые подписчики, продолжим изучение множественных ветвлений на примерах задач определения типов треугольников.
Дополнительно мы посмотрим, как можно использовать при этом вспомогательные алгоритмы. Также не будут оставлены без внимания типы величин в языке Паскаль.
ПРОДОЛЖАЕМ ОПРЕДЕЛЯТЬ ТИПЫ ТРЕУГОЛЬНИКОВ
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–A–B ТипТр_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).
Алгоритм можно сделать более компактным, если по известным сторонам предварительно вычислить косинусы углов, а затем уже на их основании сделать вывод о типе треугольника. При этом мы сможем воспользоваться, как вспомогательным, уже имеющимся у нас алгоритмом CosineA( a,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.