Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция №3
Разветвляющиеся и циклические конструкции языка Фортран.
Работа с массивами в языке Фортран
Разветвляющиеся конструкции служат для изменения последовательности выполнения программ.
Оператор безусловного перехода GOTO
GOTO метка
Используется для передачи управления по метке.
Условный логический оператор IF
Общий вид: Блок-схема:
IF (Л.В.) “оператор”
последующий оператор программы
Если истинно логическое Л.В., то выполняется “оператор”, в противном случае управление передается на “последующий оператор программы”. Если Л.В. ложно, то управление сразу передается на “последующий оператор программы”, минуя “оператор”.
Конструкция IF THEN ENDIF
Общий вид: [имя:] IF(Л.В.) THEN Блок – схема:
“группа операторов”
ENDIF [имя]
Если истинно логическое выражение
Л.В., выполняется “группа операторов”, в про-
тивном случае управление непосредственно
передается за ENDIF. Имя конструкции может
присутствовать, может и не присутствовать.
Конструкция IF THEN ELSE ENDIF Блок схема:
Общий вид: [имя:] IF (Л.В.) THEN
“операторы
группы 1”
ELSE [ имя]
“операторы
группы 2”
ENDIF [имя]
В случае истинности выполняются “опера-
торы группы 1” и управление передается за ENDIF.
В случае лжи управление передается за ELSE,
минуя “операторы группы 1”, затем выполняются “операторы группы 2”. Имя конструкции, если оно задано, должно обязательно присутствовать и перед IF, и после ENDIF.
Конструкция IF THEN ELSEIF Блок -схема
Общий вид: [имя:] IF(Л.В.1) THEN
операторы
группы 1
ELSEIF(Л.В.2) THEN [имя]
операторы
группы 2
…
[ELSE [имя]
операторы
группы n]
ENDIF [имя]
В случае истинности логического вы-
ражения Л.В.1 выполняются “операторы группы 1”
и управление передается за ENDIF. Если логичес-
кое выражение Л.В.1 ложно, то управление пере-
дается на следующий ELSEIF, то есть вычисляется
значение логического выражения Л,В.2, и если оно истинно, то выполняются “операторы группы 2”. Если оно ложно, то управление передается на следующий ELSEIF, и так далее. Если ложны все Л.В., то выполняются операторы группы n, следующие за завершающим ELSE. Если завершающий ELSE отсутствует, то управление передается за ENDIF. Число операторов ELSEIF в конструкции может быть произвольным. Имя, если оно задано, во всех частях конструкции должно быть одинаковым. Следует обратить внимание, что вся конструкция завершается одним ENDIF.
Конструкция SELECT CASE
Общий вид: [имя:] SELECT CASE (тест-выражение)
CASE ( СП1) [имя]
“операторы группы 1”
[CASE (СП2) [имя]
[“операторы группы 2”]]
…
[CASE DEFAULT [имя]
[“операторы группы n”]]
ENDSELECT [имя]
Тест-выражение – целочисленное, символьное типа CHARACTER(1) или логическое скалярное выражение.
СП – список констант, тип которых должен соответствовать типу тест -выражения. СП может содержать одно значение, или несколько констант, разделенных запятыми, или быть задан как диапазон разделенных двоеточием значения, например 5:10 или ‘I’:’N’, или :10 (опущена левая граница), или 2: (опущена правая граница). Каждое значение, даже если оно задано в диапазоне значений, может появляться только в одном СП. Пример: СASE (0, 1, 3, 20:25, 50).
Конструкция SELECT CASE работает так:
Вычисляется значение тест – выражения. Если полученное значение находится в списке СП1, то выполняются “операторы группы 1”; далее управление передается за ENDSELECT. Если значение в СП1 не находится, то проверяется, есть ли оно в СП2, и так далее. Если значение тест – выражения не найдено ни в одном списке и присутствует оператор CASEDEFAULT, то выполняются “операторы группы n”, а далее выполняется расположенный за ENDSELECT оператор. Если же значение тест - выражения не найдено ни в одном списке и CASEDEFAULT отсутствует, то ни одна группа операторов не выполняется и управление передается за ENDSELECT.
Вспомогательные управляющие операторы
Оператор STOP
Прекращает выполнение программы. Общий вид:
STOP [сообщение]
Сообщение – символьная или целочисленная константа. Эта константа выводится на экран монитора после логического завершения программы по оператору STOP. При отсутствии сообщения по умолчанию выводится строка
STOP – Program terminated
Оператор PAUSE
Оператор временно приостанавливает выполнение программы и позволяет пользователю выполнить команды операционной системы. Общий вид:
PAUSE [сообщение]
Если сообщение отсутствует, то после выполнения оператора PAUSE выводится строка:
Please enter a blank line (to continue) or a system command
(пожалуйста, введите пробел для продолжения программы или команду системы).
Циклические конструкции
При решении многих задач часто возникает ситуация, когда некоторый набор действий требуется повторить многократно. При этом сами выполняемые команды остаются неизменными, но данные, с которыми они работают, могут меняться. Такие вычислительные действия называются циклическими.
В Фортране различают три вида циклов:
• цикл с “параметром” ( или счетный цикл);
• цикл “пока” ( или цикл по условию);
• цикл Do ( бесконечный цикл).
Цикл с “параметром” Блок – схема:
Общий вид:
[имя:] DO dovar = start, stop, [, inc]
…
тело цикла
…
ENDDO [имя]
dovar – целая, вещественная (одинарной
или двойной точности) переменная, назы-
ваемая переменной цикла или параметром
цикла;
start, stop – целые, вещественные (одинарной
или двойной точности) скалярные выражения, задающие диапазон изменения dovar;
inc – приращение или шаг цикла; целое, вещественное ( одинарной или двойной точности) скалярное выражение. Inc может быть > 0 (тогда start < stop) и < 0 (тогда start > stop), но inc 0. Если inc = 1, то, как правило, 1 не указывается.
Число итераций цикла определяется по формуле
, где
max – функция выбора наибольшего значения, а функция int возвращает значение, равное целой части числа.
После завершения цикла значение переменной цикла dovar равно (inc>0):
• dovar_ni+inc, если stop > start и цикл не содержит операторов выхода из цикла, где dovar_ni – значение переменной цикла на последней итерации;
• dovar_ni, если stop start и цикл досрочно прерван, где dovar_ni – значение переменной цикла в момент прерывания цикла;
• start, если stop < start.
Для случая inc <0 значение переменной цикла определяется аналогично.
Конструкция цикла с “параметром” работает следующим образом:
• при первом выполнении DO dovar = start, stop, inc вычисляются и запоминаются значения выражений start, stop и inc;
• переменной dovar присваивается значение start, выполняется тело цикла, затем осуществляется переход на начало цикла автоматически;
• переменной dovar присваивается значение dovar = dovar + inc, это вновь полученное значение сравнивается со значением stop; если dovar stop, то тело цикла выполняется повторно и осуществляется переход на начало цикла, и т.д. пока dovar не станет равно значению stop;
• если в цикле нет операторов прерывания цикла (GOTO, EXIT, CYCLE), то цикл повторяется ni раз.
Правила:
1. нельзя изменять значение переменной цикла dovar в теле цикла;
2. если start, stop, inc – простые переменные (не выражения) и их значения изменяются в теле цикла, то на работе цикла это не отразится.
Цикл “пока” Блок – схема:
Общий вид:
[имя:] DO WHILE (Л.В.)
…
тело цикла
…
ENDDO [имя]
Если в теле цикла отсутствуют операторы
прерывания цикла (GOTO, EXIT, CYCLE), то
тело цикла выполняется до тех пор, пока истинно
скалярное Л.В.. Причем проверка истинности
Л.В. выполняется перед началом очередной итерации ( цикл с условием).
Цикл DO (бесконечный цикл) Блок – схема:
Общий вид:
[имя:] DO
…
тело цикла
…
ENDDO [имя]
Цикл DO отличается от цикла “пока” тем,
что проверка истинности Л.В. осуществляется
после выполнения очередной итерации( итератив-
ный цикл).
Конструкция цикла DO задает бесконечный цикл. Поэтому такой цикл должен содержать по крайней мере один оператор прерывания цикла, например, GOTO, EXIT, CYCLE.
Оператор EXIT
Общая форма: EXIT [имя]
Передает управление из DO – конструкции на первый, следующий за конструкцией выполняемый оператор. Если [имя] опущено, то EXIT обеспечивает выход из текущего цикла, в противном случае EXIT обеспечивает выход из цикла, имя которого присутствует в операторе EXIT.
Оператор EXIT отдельно не применяется, а встраивается в конструкцию IF.
Оператор CYCLE
Общая форма: CYCLE [имя]
Передает управление на начало DO – конструкции. При этом операторы, расположенные между CYCLE и оператором ENDDO конца цикла, не выполняются. Если имя опущено, то CYCLE обеспечивает переход на начало текущего цикла, в противном случае CYCLE обеспечивает переход на начало цикла, имя которого присутствует в операторе CYCLE.
Оператор CYCLE отдельно не применяется, а встраивается в конструкцию IF.
Вложенные циклы
DO – конструкции могут быть вложенными (цикл в цикле). Степень вложенности не ограничена. Вложенным DO – конструкциям целесообразно давать имена, что повышает их наглядность.
D1: DO while( Л.В.1)
…
D2: DO while ( Л,В.2)
…
ENDDO D2
…
ENDDO D1
DX: DO x=a, b, hx
…
DY: DO y=c, d, hy
…
ENDDO DY
…
ENDDO DX
Массивы
Массив – это именованный набор из конечного числа объектов одного типа . Массив обеспечивает доступ к некоторому множеству данных при помощи одного имени. Также имя массива используется для обеспечения доступа к элементу или группе элементов(сечению) массива.
Массивы могут быть статическими и динамическими. Под статические массивы на этапе компиляции выделяется заданный объем памяти, которая занимается массивом во все время существования программы. Память под динамические массивы выделяется в процессе работы программы и при необходимости может быть изменена или освобождена.
Массив характеризуется числом измерений (их может быть до семи), которое называется рангом. Число элементов всего массива называется его размером. Число элементов массива вдоль каждого измерения называется протяженностью(экстентом) массива вдоль измерения. Ранг и протяженность массива вдоль каждого измерения определяют форму массива.
Каждое измерение массива может быть задано нижней и верхней границей, которые разделяются двоеточием. Если нижняя граница равна единице, то она, как правило, не указывается. Протяженность массива определяется по формуле:
Протяженность = Верхняя граница – нижняя граница + 1
Пример:
Real a(2,3), c(4:5,-1:1) описаны массивы а и с.
Форма массива а (2,3) (протяженность первого измерения=2-1+1=2, протяженность второго измерения=3-1+1=3). Форма массива с (2,3) (протяженность первого измерения=5-4+1=2, протяженность второго измерения = 1-(-1)+1=3). Массивы а и с имеют одинаковую форму. Такие массивы называются согласованными.
Объявление массивов
Статические:
1. С помощью операторов описания типа
а) integer a(0:10);
б) integer, parameter:: n=10, m=0
integer a(m:n).
2. С помощью Dimension
а) integer, dimension(10):: a ! dimension как атрибут;
а) integer a
dimension a(10) ! dimension как оператор.
2. Одновременное объявление массивов разной формы
real, dimension(10):: a, b, b2(15), d(3,4) ! приоритет у явного
описания формы
Динамические:
1. С помощью атрибутов Pointer и Allocatable
а) real, pointer:: a(:), c(:), d(:) -! объявлены три одномерных масси-
ва-ссылки a, c, d;
б) integer, allocatable:: b(:,:) ! объявлен двумерный размещаемый
массив b;
в) real, allocatable, target:: t(:) ! объявлен размещаемый массив-
адресат t.
2. С помощью оператора ALLOCATABLE
integer, dimension(:,:):: b
allocatable b.
Для выделения реальной памяти под массивы-ссылки и размещаемые массивы применяется специальный оператор ALLOCATE. Примеры:
а) real, pointer:: a(:)
allocate(a(10)) ! прикрепление ссылки к области памяти в необходимом
месте программы;
б) real, pointer:: a(:) ! массив-ссылка
real, target:: t(10) ! массив-адресат
a => t ! массив-ссылка и массив-адресат должны быть одного типа и одно-
го ранга;
в) integer, dimension(6):: a=(/5,7,-10,8,-23,56/)
integer, allocatable:: c(:)
allocate(c(15)) ! выделение области памяти под массив с в необходимом
месте программы
allocate(c(size(a)) ! выделение памяти под массив с, равной размеру масси-
ва а.
allocate(c(count(mask=a>0)) – выделение памяти под массив с, равной коли-
честву положительных элементов массива а.
Для освобождения выделенной оператором ALLOCATE памяти используется оператор DEALLOCATE. Пример:
integer, allocatable:: e(:) ! объявление размещаемого массив е
real, pointer:: ra, b(:) ! объявление скаляра-ссылки ra и массива-ссылки b
allocate(e(10), ra, b(20)) ! выделение памяти под массивы e и b и под скаляр ra
………………………..
deallocate(e, ra, b) ! освобождение динамической памяти
Инициализация массивов
Инициализацию массивов(задание начальных данных элементам массивов) можно осуществить несколькими способами.
Инициализация одномерных массивов:
1. в операторах описания типа:
integer a(10)/1,2,3,4,5,1,7,2,12,9/
2. с помощью оператора data:
integer a(10)
data a/1,2,3,4,5,1,7,2,12,9/
3. с помощью конструктора массива:
integer:: a(10)=(/ 1,2,3,4,5,1,7,2,12,9/) ! в конструкторе массива
пробел между слешем и скобкой не допускается.
4. в операторах присваивания:
real b(5), a(5)
b=sin(t) ! всем элементам массива b будет присвоено значения
функции sin(t)
a=2*(/3,3,4,4,6/) ! все элементы массива a, заданные с помо-
щью конструктора массива, будут удвоены.
5. использование в конструкторе массивов встроенных Do – циклов
а) integer a(5)
a = (/(i , i =1,5)/)
встроенный Do – цикл
! элементы массива a получат значения i, равные 1,2,3,4,5
б) logical f1(10)
f1=(/(.true.,k=1,5),(.false.,k=6,10)/)
! в конструкторе массива два встроенных цикла, массив f1 получит значения: T T T T T F F F F F
Инициализация двумерных массивов:
1. с помощью оператора DATA:
integer b(2,3)
data b/1,8,4,9,6,10/ ! значения вводятся по столбцам
2. в операторах описания типа:
integer b(2,3) / 1,8,4,9,6,10 / ! значения вводятся по столбцам
3. с помощью функции RESHAPE
integer a(5,2),b(2,3),i,j
a=reshape((/(2*i,i =2,11)/), shape=(/5,2/))
b=reshape((/1,3,5,7,8,10/),shape=(/2,3/))
! в функции RESHAPE вначале задается конструктор массива, а затем из него формируется массив по форме массива shape.
Размещение массивов в памяти
Одномерный массив:
Элементы массива занимают в памяти компьютера непрерывный, последовательный отрезок памяти.
Пусть описан массив: integer:: a(10) = (/3,8,9,5,12,167,-4,6,-1,0/)
Его элементы в памяти компьютера будут располагаться следующим образом:
а
3
8
9
5
12
167
-4
6
-1
а(1) а(2) а(3) а(4) а(5) а(6) а(7) а(8) а(9) а(10)
При этом а(i) - текущий элемент массива, где i - индексная переменная, может быть целым выражением, например, а(2*k), a(k+2*j).
Двумерный массив:
Память компьютера одномерная, поэтому элементы двумерного массива также занимают в памяти компьютера непрерывный, последовательный отрезок. В языке Фортран элементы двумерного массива упорядочены по столбцам.
Пусть описан массив: real, dimension(2,3):: b /1.5,6.,7.1,-123.6,0.,1.78/
Такой массив можно представить в виде таблицы:
j
1
2
3
i
1
b(1,1)
b(1,2)
b(1,3)
2
b(2,1)
b(2,2)
b(2,3)
В памяти компьютера элементы этого массива будут располагаться в виде непрерывной последовательности по столбцам:
b
1.5
6.
7.1
-123.6
1.78
b(1,1) b(2,1) b(1,2) b(2,2) b(1,3) b(2,3)
При этом b(i,j) - текущий элемент массива, i, j - индексные переменные, которые могут быть выражениями целого типа. Причем i - номер строки, j - номер столбца.
Элемент массива
В общем виде обращение к элементу массива может быть представлено
имя массива(список индексов)
Пусть объявлены массивы: integer fac(20), d(3,4).
Примерами обращений к элементам этих массивов могут быть:
fac(15), fac(I+1), fac(2*I) - обращения к элементам массива fac;
d(2,1), d(i+1, j*2), d(3, j-i) - обращения к элементам массива d.
Сечение массива
В FPS можно получить доступ не только к отдельному элементу массива, но и к некоторому подмножеству его элементов, которое называется сечением массива. Сечение массива может быть получено в результате применения индексного триплета или векторного индекса, которые при задании сечения подставляются вместо одного из индексов массива.
Индексный триплет:
Общий вид индексного триплета
[нижняя граница]:[верхняя граница][:шаг]
Каждый из параметров триплета является целочисленным выражением. Шаг может быть >0 и <0. Индексный триплет задает последовательность индексов, в которой первый элемент равен его нижней границе, а каждый последующий больше(меньше) предыдущего на величину шага.
Примеры:
1. Пусть объявлен одномерный массив: real d(15)
Его возможные сечения:
а) d(5:15:5) - это сечение позволяет обратиться к элементам d(5), d(10), d(15);
б) d(15:6:-3) - можно обратиться к элементам d(15), d(12), d(9), d(6);
в) d(5::5) - то же, что и а), при этом верхняя граница опущена, по умолчанию ,
она принимается равной верхней границе экстента массива d;
г) d(::5) - можно обратиться к элементам массива d(1), d(6), d(11), при этом
нижняя и верхняя границы триплета опущены, по умолчанию они
принимаются равными верхней и нижней границам экстента массива d;
д) d(2:6:int(5/2)) - можно обратиться к элементам d(2), d(4), d(6), шаг при этом
задан в виде целочисленного выражения;
е) d(:) - обращение ко всем элементам массива d.
2. Пусть объявлен двумерный массив: integer b(3,6)
Примеры его возможных сечений:
а) b(2:3,2:6:2) - для такого объявления доступны следующие элементы массива:
2
4
6
2
b(2,2)
b(2,4)
b(2,6)
3
b(3,2)
b(3,4)
b(3,6)
б) b(2, :) - обращение ко второй строке массива b;
в) b(:,6) - обращение к шестому столбцу массива b;
г) b(:,:) - обращение ко всем элементам массива b.
Векторный индекс:
Это одномерный целочисленный массив, содержащий значения индексов. Векторный индекс в отличие от индексного триплета позволяет извлечь в сечение массива произвольное подмножество элементов массива.
Примеры:
1. real a(10), b(5,5)
integer vi(3),vj(2) ! объявление векторных индексов vi и vj
vi=(/1,3,5/) ! инициализация вектора vi
vj=(/2,5/) ! инициализация вектора vj
a(vi)=1.5 ! инициированы элементы массива a(1), a(3), a(5)
b(2,vj)=7 ! инициированы элементы массива b(2,2), b(2,5)
b(vi,vj)=0 ! инициированы следующие элементы массива:
2
5
1
b(1,2)
b(1,5)
3
b(3,2)
b(3,5)
5
b(5,2)
b(5,5)
2. real a(3,6), b(5) ! объявление массивов a и b
data a/5*3, 5*4,8*0/ ! инициализация массива a
b=a(2,(/1,3,4,5,6/)) ! векторный индекс задан в виде конструктора масси-
ва, в вектор b будут записаны элементы второй стро-
ки массива a из столбцов с номерами 1,3,4,5,6.
Маскирование присваивания
В FPS можно, используя оператор или конструкцию WHERE, выполнить присваивание только тем элементам массива, значения которых удовлетворяют некоторым условиям.
Оператор WHERE имеет вид:
WHERE(логическое выражение-массив) присваивание массива
Пример: real:: a(5)=(/1.0,-1.0,1.0,-1.0,1.0/)
where(a>0) a=sin(a) ! положительным элементам массива a будет при-
своено значение sin(a).
Конструкция WHERE имеет вид:
а) WHERE(логическое выражение-массив)
операторы присваивания массивов
ENDWHERE
б) WHERE(логическое выражение-массив)
операторы присваивания массивов
ELSEWHERE
операторы присваивания массивов
ENDWHERE
Пример: integer:: a(10)=(/1,-1,1,-1,1,-1,1,-1,1,-1/)
integer:: b(-2:7)=0
where (a>b)
b=b+2
elsewhere
b=b-3; a=a+b
endwhere
write (*,*) b ! на выходе будет массив 2 –3 2 –3 2 –3 2-3 2 -3
write (*,*) a ! на выходе будет массив 1 –4 1 –4 1 –4 1 –4 1 -4
Вычисляется значение логического выражения. Результатом вычисления будет логический массив-маска, под управлением которого и выполняется выборочное присваивание массивов. В предыдущем примере в результате выполнения логического выражения a>b массив-маска имеет вид:
T F T F T F T F T F (T – истина, F – ложь)
Значения присваиваются тем следующим после WHERE элементам массивов, для которых соответствующий им элемент логического массива-маски равен .TRUE. Если значение элемента массива-маски равно .FALSE. и если есть ELSEWHERE, то будет выполнено присваивание следующих после ELSEWHERE элементов массивов, соответствующих по порядку следования элементу массива-маски. Массивы в WHERE должны иметь одинаковую форму.
Встроенные функции для работы с массивами
Справочные функции:
1. SIZE(array[,dim]) – возвращает стандартное целое, равное размеру массива array, или, при наличии параметра dim , - число элементов вдоль заданного измерения dim.
Пример: real d(-5:0, 0:3)
integer r, c
r=size(d) ! возвращает размер массива d, равный 24
c=size(d, dim=2) ! возвращает число элементов по второму измерению
массива d, равное 4
Вычисления в массиве:
2. PRODUCT(array[,dim][,mask]) - вычисляет произведение всех элементов целочисленного или вещественного массива вдоль необязательного измерения dim. Перемножаемые элементы могут отбираться необязательной маской mask.
Примеры: a) real:: a(3,5)/1,2,3,5,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15/
p=product(a, mask=a>0)
print *, p ! будет найдено произведение положительных элемен-
тов массива а, равное 30
б) real:: a(3,5)/1,2,3,5,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15/, p(5)
p=product(a, dim=1)
print *, p ! будут найдены произведения элементов массива а по
столбцам в виде одномерного массива p, элементы кото-
рого равны 6 150 -504 -1320 -2730
3. SUM(array,[,dim][,mask]) - вычисляет сумму всех элементов целочисленного или вещественного массива вдоль необязательного измерения dim. Суммируемые элементы могут отбираться необязательной маской mask.
Примеры: a) real:: a(3,5)/1,2,3,5,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15/
s=sum(a, mask=a>0)
print *, s ! будет найдена сумма положительных элементов
массива а, равная 11
б) real:: a(3,5)/1,2,3,5,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15/, s(5)
s=sum(a, dim=1)
print *, s ! будут найдены суммы элементов массива а по столб-
цам в виде одномерного массива s, элементы которого
равны 6 -6 -24 -33 -42
4. COUNT(mask[,dim]) - возвращает число элементов логического массива mask, имеющих значение .TRUE., вдоль заданного необязательного элемента dim.
Пример: Посчитать число отрицательных элементов в каждом столбце задан-
ной матрицы.
integer:: c(3,3)/-1,4,5,-2,-6,-3,8,9,5/, r(3)
r=count(mask=c<0, dim=1)
print *, r ! будет возвращено число отрицательных элементов в каж-
дом столбце матрицы c в виде одномерного массива r, эле-
менты которого равны 1 3 0
5. MAXLOC(array[,mask]) - возвращает одномерный массив стандартного целого типа, значения которого равны индексам максимального элемента целочисленного или вещественного массива array.
6. MINLOC(array,[,mask]) - возвращает одномерный массив стандартного целого типа, значения которого равны индексам минимального элемента целочисленного или вещественного массива array.
Пример: integer a(3,3)//, c(3)=(/2,7,-3/), d1(1), d2(2)
d1=minloc(array=c, mask=c>0)
print *, d1 ! будет возвращено значение индекса минимального по-
ложительного элемента массива c в виде одномерного
массива d1, элемент которого равен 1
d2=maxloc(array=a)
print *, d2 ! будут возвращены значения индексов максимального
положительного элемента массива a в виде одномерного
массива d2, элементы которого равны 1 3
8. MAXVAL(array[,dim][,mask]) - возвращает максимальное, удовлетворяющее необязательной маске mask, значение целочисленного или вещественного массива array вдоль заданного необязательного измерения dim.
9. MINVAL(array[,dim][,mask]) - возвращает минимальное, удовлетворяющее необязательной маске mask, значение целочисленного или вещественного массива array вдоль заданного необязательного измерения dim.
Пример: real b(2,3)//
print *, maxval(b) ! результат будет равен 16
print *, minval(b, mask=b>0) ! результат будет равен 1
print *, maxval(b,dim=1) ! возвратится массив с элементами 3.5 12 16
print *, minval(b, dim=2) ! возвратится массив с элементами –5 1