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

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

Формат также может быть задан в виде символьного массива, элементы которого при выполнении В/В конкатенируются.

Пример. Запрограммировать формат вывода заголовка с применением символьного массива.

character(78) :: title = 'Пример заголовка' character(1) fmt(12)/'(', '1', 'x', ',', 't', 2*' ', ',', 'a', ')', 2*' '/

integer(1) n, sl /80/

 

n = (sl - len_trim(title))/2

 

select case(n)

! Преобразуем n в символьное

case(1:9)

write(fmt(6), '(i1)') n

! представление и занесем в fmt(6)

case(10:)

! или в fmt(6) и fmt(7), если n > 9

write(fmt(6), '(i1)') n/10

 

write(fmt(7), '(i1)') mod(n, 10)

 

endselect

 

write(*, fmt) title

 

Символы строки или элементы массива, расположенные после крайней правой скобки строки - спецификации формата, игнорируются. Поэтому и строка и массив могут содержать большее число элементов, чем необходимо для задания формата.

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

9.3. Выражения в дескрипторах преобразований

Если в строке формата дескриптор преобразований использует целочисленную константу, то она может быть заменена заключенным в угловые скобки (< >) целочисленным выражением:

integer :: m, k

 

k = 10

 

do m = 3, 5

 

k = k*10

 

write(*, '(2x, i<m>)') k

! 100

end do

! 1000

end

! 10000

Целочисленное выражение может быть любым допускаемым выражением со следующими ограничениями:

в дескрипторе H константа не может быть заменена целочисленным выражением;

операции отношения в этом выражении не могут быть заданы в графическом виде, например вместо знака > используется .GT., вместо

<= - .LE..

294

9. Форматный ввод/вывод

Задаваемое вместо константы целочисленное выражение не может появляться в операторе присваивания при программировании строки формат; так, ошибочен фрагмент:

integer :: m = 2, k = 5

 

 

 

character(80) s

 

 

 

s = '(2x, i<k - m>)'

 

 

 

write(*, s) m + k

! Ошибка

Но корректны операторы:

 

 

integer :: m = 2, k = 5

 

 

 

write(*, '(2x, i<k - m>)') m + k

!

7

 

write(*, 1) m, k

!

2

5

print 1, m, k

!

2

5

1 format(<m>x, <m>i<k - m>)

! Правильно

Заменяя в ДП константу на выражение, нужно следить за тем, чтобы выражение было целочисленным и возвращаемое им значение было больше нуля.

Пример. Вывести заголовок по центру экрана. character(78) :: title = 'Пример заголовка'

integer(1) :: tl, sl = 80

! sl - ширина экрана

tl = len_trim(title)

 

write(*, fmt = 10) title

! Вывод заголовка

10 format(< (sl - tl)/2 > x, a)

 

9.4. Задание формата в операторах ввода/вывода

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

в виде метки, указывающей на оператор формата: write(*, 10) a, k

или

write(*, fmt = 10) a, k 10 format(1x, f8.3, i10)

Замечание. Метка в случае ее использования для ссылки на формат может быть присвоена целочисленной переменной оператором ASSIGN (прил. 4), который, правда, удален из Фортрана стандартом 1995 г.: integer :: label, m = 55

assign 20 to label

print label, m ! 55 20 format(1x, i5)

в виде встроенного в оператор В/В символьного выражения: write(*, '(1x, f8.3, i10)') a, k

295