Логические выражения. Программирование ветвлений

Результатом логического выражения является логическое значение: .TRUE. или .FALSE. Простейшей формой логического выражения является отношение.

Отношение производит сравнение значений двух арифметических или сим­вольных выражений. Отношения являются аналогами математических неравенств, например: x>0, y<10 и т.п.

Знаки операций отношения в Фортране могут быть записаны в двух формах: мнемонической и символьной.

меньше: .LT. или <

меньше или равно: .LE. или <=

больше: .GT. или >

больше или равно: .GE. или >=

равно: .EQ. или = =

не равно: .NE. или /=

Если в выражении отношения один операнд имеет вещественный, а другой целый тип, то перед выполнением операции целочисленный опе­ранд приводится к вещественному типу.

При сравнении комплексных величин можно применять только две операции отношения: .NE. (/=) и .EQ. (= =).

Пример 1:

real ::x=1.3, y= -4.6

logical flag

flag = x > y ! .TRUE.

flag = x > abs(y) ! .FALSE.

Приоритет операций отношения ниже, чем арифметических операций. Например, в выражении

X+Y>2*Y

можно арифметические выражения в скобки не заключать, так как они сосчитаются до выполнения операции отношения.

Логическое выражение состоит из операндов логического типа, связанных логическими операциями и круглыми скобками. Результатом его вычисления является логическое значение .TRUE. или .FALSE. Операндами могут быть логические константы, переменные, функции, выражения отношения. Логические операции:

.NOT. логическое НЕ (отрицание);

.AND. логическое И;

.OR. логическое ИЛИ;

.XOR. логическое исключающее ИЛИ;

.EQV. эквивалентность;

.NEQV. неэквивалентность.

Все логические операции, кроме отрицания, являются бинарными. Логическая операция .NOT. является унарной и располагается перед операндом.

В таблице приведены результаты логических операций над логическими переменными х и у, принимающими значения "истина" (И) и "ложь" (Л).

Таблица истинности

х y х.AND. y х .OR. у .NOT. х х .XOR. у х .EQV. у х.NEQV. у
И И И И Л Л И Л
И Л Л И Л И Л И
Л И Л И И И Л И
Л Л Л Л И Л И Л


Приоритет логических операций ниже, чем операций отношений. В свою очередь у логических операций имеется своя иерархия рангов. Стоящие подряд в выражении операции отношения и логические операции одинакового старшинства выполняются слева направо.

Пример 2. Математическому неравенству 1≤ x ≤ 7 соответствует следующее логическое выражение: (1<= x).and.(x<=7).

Пример 3. Записать условие принадлежности точки с координатами (x, y) области, лежащей внутри кольца с внешним радиусом R1и внутренним радиусом R2 с центром в начале координат

real x, y, R1, R2

logical g

g=(x*x+y*y<R1*R1).and.(x*x+y*y>R2*R2)

Значение переменной g будет .true., если точка принадлежит заданной области.

Ветвление

Ветвление – алгоритмическая структура, осуществляющая выбор одного из возможных направлений выполнения алгоритма в зависимости от значения некоторых условий с последующим выходом на общее продолжение.

В Фортране существуют четыре вида программных конструкций, реализующих ветвления. Их будем называть так:

• если - то;

• если - то - иначе;

• если - то - иначе - если;

• выбор по ключу.

Ветвление «если - то» реализует неполное ветвление и записывается на Фортране с помощью конструкции IF THEN ENDIF:

[имя:] IF(логическое_выражение) THEN

БОК

END IF [имя]

Ветвление "если - то" работает так:

• вычисляется значениелогического выражения;

• если оно истинно, то выполняется БОК (Блок Операторов и Конструкций) затем происходит выход из ветвления;

• если оно ложно, то управление передается на следующий оператор, стоящий после ветвления.

Конструкция может иметь имя, отделяемое от IF двоеточием. В таком случае это же имя должно быть повторено в конце конструкции. Например:

swap: if(a < b) then

c=a; a=b; b=c !в a – максимальное значение a и b

endifswap

Оператор END IF можно писать как с пробелом, так и слитно: ENDIF.

Если в БОК входит один оператор, то ветвление "если - то" может быть записано более компактно с помощью условного логического оператора IF:

IF (логическое_выражение) оператор

Например:

If(x<0) x=-x ! получение абсолютной величины x

Ветвление "если - то - иначе" на Фортране записывается с помощью конструкции IF THEN ELSE ENDIF:

[имя:]IF(логическое_выражение) THEN

БОК1

ELSE [имя]

БОК2

ENDIF [имя]

Имя конструкции, если оно задано, должно обязательно присут­ствовать и перед IF, и после ENDIF.

Ветвление "если - то - иначе" работает так:

• вычисляется значение логического выражения;

• если оно истинно, то выполняется БОК1;

• если оно ложно, то выполняется БОК2;

• далее управление передается следующему после ветвления оператору.

Пример 4:

if(b*b-4*a*c>=0) then

print *,'Уравнение имеет вещественные корни'

Else

print *, 'Нет вещественных корней'

Endif

Структура «если-то-иначе-если» реализует вложенные ветвления, когда вложенность имеется на отрицательной ветви развилки. КонструкцияIF THEN ELSE IF имеет следующий вид:

[имя:] IF(логическое_выражение_1) THEN

БОК1

ELSE IF(логическое_выражение_2) THEN [имя]

БОК2

[ELSE[имя]

БОКn

END IF [имя]

Такая запись более компактна, поскольку END IF пишется только один раз.

Пример 5. Времена года. Здесь month – целое положительное число – номер месяца.

if (month==12.or.month==1.or.month==2) then

print*,′Зима′

else if (month==3.or.month==4.or.month==5) then

print*,′Весна′

else if (month==6.or.month==7.or.month==8) then

print*,′Лето′

else if (month==9.or.month==10.or.month==11) then

print*,′Осень′

else

print*,′Месяц указан неверно′

Endif

Структура выбора по ключуреализуется с помощью конструкции SELECT CASE:

[имя:] SELECT CASE (ключ_выбора)

CASE(СП1) [имя]

[БОК1]

[CASE(СП2) [имя]

[БОК2]]

[CASE DEFAULT [имя]

[БОКn]]

END SELECT [имя]

Ключ_выбора – это выражение целого типа или логическое выражение или символьная переменная типа CHARACTER(l).

СП – список констант, тип которых должен совпадать с типом ключа_выбора.

Исполнение конструкции происходит следующим образом. Сначала вычисляется ключ выбора. Полученное значение сравнивается с элементами списков СП1, СП2… Если в каком-то из списков обнаружено искомое значение, то выполняется БОК соответствующей CASE-секции (ветви), после чего происходит выход на оператор, стоящий следующим после END SELECT. Если ни в одном из СПi значения ключа не обнаружено, то выполняется БОК, расположенный после CASE DEFAULT и затем происходит выход из конструкции.

Пример. Времена года.

select case (month)

case(12,1,2)

print*,′Зима′

case(3:5)

print*,′Весна′

case(6:8)

print*,′Лето′

case(9:11)

print*,′Осень′

case default

print*,′Месяц указан неверно′

End select

Если сравнить этот пример с предыдущим, то видно, что использование оператора SELECT CASE в данном случае упрощает запись алгоритма.

Из приведенного примера видно, что СП может быть представлен в как в виде последовательности значений, разделенных запятыми, так и в интервальной форме через двоеточие - (A:B). Значение А должно быть не больше В. Запись вида ( :В) означает любые значения, не большие В. Запись вида (А:) означает любые значения, не меньшие А

Каждое значение, даже если оно задано в диапазоне значений, может появляться только в одном СП.

Нельзя переходить посредством оператора GOTO или в результате аль­тернативного возврата из подпрограммы внутрь конструкции SELECT CASE или из одной CASE-секции в другую. Такая ошибка будет обнаружена компилятором.

Упражнения

1. Вычислить значения логических выражений:

а) x * y <> 0 .and. y > x при x = 2, y = 1;

б) a .or. .not. b при a = .false., b = .true.

2. Если a = .true. и x = 1, то какое значение получит логическая переменная d после выполнения оператора присваивания:

а) d := x < 2; б) d := .not. a .and. x==1 ?

3. Написать оператор присваивания, в результате выполнения которого логическая переменная t получит значение .true., если высказывание истинно, и значение .false. в противном случае:

а) из чисел x, y, z только два равны между собой;

б) x – положительное число;

в) каждое из чисел x, y, z положительно;

г) только одно из чисел x, y, z положительно;

д) p делится нацело на q;

е) цифра 5 входит в десятичную запись трехзначного целого числа k.

4. Составить программу полного решения квадратного уравнения (алгоритм см. в разделе 1.3).

Наши рекомендации