Вопрос 16
Оценка 5

Вопрос 16

Оценка 5
doc
13.05.2020
Вопрос 16
Вопрос 16.doc

Вопрос 16.

Разветвляющие процессы.

Вычислительный процесс называется разветвляющимся, если в зависимости от выполнения определенных условий он реализуется по одному из нескольких, заранее предусмотренных (возможных) направлений. Каждое отдельное направление называется ветвью вычислений. Выбор той или иной ветви осуществляется уже при выполнении программы в результате проверки некоторых условий и определяется свойствами исходных данных и промежуточных результатов.

При составлении программы должны быть учтены все возможные ветви вычислений. Для программной реализации таких вычислений в языке имеются специальные операторы передачи управления, которые дают возможность перейти из одного места программы в другое (передать управление) и изменить порядок выполнения ее операторов.


Разветвляющаяся структура может быть представлена в виде следующих блок-схем:

 

 


P, P1, P2, P3 – проверяемые условия; S1, S2, S3, S4 – выполняемые действия.

Если такой переход осуществляется только при выполнении какого–либо условия, то он называется условным, а соответствующий ему оператор – оператором условного перехода. Если переход осуществляется в любом случае, то он называется безусловным, а соответствующий оператор – оператором безусловного перехода.

 

4.2.1.  Оператор условного перехода

Условный оператор реализует алгоритмическую конструкцию РАЗВИЛКА и изменяет порядок выполнения операторов в зависимости от истинности или ложности некоторого условия.

Условный оператор имеет две формы записи: полную и краткую.

Формат записи условного оператора (полная форма):

if <условие> then <оператор 1>

else <оператор 2>;

где <условие> – логическое выражение, истинность которого проверяется, <оператор 1> – оператор, который выполняется, если логическое выражение принимает значение истинности TRUE, <оператор 2> – оператор, который выполняется, если логическое выражение принимает значение истинности FALSE.

Операторы 1 и 2 могут быть как простыми, так и составными. Условный оператор является единым предложением и поэтому ни перед then, ни перед else символ ‘;’ не ставится.

Формат записи условного оператора (краткая форма):

if <условие> then <оператор>;

Если логическое выражение принимает значение истинности TRUE, то <оператор> выполняется; если логическое выражение принимает значение истинности FALSE, то выполняется следующий оператор программы.

Примеры использования условного оператора:

1) if x<0 then y:= x+1 else y:= 2*x;

2) if (n>15) and (n<25) then a:= n+40 else b:= n+1;


3) В программе вычисления значения функции

можно использовать условный оператор в такой записи:

if a=b then if c<d then x:=1   else x:=2

 else x:=3;

4) if a>b then begin

y1:=7;    y2:=a;   y3:=a+b

end

else begin

y1:=2*a;  y2:=a-b; y3:=0

end;

5) if a<=15 then y:=x-7;

z:=y+1;

Если a<=15,  то вычисляем значение y по формуле y= x-7, затем вычисляем значение z. Если a>15, то сразу вычисляем значение z.

 

Оператор безусловного перехода

Оператор GOTO позволяет изменить стандартный последовательный порядок выполнения операторов и перейти к выполнению программы, начиная с заданного оператора. Оператор, на который происходит переход, должен быть помечен меткой, которая и указывается в GOTO.

Формат записи оператора:

GOTO <метка>;

Использовать оператор GOTO следует крайне осторожно. Широкое его применение без особых на то оснований ухудшает понимание логики работы программы. Безусловный переход можно осуществлять далеко не из каждого места программы и не в любое место программы. Так, нельзя с помощью этого оператора перейти из основной программы в подпрограмму или выйти из подпрограммы. Не рекомендуется осуществлять переход внутрь структурированного оператора, т.к. он может дать неправильный результат.

Пример 1. Составить программу вычисления значения функции y=x+ln(x).

program fn1;

label  20;

var     X, Y : real;

begin      Write ('Введите значение X');           Readln(X);

if X<=0 then  begin

   Writeln('программа прервана');   goto 20

end

else Y:=X+ln(X);

Writeln('Y = ',Y)

20: end.

Пример 2. Даны три различных целых числа. Определить, можно ли из этих чисел образовать арифметическую прогрессию.

Указание. Если три числа a,b,c образуют арифметическую прогрессию, то справедливо равенство b = (a+c)/2.

program arif_progr;

var        a,b,c: integer;

begin          

       Write ('Введите значения a,b,c: ');           Readln(a,b,c);

       if  (a+b = 2*c) or (a+c = 2*b) or (b+c = 2*a)  then

 Writeln('данные числа образуют арифметическую прогрессию ')

else   Writeln('данные числа не образуют арифметическую прогрессию ')

end.

Пример 3. Вывести на экран номер четверти, которой принадлежит точка с координатами (x, y), при условии, что x и y отличны от нуля.

program koordinati;

var     x, y: real;

begin     Write ('Введите координаты точки: ');           Readln(x, y );

if  x>0   then if  y>0 then   Writeln('точка находится в  1 – ой четверти ')

                              else       Writeln('точка находится в  4 – ой четверти ')

          else if  y>0  then      Writeln('точка находится во 2 – ой четверти ')

                              else       Writeln('точка находится в  3 – ей четверти ')

end.

Пример 4. Составить программу вычисления корней квадратного уравнения

ax2 + bx + c = 0   при a не равном нулю.

program KVUR;

var  a,b,c: real;           {коэффициенты уравнения, a<>0}

d: real;               {дискриминант}

x1,x2: real;        {действительные корни}

e: real;               {действительная часть мнимых корней}

f: real;               {коэффициент при мнимой части}

begin

Writeln('Введите коэффициенты a, b, c');                    Readln(a,b,c);

d:= sqr(b)-4*a*c;     e:= -b/(2*a);        f:= sqrt(abs(d))/(2*a);

if d>=0 then

begin   x1:= e-f; x2:= e+f;

Write('Корни действительные: ');    Writeln('x1=',x1:8:5,' x2=',x2:8:5);

end

else

begin   Writeln('Корни мнимые.');    Writeln('Действительная часть: ',e:8:5,',');

Write('коэффициент при мнимой части: ',f:8:5);

end

end.

 

4.2.3. Оператор выбора

Оператор выбора CASE обеспечивает организацию разветвлений путем выбора одного из нескольких операторов.

Формат записи оператора выбора:

case <селектор> of

c1: <оператор 1>;

c2: <оператор 2>;

. . . . . . . .

cn: <оператор n>

else <оператор>

end;

Селектором в операторе выбора является выражение целого (кроме longint), символьного, логического типа, либо типа, определяемого пользователем (перечисляемого и ограниченного). Из операторов 1, 2, ..., n выполняется тот, для которого соответствующая константа c1, c2, ..., cn совпадает со значением селектора. Константы должны быть одного типа с селектором.

Если для нескольких констант нужно выполнить один и тот же оператор, то их можно перечислить через запятую (или указать диапазон).

Оператор выбора работает следующим образом: сначала вычисляется значение селектора, затем в последовательности операторов 1, 2, ..., n отыскивается тот, которому соответствует константа, равная вычисленному значению селектора. Найденный оператор выполняется, оператор case завершает работу.

Если в списке констант не будет найдена константа, соответствующая вычисленному значению селектора, то выполняется оператор, стоящий в программе за case, если в case нет ветви else, а если такая ветвь есть, то оператору, стоящему за else.

Примеры записи оператора выбора:

1)  case  k+1  of

5:    y:=sqr(x);

3,11:    y:=sqrt(x);

4:    z:=4*(a-b);

6..10:    Writeln(a,b)

end;

2)  case s of

'+', '-', '*', '/':   Write('знак операции');

  'A'..'Z':   Write('буква');

  '0'..'9':    Write('цифра')

  else    Write('другой символ')

end;


Вопрос 16. Разветвляющие процессы

Вопрос 16. Разветвляющие процессы

TRUE, <оператор 2> – оператор, который выполняется, если логическое выражение принимает значение истинности

TRUE, <оператор 2> – оператор, который выполняется, если логическое выражение принимает значение истинности

Не рекомендуется осуществлять переход внутрь структурированного оператора, т

Не рекомендуется осуществлять переход внутрь структурированного оператора, т

Write('Корни действительные: ');

Write('Корни действительные: ');

Write(' другой символ ') end;

Write(' другой символ ') end;
Скачать файл