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

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

Для реализации программ с разветвленной структурой в языке Фортран используются условный оператор 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.