Лекция-5
ОСНОВЫ ПРОГРАММИРОВАНИЯ
НА ЯЗЫКЕ ФОРТРАН
§ 1.16. Подпрограммы (процедуры).
На практике при разработке алгоритма исходная задача, как правило, разбивается на отдельные подзадачи (фрагменты). Они впоследствии реализуются в виде отдельных программных компонентов (единиц), которые должны обмениваться данными.
В современном фортране выделенные фрагменты могут оформляться в виде главной программы, внешних и внутренних процедур, модулей, содержащие глобальные данные и модульные процедуры.
1.16.1. Внешние процедуры.
В Фортране могут быть определены два типа процедур (подпрограмм): подпрограммы-функциииподпрограммы-процедуры. Подпрограмма-функция отличается от подпрограммы-процедуры тем, что вызывается из выраженияи возвращает результат, который затем используется в этом выражении. Тип возвращаемого результата определяет тип подпрограммы-функции. При задании подпрограммы-функции следует объявлять ее тип в разделе объявлений вызывающей программной компоненты так же, как это делается для других объектов данных.
Процедуру следует оформлять в виде подпрограммы-функции, если ее результат можно записать в одну переменную, в противном случае следует применить подпрограмму-процедуру.
Структура подпрограммы-функции имеет следующий вид:
заголовок функции
[операторы описания]
[исполняемые операторы]
END [FUNCTION [имя функции]]
Структура подпрограммы-процедуры, в целом, аналогична:
заголовок подпрограммы
[операторы описания]
[исполняемые операторы]
END [SUBROUTINE [имя подпрограммы]]
Подпрограмма-функция содержит результирующую переменную, в которую устанавливается возвращаемый функцией результат.
Заголовок подпрограммы-процедуры содержит оператор SUBROUTINE, а заголовок подпрограммы-функции – оператор FUNCTION.
Вызов подпрограммы-процедуры выполняется оператором
CALL имя подпрограммы-процедуры([список фактических параметров])
Вызов подпрограммы-функции выполняется из выражения, например:
result=имя подпрограммы-функции([список фактических параметров])
1.16.2. Операторы заголовка процедур.
Полный синтаксис оператора заголовка подпрограммы-процедуры:
SUBROUTINE имя подпрограммы-процедуры[([список формальных параметров])]
Общий вид оператора заголовка подпрограммы-функции:
FUNCTION имя подпрограммы-функции([список формальных параметров])
Общие характеристики операторов заголовка процедур.
Имя процедуры.Имя подпрограммы-процедуры не может появляться в операторах объявления типа. Если процедура внешняя, то ее имя является глобальным и не должно совпадать с другим глобальным именем, а также не должно быть использовано для локального имени в вызывающей программной единице.
Список формальных параметров. Список формальных параметров может содержать имена переменных и формальных процедур. Формальные параметры могут отсутствовать. Типы формальных параметров могут быть заданы внутри процедуры как неявно, так и явно (последнее считается предпочтительным).
Процедура. Процедура не может содержать оператор PROGRAM.
Вызов процедуры. При вызове процедуры происходит ассоциирование параметров процедуры, причем передаваемые при этомфактическиепараметры должны быть согласованы с соответствующимиформальнымипопорядку,по числу,по типуи разновидности типа. Компилятор проверяет соответствие параметров. При обнаружении несоответствия, как правило, генерируются ошибки.
Выход из процедуры. Выход из процедуры осуществляется в результате выполнения оператора END, либо оператора RETURN, который может быть размещен среди исполняемых операторов процедуры произвольным образом.
Пример 1.16.1.Подпрограмма-функция вычисления скалярного произведения векторов.
Пусть заданы два вещественных -мерных вектора
;
и требуется вычислить их скалярное произведение, т.е. найти
.
Реализующая подпрограмма-функцияна языке Фортран имеет вид:
function scal(x,y,n) real(4), dimension(n) :: x,y ! x,y – заданные векторы real(4) :: s=0.,scal integer(4) :: i,n do i=1,n s=s+x(i)*y(i) end do scal=s ! scal - результат end |
Пример 1.16.2.Подпрограмма-процедура вычисления линейной комбинации двух векторов.
Пусть заданы два вещественных -мерных вектора
;
и два вещественных числа и.
Требуется вычислить линейную комбинацию указанных векторов, т.е. вектор
, где ,,.
Реализующая подпрограмма-процедурана языке Фортран имеет вид:
subroutine lin(alpha,x,beta,y,n,z) real(4), dimension(n) :: x,y,z ! x,y – заданные векторы real(4) :: alpha,beta ! alpha,beta - коэффициенты integer(4) :: i,n do i=1,n z(i)=alpha*x(i)+beta*y(i) ! z – результат (вектор) end do end |
Пример 1.16.3.Подпрограмма-процедура вычисления произведения матрицы на вектор.
Пусть заданы вещественная матрица размерности(– количество строк,– количество столбцов) и-мерный вектор .Требуется вычислить произведение матрицы на вектор, т.е.-мерный вектор. Таким образом, имеем:
; ; ,
где ,.
Реализующая подпрограмма-процедурана языке Фортран имеет вид:
subroutine mv(a,x,n,m,y) real(4), dimension(n,m) :: a,x(m),y(n) ! a – заданная матрица integer(4) :: i,j,n,m ! x - заданный вектор do i=1,n y(i)=0. do j=1,m y(i)=y(i)+a(i,j)*x(j) ! y – результат (вектор) end do end do end |
Пример 1.16.4.Подпрограмма-процедура вычисления произведения матрицы на матрицу.
Пусть заданы вещественная матрица размерностии матрицаразмерности. Требуется вычислить произведение матрицына матрицу, т.е. матрицуразмерности. Имеем:
;;
,
где ,,.
Реализующая подпрограмма-процедурана языке Фортран имеет вид:
subroutine mm(a,b,n,l,m,c) real(4), dimension(n,m) :: c,a(n,l),b(l,m) ! а – заданная матрица integer(4) :: i,j,n,l,m ! b – заданная матрица do i=1,n do j=1,m c(i,j)=0. do k=1,l c(i,j)=c(i,j)+a(i,k)*b(k,j) ! c - результат end do end do end do end |