Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fortran 90. ANSI Standard.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
861.18 Кб
Скачать

Списки ввода-вывода

Когда более чем одна переменная пишется или читается в некотором операторе WRITE() или READ(), оператор ссылается на список ввода - вывода. Для вывода могут быть использованы переменные и/или выражения, но для ввода разрешены только переменные. Могут быть использованы неявные циклы DO для любого ввода или вывода, для любых типов данных, в том числе и производныых. Массив может быть специфицирован как задаваемый полностью, или поэлементно, или диапазоном элементов:

INTEGER, DIMENSION(10) :: a

READ (*,*) a(1), a(2), a(3) ! чтение значений с записью в 3 элемента

READ (*,*) a ! чтение 10 значений

READ (*,*) a(5:8) ! чтение значений с записью в 4 элемента

Элементы массива могут появляться только в списке ввода -вывода для ввода. Например:

INTEGER :: b(10), c(3)

c= (/1,2,1/)

READ (*,*) b(c) ! запрещено

Запрещение возникает потому, что b(1) появится дважды.

Я

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

Ввод-вывод в производных типах данных так как если бы компоненты были специфицированы в порядке. Так для p и t типа POINT и TRIANGLE соответственно, где:

TYPE point

REAL :: x, y

END TYPE

TYPE (point) :: pt

!

TYPE triangle

TYPE (point) :: a, b, c

END TYPE

TYPE (triangle) :: tri

следующие две пары опереторов эквивалентны:

READ (*,*) pt

READ (*,*) pt%x, pt%y

...

READ (*,*) tr

READ (*,*) tri%a%x, tri%a%y, tri%b%x, tri%b%y, tri%c%x, tri%c%y

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

Я

Неявный цикл do

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

(object, do_var=start, stop [,step])

где do_var целая переменная (и не может быть указателем).

Рассмотрим следующий пример:

INTEGER :: j

REAL, DIMENSION(5) :: a

READ (*,*) ( a(j), j=1,5) ! a(1), a(2), a(3), a(4), a(5)

WRITE (*,*) ( a(j), j=5,1,-1) ! a(5), a(4), a(3), a(2), a(1)

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

Список неявного цикла может быть таким:

INTEGER :: I, J

REAL, DIMENSION(10,10) :: B

WRITE (*,*) ((B(I,J),I=1,10), J=1,10)

Здесь вид вывода есть альтернатива использованию секции массива.

Я

Ввод-вывод без продвижения

Нормальное действие оператора ввода-вывода состоит в продвижении к следующей записи по завершении оператора. Таким образом на вводе, если запись читалась только частично, остаток вводимой записи сбрасывается. На выводе оператор WRITE() будет завершен на позиции курсора в начале новой строки.

I/O без продвижения позволяет запись читать по частям (например, длинная запись неизвестной длины) или создавать искусный пользовательский интерфейс, где приглашение ввода и ответ пользователя появляется в одной и той же строке (но остерегайтесь, что это "аккуратное средство" не определено в стандарте Fortran и зависит от реализации).

Имеется комплексное множество правил, превращающих использование ввода-вывода без продвижения и его вариантов в соответствующие ключевые слова. Этот раздел имеет смысл только с весьма зависящим от реализации аспектами управления экраном. Ключевое слово ADVANCE должно быть использовано в операторах WRITE или READ следующим образом:

INTEGER :: i, j

...

WRITE(*,*,ADVANCE='NO') 'Введите значение i : '

READ(*,*) i

WRITE(*,*) ''Введите значение j : ' ! ADVANCE='YES'

READ(*,*) j

Если пользователь вводит значения 10 и 20 это должно появиься на экране следующим образом:

Введите значение i : 10

Введите значение j :

20

Ввод-вывод без продвижения выглядит ясно, но зависит от реализации.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]