Бинарная операция, примененная к двум массивам, имеет такой же результат, как если бы эта операция была попарно применена к элементам первого и второго массива с одинаковыми номерами (индексами). Это легко можно увидеть на примере арифметических операций (см. табл. 3.3) между одномерными (пример 3.61) и двумерными (пример 3.62) массивами вещественных чисел, т.е. операции с массивами не имеют ничего общего с операциями над матрицами или векторами.
Допускаются бинарные операции между массивами и скалярами. Действие бинарной операции между массивом и скаляром равноценно совокупности операций между скаляром и всеми элементами массива, например операция умножения суммарного массива A+B (см. пример 3.62) на скалярную переменную X = 2 равноценна удвоению каждого элемента этого массива. Действие унарных операций (например, унарный минус) имеет аналогичный характер.
Пример 3.62. Объявление и инициализация массива констант с указанием верхней границы (вариант 2)
program OPERARR2
integer, parameter, dimension(2, 2):: A = RESHAPE ((/ 0, 1, 2, 3 /), (/2, 2/) ) integer, parameter, dimension(2, 2):: B = RESHAPE ((/ 4, 5, 6, 7 /), (/2, 2/) ) integer, dimension(2, 2):: C; integer :: X = 2
C = X*(A+B)
I=1; print*, (A(I, J), J = 1, 2); I=2; print*, (A(I, J), J = 1, 2) I=1; print*, (B(I, J), J = 1, 2); I=2; print*, (B(I, J), J = 1, 2) I=1; print*, (C(I, J), J = 1, 2); I=2; print*, (C(I, J), J = 1, 2) end
Для пояснения текста программы (см. пример 3.62) полезно напомнить, что для инициализации массивов A и B используется функция RESHAPE, позволяющая переформатировать одномерные массивы к требуемой форме. В данном случае эта функция содержит два аргумента (в круглых скобках, через запятую): первым аргументом является конструктор одномерного массива констант, а вторым аргументом − константа, определяющая форму конечного массива (см. п. 3.3.6).
171
3.5.УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ
3.5.1.Условный оператор и конструкция IF
Условный оператор IF проверяет значение скалярного логического выражения. Если его значение истинно, т.е. имеет значение «.TRUE.» (см. п. 3.3.3), то выполняется действие в виде одиночного оператора (например, вывод на печать, присваивание и т. д.). Обрамляющие круглые скобки для условия обязательны:
IF (условие) одиночный оператор
Оператору IF не могут в качестве действия указываться другие условные операторы и конструкции, а также циклы. Условием может быть логическая константа, переменная или выражение – чаще всего это логические отношения, связанные логическими операто-
рами (см. п. 3.4.3).
В приведенном примере (пример 3.63) определяется знак введенного с клавиатуры целого числа (положительное или отрицательное), или сообщается, что это нуль. В качестве условий используются простейшие логические отношения (см. табл. 3.6).
Пример 3.63. Пример использования логического оператора IF program SIGNDETECT
integer NUMBER read*, NUMBER
if(NUMBER > 0) print*, “Положительное” if(NUMBER < 0) print*, “Отрицательное” if(NUMBER == 0) print*, “Нуль”
end
Оператор IF позволяет выполнить одиночный оператор (или исключить его выполнение при невыполнении условия) – это в ряде случаев позволяет обеспечить компактность программы, но явно недостаточно, если в качестве альтернатив используются последовательности более чем из одного оператора. В этом случае целесообразно использовать конструкцию IF.
Первый блок конструкции IF всегда начинается со строки, содержащей ключевое слово IF, за которым в круглых скобках следу-
172
ет проверяемое условие (логическая величина) и ключевое слово THEN. После THEN в первой строке конструкции IF не может быть ничего, кроме комментария. Если строка – длинная, она может быть продолжена в соответствии с правилами продолжения строк свободного или фиксированного формата. После первой строки конструкции IF следует последовательность операторов, выполняемых при истинности проверяемого условия:
IF (условие) THEN
блок операторов
ELSE IF (альтернативное условие 1) THEN альтернативный блок операторов 1 ELSE IF (альтернативное условие 2) THEN альтернативный блок операторов 2
…
ELSE IF (альтернативное условие N) THEN альтернативный блок операторов N
ELSE
пост-альтернативный блок
END IF
Далее в конструкции IF могут присутствовать число альтернативных блоков ELSE IF со своими условиями – правила их записи точно такие же, как для первого IF-блока. Количество блоков ELSE IF не ограничено – их может быть и десять и сто, а может не быть ни одного.
Затем после блоков ELSE IF может следовать (или отсутствовать) блок ELSE, содержащий программный код, выполняемый в отсутствие истинности всех условий IF и ELSE IF. После чего для завершения конструкции IF используется оператор END IF.
Таким образом, простейшая форма конструкции IF выгляди следующим образом:
IF (условие) THEN
блок операторов
END IF
173
В качестве примера c одним альтернативным блоком в конструкции IF рассмотрим определение четности целого числа, введенного с клавиатуры.
Для определения четности числа используется правило целочисленной арифметики, при делении целых чисел дробная часть отбрасывается. Если четное целое число сначала разделить на два, а затем результат деления опять умножить на два, получится то же самое четное число, что и до деления. Если ту же операцию проделать с нечетным числом, то при делении на два дробная часть будет отброшена и при умножении результата деления на два исходное нечетное число не восстановится (пример 3.64).
Пример 3.64. Пример логической конструкции IF с альтернативой program EVENDETECT
integer NUMBER logical EVEN read*, NUMBER
EVEN = NUMBER / 2 * 2 == NUMBER if(EVEN) then
print*, “Четное”
else
print*, “Нечетное” end if
end
Развернутую конструкцию IF можно показать на примере, где одновременно определяется знак и четность целого числа, введенного с клавиатуры (пример 3.65).
Пример 3.65. Пример логической конструкции IF с множеством альтернатив
program EVENSIGN integer NUMBER logical EVEN read*, NUMBER
EVEN = NUMBER / 2 * 2 == NUMBER if(EVEN .and. NUMBER > 0) then
print*, “Четное положительное” else if(EVEN .and. NUMBER < 0) then print*, “Четное отрицательное”
else if((.not. EVEN) .and. NUMBER > 0) then print*, “Нечетное положительное”
else if((.not. EVEN) .and. NUMBER < 0) then
174
print*, “Нечетное отрицательное”
else
print*, “Нуль” end if
end
Для конструкций IF допускается произвольная вложенность при условии, что вложенные элементы не пересекаются.
3.5.2. Оператор варианта – конструкция CASE
Подобно конструкции IF конструкция CASE позволяет выполнять тот или иной блок операторов, в зависимости от определенного условия. Условие выбора задается значением скалярного выражения целого, логического или текстового типа. Выражение, определяющее условие выбора, должно быть записано в круглых скобках в операторе SELECT CASE:
SELECT CASE (выражение) CASE селектор 1
блок операторов 1 CASE селектор 1
блок операторов 1
…
CASE селектор N
блок операторов N
CASE DEFAULT
блок операторов
END SELECT
Для выбора блока операторов необходимо, чтобы селектор оператора CASE этого блока содержал элемент, совпадающий по значению с выражением в SELECT CASE. Общая форма селектора – заключенный в скобки список неперекрывающихся значений и интервалов того же типа, что и выражение, определяющее условие выбора блока исполняемых операторов.
175