
- •Управление векторами и матрицами
- •Компиляция и выполнение Компиляция
- •Связывание (редактирование связей )
- •Выполнение
- •Примеры
- •Соглашения о записи кода
- •Арифметические выражения
- •Операции отношения
- •Логические выражения
- •Сравнение символов
- •Переносимость результата
- •Спецификация массивов
- •Сечения массива Индивидуальные элементы
- •Сечения
- •Векторные указатели
- •Память для массива Физическая память:
- •Присваивание массива Присваивание всего массива
- •Присваивание секции (вырезки) массива
- •Повторная нумерация
- •Основные встроенные процедуры
- •Массивы нулевого размера
- •Массивы и производные типы
- •Инициализация массивов Конструкторы
- •Оператор data
- •Встроенные функции для массива
- •Пример упрощения
- •Пример исследования (запроса)
- •Пример конструирования
- •Пример локализации
- •Я Операторы управления
- •Вложения
- •Порядок операторов
- •Синтаксис программы Main
- •Формат представления программы
- •Программные единицы
- •Уровни доступа
- •Дополнения
- •Спецификация входных-выходных параметров
- •Использование модуля
- •Родовые подпрограммы
- •Интерактивный ввод-вывод
- •Простой Input и Output
- •Форматирование по умолчанию
- •Форматированный ввод-вывод I/o
- •Дескрипторы редактора
- •Вещественные - форма с фиксированной точкой
- •Вещественные - экспотенциальная форма
- •Символьные
- •Логические
- •Заполнение пробелами (пропуск символьных позиций)
- •Специальные символы
- •Списки ввода-вывода
- •Производные типы данных
- •Неявный цикл do
- •Ввод-вывод без продвижения
- •Файловый ввод-вывод
- •Номера устройств
- •Операторы read и write
- •Оператор write
- •Оператор open
- •Оператор close
- •Оператор inquirе
- •Динамический массив
- •Распределяемые массивы
- •Спецификация
- •Выделение и возвращение памяти
- •Статус распределяемых массивов
- •Потоки памяти (куча)
- •Что есть указатели?
- •Указатели и адресаты
- •Спецификации указателя Общая форма для операторов определения указателя и адресата такая:
- •Присваивание указателя
- •Разыменование (Dereferencing)
- •Статус (состояние) связи указателя
- •Динамическая память
- •Общие ошибки
- •Указатели в производных типах данных
- •Связанные списки
- •Параметры - указатели
- •Функции для указателей
Встроенные функции для массива
Несколько встроенных функций имеется в Fortran90. Они позволяют сократить время и усилия в процессе программирования. Их можно разделить на 7 разделов:
Умножение векторов и матриц
Упрощение
Исследование
Конструирование
Реорганизация
Манипуляции
Локализация (указание )
Пример упрощения
Встроенная функция ALL() имеет вид:
ALL( условие )
И определяет, когда для всех элементов в массиве справедливо условие (равно) .TRUE. . Результат - логическое значение .TRUE. если все элементы удовлетворяют условию и.FALSE. в противном случае.
LOGICAL :: test, test2, test3
REAL, DIMENSION(3,2) :: a
a = RESHAPE( (/5,9,6,10,8,12/), (/3,2/) )
...
test = ALL( a>5 ) ! ложь
test2 = ALL( a<20 ) ! истина
test3 = ALL( a>=5 .AND. test2 ) ! истина (true)
Первый оператор возвращает .FALSE. поскольку первый элемент равен 5, но не больше 5. Второй оператор возвращает .TRUE. поскольку все элементы имеют значения, меньшие 20. Третий Второй оператор возвращает .TRUE. поскольку все элементы имеют значения, равные или большие 5 , и значение переменной test2 равно .TRUE. .
Я
Пример исследования (запроса)
Встроенная функция SIZE() имеет вид:
SIZE( массив [, DIM] )
И возвращает протяженность массива для указанного измерения (заданного аргументом DIM). Если измерение не задано, SIZE() возвращает число всех элементов в массиве.
REAL, DIMENSION(3,2) :: a
num=SIZE(a) ! num=6
num=SIZE(a,DIM=1) ! num=3
num=SIZE(a,DIM=2) ! num=2
Значение, заданное аргументу DIM указывает измерение - DIM=1 возвращает число рядов, DIM=2 число столбцов и т.д.
|
|
|
|
|
|
DIM=2
|
|
|
|
|
|
DIM=1
Я
Пример конструирования
Встроенная функция SPREAD() имеет вид:
SPREAD(массив, DIM, NCOPIES)
И копирует данный массив добавлением измерения, где DIM становится измерением и NCOPIES числом копий.
REAL, DIMENSION(3) :: a=(/2,3,4/)
REAL, DIMENSION(3,3) :: b,c
b=SPREAD(a, DIM=1, NCOPIES=3)
c=SPREAD(a, DIM=2, NCOPIES=3)
Первый оператор SPREAD копирует массив a три раза в измерении ряда. Второй оператор SPREAD копирует массив a три раза в измерении столбца.
Я
Пример локализации
Встроенная функция MAXLOC() имеет вид:
MAXLOC(массив, [маска])
И определяет положение элемента, который имеет наибольшее значение в массиве и удовлетворяет маске (необязательной). Маска это логический массив (или условие , включенной в массив), которое соответствует массиву. Только элементы массива , которые составляют часть в поиске максимальных по значению элементов, связываются с элементами.TRUE. в маске.
REAL :: a(5)=(/2,8,5,3,4/)
num = MAXLOC( a ) ! num=2
num = MAXLOC( a(2:4) ) ! num=1, заметим перенумерацию
num = MAXLOC( a, MASK=a<5 ) ! num=5
Для третьего оператора
a
2 |
8 |
5 |
3 |
4 |
MASK=a<5
T |
F |
F |
T |
T |
Выбираются
2 |
8 |
|
|
4 |
Первый оператор возвращает 2, поскольку это позиция наибольшего номера в списке. Второй оператор MAXLOC() возвращает значение 1, поскольку это позиция наибольшего по значению элемента в вырезке массива (элемента в вырезке массива перенумерованы с 1 как меньшей границы по каждому измерению). Третий оператор MAXLOC() возвращает 5 , поскольку это позиция наибольшего номера в списке, где числа, большие 5, исключаются маской.
Я
Условные операторы
Выбор и направляющее управление через подходящий путь доступа к программе еть очень мощная и нужная операция. Fortran 90 предоставляет два механизма, которыми программист осуществляет выбор альтернативных действий, зависящих от условий:
•оператор и конструкция IF
•конструкция выбора CASE
В управлении порядком выполнения операторов используется оператор GOTO.
Оператор и конструкция IF
Простейшая форма оператора IF это единственное действие, основанное на единственном условии:
IF( выражение ) оператор
Только если выражение (логическая переменная или выражение) имеет значение .TRUE. оператор выполним. Например, в:
IF( x<0.0 ) x=0.0
если x меньше чем нуль, то дается новое значение (0.0); в противном случае x сохраняет свое прежнее значение.
Структура конструкции IF зависит от числа условий , которые могут быть проверены и имеет следующую общую форму:
[имя:] IF (выражение1) THEN
блок1
ELSEIF (выражение 2) THEN [имя]
блок 2
...
[ELSE [имя]
блок]
ENDIF [имя]
Где выражение№ есть логическая переменная или выражение.
Конструкция используется, когда число операторов зависит от условия. Например, 'если идет дождь, то взять пиджак и взять зонт'. Это требуется в части THEN . Заметим, что оператор END IF (или ENDIF) требуется, чтобы обозначить конец условного блока в операторе.
LOGICAL :: rain
INTEGER :: numb=0, ncoat
...
IF ( rain ) THEN
ncoat = 1
numb = numb+1
ENDIF
If дождь есть .TRUE. , блок операторов выполним и управление переходит к следующему оператору после ENDIF; в противном случае, блок операторов опускается и управление переходит прямо к следующему оператору после ENDIF.
Более сложная ситуация может возникать, когда представляющая альтернативные действия зависимость в единственном условии. Для примера, предыдущие примеры не делают различий между уровнями ливня . Пример выше может быть перефразирован 'если здесь легкий дождь, то взять пиджак, в противном случае (иначе) взять пиджак и зонт'.
REAL :: inches_of_rain
INTEGER :: numb=0, ncoat
...
IF( inches_of_rain>0.05 ) THEN ! сильный дождь
ncoat = 1
numb = numb+1
ELSE ! легкий дождь
ncoat = 1
ENDIF
Заметим, используется часть ELSE, отделяющей различные варианты, и что and каждый блок может содержать один или более операторов. Второй блок операторов выполняет установку операторов "по умолчанию" для случая, когда условие не выполняется. Переход управления следует тем же правилам как упомянуто выше.
Здесь рассмотрена ситуация, когда альтернативные действия зависят от нескольких условий. Например, скидка (discount) , представляемая для покупки, может очень зависеть от числа покупаемых лотов - больше покупок, больше скидка:
REAL :: cost, discount
INTEGER :: n ! число покупок
...
IF ( n>10 ) THEN ! 25% скидка на 11 или более
discount = 0.25
ELSEIF ( n>5 .AND. n<=10 ) THEN ! 15% скидка на 6-10 покупок
discount = 0.15
ELSEIF ( n>1 .AND. n<=5 ) THEN ! 15% скидка на 2-5 покупок
discount = 0.1
ELSE ! без скидки для 1 покупки
discount = 0.0
ENDIF
cost = cost-(cost*discount)
WRITE(*,*) `Накладная для ', cost
Заметим, что ELSEIF используется для добавления новых условий к блоку (другая скидка используется). Оператор ELSE действует как умолчание в случае защиты от других событий. Снова те же правила перехода управления.
Конструкция IF мжет быть помечена. Именованная конструкция может быть использована , когда одна находится внутри другой. Этот способ пометки делает программу легкой для понимания:
outer: IF( x==0 ) THEN
...
ELSE outer
inner: IF( y==0.0 ) THEN
...
ENDIF inner
ENDIF outer
Я
Конструкция SELECT CASE
Конструкция SELECT CASE обеспечиввает альтернативу серии повторяющихся операторов IF ... THEN ... ELSE IF. Ее общий вид таков:
[имя:] SELECT CASE( выражение )
CASE( значение ) [имя]
блок
...
[CASE DEFAULT
блок]
END SELECT [имя]
Результат выражения может быть типа CHARACTER, LOGICAL или INTEGER; значение должно быть того же типа, что и результат выражения и может быть любой комбинацией из:
•единичной integer, character, или logical, связывающим в типе
•min : max
любого значеиия между двумя ограничениями
•min:
любое значение минимального значения из вышеприведенных
•:max
любое значение выше минимального значения
CASE DEFAULT не обязателен и закрывает все другие возможные значения выражения, еще не закрытые другими операторами CASE. Например:
INTEGER :: month
...
season: SELECT CASE( month )
CASE(4,5) ! months 4 и 5
WRITE(*,*) 'Spring'
CASE(6,7) ! months 6 и 7
WRITE(*,*) 'Summer'
CASE(8:10) ! months 8,9 и 10
WRITE(*,*) 'Autumn'
CASE(11,1:3,12) ! months 1,2,3,11,12
WRITE(*,*) 'Winter'
CASE DEFAULT ! целое вне диапазона 1-12
WRITE(*,*) 'not a month'
END SELECT season
Приведенный выше пример печатает сезон года, ассоциированный с заданным месяцем. Если значение целого месяца не лежит в диапазоне 1-12, выбирается вариант умолчания и печатается сообщение об ошибке 'not a month'; в других случаях выбирается один из операторов CASE. Заметим, что они не определяют порядок значеиий в операторе CASE.
Я
GOTO
Оператор GOTO можно использовать дле передачи управления другому оператору в виде:
GOTO label
Оператор GOTO просто передает управление оператору, помеченному числовой меткой, перепрыгивая любые операторы между ними. Например:
...
IF( x<10 ) GOTO 10
...
10 STOP
Оператор GOTO можно бы не применять, где возможно, программы , содержащие такие оператороы, заведомо трудно поддерживать. Оператор STOP завершает программу.