Форматированный ввод-вывод. COMMON блоки. Управление Вводом-выводом, страница 2

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

Инструкция

COMMON  /COMBL/Arr(3,4)

отводит память под массив Arr(3,4) и  указывает, что к этой области памяти может обратиться любая программная компонента, если в ней также описать обращение к этому блоку памяти, например:

COMMON /COMBL/Barr(3,4)

COMBL- имя, введенного ОБЩЕГО блока памяти.

1)   Измените имя блока COMMON /COMBL/  ,например,  на /COMA/

      Посмотрите, работает ли программа. 

      Объясните вывод на  экран.

2)   Измените имя блока:   удалите названия блоков  в программе и подпрограмме

                               COMMON  Arr(3,4)

         COMMON   Barr(3,4)

      Посмотрите, работает ли программа. 

      Объясните вывод на  экран.

3.  Упрвление Вводом-выводом

Разбор работы программы F5_3.FOR

Инструкция

OPEN(1, IOSTAT = IOS, ERR = 15, FILE = FILENAME)

(Слева от знака равно = написан синтаксис Фортрана, справа от знака равно =  написаны идентификаторы и метки программы)

Эта инструкция открывает файл, имя которого определено в строке FILENAME, т.е. файл    4.dat

Переменная IOS примет значение кода возврата операции OPEN. Если операция успешна, то IOS = 0.

Если при открытии файла произошла  ошибка, то  управление будет передано на метку 15.

!!! Обратите внимание, если у Вас в каталоге нет файла из которого Вы пытаетесь читать данные, компилятор COMPAQ не делает переход на метку Ошибки, а в рабочем каталоге создает файл с именем того файла, из которого Вы пытаетесь прочитать, но созданный файл пуст и имеет нулевую длину. При работе программы будет считаться, что файл успешно открыт, но при чтении из такого пустого файла произойдет ОШИБКА ЧТЕНИЯ.

Переименуйте файл 3.dat в   4.dat

Инструкция           

READ(1,6,ERR=20) TEXT  

читает переменную TEXT по «6 формату»:

6        FORMAT(A12)    -    чтение 12 символов из строки. В случае ошибки чтения переход на метку 20.

Затем из файла читаются целые числа с помощью цикла.

Чтение переменных происходит согласно формату      

 11      FORMAT(I3, I3, I4)  - , т.е. читаются 3 целых числа, расположенных в 1-3, 4-6 и 7-10 позициях строки. Считается, что мы знаем, как размещена информация во входном файле.

Когда  мы не знаем, сколько строк нам надо прочитать, то необходимо уметь определять, когда следует завершить операцию чтения. Это возможно сделать разными способами.

Запустите программу.

В программе имеется  цикл, в котором  используется контроль переменной    IOS

          DO WHILE( IOS.EQ.0)

Но переменная IOS в цикле никак не меняется. Поэтому мы имеем бесконечный цикл по чтению из файла. И поэтому  простая инструкция чтения

            READ(1,11) A,B,C

, вызывает  ошибку, когда мы доходим до конца файла.

Именно это и видно при запуске программы.

Измените инструкции чтения на

            READ(1, 11, IOSTAT=IOS) A, B, C

Эта инструкция позволяет изменить значение IOS с помощью параметра IOSTAT (статус-состояние ввода вывода), возвращаемого операцией READ.

Посмотрите -  цикл отработал правильно.

Возможен более сложный контроль операции чтения

            READ(1, 11, ERR = 20, IOSTAT = IOS, END = 30) A, B, C

, когда также контролируются  ошибки чтения (передача управления на инструкцию с меткой    ERR=20 и конец файла END=30)

Вариант чтения

            READ(1,11,END=30) A,B,C

просто выбросит Вас из цикла, когда Вы дойдете до конца файла.

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

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

4. Разбор работы программы F5_4.FOR

Пример аналогичен предыдущему.

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

          CLOSE(1)

- закрытие канала (потока) ввода с номером 1.

5. Разбор работы программы F5_4a.FOR

Главное отличие от предыдущего примера – это организация чтения данных в цикле.

Цикл    

         DO WHILE(.NOT. EOF(1) )

будет выполняться пока значение, возвращаемое функцией EOF(1) == .FALSE..

Эта функция  (F90)  определяет запись конца файла.

************************************************************************************

Задание (учебное):   Решите задачи :

   1501   Целые числа и форматирование

   1502   Текст и форматирование

   1503   Вещественные числа и форматирование

Задание     на дом.   ПРОВЕРЯЕТСЯ  

Решите задачу 15**      Номер задания * получите у преподавателя.

Инженерная задача  на нахождение правильного ответа для конкретных  входных данных.

Замечания

-------------

а) Работающая Программа должна быть оформлена:

   подписана и иметь структурированный вид

УДАЛИТЕ ненужные файлы и каталог DEBUG. Фортрановские EXE-файлы имеют большой размер и нам незачем их хранить. Особо это касается тех, кто только начинает работать с компьютером и у них образуется куча EXE-файлов и куча DEBUG каталогов в разных местах.

Что необходимо знать:

1. Ввод чисел из файла.

2.  Передача  данных через COMMON блоки

3.  Ввод чисел из файла  в цикле

4.  Форматирование вывода:  I, A, F

Вопросы для «продвинутых»

-  Что в Лабораторной работе написано не правильно?

-  Что в Лабораторной работе написано плохо?

-  Что в Лабораторной работе пропущено и следует добавить?