Современные версии языка Фортран стандартов Фортран 90, Фортран 95, Фортран 2003 и 2008, как правило, используются для прикладных вычислительных и научных задач.
Структура программы в свободном формате:
Заголовок: program имя программы
Раздел описаний
Раздел операторов
contains
Внутренние подпрограммы
end program имя программы
Внешние подпрограммы
Заголовок
program <имя_программы>
Раздел описаний
переменные
<тип_переменных>, <атрибуты> :: <список_переменных>
типы переменных: integer, real, complex, logical, character
константы
<тип>, parameter :: <имя_константы1> = <значение1>,
<имя_константы2> = <значение2>, …
Здесь имя_1, имя_2, … ⎯ имена констант, а значение_i ⎯ значе-
ния этих констант.
массивы (пример)
real, dimension(100) :: c
Атрибуты переменных
allocatable — отмечает динамические массивы;
dimension(<список экстентов>) — отмечает массивы, требует указания параметров — экстентов массива (экстент массива определяет множество значений индекса);
external — отмечает внешние процедуры;
intent(<спецификация входа-выхода>) — указывает назначение формальных параметров и применяется только в подпрограммах, требует параметров — спецификации правил использования формального параметра;
intrinsic — отмечает встроенные процедуры;
optional — отмечает необязательные формальные параметры и применяется только в подпрограммах;
parameter — отмечает именованные константы, значение переменной с этим атрибутом не может быть изменено;
pointer — определяет переменную как указатель (ссылку);
private — спецификатор доступа для компонентов модуля, отмечает закрытые элементы модуля;
public — спецификатор доступа для компонентов модуля, отмечает доступные элементы модуля;
save — указывает на необходимость сохранения значения локальной переменной между вызовами подпрограммы, применяется только в подпрограммах, модулях и описаниях производных типов;
target — определяет переменную как потенциальный адресат указателя.
Операторы языка Фортран
Оператор присваивания:
<имя_переменной> = <выражение>
Условный оператор if…then…endif
if(<выражение>) then
<оператор 1>
…
<оператор n>
endif
Условный оператор if…then…else…endif:
if(<выражение>) then
<оператор 1>
…
else
<оператор 2>
…
endif
Оператор цикла со счетчиком do…end do:
do <параметр_цикла> = <выражение1>, <выражение2>, <выражение3>
<оператор_1>
<оператор_2>
…
end do
<выражение_3> задает шаг изменения параметра.
Конструкция do в неявной форме:
(<do_список>, <do_переменная> = <выражение1>,
<выражение2>[, <выражение3>])
например:
write(∗, ∗) ((a(i, j), i = 1, 7), j = 1, 5)
Цикл с условием:
do <метка> while (.not. <скалярное_логическое_выражение>)
…
<метка> continue
Операторы описания для встроенных типов
<оператор_описания>(KIND=<значение_параметра_разновидности>) <список_имен_переменных>
Названия операторов определения типа совпадают с названиями встроенных типов данных языка:
character, complex, integer, logical, real.
Чтобы обеспечить необходимые диапазоны и точности, в Фортране используются разновидности типов переменных (KIND). Операторы описания типов, разновидность которых не указана, описывают переменную стандартной разновидности указанного типа для данной аппаратно-программной платформы.
Оператор описания производного типа
type <имя_типа>
<оператор_описания_компонента>
[<оператор_описания_компонента>]
…
[<оператор_описания_компонента>]
end type [<имя_типа>]
Неявное определение типа
Объекты программного компонента, в имени которых на первом месте находятся буквы I, J, K,
L, M или N, относятся к целому типу стандартной разновидности. В любом другом случае считается, что объект относится к стандартной разновидности вещественного типа.
Оператор IMPLICIT
Правила неявного определения типа, устанавливаемые по умол-
чанию, можно изменить оператором implicit.
implicit <тип> (<диапазон_символов>)
пример:
implicit integer(a-b)
implicit none - позволяет отказаться от неявного описания вообще.
Операторы ввода-вывода
read(*, fmt [, advance]) [<список_ввода_вывода>]
read form [, <список_ввода_вывода>]
write(*, fmt [, advance] [, iostat] [, err]) [<список_ввода_вывода>]
где fmt задает формат преобразования данных:
- метка оператора format. Оператор format должен находиться в том же программном модуле, что и оператор ввода-вывода;
- символ "звездочка" (*), задающий форматирование, управляемое списком. В этом случае формат передаваемых данных определяется по типам переменных, содержащихся в списке;
- имя элемента массива, содержащего описание формата (в Фортране 90).
Форматирование ввода-вывода
Оператор format имеет следующий вид:
<метка> format(<список_дескрипторов>)
Арифметические выражения
1. ** ⎯ возведение в степень;
2. * / ⎯ умножение, деление;
3. + - ⎯ сложение, вычитание.
Логические выражения
.lt. < меньше
.le. <= меньше или равно
.gt. > больше
.ge. >= больше или равно
.eq. == равно
.ne. /= не равно
Логические операциия
.not. Логическое отрицание
.and. Логическое "И"
.or. Логическое "ИЛИ"
.eqv. .neqv. Логические: эквивалентность и неэквивалентность (логические равенство и неравенство)
Внутренние подпрограммы
subroutine имя подпрограммы
...
end subroutine имя подпрограммы
вызов call
Внешние подпрограммы
Подпрограммы-функции
program hypotenuso
с = funct(a, b) - вызов подпрограммы-функции по имени
real function funct(x, y) !определение подпрограммы-функции
...
end function funct
Подпрограмма, не обязательно возвращающая значения, описывается оператором subroutine и вызывается
оператором call.
Модули
module имя
...
end module имя
Модули подключаются к другим программным компонентам оператором use. Этот оператор должен следовать сразу после заголовка компонента.
Пример:
program имя программы
use имя модуля
операторы
call имя подпрограммы(x, y, alpha)
end program имя программы
комментарии (!)
! пример комментария