Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
272
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

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

TYPE(type-name) [, attrs] :: vname

type-name - имя производного типа, введенного оператором TYPE ...

END TYPE.

attrs - один или более разделенных запятыми атрибутов vname.

vname - одно или более разделенных запятыми имен переменных или констант, называемых записями. Присутствующее в vname имя может быть массивом.

Оператор TYPE, как и другие операторы объявления данных, предшествует исполняемым операторам. Оператор должен быть расположен после введения типа type-name.

Запись является составной переменной. Для доступа к компоненту записи используется селектор компонента - символ процента (%) или точка (последнее невозможно при задании директивы $STRICT):

val = vname%cname или val = vname.cname

где cname - имя компонента записи. Если компонент cname является записью, то для доступа к компоненту cname потребуется дважды применить селектор компонента:

val2 = vname%cname%cname2

где cname2 - имя компонента записи cname. И так далее.

Пример:

integer, parameter :: n = 20 character(n) bname

type catalog

character(n) name, phone integer cat_id

end type catalog type(catalog) boa

boa = catalog('JCP', '234-57-22', 44) bname = boa % name

print *, bname, ' ', boa%phone

!Можем использовать n внутри

!объявления производного типа

!Описание каталога

!Название, телефон

!Код каталога

!Объявление записи

!Конструктор структуры

!Доступ к компоненту записи

!JCP 234-567-22

Замечание. Из примера видно, что заданную до описания производного типа именованную константу можно использовать в объявлении этого типа, например для задания длины символьной строки.

3.9.2. Инициализация и присваивание записей

3.9.2.1. Конструктор производного типа

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

82

риложение3. Организация данных

имя-типа (список выражений)

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

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

Аналогичный конструктор используется и для генерации констант производного типа:

имя-типа (список константных выражений)

Пример. Сформируем структуру order, содержащую информацию о заказе покупателя. Каждый заказ может содержать до 10 наименований вещей.

type item_d

! Описание заказанной вещи

character(20) descr, color, size

! Название, цвет, размер

integer(2) qty

! Количество

real(4) price

! Цена

end type

 

type order

! Описание заказа

integer(4) ordnum, cus_id

! Номер заказа, код покупателя

type(item_d) item(10)

! Переменная типа item_d

end type

 

! Задание записи - константы

type(order), parameter :: e_ord = order(1, 1, item_d('d', 'c', 's', 1, 1.0)) type(order) cur_ord ! Переменная типа order

!Используя конструктор структуры, занесем в заказ cur_ord

!10 одинаковых вещей

!Одним из выражений конструктора order является конструктор item_d cur_ord = order(1200, 300, item_d('shorts', 'white', 'S', 1, 35.25))

print *, cur_ord%item(1) ! Вывод данных о первом предмете

! Для вывода цвета вещи потребуется дважды применить селектор компонента print *, cur_ord%item(2)%color ! Вывод цвета второго предмета

Замечания:

1.Поскольку переменная типа item_d входит в состав типа order, то тип item_d должен быть введен до описания типа order.

2.Определить переменную cur_ord можно, предварительно определив массив item(10). Выполним это в операторе объявления записи:

type(item_d) :: item(10) = item_d('shorts', 'white', 'S', 1, 35.25)

type(order) cur_ord

 

cur_ord = order(1200, 300, item)

 

print *, item(1)

! Вывод данных о первом предмете

print *, cur_ord%ordnum

! Вывод номера заказа

83