Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

Оператор передает управление n-й метке списка labels. Допустимый диапазон значений n: 1 n m, где m - число меток в списке labels. Если n выходит за границы допустимого диапазона, то вычисляемый GOTO работает так же, как и пустой оператор CONTINUE. Переход внутрь DO-, IF-, SELECT CASEили WHERE-конструкций запрещен.

Пример:

next = 1

goto (10, 20) next ! Передача управления на оператор 10 continue

...

10 continue

...

20 continue

Оператор заменяется конструкциями IF и SELECT CASE.

П.-2.1.5. Положение оператора DATA

Оператор DATA задания начальных значений переменных (разд. 3.7) можно располагать среди исполняемых операторов программы. Но этой возможностью пользоваться не рекомендуется. Следует располагать операторы DATA в разделе описаний перед первым исполняемым оператором.

П.-2.2. Устаревшие свойства Фортрана, определенные стандартом 1990 г.

П.-2.2.1. Арифметический IF

Оператор имеет вид: IF(expr) m1, m2, m3

expr - целочисленное или вещественное выражение.

m1, m2, m3 - метки исполняемых операторов того же блока видимости. Значения меток могут совпадать.

Оператор обеспечивает переход по метке m1, если expr < 0, по метке m2, если expr = 0, и по метке m3, если expr > 0.

Пример. Вычислить число отрицательных, нулевых и положительных элементов целочисленного массива.

integer a(10) /-2, 0, 3, -2, 3, 3, 3, 0, 4, 0/ integer k1, k2, k3

k1 = 0; k2 = 0; k3 = 0 do i = 1, 10

if(a(i)) 10, 11, 12

10 k1 = k1 + 1; cycle

11 k2 = k2 + 1; cycle

12 k3 = k3 + 1 end do

422

Приложение 2. Нерекомендуемые, устаревшие и исключенные свойства

print *, k1, k2, k3

!

2

3

5

end

 

 

 

 

Оператор заменяется конструкциями IF и SELECT CASE.

П.-2.2.2. Оператор ASSIGN присваивания меток

Оператор присваивания меток имеет вид: ASSIGN метка TO имя переменной

метка - целое число из диапазона 1-99999.

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

Пример:

integer label, k

 

y = (2.5 * sin(5.2))**3

! k получает некоторое значение

...

if(k .eq. 1) assign 89 to label

 

write(*, label) y

! Ссылка на оператор format

89 format(2x, 'y = ', f10.3)

 

assign 17 to label

 

if(y .gt. 0) go to label

! Переход к метке 17

...

 

17 stop

 

...

 

Переменная, получившая в результате выполнения оператора ASSIGN значение метки, не может использоваться как переменная, имеющая численное значение, в выражениях Фортрана. Переменная, получившая значение помимо оператора ASSIGN, например в результате присваивания, не может использоваться в операторе перехода. Также в операторе GOTO не может быть использована и именованная константа.

Оператор используется для выбора подходящего оператора FORMAT и в назначаемом операторе GOTO. В первом случае заменой оператору ASSIGN является задание формата при помощи символьных выражений (разд. 9.2). Назначаемый GOTO всегда может быть успешно заменен конструкциями IF или SELECT CASE.

П.-2.2.3. Назначаемый GOTO

Оператор имеет вид: GOTO var [[,] (labels)]

var - переменная целого типа, значением которой является метка исполняемого оператора. Значение переменной var должно быть определено оператором ASSIGN в том же блоке видимости.

423

О. В. Бартеньев. Современный ФОРТРАН

labels - список одной или более разделенных запятыми меток исполняемых операторов того же блока видимости. Одна и та же метка может появляться в списке более одного раза.

Оператор передает управление оператору, метка которого совпадает со значением var. Запрещается переход внутрь DO-, IF-, SELECT CASE- и WHERE-конструкций.

Пример:

integer vi, cle

! cle получает некоторое значение

...

if(cle .eq. 1) then

! Назначим vi нужное значение метки

assign 200 to vi

 

else if(cle .eq. 2) then

 

assign 400 to vi

 

else

 

assign 100 to vi

 

end if

 

goto vi (100, 200, 400)

 

100 continue

 

...

 

goto 500

 

200 continue

 

...

 

goto 500

 

400 continue

 

...

 

500 continue

 

end

 

П.-2.2.4. Варианты DO-цикла

Параметр DO-цикла и циклического списка, а также выражения, задающие пределы и шаг изменения параметра, могут быть вещественного типа (REAL(4) или REAL(8)). Например:

do x = 0.4, 20.4, 0.4

...

end do

Для приведенного цикла естественно ожидать, что число итераций ni, которое вычисляется по формуле

ni = MAX(INT((stop - start + inc)/inc), 0),

будет равно 51. На самом деле в результате ошибок округления промежуточным результатом при расчете ni может явиться число 50.999999..., а не 51.000000... Тогда после применения функции int значение ni будет равно 50. Поскольку такое может случиться, то применение вещественного параметра в DO-цикле и циклическом списке нежелательно.

424