Разветвляющиеся вычислительные процессы
Разветвляющиеся вычислительные процессы – это процессы, в которых происходит выбор одного из нескольких возможных направлений вычислительного процесса в зависимости от значений исходных данных или промежуточных результатов вычислений.
В языке Pascal существует ряд средств, с помощью которых можно организовать разветвление в программе [Л1, стр. 51 - 54]. Одним из таких средств является условный оператор if.
Общий вид оператора if:
ifлогическое_выражениеthenоператор1еlseоператор2;
где оператор1, оператор2 – простые или составные операторы.
Составной оператор представляет собой последовательность операторов, заключенных в операторные скобки begin - end.
Выполнение оператора if:
1) вычисление значения логического выражения;
2) в случае, если его значение равно true (истина), выполняется оператор1, в противном случае - оператор2;
3) управление передается оператору, следующему за оператором if.
Допускается форма оператора if без конструкции else:
ifлогическое_выражениеthenоператор1;
В этом случае оператор1 выполняется, когда значение логического_выражения равно true (истина), в противном случае управление передается оператору, следующему за оператором if.
Пример 1. Вычислить значение функции y(x)
Программа Схема алгоритма
Program Prim1;
var
a,x,y : real;
begin
writeln('Введите а, x');
readln(a,x);
if x>a then
y:=a*sin(x)
else
y:=1- sqr(x);
writeln('y=', y:7:2);
end.
Исходные данные: Результат:
I вариант a = 2.3; x = 5.5 y = -1.62
II вариант a = 12.1; x = 3.7 y = -12.69
Примечание.
В операторе вывода writeln('y=', y:7:2)указан формат вывода y:7:2для значения переменной y, где число 7 определяет общий размер поля, отводимого в строке вывода для размещения значения переменной, а число 2 указывает количество разрядов для дробной части этой переменной.
Пример 2. Вычислить значение функции y(x)
Программа Схема алгоритма
Program Prim2;
var
a,b,x,y : real;
begin
writeln('Введите a, b, x');
readln(a,b,x);
if x<=1 then y:=abs(a*x+b)
else
if x>=2 then y:=exp(-x)+1
else y:= exp(4.5*ln(x));
writeln('y=', y:5:2);
end.
Примечание.
Для вычисления выражения x4.5 в программе
используется эквивалентное выражение:
x4.5=e4.5*lnx
Исходные данные: Результат:
I вариант a = 1.4; b = 3; x = -5.2 y= 4.28
II вариант a = 2.8; b = -4; x = 1.5 y= 6.20
III вариант a = 2; b = 6; x = 4 y= 1.02
Пример 3. Вычислить значение функции y(x)
Примечание.
В этом примере нужно предусмотреть выдачу на экран сообщения, (например, “Нет решения”) при возникновении так называемой исключительной (аварийной) ситуации [Л1, стр. 17], которая может произойти в случае, если знаменатель дроби 1/(a+x) равен нулю.
Программа Схема алгоритма
Program Prim3;
label 1;
var
a,b,x,y : real;
begin
writeln('Введите a, b, x');
readln(a,b,x);
if x<=b then if (a+x)<>0 then y:=1/(a+x)
else
begin
writeln('Нет решения');
goto 1;
end
else y:=1+b*x;
writeln('y=', y:6:3);
1: end.
Примечания.
1. В операторе if перед словом elseпосле слова end нельзя ставить точку с запятой.
2. В данной программе используется оператор безусловного перехода goto 1;где 1 – метка, которая указывает, к какому оператору нужно перейти (Л1, стр. 47).
Метка выбирается пользователем и должна быть описана в разделе описаний программы, например так: label 1;
Исходные данные: Результат:
I вариант a = 4.35; b = 3; x = 2.85 y= 0.139
II вариант a = -1; b = 5; x = 1 Нет решения
III вариант a = 2.5; b = 3.7; x = 6.4 y=24.680
Пример 4. Вычислить значение функции y(x)
Примечание.
В этом примере исключительные ситуации могут возникнуть в случаях, если выражение (cx+d) меньше или равно нулю и выражение (dx-3) меньше нуля, т.е. в случаях невозможности выполнения вычисления логарифма отрицательного числа или числа, равного нулю, а также вычисления корня квадратного из отрицательного числа.
Схема алгоритма
Программа
Program Prim4;
label 10;
var
c,d,x,y : real;
begin
writeln('Введите c, d, x');
readln(c,d,x);
if x<=c then if c*x+d>0 then y:=ln(c*x+d)
else
begin
writeln('Нет решения');
goto 10;
end
else if x>=d then y:=cos(x-c)
else
if d*x-3>=0 then y:=sqrt(d*x-3)
else begin
writeln('Нет решения');
goto 10;
end;
writeln('y=', y:8:3);
10 : end.
Исходные данные: Результат:
I вариант c = 3.26; d = 5.5; x = 8.12 y = 0.147
II вариант c = 12; d = -14; x = 1 Нет решения
III вариант c = 2.36; d = 10; x = 1.5 y = 2.606
IV вариант c = 2; d = 8; x = 5 y = 6.083
V вариант c = -4; d = 1; x = -2 Нет решения
Примечание.
Проверку наличия исключительной ситуации в рассмотренном примере можно осуществить другим способом.
Введем переменную k и присвоим ей начальное значение, равное нулю (k:=0). В случае возникновения исключительной ситуации (например, если выражение c*x+d принимает отрицательное значение) присвоим переменной k значение, равное единице (k:=1).
Т.о. значение переменной k определяет наличие или отсутствие исключительной ситуации.
Схема алгоритма
Программа
Program Prim4-1;
var c,d,x,y : real;
k : integer;
begin
writeln('Введите c, d, x');
readln(c,d,x);
k:=0;
if x<=c then if c*x+d>0 then y:=ln(c*x+d) else k:=1
else if x>=d then y:=cos(x-c)
else if d*x-3>=0 then y:=sqrt(d*x-3) else k:=1;
if k=0 then writeln('y=', y:8:3) else writeln('Нет решения');
end.