Логические выражения. Программирование ветвлений
Результатом логического выражения является логическое значение: .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).