Операторы языка Фортрана для программной реализации разветвляющегося вычислительного процесса. Оператор перехода.
Вычислительный процесс называют разветвляющимся, если в зависимости от выполнения некоторых условий он реализуется по одному из нескольких, заранее заданных направлений. Каждое отдельное направление называют ветвью вычислительного процесса.
Для реализации программ с разветвленной структурой в языке Фортран используются условный оператор if и оператор выбора case.
2.1 Оператор условного перехода if
Оператор условного перехода – это такой оператор передачи управления в программе, который позволяет перейти из одного места программы в другое, т.е. передать управление и изменить порядок выполнения операторов в программе. Передача управления осуществляется в результате выполнения условия (т.е. в зависимости от значения логического выражения).
а) полная форма оператор условного перехода if
Такая конструкция if позволяет выбрать для выполнения один из двух блоков операторов. Под блоком в Фортране понимают один или последовательность из нескольких выполняемых операторов внутри составного оператора. Как принято в Фортране блоки оформляются построчно, будучи обрамлены служебными строками. Безусловная передача управления извне внутрь блока запрещена. Конструкция if может быть записана в следующей общей форме:
IF (логическое_выражение ЛВ) THEN
блок_THEN
ELSE
блок_ELSE
ENDIF
Три части конструкции, т.е. строки IF(..) THEN, ELSE и ENDIF, записывают как отдельные строки текста без символов продолжения. Конструкция IF выполняется следующим образом:
· вычисляется значение логического выражения, которое может быть либо "истинным", либо "ложным"
· если значение "истина", то выполняется блок_THEN
· если значение "ложь", то выполняется блок_ELSE
· всегда выполняется только один из блоков конструкции
На рис. 2.1 представлена схема алгоритма реализация полной формы условного оператора if.
Рис. 2.1. Схема алгоритма полной формы условного оператора
Рассмотрим на примере программы, определяющей отрицательное или положительное число было введено с клавиатуры, и отображающее соответственное сообщение на экран.
Program number
Integer k !проверяемое число
Write(*,’(a,&)’), ‘Enter a number ’
Read(*,*), k
If (k>0) then
Write(*,*),’k>0’
Else
Write(*,*),’k<0’
End if
end
Результаты работы программы
1) Enter mumber 100
K<0
2) Enter mumber -50
K<0
б) неполная форма оператор условного перехода if
Когда не предусмотрено действий в блок_ELSE, конструкцию IF можно записать упрощенно в одноблочной форме:
IF (логическое_выражение ЛВ) THEN
блок_THEN
ENDIF
Если значение логического выражения "истина", блок_THEN выполняется, если "ложь" - пропускается.
Блок-схема такого варианта представлена на рис. 2.2.
Рис. 2.2. Схема алгоритма неполной формы условного оператора
Пример. Необходимо вывести на экран квадрат вводимого числа, но если он больше 100, то результат разделить на 2.
Program sqr
Integer number ! исходное число
real number2 ! результат вычислений
Write(*,’(a,$)’),’Enter a number ’
Read(*,*), number
Number2 = number* number
If(number2 > 100) then
number2 = number2/2
Endif
Write(*,’a,f5.1’),’result ’, number2
Результат работы программы на экране
Enter a number 20
Result 200.0
в) простая форма оператор условного перехода if
Когда в блоке_THEN единственный простой оператор, а блок_ELSE отсутствует, то используется простой логический if, записываемый в одну строку. Например:
if (x < 0) y=ABS(x)
Такая форма IFназывается безблочной.
г) вложенная конструкция оператора if
Любой из блоков конструкции if может в свою очередь содержать вложенную конструкцию if. Если блок содержит такую конструкцию, то она должна полностью находиться внутри этого блока. Пример: одноблочный if использован в качестве блока_THEN охватывающей конструкции if
IF (…) THEN
if(…) then
…
endif
ELSE
…
ENDIF
Рассмотрим в качестве примера использования такой структуры программу для решения задачи о том, какое число было введено с клавиатуры отрицательное или положительное.
Рис. 2.3. Схема алгоритма вложенной конструкции условного оператора | Print*, ‘Enter k’ Read(*,*), k If (k<0) then Print*, ‘k<0’ else If (k>0) then Print*, ‘k>0’ else Print*, ‘k=0’ End if End if |
Оператор варианта (выбора) case.
Оператор варианта case можно считать обобщенным случаем оператора условного перехода, поскольку он позволяет выполнить множественный выбор (количество ветвей вычислительного процесса более двух). Схема алгоритма такого вычислительного процесса приведена на рис. 2.4.
Рис. 2.4. Схема алгоритма реализации оператора выбора case
Программная реализация оператора выбора case следующая:
[name:] SELECT CASE (expr)
[CASE (case-value [, case-value] ...) [name]
block] ...
[CASE DEFAULT [name]
block]
END SELECT [name]
Здесь expr – скалярное выражение типа integer, logical, or character; case-value – одно или более скалярных integer, logical, or character инициализирующих выражений. Каждое case-valueдолжно быть того - же типа, что и expr. If the type is character, case-value and expr can be of different lengths, but their kind parameter must be the same.
Если есть CASE DEFAULTи ни одно совпадение не найдено – выполняется блок в CASE DEFAULT.СравнимIf (a==0) then Print *,1else if (a==2) then Print *,2Else if (a==3) then Print *,3else Print *,4endif | Select case (a)Case (0) Print *,1Case (2) Print *,2Case (3) Print *,3Case default Print *,4End select |
2.3 Оператор безусловного перехода goto
Операторы исполняются в том порядке, в котором они записаны в программе. Любой исполняемый оператор и неисполняемый оператор format могут быть помечены уникальными метками из диапазона 1:99999. Используя оператор безусловного перехода goto m, можно перейти к выполняемому оператору, помеченному меткой m (метка пишется в пяти первых позициях строки в фиксированной форме, либо за меткой через пробел следует оператор в свободной форме). Любую программу можно переписать без операторов goto. Так и рекомендуется писать программы, чтобы не попасть ошибочно внутрь составного оператора или на format.