Программы разветвляющейся структуры
Средства разработки программ разветвляющейся структуры
Программой разветвляющейся структуры называют такую программу, в которой, в зависимости от исходных данных, возможны различные последовательности выполнения операторов, причем на любой из них каждый оператор выполняется только один раз.
Для реализации программ или фрагментов программ с разветвляющейся структурой используются сложные операторы [1]: условные операторы if и операторы выбора case. В этом разделе ограничимся рассмотрением полной формы условного оператора - оператора if then else и его сокращенной формы – оператора if then.
При использовании условных операторов ветвление алгоритма обусловлено проверками логических выражений (в языке Object Pascal их называют булевскими выражениями), результатом вычисления которых могут быть лишь два значения: «истина» и «ложь». В условных операторах могут использоваться как простейшие булевские выражения, основанные на сравнении выражений других типов, так и сложные, использующие логические операции.
Условные операторы
Оператор if then else имеет следующую синтаксическую диаграмму
где БВ – булевское выражение (см. ниже в разделе Булевский тип), значением которого может быть либо «истина», либо «ложь». Оп1 и Оп2 – операторы, каждый из которых может быть пустым оператором. При выполнении оператора if then else вначале вычисляется выражение БВ и если результат – «истина», то выполняется оператор Оп1, иначе, то есть если результат имеет значение «ложь», – оператор Оп2. В схемах алгоритмов оператору if then else соответствует конструкция
Оператор if then имеет синтаксическую диаграмму
где БВ – булевское выражение, Оп1 – оператор. При выполнении оператора if then вначале вычисляется выражение БВ и если результат – «истина», то выполняется оператор Оп1, иначе, то есть если результат – «ложь», управление передается следующему по порядку оператору программы. В схемах алгоритмов оператору if then соответствует конструкция
Простейшими булевскими выражениями являются отношения. Знаки отношений записываются следующим образом: >, <, = – так же, как в математике, знаки записываются парами символов <=, >=, <> соответственно. Более сложные булевские выражения рассмотрены в следующем разделе.
Пример. Требуется записать условный оператор, вычисляющий новое значение Y по заданным значениям A, B, X, Y по формуле
то есть в соответствии с алгоритмом
Вот этот оператор:
if A > B then
if B >= 3 then
Y:=2
else
else
Y:=X;
Этому оператору if then else подчинен оператор присваивания Y:=X и еще один оператор if then else, который, в свою очередь, содержит пустой оператор (после первого else) и оператор присваивания Y:=2. Необходимость использования else во вложенном условном операторе вытекает из следующего правила: else относится к ближайшему предшествующему if, у которого нет части else. Можно было бы не использовать else во вложенном условном операторе, но тогда пришлось бы заключить его в операторные скобки, то есть заменить его оператором
begin if B >= 3 then Y:=2 end.
Пример. Для функции предыдущего примера можно составить другой алгоритм:
Тогда соответствующим ему оператором if then else будет
if A<=B then
Y:=X
else
if B>=3 then
Y:=2
и вложенный в него условный оператор естественно использовать в сокращенной форме.
Булевский тип
Это стандартный тип Boolean. Он представляет всего два значения: «ложь» и «истина» (соответствующие булевские константы - False и True). Операциями над данными типа Boolean являются:
· отрицание (другое название – не, знак операции not),
· конъюнкция (другие названия – логическое произведение или просто И, знак операции and),
· дизъюнкция (другие названия – логическая сумма или просто ИЛИ, знак операции or),
· неравнозначность (другие названия – неэквивалентность или сумма по модулю два, знак операции xor).
Отрицание является унарной операцией, остальные – бинарными.
В математике операции not соответствует знак Ø перед аргументом (ØХ) или черта над аргументом (); операции and соответствует знак & или или (X&Y или XY или X Y); операции or соответствует знак V (X V Y); операции xor соответствует знак .
Ниже представлены их таблицы истинности.
X | not X | X | Y | X and Y | X | Y | X or Y | X | Y | X xor Y | |||
False | True | False | False | False | False | False | False | False | False | False | |||
True | False | True | False | False | True | False | True | True | False | True | |||
False | True | False | False | True | True | False | True | True | |||||
True | True | True | True | True | True | True | True | False |
В общем случае булевские выражения содержат отношения, булевские константы, переменные и функции, возвращающие булевские значения, разделенные знаками булевских операций и круглыми скобками. Операция not имеет наивысший приоритет и выполняется в первую очередь, операция and имеет тот же приоритет, что и арифметические операции типа умножения, операции or и xor имеет тот же приоритет, что и арифметические операции типа сложения и, наконец, в последнюю очередь вычисляются отношения.
Пример. Составить условный оператор для вычисления нового значения Y по формуле
Как видно из задания, при истинности одного из условий, другие будут иметь значение «ложь», поэтому для вычисления лучше использовать не два, а один условный оператор if then else, что приведет к сокращению вычислений:
if (A*B>1) and (A>0) then
Y:=A
else
if (A+B>1) and (A<0) then
Y:=B;
Во избежание ошибок компиляции, отношения, входящие в сложные булевские выражения, следует заключать в скобки, так как приоритет операций отношений ниже приоритетов других операций.
Пример 2.1 выполнения задания
Составить программу вывода значений функции Y(X), заданной графиком (функция не определена при |Х|>3)
или, что то же самое, – формулой
двумя способами:
a) с помощью минимального числа операторов if then else, без применения булевских операций (not, and, or, xor),
b) с помощью минимального числа операторов if then (без else) с применением булевских операций.
Вывести с поясняющими текстами значение Х и вычисленные значения функции.
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils, Math;
var
X,A,Z,Y:Real;
F:Boolean;
begin
Write('Введите значение аргумента: ');
ReadLn(X);
A:=Abs(X); //Вычисление абсолютного значения Х
Z:=Sign(X); //Вычисление Z
{ ----- Вычисление без применения булевских операций ----- }
if A>=3 then
WriteLn('Функция не определена. ')
else
begin
if A<=1 then
Y:=Z*(1-A)
else if A<2 then
Y:=Z
else
Y:=-Z;
WriteLn('Y = ',Y:4:2);
end;
{ ----- Вычисление с применением булевских операций ----- }
if A>=3 then
WriteLn('Функция не определена. ');
if A<=1 then
WriteLn('Y = ',Z*(1-A):4:2);
if (A>1) and (A<2) then
WriteLn('Y = ',Z:4:2);
if (A>=2) and (A<3) then
WriteLn('Y = ',-Z:4:2);
ReadLn;
end.