If (abs(Array(i,j)) > abs(Array(NumI,NumJ))) then
Структура программы
Программа может полностью помещаться в одном блоке. Но, как правило, реальные программы имеют значительный объем, и размещение в одном блоке затрудняет их написание и отладку. Кроме того, любая задача может быть разделена на относительно самостоятельные подзадачи. Оформление каждой подзадачи в виде отдельного блока способствует разделению работы над программой на независимые этапы и оперативному внесению изменений.
Блоки, выделенные для подзадач, называются программными единицами. В Фортране различаются три вида независимых программных единиц:
- главная программа,
- внешняя процедура,
- модуль.
Независимые программные единицы имеют независимые системы обозначений и могут компилироваться отдельно. Все элементы независимой программной единицы локальны, то есть доступны внутри этой единицы и недоступны вне нее.
Частью независимых программных единиц могут быть внутренние процедуры – процедуры, описание которых заключено внутри программы-носителя.
Главная программа
Главная программа является обязательным компонентом любой программы. При запуске программы операционная система передает управление операторам главной программы. Главная программа должна быть единственной, иначе невозможно определить точку входа – оператор, с которого начинается выполнение программы.
Структура главной программы такова:
[program имя программы]
[Операторы описания]
[Исполняемые операторы]
[contains
внутренние подпрограммы]
end [program имя программы]
В квадратные скобки заключены необязательные части текста программы, которые могут отсутствовать. Как видно, единственным обязательным элементом главной программ является операторend. Отличительным признаком главной программы является отсутствие специальных операторов (subroutine, functionилиmodule) в ее заголовке: именно это характеризует этот компонент как главную программу.
Оператор end главной программы не только отмечает конец программного компонента, но и является сигналом к остановке всей программы. Хорошая организация программы предусматривает возврат управления в главную программу на завершающей стадии работы, но если необходимо остановить программу в другом месте, используется оператор stop.
Если оператор end содержит имя программы, то оно должно совпадать с именем, указанным в операторе program в заголовке.
Блок Операторы описания, если он есть, должен предшествовать блоку Исполняемые операторы. Отсутствие блока Исполняемые операторы возможно, но бессмысленно.
Оператор contains отделяет исполняемые операторы от описания внутренних процедур.
Внешние процедуры
Внешние процедуры – это программные единицы, которые служат для выполнения отдельных подзадач в рамках общей задачи программы в целом.
Нередко последовательность команд, выполняющих конкретные действия, необходимо повторить в нескольких конкретных точках программы. Последовательность операторов для выполнения таких действий можно записать в виде процедуры.
Общий вид внешней процедуры:
Заголовок процедуры
[Операторы описания]
[Исполняемые операторы]
[contains
внутренние процедуры]
Оператор end процедуры
Для того, чтобы процедура начала выполняться, необходимо ее вызвать. Программная единица, из которой осуществляется вызов процедуры, называется вызывающей программной единицей. Процедуры вызываются из главной программы или из других процедур и при завершении возвращают управление вызывающей программной единице.
Возврат управления из процедуры в вызывающую программную единицу, в точку вызова процедуры, осуществляется оператором return. Операторend не только указывает на конец процедуры, но и действует как оператор return. Оператор return может прекратить выполнение процедуры в любом ее месте и передать управление в место вызова. Как и оператор stop, он может быть частью условного оператора.
Все процедуры должны иметь возможность обмениваться данными с вызывающими программными единицами – получить входные данные от вызывающей программы и передать ей результаты своей работы. Обмен информацией с процедурами может происходить через параметры (аргументы) процедур и/или через глобальные данные. Организация глобальных данных рассматривается в разделе «Модули».
При передаче данных через параметры в заголовке процедуры указывается список формальных параметров – перечень переменных и/или массивов, которые используются в ходе выполнения процедуры.
В операторах вызова процедуры указывается список фактических параметров. При вызове процедуры происходит подстановка фактических параметров вместо формальных параметров.
Каждый параметр процедуры имеет следующие основные характеристики:
- тип;
- ранг – размерность или количество измерений; ранг переменной равен 0;
- назначение параметра – входной, выходной или универсальный (изменяемый).
Назначение формального параметра определяет атрибут intent:
intent(in) – входной параметр;
intent(out) – выходной параметр;
intent(inout) – универсальный параметр.
Если атрибут назначения параметра не указан, то по умолчанию параметр считается универсальным (inout).
Имеется два основных вида процедур: процедуры-функции functionи процедуры-подпрограммыsubroutine.
Процедуры-функции
Структура процедуры-функции имеет вид:
[Тип] function имя функции (список формальных параметров)
[Операторы описания]
[Исполняемые операторы]
[contains
внутренние процедуры]
end [function[имя функции]]
Процедура-функция вычисляет значение заданного типа и возвращает управление в вызывающую программную единицу вместе с этим значением. Полученное значение называется возвращаемым значением. В вызывающей программе возвращаемое значение может быть присвоено переменной или подставлено в выражение.
Оператор functionназывается заголовком функции. Тип функции, указанный в ее заголовке, является типом возвращаемого значения. Кроме того, в заголовке указывается уникальное имя функции, составленное по правилам Фортрана, и список формальных параметров в круглых скобках.
Среди операторов описания должны присутствовать описания формальных параметров функции и внутренних (локальных) переменных и массивов.
Среди исполняемых операторов обязательно должно определяться возвращаемое значение функции, имя которого совпадает с именем функции.
Если в операторе end указано имя функции, оно должно совпадать с именем в заголовке функции.
Вызов функции не требует специального оператора. Обращением к функции является имя функции и список фактических параметров в круглых скобках, например:
real :: A
A = имя функции (список фактических параметров)
Примеры обращения к функции:
y = sin(x)
a = sqrt(x) + sqrt(s)
Пример функции
Оформить в виде функции нахождение в вещественной матрице элемента с максимальным абсолютным значением. В главной программе требуется нормировать матрицу, то есть разделить все ее элементы на полученный элемент.
real function Max_Abs(Array, cRows, cCols)
! заголовок функции; возвращаемое значение вещественного типа
! операторы описания:
implicit none! оператор должен быть в каждой программной единице
! формальные параметры функции – массив, количество его строк и столбцов
integer, intent(in) :: cRows, cCols
real, dimension(1:cRows,1:cCols), intent(in):: Array
! локальные переменные
integer :: i, j ! переменные циклов
integer :: NumI, NumJ ! координаты элемента матрицы
! исполняемые операторы:
NumI = 1; NumJ = 1 ! максимальным по модулю считаем Array(1,1)
do i = 1, cRows
do j = 1, cColumns
if (abs(Array(i,j)) > abs(Array(NumI,NumJ))) then
NumI = i; NumJ = j
Endif
Enddo
Enddo
Max_Abs = Array(NumI,NumJ) ! возвращаемое значение
end function Max_Abs
В главной программе:
implicit none! оператор должен быть в каждой программной единице
integer, parameter:: cR = 6, cCol = 8
real, dimension(1:cR, 1:cCol) :: Array
real:: Max_Abs ! описание типа возвращаемого значения функции
. . .
! фактические параметры функции Max_Abs –
! массив, число его строк и столбцов
Array = Array / Max_Abs(Array, cR, cCol)
Комментарии к примеру:
1) Обратите внимание на соответствие формальных и фактических параметров. Правила их соответствия будут описаны ниже.
2) Формальные параметры cRows и cColumns в процедуре-функции должны быть описаны до их использования при описании массива.
3) Переменные i, j, NumI, NumJ в процедуре-функции локальны, они недоступны за ее пределами.
4) В алгоритме функции поиск максимального по модулю элемента заменен поиском его координат в массиве. После завершения циклов найти значение элемента массива по его координатам не представляет труда.
5) В главной программе должно присутствовать описание типа возвращаемого значения функции.
6) В главной программе использована возможность деления всех элементов на одно число без построения циклов.
Дата добавления: 2017-09-19; просмотров: 319;