Материал: Аверянов Введение в оператсионные системы и основы программирования 2015

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

3.7. ПРОГРАММНЫЕ КОМПОНЕНТЫ И ЭЛЕМЕНТЫ ООП

3.7.1.Структура программных компонентов

Впростейшем случае программа на Фортране может состоять из одной главной программы, находящейся в файле с соответствующим расширением (для компилятора Gfortran это .f95). При этом она может состоять даже из одного единственного оператора END. Операторы PROGRAMM … END являются операторными скобками, ограничивающими последовательность операторов главной программы, при этом оператор PROGRAMM – не обязательный (хотя настоятельно рекомендуемый, особенно для программ, предъявляемым сторонним заказчикам, к которым стоит отнести и преподавателя на зачете).

Сучетом синтаксиса Фортрана 90/95, структуру главной программы упрощенно можно представить в виде:

PROGRAM имя программы операторы описания исполняемые операторы

CONTAINS

внутренние подпрограммы END имя программы

К операторам описания относятся объявления скалярных переменных и констант, а также объявление массивов и описание производных типов (п. 3.3). В исполняемые входят операторы ввода/вывода данных, управляющие операторы, присваивания и выражения всех встроенных и производных типов, а также использования программных компонентов.

Оператор CONTAINS используется только при наличии внутренних подпрограмм (п. 3.7.3), а имя главной программы после оператора END так же необязательно, как и оператор PROGRAM.

Программные компоненты подразделяются на подпрограммы-

процедуры (SUBROUTINE), подпрограммы-функции (FUNCTION)

и модули (MODULE). Каждый модуль (MODULE) должен размещаться в отдельном файле, а расположение и группировка по фай-

201

лам внешних подпрограмм, как процедур (SUBROUTINE), так и функций (FUNCTION), не являющихся компонентами модулей, не регламентирована, т.е. полностью на усмотрении программиста: в одном файле с главной программой или в отдельных файлах При этом исходные файлы, содержащие внешние подпрограммы и модули, должны иметь расширение .f95 (для Gfortran).

Все программные компоненты Фортрана, т.е. подпрограммыпроцедуры, подпрограммы-функции и модули, имеют одинаковую структуру (табл. 3.11).

Таблица 3.11. Структура программных компонентов

Оператор PROGRAM, SUBROUTINE, FUNCTION или MODULE

Операторы USE (4. 3.7.4)

 

Оператор IMPLICIT NONE

Операторы IMPLICIT

 

 

 

 

Операторы

описания:

Операторы FORMAT

Операторы PARAMETER

объявления

переменных

и DATA

и констант, массивов,

 

описание

 

производных

 

 

 

 

 

типов,

интерфейсных

 

 

блоков модулей

 

Исполняемыеоператоры

 

 

 

Оператор CONTAINS

 

 

 

 

Внутренние или модульные (для MODULE) подпрограммы

 

 

Оператор END

 

 

 

 

3.7.2. Внешние подпрограммы

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

процедуры и подпрограммы-функции. Оба вида подпрограмм име-

ют практически одинаковую структуру:

SUBROUTINE имя процедуры (список формальных параметров) описание формальных параметров описание внутренних параметров исполняемые операторы

202

CONTAINS

внутренние подпрограммы END имя процедуры

или

тип функции FUNCTION имя функции (список формальных параметров)

описание формальных параметров описание внутренних параметров исполняемые операторы

CONTAINS

внутренние функции END подпрограммы-процедуры

Подпрограмма-процедура ограничена операторными скобками (SUBROUTINE … END), а подпрограмма-функция операторными скобками (FUNCTION … END).

После имени подпрограммы в круглых скобках указывается список формальных параметров, которые передаются в подпрограмму при ее вызове. Формальные параметры, переданные в под- программу-процедуру, изменяются алгоритмом процедуры и возвращаются в программную компоненту, из которой была вызвана подпрограмма.

Подпрограмма-процедура может вернуть в вызывающую программу только список формальных параметров, для ее вызова используется оператор CALL (пример 3.94).

Пример 3.94. Подпрограмма-процедура, складывающая два числа program SUBPRG1

real :: X=1., Y=2., Z call SUMAB(X, Y, Z) print *, Z

end

subroutine SUMAB(A,B,C) real :: A, B, C

C = A + B return end

203

Подпрограмма-функция может использоваться в вызывающей программе аналогично переменной соответствующего типа (пример 3.95), в том числе в выражениях и присваиваниях, для этого функция должна быть объявлена внешней с помощью оператора EXTERNAL. Точно также используется внутри подпрограммыфункции ее имя – переменной соответствующего типа, но перед завершением работы подпрограммы-функции эта переменная должна получить значение, которое вернется в вызывающую программу. При этом подпрограмма-функция, как и подпрограммапроцедура, может изменять значения элементов списка формальных параметров (но этого делать не рекомендуется).

Пример 3.95. Подпрограмма-функция, складывающая два числа program SUBPRG2

external SUM

real :: X=1., Y=2., Z Z = SUM(X, Y) print *, Z

end

real function SUM(A,B) real :: A, B

SUM = A + B return

end

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

Если в подпрограмме (процедуре или функции) предполагается обработка массива, то ранги (размерности) массивов в вызывающей и вызываемой программной компоненте должны совпадать, а экстенты (количество элементов по каждому измерению) должны передаваться через список формальных параметров (пример 3.96).

Пример 3.96. Передача массивав подпрограмму program SUBPRG3

integer, parameter :: M=1, N=2 integer , dimension(M,N) :: A, B, C data A /1, 2/ B /3, 4/

call SUMARR(A, B, C, M, N)

204

print *, C end

subroutine SUMARR(X,Y, Z, K, L) integer , dimension(K, L) :: X,Y, Z Z = X+Y

return end

Формальные параметры подпрограммы должны быть объявлены в разделе описания, или к ним будут применены правила по умолчанию для имен переменных. При вызове подпрограммы в список формальных параметров предаются соответствующие фактические параметры. Списки формальных и фактических должны иметь строгое поэлементное соответствие в отношении данных. Скаляру должен соответствовать скаляр того же типа, массиву – массив, а функции – функция.

Одноименные переменные в списках формальных и фактических параметров программ и подпрограмм ни как не связаны друг с другом, поскольку являются внутренними переменными своих программ и подпрограмм (пример 3.97).

Пример 3.97. Независимость имен (A иB) в программных компонентах program SUBPRG4

external SUM real :: A=1., B=2.

print *, SUM (A, B) end

real function SUM(A, B) real :: A, B

SUM = A + B return

end

3.7.3. Внутренние подпрограммы

Внутренние подпрограммы (процедуры и функции) по структуре и способу применения ничем не отличаются от внешних подпрограмм (см. п. 3.7.2). Однако это не отдельная программная компонента, а составная часть главной программы или внешней подпрограммы. Хотя внутренние подпрограммы не могут иметь собственных внутренних подпрограмм, они имеют доступ ко всем объ-

205

Источник: https://studfile.net/preview/16708824/