Материал: Аверянов Введение в оператсионные системы и основы программирования 2015

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Бинарная операция, примененная к двум массивам, имеет такой же результат, как если бы эта операция была попарно применена к элементам первого и второго массива с одинаковыми номерами (индексами). Это легко можно увидеть на примере арифметических операций (см. табл. 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

Источник: https://studfile.net/preview/16708824/