01 (537404), страница 5
Текст из файла (страница 5)
Блок-схема вышеописанного алгоритма приведена на рисунке 2.
Для создания программ, реализующих такие разветвляющиеся алгоритмы, используются операторы безусловного и условного переходов, влияющие на последовательность выполнения операторов.
Оператор безусловного перехода позволяет передать управление любому выполняемому оператору программы. Общая форма оператора
Go to метка
где метка – метка оператора, которому передается управление.
Выполняемый оператор, непосредственно следующий за оператором
безусловного перехода, должен иметь метку, иначе на него невозможно передать управление
123456789.............…….... …….............................72 73......80
Go to 10
8 А = D + B
10 C = E - A
В данном фрагменте оператор безусловного перехода передает управление оператору C = E - A с меткой 10, минуя оператор A = D + B.
Вычисляемый оператор безусловного перехода используется в ситуации, когда адрес передачи управления меняется в зависимости от значения некоторого целого выражения. Общая форма оператора
Go to ( список меток )[,] выражение.
Здесь список меток | – перечень меток выполняемых операторов, которым требуется передать управление. Метки в списке разделяются запятыми; |
выражение | – арифметическое выражение целого типа, значение которого указывает адрес передачи управления. |
Оператор осуществляет передачу управления выполняемому оператору с меткой, порядковый номер которой в списке равен значению арифметического выражения. В ситуации, когда вычисленное значение арифметического выражения меньше единицы или больше количества меток в списке, выполняется оператор, следующий непосредственно за вычисляемым оператором безусловного перехода. В списке меток оператора допускается их повторение. Например, приведенный ниже фрагмент программы
123456789................................................72 73......80
Go to (12, 8, 25, 8), NUM
A = 2.5
12 F = X
Go to 10
25 F = X * Y
Go to 10
8 F = A + D
10 ........
работает следующим образом: если значение целой переменной NUM равно 1, то управление будет передано оператору с меткой 12, при NUM, равном 2-м или 4-м - оператору с меткой 8 и так далее. Если значение NUM окажется меньше 1 или больше 4, то управление будет передано оператору А = 2.5.
Оператор условного перехода служит для выбора одного из нескольких возможных продолжений процесса выполнения программы в зависимости от выполнения некоторого условия. Различают арифметический, логический и блочный операторы условного перехода.
Арифметический оператор условного перехода осуществляет выбор пути передачи управления на основе анализа некоторого арифметического выражения и записывается в виде:
If (выражение) M1, M2, M3
где выражение – арифметическое выражение, определяющее выбор направления передачи управления;
M1, M2, M3 – метки выполняемых операторов, которым может быть передано управление.
Арифметический оператор условного перехода передает управление оператору с меткой – M1, если значение арифметического выражения меньше нуля, M2 – если выражение равно нулю и M3 – если выражение больше нуля.
При использовании арифметического оператора условного перехода необходимо придерживаться следующих правил:
-
оператор, следующий непосредственно за ним, должен иметь метку, в противном случае он будет недоступен в программе;
-
две метки из трех используемых могут совпадать, что позволяет реализовать условия " " или " ";
-
для перехода по нулевому значению (метка M2) не рекомендуется использовать арифметическое выражение вещественного типа;
-
блоки операторов, имеющих метки M1, M2, M3, могут располагаться в любом месте программы и не обязаны следовать за условным оператором.
Например, приводимый фрагмент программы
123456789................................................72 73......80
If (Sqrt(A) + 3*B) 20, 10, 25
20 X = Y + Z
Go to 30
25 X = Y
Go to 30
10 X = Y - Z
30 ........
выполняется следующим образом: если значение арифметического выражения Sqrt(A) + 3*B будет отрицательным, то управление будет передано оператору с меткой 20, если нулевым – оператору с меткой 10, если положительным – оператору с меткой 25.
***Замечание: при использовании арифметического оператора условного перехода необходимо отслеживать корректность работы программы после выбора ветви расчетов. В приведенном примере этой цели служат операторы безусловного перехода Go to 30, которые позволяют обходить ненужные расчетные ветви.
С использованием описанных операторов рассмотренный выше алгоритм решения задачи об идентификации областей может быть записан в виде программы
123456789..............................................................72 73......80
Read(*, *) X, Y
If (X*X + Y*Y - 4.) 4, 4, 3
3 N = 0
Go to 7
4 If (Y) 6, 6, 5
5 N = 1
Go to 7
6 N = 2
7 Write(6, 8) X, Y, N
8 Format(' Точка M(', F4.1, ',', F4.1,
* ') лежит в области N = ', I1)
End
Логический оператор условного перехода осуществляет выбор пути передачи управления на основе анализа логического выражения и записывается в виде:
If ( выражение ) оператор
где выражение | – логическое выражение, определяющее будет ли выполняться оператор, входящий в условный оператор, или нет; |
оператор | – любой выполняемый оператор. |
При выполнении логического оператора условного перехода вычисляется и анализируется выражение. Если оно – "истина", выполняется оператор. В противном случае ("ложь") – оператор выполняться не будет, и управление будет передано оператору, следующему за логическим оператором условного перехода. Ниже приведены фрагменты программ, иллюстрирующие работу логического оператора условного перехода.
123456789...............................................................72 73......80
If (X.LE.1.5) Go to 12
Y = -1.0
Go to 15
12 Y = 1.0
15 .......
В этом примере вычисление переменной Y производится в зависимости от значения переменной X. Если X <=1.5, то управление будет передано оператору с меткой 12 и Y примет значение, равное 1.0. Если Х > 1.5, то выполнится оператор Y = - 1.0. Оператор безусловного перехода Go to 15 позволяет избежать ошибочного присваивания переменной Y значения 1.0.
В этом фрагменте программы
123456789..............................................................72 73......80
............
If (X.GT.5.) X = X/2.
Y = 3. + X**2
.........
перед вычислением значения переменной Y проверяется значение переменной Х. Если выполняется условие Х > 5, то сначала значение переменной Х уменьшается вдвое, а затем вычисляется значение переменной Y. В противном случае, значение Х остается неизменным, и управление сразу переходит к оператору Y = 3. + X**2.
С использованием логического оператора условного перехода рассмотренная выше программа идентификации областей примет вид:
123456789..............................................................72 73......80
Read(*, *) X, Y
If (X*X + Y*Y.LE.4.) Go to 4
N = 0
Go to 7
4 If (Y.LE.0.) Go to 6
N = 1
Go to 7
6 N = 2
7 Write(6, 8) X, Y, N
8 Format(' Точка M(', F4.1, ',', F4.1, ') лежит в области N = ', I1)
Stop
End
Блочный оператор условного перехода является аналогом логического оператора условного перехода, но позволяет использовать в каждой из своих расчетных ветвей не один оператор, а блоки операторов. Общая форма оператора
If ( выражение ) Then
блок_1
[ Else
блок_2 ]
EndIf
где выражение | – логическое выражение, определяющее будет ли выполняться блок_1 или блок_2; |
блок_1, блок_2 | – группы выполняемых операторов. |
Блочный оператор условного перехода работает следующим образом. Если значение логического выражения есть "истина", то выполняются операторы блока_1, а операторы блока_2 игнорируются. Если значение логического выражения есть "ложь", то игнорируются операторы блока_1, а выполняются операторы блока_2. Признаком конца группы операторов блока_1 является оператор Else, а группы операторов блока_2 – оператор EndIf. После выполнения любого из блоков управление передается на оператор, следующий за ключевым словом EndIf. Ключевое слово Else и операторы блока_2 могут отсутствовать. В этом случае работа блочного оператора условного перехода аналогична работе логического оператора.
При использовании блочного оператора условного перехода необходимо придерживаться следующих правил:
-
не допускается передача управления в блоки операторов блок_1 или блок_2 извне, минуя оператор If;
-
при использовании в качестве блока_2 другого оператора условного перехода вместо комбинации двух ключевых слов Else и If можно использовать единое слово ElseIf;
-
допускается использование пустых блоков операторов после ключевого слова Else, но это рекомендуется избегать.
Использование блочного оператора условного перехода упрощает чтение программы, делая ее более наглядной. Это можно видеть на примере программы идентификации областей:
123456789..............................................................72 73......80
Read(*, *) X, Y
If (X*X + Y*Y.LE.4.) Then
If (Y.LE.0.) Then
N = 2
Else
N = 1
EndIf
Else
N = 0
EndIf
Write(6, 8) X, Y, N
8 Format(' Точка M(', F4.1, ',', F4.1,
* ') лежит в области N = ', I1)
Stop
End
З а д а н и е к л а б о р а т о р н о й р а б о т е
Составить блок-схему и программу для решения следующих задач. В вариантах 1-14 вычислить значение F по предлагаемой формуле. При получении нуля в знаменателе необходимо напечатать фразу "нуль в знаменателе". В вариантах 15-24 определить номер области n, в которую попадет точка с заданными координатами x и y. Границы отнести к области с большим номером. В вариантах 25-30 выполнить указанные действия. В качестве исходных данных использовать восемь различных комбинаций значений вводимых переменных. В программе предусмотреть ввод исходных данных из файла prog_3.dan и печать результатов в файл prog_3.res. Результаты тестирования программы привести в отчете.