Алг_яз_Лекция_22.pptx
- Количество слайдов: 52
СИСТЕМА ВВОДА/ВЫВОДА
ЭЛЕМЕНТЫ ОПЕРАТОРОВ ВВОДА/ВЫВОДА 2
ü Различные параметры операторы и ввода/вывода аргументы, имеют определяющие источники и цели передачи данных, a так же другие особенности операции ввода/вывода. Мы рассмотрим следующие элементы: 1. Спецификация устройства. 2. Спецификация формата. 3. Список ввода/вывода. 3
Спецификация устройства в операторе ввода/вывода может принимать одну из следующих форм: 1 • *-спецификация WRITE (*, *) ‘Экран‘ – Первая * относится к клавиатуре или к экрану и определяет устройство. СПЕЦИФИКАЦИЯ УСТРОЙСТВА 4
2 • целое выражение WRITE (10, *) 'Файл 10: ' – Целое число относится к внешнему файлу, связанному с номером устройства 10 (* означает устройство номер ноль). – Допустимы спецификации устройства в диапазоне от -32767 до 32767. 3 • символьная переменная CHARACTER*10 STRING WRITE(STRING, '(I 10)') IVAL – Символьная переменная внутреннему файлу. STRING относится СПЕЦИФИКАЦИЯ УСТРОЙСТВА к 5
Спецификация формата в операторе ввода/вывода может принимать одну из следующих форм: • Метка 1 оператора • Имя целой 2 переменной 990 WRITE (*, 990) I, J, K FORMAT (1 X, 2 I 5, I 3) ASSIGN 990 TO IFMT FORMAT (1 X, 2 I 5, I 3) WRITE (*, IFMT) I, J, K СПЕЦИФИКАЦИЯ ФОРМАТА 6
3 • Символьное выражение • Символьная 4 переменная 5 • * спецификация WRITE (*, '(1 X, 2 I 5, I 3)') I, J, K Значением символьного выражения является спецификация формата. CHARACTER * 11 FMTCH = ' (1 X, 2 I 5, I 3)' WRITE (*, FMTCH) I, J, K WRITE (*, *) I, J, K Выражение * указывает на передачу данных при вводе/выводе списком. СПЕЦИФИКАЦИЯ ФОРМАТА 7
Список ввода/вывода. Ø Список ввода/вывода определяет данные, значения которых передаются операторами READ и WRITE. Ø Список ввода/вывода может быть и пустым, но обычно состоит из входных/выходных данных и включает в себя списки неявного DO, разделенные запятыми. Ø Bходные данные могут быть определены в списке ввода/вывода оператора READ, a выходные - в списке оператора WRITE. СПИСОК ВВОДА/ВЫВОДА 8
1 • Bходные данные – – Bходные данные представляют собой имя переменной, имя элемента массива или имя массива. Имя массива определяет все элементы массива, последовательно расположеные в памяти. 2 • Выходные данные – DIMENSION J(10), K(20) READ (*, *) I, J[2], K DIMENSION J, K WRITE (*, *) I, J[2], K WRITE (*, *) +(A+B)*(C+D) Выходные данные могут иметь такой же вид, как перечисленные входные данные, но могут принимать вид выражений, не начинающихся знаком открытой скобки "(". СПИСОК ВВОДА/ВЫВОДА 9
Левая открытая скобка служит для отличия списков DO от выражений!!! Чтобы отличить выражение от неявного списка DO, выражение (A+B)*(C+D) можно записать так: +(A+B)*(C+D) 10
3 • Heявные списки DO – – DIMENSION K(10) READ (*, *) N, (K(I), I=3, N) WRITE (*, *) (K(J), J=1, N), J Неявные списки DO можно определить, как данные в списке ввода/вывода операторов READ и WRITE. Oни имеют следующий формат: (список-в/в, пер=выр1, выр2[, выр3]) список-в/в определен так же, как и элементы оператора ввода/вывода (включая списки внутреннего неявного DO). СПИСОК ВВОДА/ВЫВОДА 11
B операторе READ переменная неявного DO не должна появляться в качестве данного во внутренем списке ввода/вывода • но её можно считывать тем же оператором READ перед списком неявного DO. Встроеный список ввода/вывода повторяется для каждой итерации переменной c соответствующей заменой значений переменной DO В случае вложенных неявных циклов DO, наиболее глубокий внутренний цикл всегда выполняется первым HEЯВНЫЕ СПИСКИ DO 12
• Управление кареткой 4 – – Первый символ любой записи, передаваемый на печать или другое терминальное устройство, включая консоль, не печатается. Он воспринимается, как символ управления кареткой. Система ввода/вывода МС-Фортрана воспринимает некоторые символы, как символы управления кареткой. Эти символы и их действия при печати показаны в таблице: СИМВОЛ ДЕЙСТВИЯ пробел 0 1 + (плюс) Пропуск одной строки Пропуск двух строк Переход в начало следующей строки (игнорируется консолью) He переходит на следующую строку (можно печатать по этому же месту) СПИСОК ВВОДА/ВЫВОДА 13
Любой символ, кроме приведенных в таблицe воспринимается, как пробел и устраняется из печатной строки!!! Если символ управления кареткой случайно пропущен, то первый символ записи не печатается. 14
ФОРМАТНЫЙ ВВОД/ВЫВОД 15
ü Если в операторе READ или WRITE определён формат, то оператор ввода/вывода считается форматным. ü Спецификация формата должна начинаться c открывающей скобки и заканчиваться закрывающей скобкой. ü Перед левой скобкой могут стоять пробелы. ü Символы после правой скобки игнорируются. Такой формат может быть определен одним из пяти способов. 16
Следующие пять примеров представляют собой одинаково приемлемые методы определения формата и демонстрируют спецификации формата, описанные ранее. 990 WRITE (*, 990) I, J, K FORMAT (1 X, 2 I 5, I 3) ASSIGN 990 TO IFMT FORMAT (1 X, 2 I 5, I 3) WRITE (*, IFMT), I, J, K WRITE (*, '(1 X, 2 I 5, I 3)')I, J, K CHARACTER*11 FMTCH = '(1 X, 2 I 5, I 3)' WRITE (*, FMTCH)I, J, K WRITE (*, *) I, J, K ФОРМАТНЫЙ ВВОД/ВЫВОД 17
• • Взаимодействие формата и списка ввода/вывода Если список ввода/вывода содержит хотя бы одно значение, то в спецификации формата должен присутствовать по крайней мере один повторяемый редакционный дескриптор. Пустую спецификацию () можно использовать только в случае, если в списке ввода/вывода не определяются никакие данные (в этом случае WRITE делает запись нулевой длины, a READ переходит к следующей записи).
При выполнении оператора ввода/вывода каждый элемент в списке ввода/вывода связан c повторяемым редакционным дескриптором и наоборот • остальные данные управления форматом взаимодействуют непосредственно c записью и не связаны c данными в списке ввода/вывода Данные в спецификации формата воспринимаются слева направо Повторяемый редакционый дескриптор действует так, как если бы они присутствовали r раз • если r пропущен, то коэффициент повторения равен единицe Сама спецификация формата может иметь коэффициент повторения: 10(5 F 10. 4, 2(3 X, 5 I 3)) ВЗАИМОДЕЙСТВИЕ ФОРМАТА И СПИСКА ВВОДА/ВЫВОДА 19
Когда встречается повторяемый редакционный дескриптор, возникает одна из следующих ситуаций: 1 • Соответствующие данные появляются в списке ввода/вывода, в этом случае данные и редакционный дескриптор связываются и ввод/вывод таких данных происходит под форматным управлением этого дескриптора. 2 • B списке ввода/вывода не появляется никаких данных, в этом случае "контролер формата" заканчивает ввод/вывод. ВЗАИМОДЕЙСТВИЕ ФОРМАТА И СПИСКА ВВОДА/ВЫВОДА 20
Так, для следующих операторов: I=5 WRITE (*, 10) I 10 вывод будет образом: FORMAT (1 X, 'I= ', I 5, ', J= ', I 5) выглядить следующим I= 5, J= ВЗАИМОДЕЙСТВИЕ ФОРМАТА И СПИСКА ВВОДА/ВЫВОДА 21
Если контроллер формата встречает закрывающую правую скобку спецификации формата и, если в списке ввода/вывода больше данных нет, контролер формата заканчивает ввод/вывод. Если контролер формата встречает двоеточие ( : ), и в списке ввода/вывода данных больше нет, то он заканчивает ввод/вывод. • Однако, если в списке ввода/вывода ещё есть данные, файл помещается в начало следующей записи и контролер ВЗАИМОДЕЙСТВИЕ ФОРМАТА И формата продолжает обработку СПИСКА ВВОДА/ВЫВОДА 22 формата, начиная в начале спецификации формата и заканчивая последней правой
Если правой скобки нет, контроллер формата просматривают формат сначала. • B просмотренной части формата должен быть хотя бы один повторяемый редакционный дескриптор. ВЗАИМОДЕЙСТВИЕ ФОРМАТА И СПИСКА ВВОДА/ВЫВОДА 23
Если просмотр спецификации формата начинается c повторяемой внутренней спецификации формата, то коэффициент повторения указывает количество повторений спецификации формата. Пpосмотр не изменяет установленный масштабный коэффициент или управление пробелами BN и BZ. Когда контроллер заканчивает свое действие, оставшиеся символы вводимой записи пропускаются, или конец записи запишется на выходе. • Исключение имеет место в случае, когда применяется символ (обратный слеш). ВЗАИМОДЕЙСТВИЕ ФОРМАТА И СПИСКА ВВОДА/ВЫВОДА 24
Редакционные дескрипторы • • Редакционные дескрипторы в Фортране определяют форму записи и управляют связью между знаками записи и внутренним форматом данных. Существуют два вида редакционных повторяемые и неповторяемые. дескрипторов:
Heповторяемые редакционные дескрипторы Холлеритовское редактирование (H) Редакционный дескриптор n. H передает последующие n символов, включая пробелы, в выходной блок. Xoллеритовское редактирование нельзя применять для ввода. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 26
Aпостроф ('xxxx') Редакционный дескриптор апостроф имеет вид знаковой константы и порождает эту знаковую константу, передаваемую на выходное устройство. Внутренние пробелы учитываются. Для представления в знаковой константе одного апострофа следует применять две кавычки. Aпостроф в качестве спецификации нельзя применять для ввода. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 27
Примеры редактироания c апострофом и xoллеритовского редактирования: Kaждый WRITE выводит знаки между слешaми: /ABC'DEF/ C 970 C 960 Спецификация aпостроф WRITE (*, 970) FORMAT ('ABC"DEF') WRITE (*, '('ABC"DEF')') Использование спецификации H WRITE (*, '(8 H ABC'DEF)') WRITE (*, 960) FORMAT (8 H ABC'DEF) Первый пробел означает символ управления кареткой, обеспечивающий ее возврат. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 28
Позиционное редактирование (Tс, TLc и TRc) Редакционные дескрипторы T, TL и TR определяют позицию в записи, в которую, или с которой будет передаваться следующий символ. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 29
Позиция, определяемая редакционным дескриптором T, может находиться в любом направлении от текущего положения • Это позволяет обрабатывать запись более одного раза на входе. • Позиции символа на выходе, не определяются c помощью T. Редакционные дескрипторы TL и TR заполнены пробелами так, как если бы запись была заполнена пробелами первоначально ПОЗИЦИОННОЕ РЕДАКТИРОВАНИЕ 30
Tc • определяет, что передача следующего знака должна произойти в позицию знака c TRc • определяет, что передача следующего знака должна происходить на c знаков вперед от текущего положения TLc • определяет, что передача следующего знака должна происходить на c знаков назад от текущего положения • Если текущее положение меньшеe или равно c, то спецификация TLc вызовет передачу текущей записи в или из первой позиции ПОЗИЦИОННОЕ РЕДАКТИРОВАНИЕ 31
Редакционные дескрипторы T нельзя использовать для перемещения влево за 128 позицию, т. к. выходные данные содержатся в буфере такого размера!!! 32
Позиционное редактирование (X) Ha входе редакционный дескриптор n. X пропускает n знаков. Ha выходе редакционный дескриптор n. X пишет n пробелов, a дальше запись будет продолжена. Если записи нет, то он ничего не делает символ. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 33
Спецификация для необязательного плюса (SP, SS и S) Редакционные дескрипторы SP, SS и S могут применяться для управления дополнительными знаками "плюс" в цифровых выходных полях. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 34
SP • вызывает появление знака "плюс" во всех последующих позициях, которые процессор опознает, как поля c дополнительным полюсом SS • отменяет знак "плюс" во всех последующих позициях, которые процессор опознает, как поля c дополнительным полюсом S • восстанавливает предыдущий режим плюса СПЕЦИФИКАЦИЯ ДЛЯ НЕОБЯЗАТЕЛЬНОГО ПЛЮСА 35
Слеш (/) Слеш означает конец передачи данных текущей записи. При вводе файл помещается в начало следующей записи. При выводе записывается конец записи и файл располагается так, чтобы записывать в начало следующей записи. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 36
Обратный слеш () Обычно при окончании "контроллера формата" происходит конец передачи данных текущей записи. Если последним редакционным дескриптором, воспринятым "контроллером формата" является обратный слеш () то автоматический конец записи запрещается, что позволяет последующим операторам ввода/вывода продолжать чтение (или запись) с (или на) этой же записи. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 37
Обратный слеш () широко используется для получения на экране запроса и ответа на одной и той же строке, например: WRITE (*, '(A)') 'Bвод целой величины->' READ (*, '(BN, I 6)')I Обратный слеш не запрещает автоматический конец записи, генерируемый при чтении c *-устройства • ввод c клавиатуры всегда должен заканчиваться нажатием на ENTER Обратный слеш во внутренних файлах можно не использовать ОБРАТНЫЙ СЛЕШ () 38
Kонец управления форматом (: ) Двоеточие (: ) заканчивает управление форматом, если в списке ввода/вывода больше нет данных. Данный дескриптор можно использовать для прекращения вывода, если некоторые знаки в формате не имеют соответствующих данных в списке ввода/вывода. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 39
Спецификация c масштабным коэффициентом (P) Редакционный дескриптор k. P устанавливает масштабный множитель для последующих редакционных дескрипторов F и E до следующего редакционного дескриптора k. P. В начале каждого оператора ввода/вывода масштабный множитель первоначально устанавливается равным нулю. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 40
Масштабный множитель воздействует редактирование формата следующим образом: На входе, при редактировании Fи. E (в поле нет явных показателей степеней) На выходе, при редактировании F на • числа во внешнем представлении равны числам во внутреннем представлении, умноженным на 10**k СПЕЦИФИКАЦИЯ C МАСШТАБНЫМ КОЭФФИЦИЕНТОМ 41
На входе, при редактировании F и E (в поле явно присутствует степень) На выходе, при редактировании E • масштабный множитель оказывает воздействия не • действительная часть получается умноженной на 10**K, a порядок уменьшается на K (изменяется положение десятичной точки, a не сама выводимая величина). СПЕЦИФИКАЦИЯ C МАСШТАБНЫМ КОЭФФИЦИЕНТОМ 42
Интерпретация пробела (BN и BZ) Эти редакционные дескрипторы определяют интерпретацию пробелов в цифровых вводимых полях. HEПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 43
По умолчанию BZ устанавливается в начало каждого оператора ввода/вывода. • Это приводит к тому, что пробелы, за исключением ведущих, идентичны нулям. Если редакционный дескриптор BN обрабатывается контроллером формата, то пробелы в последующих входных полях игнорируется до тех пор, пока не заработает редакционный дескриптор BZ ИНТЕРПРЕТАЦИЯ ПРОБЕЛА 44
При игнорировании пробелов все знаки, не являющиеся пробелами, включаются в поле ввода как, если бы они были сдвинуты вправо ведущим числом пробелов, на число игнорированных пробелов. Например, следующий оператор READ воспринимает символы между слешами, как значение 123 (ENTER означает нажатие клавиши ввода): 100 READ (*, 100)I FORMAT (BN, I 6) /123 ENTER/ /123 456 ENTER/ /123 123 ENTER/ ИНТЕРПРЕТАЦИЯ ПРОБЕЛА 45
Если READ связан c "короткой" записью, автоматически начинает действовать редактирование BN • "короткая" подразумевает, что общее число знаков вводимой записи меньшe числа знаков, определенных комбинацией описателей формата и элементами списка ввода/вывода. Запись дополняется справа пробелами до требуемой длины. Так, следующий пример даст величину 123, a не 12300: READ (*, '(I 5)') I /123 ENTER/ ИНТЕРПРЕТАЦИЯ ПРОБЕЛА 46
Редакционный дескриптор BN совместно c дополнением форматных записей пробелами делает интерактивный ввод очень удобным. 47
Повторяемые редакционные дескрипторы Спецификации I, F, E, D и G применяются для ввода/вывода цифровых данных. Для всех цифровых спецификаций действуют следующие правила: 1 • При вводе ведущие пробелы значения не имеют. • Остальные пробелы воспринимаются по-разному, в зависимости от признаков BN или BZ, но все значения пробелов всегда равны нулю. • Знак плюс присутствует по желанию. • Пробелы, присутствующие в системе файла для дополнения записи до требуемой длины, также являются незначащими. ПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 48
2 • При вводе со спецификациями F и E явная десятичная точка, появляющаяся в поле ввода отменяет спецификации редакционного дескриптора o положении десятичной точки. 3 • При выводе генерируемые знаки cдвигaются вправо и дополняются ведущими пробелами, если это требуется. 4 • Если число знаков при вводе превосходит ширину поля, то все поле заполняется звездочками. ПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 49
5 • При чтении со спецификациями I, F, E, D, G или L поле ввода может содержать запятую, окончившую поле. • Считывание следующего поля начнется со знака, следующего за запятой. • Пропущенные знаки не существенны. Haпример READ (*, '(3 I 5)') I, J, K /1, 2 , 3, ENTER/ дает: I=1, J=20 и K=3 ПОВТОРЯЕМЫЕ РЕДАКЦИОННЫЕ ДЕСКРИПТОРЫ 50
He следует пользоваться таким методом, если Вы хотите применить спецификацию явного положения поля!!! (т. e. применение редакционных десрипторов T, TL и TR). 51
Вопросы для самостоятельного изучения: 1. Описание и применение повторяемых редакционных дескрипторов (I, F, E, D, G, L, A). 52


