Главная Учебники - Разные Лекции (разные) - часть 32
|
Автоматические
массивы
В процедуре
может быть
задан локальный
массив, размеры
которого могут
меняться при
разных вызовах
процедуры.
Такие
массивы, так
же как и локальные
строки переменной
длины (разд.
10.4), относятся
к автоматическим
объектам.
Фортран
поддерживает
рекурсивные
вызовы внешних,
модульных и
внутренних
процедур.
Процедура
называется
рекурсивной,
если
она обращается
сама к себе или
вызывает другую
процедуру,
которая, в свою
очередь,
вызывает
первую процедуру.
В первом случае
рекурсия называется
прямой,
во
втором - косвенной.
Оператор
объявления
рекурсивной
процедуры
должен предваряться
префиксом
RECURSIVE.
Внутри рекурсивной
процедуры
интерфейс к
этой процедуре
является явным
(см. разд. 16.4.3).
Пример.
Разработать
подпрограмму
subst,
которая
в данной строке
заменяет все
вхождения
подстроки sub1
на
подстроку sub2.
Так,
если дана строка
'abc1abc2abc3'
и sub1
= 'abc',
a
sub2
=
' d',
то результатом
должна быть
строка ' dl
d2
d3'.
program stgo
character(len
= 20) :: st =
'abc1abc2abc3'
call
subst(st, 'abc', d')
! subst содержит
прямую
write(*,
*) st
!
рекурсию
d1 d2 d3
end
recursive
subroutine subst(st,
subl, sub2)
character(len
= *) st, sub1, sub2
! Длина
каждой строки
определяется
st = st(:ip - 1) // sub2 // st(ip
+ len(subl):)
call
subst(st, subl, sub2) ! Рекурсивный
вызов подпрограммы
end !
не выполнены
все замены subl
на sub2
Если
функция содержит
прямую рекурсии,
то есть непосредственно
вызывает сама
себя, результату
необходимо
дать имя,
отличное
от имени Функции.
Это выполняется
путем добавления
в заголовок
функции предложения
RESULT.
В случае
косвенной
рекурсии имя
результирующей
пе-Ременнрд
и имя функции
могут совпадать.
Символьные
типы данных
Символьный
тип данных
позволяет
задать объект,
состоящий из
последовательности
символов.
Такую
последовательность
мы будем строкой.
Символьный
тип данных
могут иметь
объекты: переменные,
константы
и функции. Символьный
тип является
встроенным
типом данных
для него существует
одна
встроенная
операция - операция
конкатенации
(обозначается
двумя слешами
//), позволяющая
выполнять
объединение
отдельных строк
или подстрок
символов. Объявление
символьных.данных
выполняется
оператором
CHARACTER,
например:
character
:: ch = 'а' !
Символьная
переменная
длиной в 1 символ
character(len
= 20) st ! Символьная
переменная
из 20 символов
st
= 'Example' !
Присвоим значение
символьной
переменной
st
== st // '_' // ch ! Возвращает:
Example_a
Оператор
CHARACTER
содержит в
скобках данные
о длине символьного
объекта. Если
длина не задана,
то по
умолчанию она
принимается
равной единице.
DO-Циклы.
Операторы EXIT
и CYCLE
Простейшая
конструкция
DO
[имя:]
DO
БОК
END
DO (имя]
задает
бесконечный
цикл. Поэтому
такой цикл
должен содержать
по крайней
мере
один
оператор, например
EXIT
[имя],
обеспечивающий
выход из этого
цикла.
Имя
конструкции,
если оно присутствует,
должно появляться
в
операторах
DO
и END
DO.
Рекомендуемая
форма DO-цикла
с параметром:
[имя:]
DO dovar = start, stop [, inc]
БОК
END
DO [имя]
dovar
- целая
переменная,
называемая
переменной
цикла или параметром
цикла;
start,
stop
- целые
скалярные
выражения,
задающие диапазон
изменения
dovar;
inc
- целое
скалярное
выражение,
задающее лаг
изменения
dovar.
Значение
inc
не
может
быть
равным нулю.
Если параметр
inc
отсутствует,
то он принимается
равным единице.
Рекомендуемая
форма DO
WHILE-цикла:
[имя]
DO
WHILE(ЛB)?
БОК
END
DO [имя]
Если
DO
WHILE-цикл
не содержит
операторов
прерывания
цикла,
БОК
выполняется
до тех пор, пока
истинно скалярное
ЛВ.
DO-цикл,
DO-цикл
с параметром
и DO
WHILE-цикл
могут быть
рваны
операторами
GOTO,
EXIT
и CYCLE,
а также в результате
выполнения
оператора
RETURN,
обеспечивающего
возврат из
подпрограммы.
Оператор
EXIT
[имя}
передает
управление
из DO-конструкции
на первый следующий
за kohi
рукцией
выполняемый
оператор. Если
имя
опущено,
то EXIT
обеспечив;
выход из текущего
цикла,
в
противном
случае EXIT
обеспечивает
выход цикла,
имя
которого
присутствует
в операторе
EXIT.
Оператор
CYCLE
[имя]
передает
управление
на начало
DO-конструкции.
При этом оператор
расположенные
между
CYCLE
и оператором
END
DO
конца цикла,
не выполняются.
Если имя
опущено,
то CYCLE
обеспечивает
переход на
начало текущего
цикла, в противном
случае CYCLE
обеспечивает
переход
на начало
цикла, имя
которого
присутствует
в операторе
CYCLE.
Условный
логический
оператор IF
IF(ЛВ)
оператор
Если
истинно ЛВ, то
выполняется
оператор,
в
противном
случае управление
передается
на
последующий
оператор программы.
Конструкция
IF THEN ENDIF
[имя-.]IF(ЛВ)
THEN
БОК
END
IF [имя]
БОК
выполняется,
если истинно
ЛВ. Если присутствует
имя конструкции,
то оно должно
быть
и в первом и в
последнем
операторе
конструкции,
например:
swap:
if(x < у)
then
hold
= х; х = у; у = hold
end if swap
Замечание.
Если
БОК содержит
один оператор,
то лучше использовать
оператор
IF(ЛВ)
оператор
Конструкция
IF THEN ELSE ENDIF
[имя:]
IF(ЛВ)
THEN
БОК1
ELSE
[имя]
БОК1
END
IF [имя]
В
случае истинности
ЛВ выполняется
БОК1 и выполняется
БОК2, если ЛВ
ложно.
Имя
конструкции,
если оно задано,
должно обязательно
присутствовать
и перед IF,
и
после
END IF.
Конструкция
IF THEN ELSE IF
[имя:]
IF(ЛВ)
THEN
БОК1
ELSE
IF(ЛВ2)
THEN [имя]
БОК2
…
[ELSE
[имя]
БОКn
END
IF [имя]
В случае
истинности
ЛВ1 выполняется
БОК1 и управление
передается
на
следующий
за END
IF
оператор. Если
ЛВ1 ложно, то
управление
передается
на следующий
ELSE
IF,
то есть вычисляется
значение
ЛВ2
и, если оно
истинно, то
выполняется
БОК2. Если оно
ложно, то
управление
передается
на следующий
ELSE
IF,
и так далее.
Если ложны все
ЛВ,
то выполняется
следующий за
завершающим
ELSE
БОКп.
Если
завершающий
ELSE
отсутствует,
то управление
передается
на расположенный
за
END
IF
оператор.
Число операторов
ELSE
IF
в конструкции
может быть
произвольным.
Имя
в ELSE
и в ELSE
IF
можно задавать,
если это имя
имеют
операторы
IF
и END
IF.
Имя, если оно
задано, во всех
частях
конструкции
должно быть
одинаковым.
Конструкция
SELECT CASE
[имя:]
SELECT CASE (тест-выражение)
| |||||