
- •Lesson 4 Массивы
- •Одномерные массивы Описание одномерных массивов
- •Ввод и вывод одномерных массивов Ввод одномерного массива
- •Вывод одномерного массива
- •Integer:: I
- •Примеры задач.
- •Многомерные массивы
- •Секции массива
- •Размещение массивов в памяти
- •Ввод и вывод массивов
- •Ввод двумерного массива
- •Вывод двумерного массива
- •Примеры задач.
- •Характеристики массивов
- •Форма массива. Конформные массивы
- •Функции shape и size
- •Выражения с массивами и присваивание массивов
- •Оператор и конструкция where
- •Динамические массивы
Функции shape и size
Определить в программе форму или размер массива можно, обратившись к функциям shape или size. Эти функции могут использоваться для массивов в подпрограммах или для динамических массивов.
Функция shape(array) с одним аргументом – именем массива – возвращает форму массива – одномерный целочисленный массив, число элементов которого равно рангу массива-аргумента, а каждый элемент равен протяженности массива-аргумента в данном измерении. Для двумерного массива это количество строк и количество столбцов.
Пример.
integer, dimension(1:11, -3:0):: A2
integer, dimension(1:2):: Sh
. . .
Sh = shape(A2) ! Sh – массив; Sh(1)=11; Sh(2)=4
У функции size(array,[dim]) два аргумента: первый – имя массива – обязательный, второй – номер измерения – необязательный. Если номер измерения указан в числе аргументов, функция возвращает протяженность массива-аргумента по заданному измерению, если нет – функция возвращает полный размер массива-аргумента.
Пример.
integer, dimension(1:11, -3:0):: A2
integer:: Sz, Sz1, Sz2
. . .
Sz1 = size(A2, 1) ! Sz1 = 11
Sz2 = size(A2, 2) ! Sz2 = 4
Sz = size(A2) ! Sz = 44
Выражения с массивами и присваивание массивов
Операндами выражений и операций присваивания могут быть не только скалярные объекты, но и массивы и секции массивов.
Например, выполнение для массива array оператора присваивания
array = -array
приведет к перемене знака всех элементов массива
Для конформныхмассивов, и только для них, определены все арифметические, логические операции и операции отношения. Результатом этих операций является массив, конформный исходным, элементы которого получены применением соответствующей операции к элементам массивов-операндов. Операндами выражений с массивами могут быть секции массивов.
Пример1.Сложение массивов.
integer, dimension(1:20, 1:20) :: A, B, S
S = A + B
Выполнение оператора присваивания равносильно выполнению операторов
do i = 1, 20
do j = 1, 20
S(i, j) = A(i, j) + B(i, j)
enddo
enddo
Пример2. Умножить на константу вторую строку матрицы.
integer, dimension(1:20, 1:20) :: A
integer, parameter :: C=12
A(2,:) = A(2,:) * C
Результат будет таким же, как и при выполнении операторов
do j = 1, 20
A(2, j) = A(2, j) * C
enddo
Внимание!Произведением массивов А*В является массивпроизведений элементов с одинаковыми индексами, а не произведение векторов и матриц в алгебраическом смысле.
Пример3. Сравнение массивов.
integer, dimension(1:40) :: A
logical, dimension(1:20) :: L
L = A(:20) == A(21:)
Конформны логический массив, первая и вторая половины массива A.
Выполнение оператора присваивания равносильно выполнению операторов
do i = 1, 20
L(i) = A(i) == A(i+20)
enddo
Оператор и конструкция where
Оператор whereможно рассматривать как аналог оператораifдля массивов. Если аргументом оператораifявляется скалярное логическое выражение, то аргументом оператора whereявляется логический массив. Операторwhereприменяется, когда необходимо выполнить какие-то действия только над элементами массива, удовлетворяющими некоторому условию. Например, оператор
where (A>0) A = sgrt(A)
заменяет положительные элементы массива Aзначениями квадратных корней из них, остальные элементы не изменяются.
При выполнении оператора создается логическиймассив-маска (A>0), конформный исходному массивуAи заполненный логическими константами.true.и.false.Следующий этап – вычисление квадратных корней – выполняется только для элементов с маской.truе.без попыток вычислить корни из отрицательных элементов.
Общий вид оператора
where (логическое_выражение_массив)переменная_массив=выражение_массив
Форма логического массива-маски, являющегося результатом проверки условия логическое_выражение_массив, должна совпадать с формойпеременная_массив.Выражение_массивв правой части оператора присваивания вычисляется только для элементов, соответствующих истинным значениям логического выражения.
Внимание!Операторwhere–простойоператор, он пишется в одной строке, если нет символа переноса.
Для выполнения группы присваиваний массивов применяется конструкция where...endwhere:
where (логическое_выражение_массив)
присваивание массивов
endwhere
Массив-маска вычисляется один раз и не изменяется во время выполнения присваивания массивов.
Пример1. Используя конструкциюwhere...endwhereзаменить положительные элементы массиваAзначениями квадратных корней из них.
where (A>0)
A = sqrt(A)
endwhere
Конструкция where...endwhereпозволяет организовать группу альтернативных назначений:
where (логическое_выражение_массив)
присваивание массивов 1
elsewhere
присваивание массивов 2
endwhere
Вторая группа присваиваний выполняется в том же порядке и по тем же правилам, но под управлением маски (.not.логическое_выражение_массив), которая также вычисляется один раз в момент выполнения оператораwhere.
Пример2. Заменить положительные элементы массиваAзначениями квадратных корней из них, остальные элементы массива обнулить.
where (A>0)
A = sqrt(A)
elsewhere
A = 0
endwhere