1.17. ПОДПРОГРАММЫ

Если оформляемый в виде подпрограммы фрагмент алгоритма возвращает более одного объекта данных, то такой фрагмент удобно оформить в виде процедуры. Передача данных и возвращение данных из процедуры выполняется через аппарат формальных и фактических параметров. Описание процедуры имеет вид:

Закрыть

Процедура (подпрограмма) – это именованная программная единица, в заголовке которой присутствует оператор SUBROUTINE.

[RECURSIVE]SUBROUTINE < имя > [(<список формальных параметров S>)]

[<Операторы ОПИСАНИЯ>]

[<Исполняемые операторы>]

[CONTAINS <Внутренние процедуры>]

[RETURN]

END [SUBROUTINE [< ИМЯ ПОДПРОГРАММЫ>]]

Аналогично выглядит и структура подпрограммы-функции.

Закрыть

[<Тип результата>][RECURSIVE] FUNCTION < имя > ([<список формальных параметров S>])[RESULT <Имя результата>]

 

[<Операторы ОПИСАНИЯ>]

[<Исполняемые операторы>]

[ CONTAINS <Внутренние процедуры>]

[RETURN]

END [FUNCTION [< ИМЯ ПОДПРОГРАММЫ>]]

Обращение к процедуре представляет собой оператор

CALL < имя > (<список фактических параметров S>)

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

Закрыть

Внутренние подпрограммы описываются после оператора CONTAINS внутри головной программы, внешней и модульной подпрограммы. Их описание имеет следующую структуру:

<заголовок процедуры>

[<операторы описания>]

[<исполняемые операторы>]

END SUBROUTINE [<имя подпрограммы>]

или

<заголовок функции>

[<операторы описания>]

[<исполняемые операторы>]

END FUNCTION [<имя функции>]

Внутренние процедуры (в отличие от внешних и модульных процедур) не могут содержать своих внутренних процедур. Также в отличие от внешних процедур внутренние процедуры, как и модульные, обязательно содержат в операторе END слово FUNCTION в случае функции или SUBROUTINE в случае процедуры.

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

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

ПРИМЕР:

PROGRAM MASS_SUM

DIMENSION C(1: 4), A(1:4), B(1:4)

            A=5.0  ! Задание всем элементам массива значения 5.0

            B=10.0 ! Задание всем элементам массива значения 10.0

            C=SUM_MASS(4,A,B)

            PRINT *, C

CONTAINS

FUNCTION SUM_MASS(N,A,B)

DIMENSION SUM_MASS(1:N), A(1:N), B(1:N)

            DO I=1,N

                        SUM_MASS(I)=I*(A(I)+B(I))

            END DO

            RETURN

END FUNCTION

END

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


ПРИМЕР:

Пусть заданы матрица  размерности  и вектор размерности , вычислить . Оформить в виде процедуры произведение матрицы и вектора.

! Процедура умножения матрицы на вектор

SUBROUTINE PROD(N,A,B,C)

REAL(8) A(N,N), B(N), C(N)

INTEGER :: N, I, J

            C=0

            DO I=1, N

                        DO J=1, N

                                   C(I)=C(I)+A(I,J)*B(J)

                        END DO       

            END DO

RETURN

END

! Вызывающая программа

PROGRAM PROD_A_B

! Описание переменных

INTEGER, PARAMETER :: N=3

REAL(8) A(N,N), X(N), X1(N)

CHARACTER (LEN=1)ST

            ST='N'

            PRINT *,' MATRIX PROD'

! Присоединение внешнего файла DAT.TXT

! к устройству В/В с номером 45

            OPEN(45,FILE='DAT.TXT')

! Ввод данных из файла

            READ(45,*) ((A(I,J),J=1,N),X(I),I=1,N)

! Вызов подпрограммы умножения матрицы на вектор

            CALL PROD(N,A,X,X1)

! Вывод результата в файл DAT.TXT

            PRINT *, 'RESULTS'

            WRITE(45,'(<N+2>F6.2)') ((A(I,J),J=1,N),X(I),X1(I),I=1,N)

!Вывод результата на экран          

            WRITE(*,'(<N+2>F6.2)') ((A(I,J),J=1,N),X(I),X1(I),I=1,N)         

  1 CONTINUE        

            PRINT * ,'PRESS Y TO PROGRAM TERMINATE'

    READ *, ST   

            IF (ST/='Y') THEN

                        GOTO 1        

            END IF

STOP

END

После выполнения этой программы в текстовом файле DAT.TXT(см. рисунок 1.9а)  и на экране монитора(см. рисунок 1.9б) будут записаны исходные данные и результаты работы программы.

Закрыть

Рисунок 1.9a. Результат работы программы перемножения матрицы и вектора


Закрыть

Рисунок 1.9б. Результат работы программы перемножения матрицы и вектора

На рисунке показано содержимое файла DAT.TXT: исходные данные записаны выше черты, а результаты работы программы – ниже.

ЗАДАНИЕ:

1) Применить программу для  вычисления произведения матрицы размерности 44 и вектора размерности 4 :

 , .


2) Модифицировать программу, так чтобы при выводе в файл и на экран матрица А, данный вектор x и результирующий вектор были подписаны (вывод в файл см. рисунок 1.8в  и вывод на экран см. рисунок 1.9г).

Закрыть

Рисунок 1.9в. Результат работы модифицированной программы перемножения матрицы и вектора



Закрыть

Рисунок 1.9г. Результат работы модифицированной программы перемножения матрицы и вектора