Мы с вами, уважаемые подписчики, начинаем подготовку к изучению методов и средств программирования разветвлений.
Изучив свойства, порядок записи и вычисления логических выражений, можно перейти к построению алгоритмов и подпрограмм с результатами логического типа. Без ложной скромности отмечу, что материал подобного рода вы вряд ли найдёте в обычной литературе.
АЛГОРИТМЫ С РЕЗУЛЬТАТАМИ ЛОГИЧЕСКОГО ТИПА
1. Решение задачи “Стороны треугольника”.
Задача L.2.1. “Стороны треугольника”. Заданы произвольные числа a, b и c. Построить алгоритм и подпрограмму для определения того, может ли существовать треугольник с длинами сторон, равными заданным числам.
Смысл задачи состоит в определениии возможности построения треугольника, длины сторон которого равны произвольным числам a, b и c.
В основу решения задачи следует положить известное “неравенство треугольника”, в соответствии с которым каждая сторона обязательно должна быть меньше суммы двух других в том случае, если треугольник существует. Очевидно, что сформулированное утверждение может быть представлено логическим выражением (a < b + c) и
(b < a + c) и (c < a + b), которое в этом случае оказывается истинным.
А вот если хотя бы одна из сторон не меньше суммы двух других, то значение этого логического выражения оказывается ложным. Последнее означает, что существование такого треугольника невозможно.
Осталось решить следующий вопрос. Поскольку в условии задачи сказано, что числа a, b, c – произвольные, то не следует ли при ответе на вопрос задачи учесть и то, что все они обязательно должны быть положительными ? И в том случае, когда хотя бы одно из них неположительное, также давать отрицательный ответ на вопрос о существовании треугольника.
Однако простая проверка показывает, что и без того наличие хотя бы одного неположительного значения среди чисел a, b, c сразу приводит к ложности значения нашего логического выражения. Например:
-a = 2, b = 2, c = –2; получаем (a < b + c) = НЕТ;
-a = 2, b = –2, c = 2; получаем (c < a + b) = НЕТ и т.д.
Таким образом, мы приходим к выводу, что “неравенство треугольника” является универсальным и автоматически учитывает условие положительности сторон треугольника. Поэтому использовать какие бы то ни было дополнительные условия нет необходимости.
Окончательный вывод состоит в том, что можно построить алгоритм решения поставленной задачи в виде функции логического типа, принимающей истинное значение только в том случае, если треугольник с заданными длинами сторон существует, и наоборот, принимающей ложное значение, если треугольник с заданными длинами сторон существовать не может. При этом, учитывая прозвольный характер задаваемых в качестве
сторон числовых значений, тип аргументов должен быть выбран вещественным.
Алгоритм и его перевод на Паскаль выглядят следующим образом:
алг Стороны ( a, b, c: вещ ): лог дано произвольные a, b, c надоДА – в случае существования треугольника нач Стороны := (a < b + c) и (b < a + c) и (c < a + b) кон
Function Side ( a,b,c: Real ): Boolean; Begin Side:=(a<b+c) And (b<a+c) And (c<a+b) End;
Решение данной задачи приведём также и в виде программы.
{$B+,D+,E+,I+,L+,N+,Q+,R+,X-} ProgramL_02_01; FunctionSide ( a,b,c: Real ): Boolean; Begin Side := (a < b+c) And (b < a+c) And (c < a+b) End; Vara,b,c: Real; Begin Write('Введите в качестве длин сторон треугольника числа a,b,c: '); ReadLn(a,b,c); WriteLn('Утверждение, что такой треугольник существует = ',Side(a,b,c)); End.
Обратите внимание, что в исполняемой части программы обращение к функции, решающей поставленную задачу, указано в качестве элемента списка оператора вывода. Отметим, что такое удобство возможно только для функций.
2. Решение задачи “Углы треугольника”.
Задача L.2.2. “Углы треугольника”. Заданы произвольные значения углов A и B в градусах. Построить алгоритм и подпрограмму для определения того, может ли существовать треугольник с такими углами.
Смысл задачи состоит в определениии возможности построения треугольника, значения двух углов которого равны произвольным числам A и B.
Известные свойства треугольника позволяют утверждать, что все три его угла обязательно положительны, а их сумма равна 180°.
Поскольку из трёх углов заданы только два A и B, то третий угол С можно доопределить, вычтя из 180 сумму заданных углов. Таким образом, отпадает необходимость в проверке, действительно ли сумма всех трёх углов равна 180°. Остаётся
проверить, все ли углы положительны. Соответствующее логическое выражение (A > 0) и (B > 0) и (C > 0) как раз и оказывается истинным именно в этом случае. Сам треугольник при этом считается существующим.
А вот если хотя бы один из углов неположителен, то хотя бы одно из отношений, а также значение логического выражения в целом оказывается ложным. Последнее означает, что существование такого треугольника невозможно.
Окончательный вывод состоит в том, что можно построить алгоритм решения поставленной задачи в виде функции логического типа, принимающей истинное значение только в том случае, если треугольник с заданными углами существует, и наоборот, принимающей ложное значение, если треугольник с заданными углами существовать не может. При этом, учитывая прозвольный характер задаваемых в качестве углов числовых значений,
тип аргументов должен быть выбран вещественным.
Алгоритм и его перевод на Паскаль выглядят следующим образом:
алг Углы ( A, B: вещ ): лог дано произвольные углы A, B надоДА – в случае существования треугольника начC: вещ C := 180 – ( A + B ); Углы := (
A > 0 ) и ( B > 0 ) и ( C > 0 ) кон
Function Angle ( A,B: Real ): Boolean; Var C: Real; Begin C := 180 – ( A + B ); Angle := (A>0) And (B>0) And (C>0) End;
В заключение отметим смысл применения промежуточной переменной C вещественного типа, обозначающей третий угол. Принципиальной необходимости в ней нет, так как можно было бы использовать логическое выражение (A > 0) и (B > 0) и
(180 – (A + B) > 0). Тем не менее, как мне кажется, при наличии переменной C алгоритм становится более понятным и выразительным.
Решение данной задачи в виде программы запишите самостоятельно.
Таким образом, мы с вами, уважаемые подписчики, начали учиться составлять простейшие алгоритмы с результатами логического типа, переводить их на Паскаль и реализовывать в виде программ.
Попутно мы расширили наши знания об операторах вывода Паскаля.
Уважаемые подписчики!При необходимости задать вопрос, проконсультироваться, уточнить или обсудить что-либо обращайтесь через Гостевую книгу моего персонального сайта http://a-morgun.narod.ru