ровать такую переменную или константу (т.е. присвоить ей первоначальное значение).
В примере 3.26 две такие константы (PI_1 и PI_2) инициализируются двумя почти одинаковыми вещественными константами. Однако, запустив и выполнив эту программу, можно увидеть ощутимую разницу: для константы PI_1 обеспечена точность только до 7 значащих цифр, а для переменной PI_2 – 15 значащих цифр, как и требовалось. Дело в том, что буквальная константа, не содержащая явного описания разновидности типа (как PI_1), считается буквальной константой стандартной разновидности (т.е. KIND=4) и может обеспечивать соответствующую точность (и не более того) в независимости от того, сколько значащих цифр указано в ее записи. Соответственно, константа 3.1415926535897931 может обеспечить точность только 7 значащих цифр, тогда как константа с явным указанием параметра разновидности 3.1415926535897931_8 (постфикс «_8» явно определяет параметр разновидности) обеспечивает требуемую точность (см. пример 3.26).
Пример 3.26. Точность представления 8-байтовых целых констант program PRECINT8
real (kind=8), parameter :: PI_1=3.1415926535897931, & ! Перенос строки! PI_2=3.1415926535897931_8
print*, PI_1 print*, PI_2 end
3.3.5. Скалярные переменные и константы
Все данные, используемые при программировании на Фортране, подразделяются на константы и переменные. Значение переменной может изменяться во время работы программы, а значение константы не может быть изменено.
Переменная всегда имеет имя (или идентификатор – п. 3.3.1), а константы подразделяются на буквальные (п. 3.3.3) и именованные (т.е. константы, имеющие идентификатор). Язык программирования Фортран 90/95 оперирует со скалярными переменными и константами, а также с массивами.
Скаляр – единичный (не являющийся массивом) объект данных (переменная или константа) одного типа.
146
Массив представляет собой индексированный (определенным образом пронумерованный) набор скаляров одного типа. Обращение к элементу массива осуществляется через имя массива и индекс элемента. Элементы массива могут быть либо только переменными, либо только константами.
Переменные и именованные константы описываются в начале программы до первого исполнимого оператора.
Объявление именованных констант в Фортране 90/95 имеет следующий вид:
тип ([KIND=K]), PARAMETER :: Ик1=БК, Ик2=ИК, Ик3=ВЫР…,
где тип – название (идентификатор типа); K – параметр разновидности типа либо в виде буквальной или именованной константы, либо как целое арифметическое выражение.
Атрибут PARAMETER указывает, на то, что объекты данных, перечисленные через запятую после разделителя «::» (двойное двоеточие), являются именованными константами (с именами Ик1, Ик2, Ик3 и т.д.), которые могут быть инициализированы (инициализация – присвоение первоначального значения) тремя способами:
1)посредством буквальных констант – БК;
2)через ранее определенные именованные константы – ИК;
3)путем вычисления значения выражения соответствующего типа – ВЫР.
Во всех трех случаях необходимо, чтобы именованные константы были инициализированы значениями соответствующей разновидности типа: KIND=K. При этом значение параметра разновидности типа K может быть задано в виде целой константы (буквальной или ранее определенной именованной) или целого арифметического выражения.
Приведенные примеры 3.20, 3.27 – 3.31 иллюстрируют три способа инициализации именованных констант.
Пример 3.27. Инициализация именованных констант стандартной разновидности (параметр KIND не обязателен) через буквальные константы program CONSTINIT1
real, parameter:: PI= 3.1415927, E= 2.7182817 print*, PI, E
end
147
Пример 3.28. Инициализация именованных констант нестандартной разновидности. Параметр разновидности типа обязателен
program CONSTINIT2
real (kind=8), parameter:: PI= 3.1415926535897931_8 real (8), parameter:: E= 2.7182818284590451_8 print*, PI, E
end
Пример 3.29. Инициализация именованных констант через выражения, содержащие ранее определенные именованные константы
program CONSTINIT3
real, parameter:: PI= 3.1415927, R=1., L= 2.*PI*R real, parameter:: S= PI*R**2.
print*, PI, R, L, S end
Пример 3.30. Инициализация именованных констант с использованием математическихфункций
program CONSTINIT4
real(8), parameter:: PI = acos(–1._8), E = exp(1._8) print *, PI, E
end
Именованные константы могут быть инициализированы в стиле Фортран 77, в том числе в соответствии с правилами неявного определения типов (см. примеры 3.20 и 3.31).
Пример 3.31. Инициализация именованных констант с неявным определением типа (только для стандартной разновидноститипа)
program CONSTINIT6
parameter (PI= 3.1415927, MIN = 0) parameter (E= 2.7182817, MAX =100) print*, PI, E, MIN, MAX
end
Объявление и инициализация скалярных переменных в
Фортране 90/95 аналогичны объявлению именованных констант, за исключением атрибута PARAMETER, используемого только при объявлении констант:
тип ([KIND=K]) :: Пер1=БК, Пер2=ИК, Пер3=ВЫР…
Объекты данных, перечисленные через запятую после разделителя «::» (двойное двоеточие), являются переменными (с именами
148
Пер1, Пер2, Пер3 и т.д.), которые, как и именованные константы, могут быть инициализированы тремя способами:
1)посредством буквальных констант – БК;
2)через ранее определенные именованные константы – ИК;
3)путем вычисления значения выражения ВЫР.
Во всех трех случаях переменные следует инициализировать значениями соответствующей разновидности типа: KIND=K.
Далее приводятся примеры 3.32 – 3.37, иллюстрирующие объявление переменных в Фортране 90/95.
Пример 3.32. Инициализация переменных стандартной разновидности (параметрKIND не обязателен) через буквальные константы
program VARINIT1
real :: PI= 3.1415927, E= 2.7182817 print*, PI, E
end
Пример 3.33. Инициализация переменных нестандартной разновидности. Параметр разновидности типа обязателен
program VARINIT2
real (kind=8):: PI= 3.1415926535897931_8 real (8):: E= 2.7182818284590451_8 print*, PI, E
end
Пример 3.34. Инициализация переменных через выражения, содержащие ранее определенные именованные константы
program VARINIT3
real, parameter:: PI= 3.1415927, R=1. real:: L= 2.*PI*R, S= PI*R**2. print*, PI, R, L, S
end
Пример 3.35. Инициализация переменных с использованием математическихфункций
program VARINIT4
real(8):: PI = acos(–1._8), E = exp(1._8) print *, PI, E
end
Пример 3.36. Инициализация переменных с запретом неявного определения типа
program VARINIT5
149
implicit none |
! Запрет неявного определения типа |
real (kind=8) PI, E |
|
integer MIN, MAX |
|
PI= 3.1415926535897931_8; E= 2.7182818284590451_8; MIN = 0; MAX = 100 print*, PI, E, MIN, MAX
end
Переменные могут быть объявлены (в смысле типа) и инициализированы в стиле Фортран 77, в том числе в соответствии с правилами неявного определения типов. При этом можно использовать свободный формат записи программы.
Пример 3.37. Инициализация переменных с неявным определением типа (только для стандартной разновидности типа)
program VARINIT6
PI= 3.1415927; E= 2.7182817; MIN = 0; MAX =100 print*, PI, E, MIN, MAX
end
3.3.6. Массивы
Массивы представляют собой индексированные (нумерованные) наборы скалярных объектов (переменных или констант) одного типа. Доступ к элементам массивов осуществляется по индексам (номерам) элементов в массивах.
Рис. 3.2. Массив ранга три (трехмерный)
150