Организация данных

К организации данных в языке Фортран можно отнести способы объявления типов данных и способы инициализации (задания начальных значений) данных.

Каждый объект данных – константа, переменная, массив, выражение или функция – имеет тип. Объекты разных типов по-разному представляются на машинном уровне (занимают различные объемы памяти, обрабатываются разными командами и т.д.).

Типы данных разделяются на встроенные (целые, вещественные, комплексные, логические, символьные) и производные (создаваемые пользователем на базе встроенных). Типы данных задаются операторами описания типа, которые имеют вид:

имя типа [[[(KIND=значение)][, attrs]::] list

Тип – состоит из имени типа (см. табл. 2) и (необязательно[4]) параметра разновидности KIND[5] (количество байтов, отводимых в памяти под объект данного типа); например, INTEGER(4) обозначает целую величину, занимающую в памяти 4 байта. Если разновидность не указана, то используется стандартная разновидность (задаваемая по умолчанию). Типы данных Intel Fortran – целый (INTEGER), вещественный (REAL), вещественный двойной точности (DOUBLE PRECISION или REAL(8)), вещественный расширенной точности (REAL(16)), комплексный (COMPLEX), комплексный двойной точности (DOUBLE COMPLEX или COMPLEX(8)), комплексный расширенной точности (COMPLEX(16)), логический (LOGICAL), символьный (CHARACTER). В табл. 2 перечислены встроенные типы данных Фортрана, допустимые для них значения параметра разновидности, стандартный диапазон представления величин.

attrs – один или более атрибут, описывающий представленные в list объекты данных. Если хотя бы один атрибут указан, то должен быть использован разделитель::. Атрибуты определяют дополнительные свойства данных. Возможные атрибуты: ALLOCATABLE (данные, динамически размещаемые в памяти[6]), PARAMETЕR (данные, являющиеся именованными константами), POINTER (указатель, ссылка на объект-адресат, может заменить объект-адресат), TARGET (объект-адресат), DIMENSION (массив), PRIVATE (закрытые данные, доступны только модулям, к которым они принадлежат), PUBLIC (данные, к которым возможен доступ из других модулей) и др.

list – разделенный запятыми список имен объектов данных (переменных, констант, а также внешних, внутренних, операторных и встроенных функций).

Таблица 2. Типы данных Intel Fortran

Тип Разновидности[7] Диапазон представления
Integer
(целый)
integer(1) (integer*1, byte) -128+127
integer(2) (integer*2) -32768+32767
integer(4) (integer*4) -2147483648+2147483647
integer(8) -9223372036854775808
+9223372036854775807
Real
(вещественный)
real(4) (real*4) 1.1754944-10-38 3.4028235-10+38
real(8) (real*8,
double precision)
2.225073858507201-10-308 1.797693134862316-10+308
real(16) (real*16) 6.475175119438025110924438958227646-10-4966 1.189731495357231765085759326628007-10+4932
Complex
(комплексный)
complex(4) (complex*8) см. тип real(4)
complex(8) (complex*16)
double complex
см. тип real(8)
complex(16) (complex*32) см. тип real(16)
Logical
(логический)
logical(1) (logical*1) .true. (истина, логическая единица)
.false. (ложь, логический ноль)
logical(2) (logical*2)
logical(4) (logical*4)
logical(8) (logical*8)
Character
(символьный)
character
(character(n), character*n)
n – длина текстовой строки в символах; на каждый символ отводится 1 байт; по умолчанию под символьный тип данных отводится 1 байт (1 символ). Допустимое значение длины строки 1f n f32767. Если вместо значения n стоит символ *, это означает, что длина символьной константы равна числу символов в ней

Константы, имеющие имя, называются именованными[8] и задаются с атрибутом PARAMETER, остальные (числа, строки) – буквальными (литеральными). Имена констант и переменных могут состоять из букв латинского алфавита, цифр, знаков подчеркивания ( _ ) и доллара ($). Имя должно начинаться с буквы или знака “$”. Регистр буквы имеет значение, т.е., например, имена х1 и Х1 считаются различными. Длина имени не должна превышать 63 символа. Имена в пределах одной программной единицы должны быть уникальными.

Приведем примеры описания данных с комментариями:

integer, parameter:: pi !целая константа pi, занимающая 4 байта

real(16) x,y !вещественные переменные х и у расширенной точности

double precision par !вещественная переменная par двойной точности

complex*16 angle !комплексная переменная angle двойной точности

logical(1):: flag !логическая переменная flag, занимающая 1 байт

character(20) fio_1 !строка fio_1 из 20 символов

real, dimension(10):: d !массив d из 10 вещественных значений real(4)

загрузка…

Если в программе на Фортране встречается не описанная в начале программы переменная, то действует правило по умолчанию (определение типа по имени): данные, имена которых начинаются с букв I, J, K, L, M, N, имеют стандартный целый тип, остальные – стандартный вещественный. Это неявный способ задания типа данных. Данные комплексного, логического и символьного типа объявляются только явно (операторами объявления типа данных).

Правило по умолчанию можно отменить с помощью оператора Implicit, который имеет вид:

IMPLICIT type(letters) [, type(letters), …]

type – один из встроенных или производных типов данных

letters – список букв или диапазонов букв.

Пример программы, содержащей явные и неявные описания типов данных:

Program decl !задается наименование программы — decl

Implicit logical (a-c, f) !переменные, имена которых начинаются на a,b,c

!или f, не описанные явно, считаются логическими

Real min,max !объявляются вещественные переменные min, max

f1=.true.; f2=.false. !переменным f1 и f2 логического типа (см. оператор

!implicit) присваиваются значения .true. и .false.

read *,x,y !ввод значений вещественных переменных х и у

!тип определяется неявно по именам переменных)

if (x>y) then !если x>y, логической переменной bool

bool=f1 !присваивается значение «истина», иначе – «ложь»

else

bool=f2

endif

print *, ‘x>y=’,bool !выводится результат – текст «x>y=» и значение

!переменной bool (символ «Т» в случае .true.

!и «F» в случае .false.)

end !конец программы

Буквальные константы служат для задания значений данных соответствующего типа, используются в арифметических и логических выражениях, в операторах вывода и т.д. Возможно задание арифметических (целых, вещественных, комплексных), логических и символьных буквальных констант.

Целые константы – целые числа со знаком или без знака. Примеры: +10, 10, -10_2 (после знака подчеркивания “_“ указано значение разновидности KIND = 2 для константы -10). Целые константы могут также быть заданы в различных системах счисления в виде основание системы#число, например: 8#21 (число 21 в восьмеричной системе счисления, т.е. 17 в десятичной). Основанием системы счисления может быть любое число от 2 до 36.

Вещественные константы могут быть заданы в F-форме, E-форме, D-форме и Q-форме. F-форма задает числа с фиксированной точкой. E-форма, D-форма и Q-форма задают числа с плавающей точкой. Например число –51.234 можно представить в десятичной системе счисления как . Мантисса задает точность представления, а показатель степени задает порядок числа. (F — форма: -51.234, E — форма: -0.51234-Е+2, D — форма: -0.51234D+2).

F и E – формы могут задавать числа одинарной и двойной точности (4 и 8 байт памяти), например: 3.3_4; 3.3_8; 0.125E-4_8; 0.125E-4.

D — форма задает числа только двойной точности, Q-форма – расширенной точности.

Комплексные константы – две целые или вещественные константы (реальная и мнимая часть), заключенные в скобки и разделенные запятой. Реальная и мнимая части могут быть заданы в F-форме, E-форме, D-форме и Q-форме: (2.33, 0.044), (0.233E1, 0.44E-1), (0.233D+1, 0.44D-1), (-1.23Q-400, 12.34Q4000), (44.36_4,-12.2E16_4) .

Логические константы – их всего две: .TRUE. и .FALSE. Наличие обрамляющих точек обязательно. Примеры: .TRUE., .false._4. Логическим величинам можно присваивать и целые значения. При этом положительные значения воспринимаются как равные .true., а отрицательные и равные нулю – как .false.

Символьные константы – последовательность одного или более символов 8-битового кода, заключенная в апострофы или двойные кавычки. Символьная строка, после которой записан латинский символ С, образует СИ-строку (эскейп-последовательность в языке С), служащую для вывода непечатаемых символов (перевод строки, звуковой сигнал и др.). Примеры: ‘rezult=’, “What is your name?”, ‘a’c (вывод звукового сигнала).

Символьные подстроки – непрерывные части текста внутри символьной строки. Строка при этом рассматривается как последовательность пронумерованных слева направо символов, начиная с первого. Общий вид подстроки:

str([n1]:[n2]),

где str – константы или переменной, n1 – номер первого символа подстроки, n2 – номер последнего символа подстроки. Если не задано значение n1, оно считается равным 1, если не задано значение n2, оно считается равным длине строки. Пример:

CHARACTER*25 FIO, name !FIO, name – символьные переменные FIO = ‘Ivanov Petr Andreevich’ !присваивается значение переменной FIO name= FIO(8:11) !значение переменой name — Petr

Константы двоичные, восьмеричные, шестнадцатеричные – не имеют типа данных, он предполагается численным и зависит от их применения. Представляют собой символ, обозначающий основание системы счисления (В – для двоичных, О – для восьмеричных, Z – для шестнадцатеричных), за которым следует число, записанное как символьная строка, т.е. заключенное в апострофы или двойные кавычки. Примеры: B’0101110′, О²752², Z’A4D’.

Присваивание начальных значений (инициализацию) данных можно выполнить двумя способами:

1) В операторах объявления типа, например:

integer, parameter:: m=4,n=5 !объявлены целые именованные константы

!m и n, которым присвоены значения 4 и 5

!разновидность по умолчанию, 4 байта

integer(2) d1/4/, d2/5/ !объявлены переменные d1, d2 целого

!типа (KIND=2), при такой инициализации

!наличие разделителя :: необязательно

real(8):: a = 2D0, b = 0.35D4 !объявлены и инициализированы

!переменные a, b двойной точности

complex:: C1, C2 = (10.5, 11.3) !объявлены комплексные переменные C1,

!C2 стандартной разновидности KIND = 4;

!C2 присвоено начальное значение

Logical:: m=5 !объявлена логическая переменная m,

!ее значение равно .true.

character(15):: st1=’example’, st2*20/’example_2’/ !объявлены

!и инициализированы две символьные

!переменные st1 длиной 15 символов

!и st2 длиной 20 символов

character(*), parameter:: st = ’example’ !для задания длины используется

!символ * при определении именованной

!константы; в этом случае длина равна

!числу символов константы

б) с помощью оператора DATA, общий формат которого:

DATA список имен /список значений/

Объекты в списке имен и в списке значений перечисляются через запятые и находятся в строгом соответствии слева направо. Пример:

integer d1, d2!объявлены переменные d1 и d2

!целого типа стандартной разновидности

logical g1, g2!объявлены логические переменные g1, g2

character bell !объявлена символьная переменная bell

data d1, d2 /34, 100/ !переменные инициализированы оператором

!data, d1=34, d2=100

data g1,g2 /.true., .false./ !логическим переменным g1, g2 с помощью

!оператора data присвоены значения:

!g1=.true., g2=.false.

data bell/’\a’c/ !символьной переменной bell присвоено

!значение Си-константы (звуковой сигнал)


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *