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

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

!следующий символ.

!Если текущий символ отличен от пробела, то возможны варианты:

!а) мы находимся в начале строки или предыдущий символ является

!пробелом (wb = 0);

!б) предыдущий символ отличен от пробела (wb > 0) - выполняем

!дальнейшее перемещение по текущему слову.

do j = 1, lst

! Просмотрим все символы строки

if(st(j:j) == ' ') then

 

if(wb > 0) call addword(words, st, wb, we, nw)

else if(wb == 0) then

! Обнаружено начало слова

wb = j

 

we = j

 

else

 

we = we + 1

! Перемещение по текущему слову

end if

 

end do

 

!После просмотра всей строки, если строка не была пустой,

!мы обязаны добавить последнее слово в массив words if(wb > 0) call addword(words, st, wb, we, nw)

end do close(unit)

write(*, *) 'Число слов в тексте nw =', nw do j = 1, nw

write(*, *) words(j) end do

end

subroutine addword(words, st, wb, we, nw)

integer wb, we, nw

 

character(len = *) words(*)

! Перенимающий размер массив

character(len = *) st

! Строка, перенимающая длину

nw = nw + 1

 

words(nw) = st(wb : we)

 

wb = 0

 

end

 

3.9. Производные типы данных

3.9.1. Объявление данных производного типа

Рассмотрим табл. 3.3, содержащую экзаменационные оценки.

Таблица 3.3. Экзаменационные оценки студентов

Ф. И. О.

Экзамен 1

Экзамен 2

Экзамен 3

Экзамен 4

Александров В. М.

4

5

3

4

 

 

 

 

 

Владимиров А. К.

3

5

4

2

 

 

 

 

 

...

 

 

 

 

 

 

 

 

 

79

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

При работе с таблицей может возникнуть ряд задач: сохранить таблицу в файле; прочитать данные из файла; подсчитать среднюю оценку студентов; найти лучших (худших) студентов и т. д. При этом удобно при передаче данных в файл и считывании их из файла оперировать строками таблицы, имея доступ к отдельным элементам строки. Иными словами, при таком подходе строка таблицы должна быть самостоятельной переменной, состоящей из нескольких изменяемых компонентов. Такой переменной в Фортране является запись.

Запись - это переменная производного (структурного) типа данных.

Записи вводятся оператором TYPE или, как в FPS версии 1, оператором

RECORD.

Производный тип данных (структура) - это одно или несколько объявлений переменных (как правило, разного типа), сгруппированных под одним именем. Структура должна вводиться в разделе объявлений программы.

В Фортране 90 производный тип данных вводится оператором:

TYPE [, access-spec] [::] name

[PRIVATE | SEQUENCE] component decl [component decl]

...

END TYPE [name]

access-spec - определяющий способ доступа к объявленному типу атрибут (PUBLIC или PRIVATE). Атрибуты PUBLIC и PRIVATE могут быть использованы только при объявлении типа в модуле (разд. 8.7). По умолчанию способ доступа PUBLIC (если только модуль не содержит оператор PRIVATE без указания в нем списка объектов). Задание атрибута PUBLIC означает, что тип и его не имеющие атрибута PRIVATE компоненты доступны во всех программных единицах, использующих модуль, в котором производный тип определен. Задание атрибута PRIVATE означает, что тип и/или его компоненты доступны только в модуле. Причем сам тип может иметь атрибут PUBLIC, а его компоненты - PRIVATE.

name - имя производного типа данных (структуры); оно не должно совпадать с именем другой переменной или функции, определенных в том же программном компоненте, также оно не может совпадать с именем встроенного типа данных, например COMPLEX. Имя структуры является локальным и поэтому структура как тип должна быть объявлена в каждой программной единице, в которой объявляются переменные введенного типа. Для уменьшения издержек на разработку программы рекомендуется объявлять структуры в отдельных модулях, ссылаясь на них в тексте программной единицы оператором USE.

80

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

component decl - любая комбинация одного или нескольких операторов объявления типов переменных, имеющая вид:

тип [[, список атрибутов] ::] список компонентов

В необязательном списке атрибутов могут присутствовать атрибуты POINTER и/или DIMENSION. Операторы объявления типов могут содержать скаляры и массивы встроенных и производных типов. При этом входящие в component decl операторы TYPE и/или RECORD должны ссылаться на ранее определенные производные типы. Фортран 95 позволяет операторам, входящим в component decl, содержать начальные значения переменных. Они по умолчанию будут являться начальными значениями соответствующих компонентов всех объектов этого типа. Инициализировать можно как все, так и отдельные компоненты. Например:

type entry

! Объявление типа entry

real(4) :: val = 3.0

! Инициализация компонента val

integer(4) :: index

! Инициализация не выполняется

type(entry), pointer :: next => null( )

! Инициализация компонента next

end type entry

 

type(entry) :: erray(10)

 

print *, erray(5)%val

! 3.000000

Если объявление производного типа содержит атрибут SEQUENCE, то его компоненты будут записаны в память в порядке их объявления в типе. Это позволяет использовать переменные производного типа в com- mon-блоках, операторах EQUIVALENCE и в качестве параметров процедур.

Замечания:

1.Входящие в состав производного типа переменные называются его

компонентами.

2.По умолчанию объявленный в модуле производный тип доступен в любой программной единице, использующей модуль.

3.При определении компонента производного типа могут быть использованы только два атрибута: POINTER и DIMENSION. При этом если компонент объявлен с атрибутом POINTER, то он может ссылаться на объект любого типа, включая и объект объявленного производного типа, например:

type entry

! Объявление типа entry

real val

 

integer index

! Ссылка на объект типа entry

type(entry), pointer :: next

end type entry

 

4. Следующий стандарт позволит задавать в производных типах размещаемые объекты данных.

81