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

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

и Fw.d. При выводе преобразование G в зависимости от значения выводимой величины соответствует либо F-, либо Е-преобразованию. В табл. 9.5, 9.6 приведена интерпретация дескрипторов G и GE при выводе.

Таблица 9.5. Интерпретация дескриптора Gw.d при выводе

Абсолютное значение величины

Интерпретация

 

 

 

x < 0.1

Gw.d = Ew.d

 

 

 

 

0.1 x < 1

Gw.d = F(w - 4).d, 4(

)

1 x < 10

Gw.d = F(w - 4).(d - 1), 4( )

 

 

 

 

10d-2

x < 10d-1

Gw.d = F(w - 4).1, 4(

)

10d-1

x < 10d

Gw.d = F(w - 4).0, 4(

)

10d x

Gw.d = Ew.d

 

Дескриптор Gw.d[De] эквивалентен дескриптору Gw.d[Ee] за тем исключением, что при выводе вместо E печатается D.

Таблица 9.6. Интерпретация дескриптора Gw.dEe при выводе

Абсолютное значение величины

Интерпретация

 

 

 

 

x < 0.1

Gw.dEe = Ew.d

 

0.1 x < 1

Gw.dEe = F(w - e - 2).d, (e + 2)(

)

 

 

 

1 x < 10

Gw.dEe = F(w-e-2).(d-1),(e+2)(

)

 

 

 

 

10d-2

x < 10d-1

Gw.dEe = F(w - e - 2).1, (e + 2)(

)

10d-1

x < 10d

Gw.dEe = F(w - e - 2).0, (e + 2)(

)

10d x

Gw.dEe = Ew.d

 

Пример:

real :: b1 = .01234, b2 = 123400, b3 = 123.4

write(*, 1) b1, b2, b3

! -.12340E-01 .12340E+06 123.40

write(*, 2) b1, b2, b3

! -.12340E-001 .12340E+006 123.40

1 format(1x,

3G12.5)

 

2 format(1x,

3G12.5E3)

 

9.8. Дескрипторы управления

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

Неповторяющиеся ДП служат:

для управления позицией В/В (преобразования nХ, T, TL, TR);

312

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

внесения в запись дополнительной информации (преобразования апострофа и Холлерита);

масштабирования данных и других, приведенных в табл. 9.7, функций управления В/В.

Всписке ДП для разделения его отдельных дескрипторов используется запятая, которая может быть опущена:

между дескриптором P и сразу следующими за ним дескрипторами F, E, EN, ES, D или G, например: 1X, 2P F9.6;

перед или после дескрипторов апострофа ('), кавычек ("), обратного слеша (\) или двоеточия (:), например: 1x, I3, ' ' B8 \;

перед и после слеша, например: 1x, 2I5, 2(/ 2F5.2).

Таблица 9.7. Неповторяющиеся дескрипторы преобразований

Формы

Имя

 

Назначение

 

Использование

 

 

 

 

Строка

Преобразование

Передает строку текста в файл

Вывод

 

апострофа

 

 

 

 

nH

Преобразование

Передает n символов в файл

"

 

Холлерита

 

 

 

 

Q

Преобразование

Возвращает число

 

Ввод

 

опроса

непрочитанных символов записи

 

Tn, TLn, TRn

Преобразование

Спецификация позиции в записи

В/В

 

позиции

 

 

 

 

nX

Преобразование

"

"

" "

"

 

позиции

 

 

 

 

SP, SS, S

Преобразование

Управление выводом знака плюс

Вывод

 

знака плюс

 

 

 

 

/

Преобразование

Переход к следующей записи и

В/В

 

слеша

простановка символов конца

 

 

 

записи

 

 

 

\

Преобразование

Продолжение текущей записи

Вывод

 

обратного слеша

(для тех же целей можно

 

 

 

 

использовать знак $)

 

 

:

Прерывание

При исчерпании списка вывода

"

 

выполнения

прерывает выполнение ДП

 

 

действия ДП

 

 

 

 

kP

Преобразование

Устанавливает значение

 

В/В

 

масштабного

показателя степени в ДД F, E, D

 

 

коэффициента

и G

 

 

 

BN, BZ

Интерпретация

Устанавливает способ

 

Ввод

 

пробела

интерпретации пробелов

 

 

313

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

Преобразование апострофа или двойных кавычек выполняет вывод заключенной в апострофы или кавычки строки. Для вывода обрамленной апострофами и содержащей апострофы строки необходимо указать каждый выводимый апостроф дважды (либо заключить строку в двойные кавычки). Аналогично выполняется вывод содержащих двойные кавычки строк. Преобразование апострофа и двойных кавычек не может быть использовано с оператором READ.

Пример:

write(*, 1)

1 format(2x, 'Введите границы отрезка [a, b]: ') ! или

write(*, '(2x, "Введите границы отрезка [a, b]: ")') ! или, применив дескриптор A

write(*, '(2x, a)') 'Введите границы отрезка [a, b]: ' read(*, *) a, b

Замечание. Если в спецификации формата оператора WRITE выводимая строка заключена в апострофы, то сама спецификация должна быть заключена в двойные кавычки; можно сделать наоборот, например:

write(*, "(2x, 'Введите границы отрезка [a, b]: ')")

Преобразование Холлерита. Дескриптор nH передает n символов, включая пробелы, в файл или на экран. Число символов, следующих за дескриптором nH, должно быть равно n. Преобразование Холлерита может быть использовано везде, где допустимо применение символьных констант. Принято называть константы, определенные при помощи дескриптора nH,

холлеритовскими константами. Пример:

write(*, 1)

1 format(2x, 31HВведите границы отрезка [a, b]:) ! или

write(*, '(2x, 31HВведите границы отрезка [a, b]:)')

Замечание. Фортран 95 удалил холлеритовские константы из стандарта; несмотря на это, они продолжают поддерживаться CVF.

Преобразование опроса. Дескриптор Q возвращает число непереданных символов записи. Соответствующий дескриптору Q элемент списка В/В должен быть целого или логического типа.

Вследующем примере дескриптору Q соответствует переменная nq,

вкоторую благодаря дескриптору Q будет считано (после ввода пяти элементов массива kar) число непереданных символов записи. Затем значение nq будет использовано при вводе массива chr.

314

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

integer kar(5), nq character(1) chr(80)

read(4, '(5I4, Q, 80A1)') kar, nq, (chr(i), i= 1, min(nq, 80))

Возвращаемое дескриптором Q значение можно использовать не только в текущем, но и в следующем операторе ввода. Для этого после опроса записи надо остаться в текущей записи, т. е. применить ввод без продвижения, например:

integer k, nq

! Спецификатор ADVANCE = 'NO' задает ввод

character(1) chr(80)

! без продвижения

read(*, '(I2, Q)', advance = 'no') k, nq read(*, '(80A1)') (chr(i), i= 1, min(nq, 80))

Преобразование позиции. Дескрипторы T, TL и TR задают позицию записи, в которую или из которой будет передаваться следующий символ. Новая позиция может быть задана как левее, так и правее текущей. Это позволяет при вводе использовать запись более одного раза. Правда, не рекомендуется перемещаться в обратном направлении более чем на 512 байт (символов).

Дескриптор Tn задает абсолютную табуляцию: передача следующего символа будет выполняться начиная с позиции n (отсчет позиций выполняется от начала записи).

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

Дескриптор TLn задает относительную левую табуляцию: передача следующего символа будет выполняться начиная с позиции, расположенной на n символов левее текущей позиции. Если задаваемая дескриптором TLn позиция оказывается перед первой позицией текущей записи, то передача следующего символа будет выполняться с первой позиции. Если размер записи больше выделенного для В/В буфера, то нельзя выполнить левую табуляцию в позицию, принадлежащую предыдущему буферу.

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

Дескриптор nX используется для перемещения позиции В/В на n символов вперед.

Пример:

real :: a = 1.23, b = 5.78, c

 

 

 

write(*, 1) a, b

!

a = 1.230

b = 5.780

1 format(T7, 'a = ', f6.3, TR7, 'b = ', f6.3)

 

 

315

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

read(*, '(20(f6.2, TL6))') a, b, c

! Введем:

4.67

write(*, '(4x, 3f6.2)') a, b, c

!

4.67

4.67 4.67

Управление выводом знака + в числовых полях выполняется при помощи дескрипторов SP, SS и S. Использование дескриптора SP обеспечивает вывод знака + в числовых полях, в которых выводятся положительные числа. Дескриптор SS подавляет вывод знака + (принимается по умолчанию). Дескриптор S восстанавливает действие дескриптора SS.

Пример:

real :: a = 1.23, b = 5.78

 

 

write(*, '(2f6.2)') a, b

! 1.23

5.78

write(*, '(sp, 2f6.2)') a, b

!+1.23

+5.78

write(*, '(sp, f6.2, s, f6.2))') a, b

!+1.23

5.78

Преобразование слеша. В текущей записи слеш (/) указывает на конец подлежащих передаче данных.

При вводе слеш позиционирует файл за текущей записью.

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

Пример:

integer a(20)

open(9, file = 'a.txt', blank = 'null') read(9, 1) a

write(*, 1) a

1 format(7i3 / 5i3 / 8i3)

Состав файла a.txt:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

-1

-2

-3

-4

-5

-6

-7

-8

-9 -10

При вводе по формату 1 из первой записи файла будут введены 7 чисел, из второй - 5 и из третьей - 8. Переход с одной записи на следующую обеспечивается преобразованием слеша.

Результат вывода по формату 1:

1

2

3

4

5

6

7

 

11

12

13

14

15

 

 

 

-1

-2

-3

-4

-5

-6

-7

-8

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

316

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

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

Такое же действие оказывает и дескриптор $, а также спецификатор оператора В/В ADVANCE = 'NO', который, правда, в отличие от дескрипторов \ и $ применима и при вводе. Дескрипторы $ и \ часто применяются для организации запросов, например:

write(*, 1) read(*, *) a, b

1 format( 2x, 'Введите границы отрезка [a, b]: ', \)

! или format( 2x, 'Введите границы отрезка [a, b]: ', $)

После вывода запроса по формату 1 ввод границ отрезка можно будет выполнить на той же строке, где выведен и запрос.

Прерывание выполнения действия ДП спецификации формата осуществляется дескриптором двоеточие (:). Прерывание происходит в том случае, когда список вывода исчерпан.

Пример, когда двоеточие прерывает вывод пояснительного текста:

real :: a = 0.59, eps = 1e -5

 

write(*, 1) a, eps

! Начало отрезка .59 Точность: .100E-04

write(*, 1) a

! Начало отрезка .59

1 format(1x, 'Начало отрезка: ', f4.2, : 2x, 'Точность: ', e9.3)

Преобразование масштабного коэффициента задается дескриптором kP. Дескриптор устанавливает коэффициент масштабирования для всей последовательности ДД F, E, D и G до тех пор, пока не встречен другой дескриптор kP. По умолчанию преобразование масштабного коэффициента не задано. Действие дескриптора kP было описано при рассмотрении ДД F и E. Здесь же мы ограничимся примером:

real a(4), b(4), c(4), d(4) open(9, file = 'a.txt')

read(9, 1) (a(i), b(i), c(i), d(i), i = 1, 4)

1 format(f10.6, 1p, f10.6, f10.6, -2p, f10.6) write(*, 2) (a(i), b(i), c(i), d(i), i = 1, 4)

2 format (4f11.3)

Состав файла a.txt:

12340000

12340000

12340000

12340000

12.34

12.34

12.34

12.34

12.34e0

12.34e0

12.34e0

12.34e0

12.34e3

12.34e3

12.34e3

12.34e3

Результат:

 

 

12.340

1.234

1.234

1234.000

12.340

1.234

1.234

1234.000

317