Взаимодействие операторов write и format

1. Оператор write
write(номер устройства, ссылка на формат) список вывода
пояснения:

- куда выводить – направление вывода в виде номера устройства;

- что выводить – в списке вывода перечислены выводимые данные, этот список просматривается однократно;

- как выводить – данные из списка вывода запрашиваются по мере просмотра СД оператора format.

2. Оператор format описывает, как выводить данные, интерпретируя список дескрипторов
метка format(список дескрипторов)
пояснения:

- по дескриптору данных запрашивается и выводится элемент списка вывода; если дескриптор данных не подходит элементу списка вывода, то сообщается expected descriptor об ожидавшихся дескрипторах;

- по другим дескрипторам выводятся надписи, пробелы, переносы;

- по концу СД – просмотр повторяется на участке сканирования.

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

- оператор format без внутренних скобок

1format ( .. .. )

­____¥___| – повторение по скобкам формата ;

- оператор format с внутренними скобками

2format((..)..(..(..)..)..)

­____¥________|

повторение по последней паре скобок внутри оператора format .

Принцип сканирования реализуется по следующим правилам:

- каждый новый оператор write начинает вывод с новой строки, устанавливает начало списка вывода и начало списка дескрипторов;

- если встретился дескриптор данных, запрашивается и превращается в текст очередной элемент списка вывода;

- попутно исполняются встретившиеся оформительские дескрипторы: по дескриптору «X» вставляются пробелы, вносятся текстовые константы, по дескриптору «/» переносятся строки;

- участок сканированияциклически просматривается и интерпретируется до тех пор, пока не будут обработаны все элементы списка вывода;

- при возврате к началу участка сканирования вывод продолжается с новой строки;

- по концу списка вывода продолжится просмотр и исполнение оформительских дескрипторов до ближайшего дескриптора данных или до дескриптора «:» .

Пример 1 – на понимание процесса сканирования.
Вывести два целых по формату с одним числовым полемi2.

integer::x=12,y=100

Open (2, file=’Out.txt’)

write(1,33) x, y ! x, y – список вывода

33format(i3) ! (i3) – участок сканирования

Поскольку длина списка вывода больше длины списка дескрипторов, возникает сканирование, то есть повторение формата и перенос строки. Повторяется весь список дескрипторов, так как внутри формата скобок нет. В файл Out.txt выведется две строки, начинающиеся с пробела – дескриптор 1х (символ «˜» означает пробел)

˜12

Формат пригоден для вывода любого количества целых чисел из диапазона [-99 , 999], которые вмещаются в 3 позиции.

Пример 2 – число не помещается в отведенное поле.
Вывести два целых по формату с одним числовым полемi2.

integer::x=12,y=100

Open (2, file=’Out.txt’)

write(1,33) x, y ! x, y – список вывода

33format(1x, i2) ! (1x, i2) – участок сканирования

Поскольку длина списка вывода больше длины списка дескрипторов, повторяется весь список дескрипторов, так как внутри формата скобок нет. В файл Out.txt выведется две строки, начинающиеся с пробела – дескриптор 1х (символ «˜» означает пробел)

˜12

˜**

Формат пригоден для вывода любого количества целых чисел из диапазона [-9 , 99]. Вместо трехзначного числа 100 выведется «**», поскольку ширина поля вывода равна 2 (дескриптор i2).

Пример 3 – бесконечно глупый вывод.
Вывести целое по формату, в котором нет дескрипторов данных.

write(1,33)12 ! целое 12 бесконечно ищет дескриптор i в 33 format()

33format('ищем целый дескриптор, а его нет')

Внимание: просмотр фактически зациклился !

Массивы

Характеристики массива

В современном Фортране свойства объектов, в частности, массивов описывают так:

список_атрибутов ::список_объектов

Характеристики и атрибуты массива.

1. Имя массива, как объекта.

2. Тип массива– одного из базовых типовinteger,real,complex,logical,characterили определяемого типа type(имя_типа).

3. Количество измерений или ранг массива – допускается от 1 до 7, причем по каждому измерению указывается пара целых чисел [нижняя:]верхняя границы индекса:

a. либо диапазон индекса как нижняя:верхняя границы индекса
протяженность = верхняя – нижняя + 1 ; протяженность – это неотрицательное число, указывающее на количество возможных значений индекса по выбранному измерению;

b. либотолько верхняя граница, с нижней границей по умолчанию равной 1; в этом случае верхняя граница - это протяженность, например, число строк или число столбцов матрицы.

4. Форма массива, по-английски Shape – целочисленный вектор, составленный из протяженностей в порядке следования измерений. Форма характеризует порядок размещения элементов в памяти компьютера. Массивы, одинаковые по форме, называют, конформными. Форма измеряется функцией shape(Array).

5. Число элементов – это произведение протяженностей по всем измерениям массива, измеряется функцией size(Array)
size(Array)=product(shape(Array)).

6. Объем памяти, занимаемый массивом
<объем_памяти > = < память на один элемент >* size(array)
– ограничивается лишь объемом памяти компьютера.

7. Когда и как массив размещается в памяти компьютера – статический или динамический (allocatable); в процедуре, дополнительно – динамический автоматический, передаваемый по адресу.

8. Назначение (intent) массива как аргумента процедуры: intent(in) – входной аргумент, intent(out) – выходной аргумент, intent(inout) – входной-выходной аргумент.

9. Прочие атрибуты: public|private,pointer|target,parameter,save.

Предупреждение. Выбор элемента неописанного массива компилятор воспринимает как вызов неизвестной функции, причем об этом сообщает не компилятор, а компоновщик приложений.

Пример. Подсчитать s – среднее значение и D – среднее отклонение от среднего значения в массиве x

Взаимодействие операторов write и format - student2.ru .

В раннем Фортране массив суммировали поэлементно, в Фортране-90 всё выглядит проще – «читаем – считаем – печатаем». Добиться краткости позволяет важный принцип современного Фортрана – практически везде, где используется простая переменная, можно использовать массив, как в abs(X-s), кроме того, функция sum(X) суммирует массив.

Program sumX ! sum(X)-встроенная функция суммирования вектора

Real,Dimension(1:10)::X; real s

read(1,*)X; s=sum(X)/10; print *, 'среднее =',s

! читаем – считаем – печатаем

print *, 'среднее отклонение D=',sum(abs(X-s))/10

End Program sumX

Наши рекомендации