Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лек-5(информатика).doc
Скачиваний:
10
Добавлен:
03.03.2015
Размер:
263.68 Кб
Скачать

Лекция-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