Материал: Аверянов Введение в оператсионные системы и основы программирования 2015

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

В операторах READ(*,*) и WRITE(*,*) в круглых скобках через запятую записаны две «звездочки», первая означает выбор устройства по умолчанию. Если не оговорено иное, то для ввода по умолчанию используется клавиатура, а для вывода – экран монитора. Вторая «звездочка» имеет тот же смысл, что и единственная «звездочка» в операторах READ* и WRITE* – она означает выбор правил «по умолчанию» в отношении формата ввода или вывода данных. Это сигнал компилятору, что программисту лень или некогда думать о формате представления результатов, и ему (компилятору Фортрана) придется взять это на себя. Формат ввода/вывода по умолчанию будет зависеть от типа вводимых или выводимых элементов, записанных в виде списка, проще говоря перечисленных через запятую, поэтому такой вариант ввода/вывода еще называют

вводом/ выводом под управлением списка.

Список ввода/вывода начинается сразу после закрытия круглых скобок для READ(*,*) и WRITE(*,*) или через запятую после единственной «звездочки» для READ* и WRITE*. В списке могут присутствовать скаляры и массивы всех встроенных и производных типов, включая переменные, буквальные и именованные константы и выражения.

Наиболее распространен вывод данных под управлением списка, когда числовые данные сопровождаются текстом в виде текстовых буквальных констант (пример 3.78).

Пример 3.78. Простейший вывод данных под управлениемсписка program DATAOUT

integer, parameter :: N=3 real:: X=1., Y=2., Z=3.

print*, “Вывод значений N=”, N, “переменных:” print*, “X=”, X, “Y=”, Y, “Z=”, Z

end

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

Вывод значений N=

3 переменных:

 

 

X= 1.0000000

Y=

2.0000000

Z=

3.0000000

 

 

186

 

 

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

В отношении рассмотренного примера необходимо сделать несколько замечаний. Начинающие программисты, приступающие к программированию на Фортране, иногда считают, что при выводе переменной X перед ней нужно обязательно писать «X=», что здесь есть какая-то связь. Смысловая связь действительно существует, но она в голове программиста, а не в списке оператора PRINT, которому безразлично, будет ли это текст «X=» или «X равно» или же это будет «Hello, World!» или не будет вообще никакого текста. Оператор PRINT просто выводит на экран все элементы, указанные ему в списке вывода, и текстовая буквальная константа «X=» – такой же равноценный и независимый элемент этого списка, как имя вещественной переменной X.

При вводе данных под управлением списка (пример 3.79) после запуска программы у начинающих программистов порой складывается впечатление, что компьютер «завис» – на темном экране виден только мигающий курсор, но это и есть приглашение к вводу данных. Данные вводятся подряд, в одну строку, через пробел или через запятую. При этом количество вводимых данных в списке ввода должно соответствовать количеству данных, введенных с клавиатуры.

Пример 3.79. Простейший ввод данных под управлением списка program DATAIN

integer:: X

integer, dimension (2, 2) :: A read*, X, A

print*, “X=”, X, “A=”, A end

В представленном примере один оператор READ осуществляет ввод с клавиатуры скалярной переменной X и массива A из четырех элементов. Соответственно, после запуска программы необходимо ввести с клавиатуры пять целых чисел через пробел или запятую. Также можно подтверждать ввод каждого числа клавишей «Enter», при этом для завершения ввода необходимо пять чисел, только тогда оператор READ завершит свою работу.

187

Объекты производных типов данных вводятся и выводятся как последовательность значений элементов, составляющих структуру объекта. О вводе/выводе массивов речь пойдет далее (п. 3.6.3).

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

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

Таблица 3.9. Варианты операторов форматного ввода/вывода

Оператор

Действие

READ (*, ‘(fmt)’ ), список ввода

Ввод с клавиатуры

READ (*, метка), список ввода

Ввод с клавиатуры

READ ‘(fmt)’, список ввода

Ввод с клавиатуры

READ, метка, список ввода

Ввод с клавиатуры

WRITE (*,‘(fmt)’ ), список вывода

Вывод на экран

WRITE (*, метка ), список вывода

Вывод на экран

PRINT ‘(fmt)’, список вывода

Вывод на экран

PRINT, метка, список вывода

Вывод на экран

Метка FORMAT(fmt)

Контейнер спецификаций

Операторы форматного ввода/вывода (табл. 3.9) точно такие же, как и в табл. 3.8, за исключением спецификации формата fmt, или ссылки на нее через метку оператора FORTMAT – контейнера форматных спецификаций.

Спецификация формата fmt (см. примеры далее) представляет собой список дескрипторов формата данных (табл. 3.10).

Дескрипторы, используемые для описания формата данных (см. табл. 3.10) позволяют задавать символьную длину поля w для размещения объекта данных при вводе выводе и учитывать особенности числовых и нечисловых типов данных Фортрана.

При использовании непосредственно в операторах ввода/вывода ссылка на формат представляется как текстовая константа: ‘(fmt)’ или «(fmt)», содержащая спецификацию формата fmt, заключенную в круглые скобки. Такой подход рекомендуется, если список дескрипторов в спецификации формата достаточно короткий.

188

Таблица 3.10. Дескрипторы формата данных

Дескриптор

Тип данных

 

Внешнее представление

 

 

 

 

 

Десятичное представление целого чис-

 

 

 

 

ла в поле шириной w символов. Вели-

Iw[.m]

Целыйтип

 

чина m определяет минимальное число

 

 

 

 

цифр при выводе, недостающие пози-

 

 

 

 

ции заполняются нулями слева

 

Bw[.m]

 

 

 

Двоичное, восьмеричное и шестнадца-

Ow[.m]

Целыйтип

 

теричное представление целого числа,

Zw[.m]

 

 

 

выводится аналогично Iw[.m]

 

 

 

 

 

Представление

вещественных

чисел

 

 

 

 

без десятичной экспоненты (степени

Fw.d

Вещественный тип

 

числа десять). Задается ширина поля w

 

 

 

 

и количество цифр d после десятичной

 

 

 

 

точки

 

 

 

 

 

 

 

Представление вещественного числа с

 

 

 

 

десятичной экспонентой. Обязательно

Ew.d[Ee]

Вещественный тип

 

задается ширина поля w и количество

 

цифр d после десятичной точки. До-

 

 

 

 

полнительно можно задать e – ширину

 

 

 

 

поля порядка десятичной экспоненты

 

 

 

 

Аналогичен E. Десятичный порядок

EN.d

Вещественный тип

 

кратен трем. Целая часть числа в диа-

 

 

 

 

пазоне от 1 до 1000

 

 

 

 

 

 

Аналогичен E. Целая часть числа в

ES.d

Вещественный тип

 

диапазоне от 1 до 10. Масштабный

 

 

 

 

множитель не действует

 

 

Комплексный тип

 

Задается парой дескрипторов F, E, EN

 

или ES

 

 

 

 

 

 

 

Представление

логических

данных.

Lw

Логический тип

 

Задается ширина поля w для вывода в

 

минимальном варианте T и F, а в мак-

 

 

 

 

 

 

 

 

симальном варианте .TRUE. и .FALSE

 

 

 

 

Можно задавать символьную ширину

A[w]

Текстовый тип

 

поля w. Если ширина поля не указана,

 

то определяется фактическим количе-

 

 

 

 

 

 

 

 

ством символов в тексте

 

 

 

 

 

 

Универсальный дескриптор. Применя-

 

Все

встроенные

 

ется для вещественных чисел, порядок

Gw.d[Ee]

 

величины которых заранее

не

извес-

типы

 

 

тен: работает как F или E. Для целого,

 

 

 

 

 

 

 

логического и текстового типа работа-

 

 

 

 

ет как Iw, Lw и Aw

 

 

 

 

 

 

Задается дескрипторами в соответст-

Производные типы

 

вии с встроенными типами элементов

 

 

 

 

структуры производного типа

 

 

 

 

189

 

 

 

Если же список дескрипторов в спецификации формата имеет большую длину, сложную структуру, а также содержит текстовые константы с внутренними апострофами или кавычками (буквальные константы текстового или символьного типа – п. 3.3.3), то целесообразно использовать меточную ссылку на оператор FORMAT.

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

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

Пример 3.80. Неправильныйформат привводе program FMT1

read ‘(i1, i2, i3)’, K, L, M ! Предлагается ввести через пробел 1^23^456 print ‘(i1, i2, i3)’, K, L, M

end

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

Ввод: 1^23^456 Вывод: 1^2^34

По спецификации «I1» считывается одна символьная позиция – первая единица, как целое число, соответственно переменная «K» получает значение «1», далее по спецификации «I2» считывается два символа «^2» в предположении, что это целое число и переменной «L» присвоится значение «2». И наконец, по спецификации «I3» будут считаны еще три позиции: «3^4» – компилятор Gfortran исключает все пробелы, и переменная «L» инициализируется как «34», но возможна ситуация, когда будут считаны символы только до пробела и тогда в «L» запишется целое значение, равное трем.

При выводе также нужно считать символьные позиции, чтобы получить приемлемый результат (пример 3.81). Первый PRINT выведет «1234» без пробелов.

190

Источник: https://studfile.net/preview/16708824/