- •Глава 3. Программирование на фортране-90
- •3.1. Версии Фортрана
- •3.2. Работа в системах программирования на Фортране
- •3.3. Структура и формат программы на Фортране 90
- •3.4. Элементы языка Фортран
- •Одиночные и двойные специальные символы
- •3.5. Данные. Типы данных
- •Разновидности числовых типов данных
- •Буквальные константы
- •Упражнения
- •3.6. Арифметические выражения. Присваивание. Ввод-вывод
- •Арифметические выражения
- •Основные математические функции
- •Упражнения
- •3.7. Логические выражения. Программирование ветвлений
- •Ветвление
- •Упражнения
- •3.8. Программирование циклов
- •Упражнения
Ветвление
Ветвление – алгоритмическая структура, осуществляющая выбор одного из возможных направлений выполнения алгоритма в зависимости от значения некоторых условий с последующим выходом на общее продолжение.
В Фортране существуют четыре вида программных конструкций, реализующих ветвления. Их будем называть так:
• если - то;
• если - то - иначе;
• если - то - иначе - если;
• выбор по ключу.
Ветвление «если - то» реализует неполное ветвление и записывается на Фортране с помощью конструкции IF THEN ENDIF:
[имя:] IF(логическое_выражение) THEN
БОК
END IF [имя]
Ветвление "если - то" работает так:
• вычисляется значение логического выражения;
• если оно истинно, то выполняется БОК (Блок Операторов и Конструкций) затем происходит выход из ветвления;
• если оно ложно, то управление передается на следующий оператор, стоящий после ветвления.
Конструкция может иметь имя, отделяемое от IF двоеточием. В таком случае это же имя должно быть повторено в конце конструкции. Например:
swap: if(a < b) then
c=a; a=b; b=c !в a – максимальное значение a и b
endif swap
Оператор 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-секции (ветви), после чего происходит выход на оператор, стоящий следующим послеENDSELECT. Если ни в одном из СПiзначения ключа не обнаружено, то выполняется БОК, расположенный послеCASEDEFAULTи затем происходит выход из конструкции.
Пример. Времена года.
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
Если сравнить этот пример с предыдущим, то видно, что использование оператора SELECTCASEв данном случае упрощает запись алгоритма.
Из приведенного примера видно, что СП может быть представлен в как в виде последовательности значений, разделенных запятыми, так и в интервальной форме через двоеточие - (A:B). Значение А должно быть не больше В. Запись вида ( :В) означает любые значения, не большие В. Запись вида (А:) означает любые значения, не меньшие А
Каждое значение, даже если оно задано в диапазоне значений, может появляться только в одном СП.
Нельзя переходить посредством оператора GOTO или в результате альтернативного возврата из подпрограммы внутрь конструкции SELECT CASE или из одной CASE-секции в другую. Такая ошибка будет обнаружена компилятором.