Сегодня мы с вами, уважаемые подписчики, продолжим изучение множественных ветвлений на примерах задач определения типов треугольников.
Кроме того, мы продолжим процесс углубления наших знаний, связанных с типами величин в языке Паскаль.
ОПРЕДЕЛЕНИЕ ТИПОВ ТРЕУГОЛЬНИКОВ
1. Решение задачи “Тип треугольника – 1”.
Задача V.2.4. “Тип треугольника – 1”. Заданы стороны треугольника a, b, c. Построить алгоритм и подпрограмму, определяющую его тип по отношению к сторонам.
При решении этой задачи можно воспользоваться известным из геометрии правилом определения типа треугольника по отношению к его сторонам в зависимости от соотношения их длин:
-если все три стороны треугольника равны между собой 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 ElseType_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 – A – B выбор при
(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 ElseType_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.
К популярным нестандартным порядковым типам относятся перечисляемый и интервальный.
Перечисляемый тип задаётся перечнем всех своих значений. Значениями типа являются идентификаторы. При определении такого типа следует выбрать идентификатор для него самого, а также построить список всех возможных его значений в виде списка идентификаторов.
Например: TypeName = (Ivan, Peter,
Sidor, Mari). Теперь в разделе переменных можно описать, например, такую: Var X: Name. Переменная X в программе
может принимать значения лишь из числа перечисленных идентификаторов, например,X := Mari.
Никакие операции с величинами этого типа не предусмотрены. Ввести с клавиатуры или вывести на экран значения этого типаневозможно. Переменные и константы перечисляемого типа можно использовать в программе в качестве содержательных
меток.
Интервальный тип образуется посредством указания определённого интервала значений (отрезка типа) из того или иного стандартного порядкового типа, называемого в данном случае базовым. Интервал записывают с помощью двух граничных значений (сначала наименьшего, а затем наибольшего)
через горизонтальное двоеточие. Например:
Type Letter =’A’..’Z’;{отрезок базового типа Char} Date =1..31;{отрезок базового типа Byte} Centre =–5..5;{отрезок базового типа ShortInt}
Интервальный тип сохраняет все свойства соответствующего базового типа с учётом граничных значений.
Такой тип мы с вами уже использовали на прошлом занятии для записи оператора варианта.
Значениям переменных, для которых был определён перечисляемый либо интервальный тип, выход за допустимые границы запрещён. Разумеется, этот запрет действует только в том случае, если при настройке компилятора был включен контроль ситуаций выхода значений переменных за пределы допустимого диапазона в процессе выполнения программы, или в программе была использована директива компиляции {$R+}.
Уважаемые подписчики! На следующем занятии мы с вами продолжим рассмотрение задач на определение типов треугольников.
Уважаемые подписчики!При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru. При этом настоятельно рекомендую пользоваться браузером Internet Explorer.