С помощью условного оператора реализуются разветвляющиеся вычислительные процессы.
Разветвляющимися процессами называются такие, в которых в зависимости от значения некоторого признака обработка данных производится по одному из возможных направлений (по одной из ветвей).
В условном операторе в зависимости от выполнения проверяемого условия вычисление производится по одной из двух возможных ветвей (если количество ветвей вычислительного процесса свыше двух, то в этом случае обычно используется оператор Case, который в дальнейшем рассматривается в разделе «Оператор варианта»).
Пример 1.
Это сигнатура, функция знака y = sign(x). График функции:
y
1
0 x
-1
Блок-схема вычисления функции знака:
да нет
y := 1
да нет
Здесь производятся две проверки. В первой из них ( ) определяется первая ветвь вычислений, но остаются неопределенными вторая и третья ветви в формуле вычисления функции знака. Разделение этих ветвей выполняет вторая проверка ( ). В последнем случае знак «=» - это операция отношения, но не присваивание переменной нулевого значения.
Синтаксическая диаграмма условного оператора:
Выражение между ifи then должно иметь тип boolean, т.е. это логическое выражение. Если значение выражения равно true, то выполняется оператор 1; в противном случае - оператор 2 или не выполняется никаких действий (при отсутствии альтернативы else).
Ранее указывалось, что операторы в Паскаль-программе разделяются между собой точкой с запятой. В связи с этим внутри любого структурного оператора, в том числе оператора if, символ ";" не должен встречаться, иначе все, что стоит после него, будет считаться уже другим оператором.
Пример 2.
If x>0 then
y:=sqrt(x);
Else
y:=sqr(x);
В этом примере точка с запятой, стоящая перед словом else, заканчивает текст условного оператора. А это приводит к ошибке, поскольку оператора, начинающегося с зарезервированного слова else, в Паскале нет.
Следовательно, перед словом elseв условном операторе не должно быть точки с запятой, в противном случае это рассматривается как ошибка.
Паскаль-программа для функции знака:
ProgramSign1;
Var x : integer;
y : shortint;
Begin
Ввод x
If x>0 then
y:=1
Else
If x<0 then
y:=-1
Else
y:=0;
Печать y
End.
Если x - вещественная переменная, то сравнение в большинстве случаев нужно выполнять по e, где e - достаточно малое число (погрешность задания исходных данных). Как уже ранее указывалось, вещественные числа, как правило, определяют результаты измерений, производимых с определенной точностью. В этом случае значение с точки зрения математики является положительным числом. Если же переменная означает вес груза, то значение кг должно считаться эквивалентным нулю, если точность измерения веса кг.
На числовой оси вещественный нуль - это e-окрестность точки 0. Другими словами, если ½x½ < e, то x считается равным нулю.
x < 0 x = 0 x > 0
-e 0 e x
Следовательно, для вещественных переменных
Аналогично, и т.п.
Реализация функции знака для вещественного аргумента:
ProgramSign2;
Const eps = 0.000001;
Varx : real;
y : shortint;
Begin
Ввод x
If x>eps then
y:=1
Else
If x<-eps then
y:=-1
Else
y:=0;
Печать y
End.
В реальных программах вычисление sign(x) оформляется в виде функции, обращение к которой аналогично, например, обращению к функции sin(x).
Вне зависимости от физического смысла переменных операции отношения для вещественных значений в большинстве случаев должны выполняться по .
Предположим, что в программе требуется вычислить значение корня нечетной степени:
Поскольку областью определения корня нечетной степени является вся числовая ось, то в программе должны анализироваться альтернативные варианты x < 0, x = 0 и x > 0. Учитывая, что ln(x), используемый при вычислении степенной функции, определен лишь при x > 0, рассматриваемую задачу можно реализовать следующим образом:
If abs(x)<eps then
y:=0
Else
y:=sign(x)*exp(ln(abs(x))/3);
Здесь рекомендуется установить eps <= 1E-30 ( при x = 1E-30 получим y = 1E-10 ).
Пример 3.
; сравнить и .
Var a,x,y : real;
b : boolean;
Begin
a:=5; x:=0.88;
y:=a*sin(x)/sqrt(1-sqr(cos(x));
b:=y=a;
Значения и равны лишь при точных вычислениях. При вычислении на ЭВМ мы имеем дело с приближенными значениями вещественных переменных.
Здесь мы получим b = false, так как y - a = 1.5 × 10-11 (точное значение y - a = 0).
Правильная реализация:
Consteps = 0.000001;
Var a,x,y : real;
b : boolean;
Begin
a:=5; x:=0.88;
y:=a*sin(x)/sqrt(1-sqr(cos(x));
b:=abs(y-a)<eps;
Здесь имеем b = true.
Пример 4. .
Program Max;
Vary,a,b,c : real;
Begin
Ввод a,b,c
y:=a;
Ifb>y then
y:=b;
If c>y then
y:=c;
Печать y
End.
Ниже приведена блок-схема для примера 4.
да нет
да нет
Примечание. Здесь, в отличие от предыдущих примеров, нет необходимости проверять отношения между значениями переменных с учетом погрешности .
Операторы 1 и 2, изображенные на синтаксической диаграмме условного оператора, в свою очередь могут быть условными операторами.
Пример 5.
IfB1 then
If B2 then
IfB3 then
S1
Else
S2
Else
IfB4 then
S3
Else
S4
Else
S5 .
Здесь B1,B2,B3,B4 – некоторые логические выражения, принимающие значения true или false; S1,S2,S3,S4,S5 – операторы (например, операторы присваивания). Каждое слово "else" в условном операторе относится к ближайшему слову "if", не связанному с каким-либо словом "else".
Схема действия записанного выше условного оператора наглядно изображена на приведенной ниже блок-схеме.
false true
false true
false true false true
Условные операторы, многократно вложенные друг в друга, трудно понимать и в программах их применять не рекомендуется.
Пример 6. Сгруппировать переменные в порядке возрастания.