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

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

1. В Фортране структурная переменная может быть записана "целиком" как в неформатный (двоичный), так и в текстовой файл (в более ранних версиях Фортрана в текстовом файле запись можно было сохранить лишь покомпонентно). При передаче записи stud в текстовой файл можно использовать, например, такой форматный вывод (пусть файл подсоединен к устройству 3):

write(3, '(1x, a30, 4i3)') stud

В задаче для хранения данных использован последовательный двоичный файл exam.dat. Передача в файл осуществляется в подпрограмме testfile. Каждая запись файла имеет вид:

Name номер Оценка 1Оценка 2Оценка 3Оценка 4

Начальное значение номера - 01. Строка является внутренним файлом; поэтому проще всего получить строку вида Name номер, записав в символьную переменную stud%name данные 'Name ', номер по формату '(a, i3.2)', где номер меняется от 1 до ns. Каждая оценка формируется случайным образом в диапазоне от 2 до 5 функцией rmark, которая, в свою очередь, использует генератор случайных чисел (от 0.0 до 1.0) - встроенную подпрограмму RANDOM. Формируемая последовательность оценок зависит от начальной установки RANDOM, которая определяется значением параметра подпрограммы SEED.

2.Символ $ в спецификации формата оператора WRITE(*, '(1x, a $)') обеспечивает вывод без продвижения, что позволяет ввести значение sv на той же строке, где выведено сообщение 'Старт random (INTEGER*4): '.

3.Выход из цикла происходит при достижении конца файла (функция EOF вырабатывает .TRUE.).

В результате работы программы на экран будут выведены строки (последовательность оценок зависит от значения параметра sv):

Name 01

2

4

5

5

...

 

 

 

 

Name 20

3

5

5

4

4.Чтобы избежать повторного описания структуры в главной программе

иподпрограмме testfile, ее описание выполнено в отдельном модуле tex, который затем включается в текст программных единиц оператором USE.

3.9.7.Структуры и записи

3.9.7.1. Объявление и присваивание значений

Фортран CVF и FPS наследует от предшествующих версий еще одну возможность объявления производного типа данных - оператор STRUCTURE, которым, правда, не следует пользоваться при написании нового кода. Синтаксис оператора:

89

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

STRUCTURE /имя структуры/ объявление компонентов структуры

END STRUCTURE

Имя структуры - имя нового типа данных, оно не должно совпадать с именем другой переменной или функции, определенных в том же программном компоненте; также оно не может совпадать с именем встроенного типа данных, например COMPLEX.

Объявление компонентов структуры - любая комбинация одного или нескольких операторов объявления типов переменных или конструкций UNION. Операторы объявления типов могут содержать простые переменные, массивы, строки и операторы RECORD, которые ссылаются на ранее определенные структуры. Элементы структуры объявляются без атрибутов.

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

Структуры, содержащие оператор RECORD, называются вложенными. Вложенные структуры могут содержать компоненты с одинаковыми именами.

Длина структуры не может превышать 64 Кбайт. Способ упаковки структуры в памяти контролируется директивой $PACK и параметром /Zp в командной строке компилятора. Структуры являются одинаковыми, если их компоненты имеют одинаковый тип и размещены в структуре в одной и той же последовательности. Кроме этого, они должны иметь одинаковую упаковку в памяти ЭВМ.

Переменные структурного типа объявляются оператором

RECORD /имя структуры/ [, attrs] [::] vname

attrs и vname имеют тот же смысл, что и в операторе объявления производного типа TYPE.

Имя структуры должно быть введено до применения оператора RECORD. Оператор RECORD должен предшествовать исполняемым операторам программного компонента.

Пример:

structure /item_d/

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

character*20 descr, color, size

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

integer*2 qty

! Количество

real*4 price

! Цена

end structure

 

structure /order/

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

integer*4 ordnum, cus_id

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

record /item_d/ item(10)

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

90

 

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

end structure

 

record /order/ cur_ord

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

cur_ord = order(1200, 300, item_d('shorts', 'white', 'S', 1, 35.25))

print *, cur_ord.item(1)

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

print *, cur_ord.item(2).color

! Вывод цвета второй вещи

Запись состоит из компонентов, определенных оператором STRUCTURE. Доступ к компоненту записи осуществляется посредством указания после имени структурной переменной (записи) точки или знака % и имени компонента, например:

c_id = cur_ord.cus_id

! Код покупателя

i_color = cur_ord.item.color

! Цвет изделия

или

c_id = cur_ord%cus_id i_color = cur_ord%item%color

Компоненты записи не имеют отличий от других переменных, имеющих тот же тип, кроме одного: целочисленный элемент записи не может быть использован в качестве переменной (dovar) DO-цикла.

При работе с текстовыми файлами можно выполнять форматный или управляемый списком В/В как компонентов записи, так и всей записи.

3.9.7.2. Создание объединений

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

В Фортране имеется возможность выполнять эти действия, работая с одной

итой же структурой. Для этих целей следует задать структуру, в которой разрешено разным группам данных занимать одну и ту же область памяти. Группа данных оформляется оператором MAP. А объединение групп и отображение на одну и ту же область памяти задается оператором UNION. Операторы имеют синтаксис:

MAP

объявление элементов структуры

END MAP

UNION map-блок map-блок

[map-блок ...] END UNION

Внутри объединения должно быть не менее двух map-блоков. Блок union может находиться только внутри оператора STRUCTURE. Блок map может находиться только внутри оператора UNION. Объединяемые map-блоки

91