Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Книга Фортран Павловец 2008

.pdf
Скачиваний:
127
Добавлен:
31.05.2015
Размер:
1.55 Mб
Скачать

При вводе информации можно пропускать, не читая, некоторые позиции. Например:

READ(5,6) K,L

5 FORMAT(2X, I3, 4X, I5)

Считывать значения, вводимые с клавиатуры, будем следующим образом:

Отступим две позиции от начала строки, из трех позиций прочитаем число и поместим его в переменную K, пропустим 4 позиции и прочитаем из следующих пяти позиций число в переменную L. Т.е. данные должны быть представлены следующим образом:

123 12345

2Х 4Х

I3 I5

Если в конце строки ввести лишние цифры, то они не будут восприняты ЭВМ.

Если ввести не все цифры, то ЭВМ воспримет их как пробелы. Компилятор преобразовывает пробелы в нули и при неправильном вводе данных в программу считается, например не 1, а 100.

Так:

– считает как 0;

999 – максимальное число, которое можно читать по формату I3.

Разделители

Разделителем оператора FORMAT может быть символ запятая « , » или символ слэш « / ». Символ слэш, расположенный в тексте оператора FORMAT, обозначает переход на

новую строку или новую запись. Пример:

6FORMAT(2X,I3/4X,I5) Отступить 2 позиции, прочитать (вывести) число по спецификации I3, перейти на новую строку, отступить 4 позиции, прочитать (вывести) число по спецификации (формату) I5.

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

информация, попадающая в первую позицию, теряется.

Если в первую позицию заносится «0» (ноль), то информация выводится через одну строку.

Если заносится в первую позицию «1» (единица), то дальнейший вывод информации будет осуществляться с первой строки следующей страницы. Одна страница при выводе на печатающее устройство содержит 63 строки, а при выводе на экран 25 строк.

Если в первой позиции строки помещен символ «+», то вывод информации на принтер или экран дисплея осуществляется без прогона строк на одно и то же место. Новая информация появится на месте последней предыдущей строки.

Пример:

WRITE(6,9) M,N

9 FORMAT(’+’,1X, I3,2X,I4)

71

После выполнения оператора FORMAT или после бесформатного вывода происходит автоматический переход на следующую строку. При этом курсор экрана переходит в первую позицию следующей строки. Но можно установить гашение перехода на следующую строку с использованием символа обратный слэш « \ ».

Пример:

WRITE(6,10)

10FORMAT(1X,’Введите значение А=’\) READ(5,*)А

Данный блок сработает следующим образом: появится надпись «Введите значение А=». Курсор будет находиться и мигать в конце выведенного текста. Если мы будем вводить новое число, то оно будет отображаться сразу после знака равно. Если не использовать обратный слэш, то вводимое число будет отображаться с первой позиции на следующей строке, что менее наглядно.

Для вывода информации в конкретное место строки используется спецификация Т: Tn, где n – номер позиции, начиная с которой будет обрабатываться информация.

Пример:

FORMAT(T5,I3) FORMAT(4X,I3)

Отличие спецификаций Х и Т состоит в следующем. Спецификация nХ пропускает количество n пробелов от начала строки или между двумя объектами списка спецификаций. Спецификация Тn указывает номер позиции в строке, начиная с которой будет выводиться дальнейшая информация. Если в одной строке использовать несколько раз спецификацию Т, то можно сначало выводить информацию в конце строки, затем в начале, затем в средине и выводимая информация может даже наслаиваться на выведенную ранее.

Ввод-вывод данных вещественного типа осуществляется по спецификации F или Е.

Спецификация F

Используется для ввода-вывода данных вещественного типа. Позволяет вводить и выводить информацию с фиксированной десятичной точкой.

Общая запись спецификации F:

Fw.d, где w – количество позиций, отведенных под число;

d – количество позиций из w, в которых размещается дробная часть числа.

Пример:

READ(5,11) A,B

11 FORMAT(F6.2,2X,F8.4)

Информация для ввода по спецификации F может быть представлена в двух формах:

1)без десятичной точки;

2)с десятичной точкой.

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

72

01234567890123456789

d=2 2X

d=4

w=6

w=8

F6.2

F8.4

Ввод значения переменной А производится по формату F6.2 (смотри пример). Это значит, что первое число будет читаться из первых 6 (w=6) позиций, из которых 2 последние позиции (d=2) будут считаться дробной частью вводимого числа. Число прочитается как 123,45 и запишется в память ЭВМ в переменную А. Переменная А будет сохранять это значение как А=0,12345*103.

Затем при дальнейшем вводе будут пропущены два символа 6 и 7 (так как используется пропуск символов по формату 2X) и произведётся считывание значения переменной В по формату F8.4. Число прочитается как 8901,2345 и сохранится в памяти ЭВМ как В=0,89012345*104. Последние цифры из строки ввода 6789 не входят в перечень описанных в операторе FORMAT полей, считываться и обрабатываться не будут.

Второй вариант: информация подготавливается с десятичной точкой. В этом случае

параметр d не играет никакой роли, а число читается из отведенного для него количества позиций w. Знак «минус» и символ «точка» занимают по одной позиции.

Примеры:

для спецификации F6.2 можно задавать численные данные:

–123.5

99999.

.12345

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

При вводе данных с десятичной точкой в виде:

1. 234567890123. 456

d=2 2X

d=4

w=6

w=8

F6.2

F8.4

получим значения переменных А=1,2345 В=890123,4. Цифры 6 и 7 будут пропущены по спецификации 2Х. Последние цифры 5 и 6 не прочитаются, так как выходят за пределы обрабатываемых полей.

Особенности набора числовых данных при вводе информации

При бесформатном вводе данных вещественного типа при наборе целой константы и нажатии клавиши "ввод" число воспринимается как вещественное. Например:

READ(5,*)A

При вводе числа 17 и нажатии клавиши "ввод" переменной А будет присвоено число 0.1700000Е+02, т.е. вещественное число 17.

При форматном вводе данных без десятичной точки преждевременное нажатие клавиши "ввод" до заполнения форматного поля данными может привести нас к нежелательным результатам. Предположим, по формату F4.1 будем набирать вводимые данные и сразу после набора нажимать клавишу "ввод".

73

READ(5,3)A

3 FORMAT(F4.1)

Набираем: 1"ввод". Число А воспримется как 0,1. Набираем: 12"ввод". Число А воспримется как 1,2. Набираем: 123"ввод". Число А воспримется как 12,3. Набираем: 1234"ввод". Число А воспримется как 123,4.

Только последняя введенная информация заполнила поле ввода из 4 позиций и число воспринялось правильно. Обратите внимание, поскольку в другой литературе такая информация не встречается.

Если в поле ввода набирать символ "пробел", то на персональных ЭВМ он не воспринимается. Будем вставлять символы "пробел" при вводе данных для примера:

READ(5,3)A

4 FORMAT(F4.1)

Набираем: 2---"ввод". Число А воспримется как 0,2. Набираем: 2--3"ввод". Число А воспримется как 2,3. Набираем: 2-34"ввод". Число А воспримется как 23,4. Набираем: 2-3-"ввод". Число А воспримется как 2,3.

Обратите внимание, поскольку в другой литературе такая информация не встречается. В ЭВМ старых типов, использующих для ввода информации перфокарты или текстовые файлы символ «пробел» воспринимался как «ноль».

Использование повторителей в операторе FORMAT

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

READ(5,8) A,B,X,V

8FORMAT(F4.2,3F5.3)

Вэтом примере переменная А будет читаться по формату F4.2, а переменные B,X,V будут считываться по формату F5.3, который из-за повторителя (цифра 3) сработает, как сработала бы следующая строка:

8FORMAT(F4.2,F5.3,F5.3,F5.3)

Вданном примере повторитель (цифра 3) заменил три F5.3.

Кроме того, повторители могут использоваться для группы форматов:

READ(5,9) X,B,C,K,D1,D2,M 9 FORMAT(F6.2,2(2F4.2,I3))

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

Порядок считывания по форматам: Х – по F6.2; B,C – по F4.2; K – по I3; D1,D2 – по F4.2; M –

по I3.

74

Примечание Если группа форматов заключена в скобки и число повторителей перед скобкой не

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

Все данные должны быть расположены в одной строке. Для перехода на другую строку при вводе (выводе) информации в операторе FORMAT в качестве разделителя используется символ « / » – слэш.

Рассмотрим, как можно считывать информацию из нескольких строк на дисплее. Для правильного ввода данных из нескольких строк необходимо:

1)правильно составить строку с оператором FORMAT (правильно расставить символы перехода на другую строку « / », правильно выбрать спецификацию ввода/вывода данных – I, F, E, G в зависимости от типа вводимых данных)

2)подготовить и правильно ввести необходимую информацию.

Примеры считывания из двух строк:

8FORMAT(F6.2,2(2F4.2/I3))

Впоследнем примере необходимо вводить информацию следующим образом:

F6.2

 

F4.2

 

F4.2

 

 

 

 

 

I3

 

F4.2

 

F4.2

I3

Если разделитель «/» поставить после I3, т.е. FORMAT(F6.2,2(2F4.2,I3/)), то информацию необходимо будет представить в виде:

 

F6.2

 

F4.2

 

F4.2

 

I3

 

 

 

 

 

 

 

 

 

F4.2

 

F4.2

 

I3

 

 

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

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

При выводе информации на экран дисплея длина одной строки - до 80 символов.

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

ОЧЕНЬ ВАЖНОЕ ПРАВИЛО:

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

75

Пример:

READ(5,9) X,B,C,K,D1,D2

9FORMAT(F6.3,F3.1,F4.2,I3)

Вданном примере в списке спецификаций оператора FORMAT четыре спецификации (F6.3,F3.1,F4.2,I3), а список ввода содержит 6 переменных (X,B,C,K,D1,D2). Как видно, список ввода больше списка спецификаций. Поэтому вводимую информацию необходимо подготовить следующим образом с первой позиции вводимой строки:

F6.3 - X

 

F3.1- B

 

F4.2 - C

 

I3 - K

F6.3 - D1 F3.1- D2

Вывод по спецификации Fw.d

При выводе по этому формату обязательно выводятся: знак « – » (знак « + » опускается) и целая часть числа, десятичная точка и количество позиций d с дробной частью числа

(выводится с округлением и отбрасыванием не поместившейся дробной части числа).

Десятичная точка занимает отдельную позицию.

Пример: при а=0,1225786

 

WRITE(5,4)A

 

4

FORMAT(2X,’A=’,F6.3)

А=_0.123

В результате на экран будет выведено:

 

 

d=3

 

 

w=6

На некоторых версиях ФОРТРАНа может быть установлено (пользователем) гашение

незначащего нуля, в этом случае будет выведено:

А=_ _.123

При выводе по формату F6.3 максимальное число, которое можно вывести - это 99.999 (для примера: число А=99.999492 – выведем по этому формату, а число А=99.999823 – не сможем вывести по этому формату, так как d=3, оставшаяся дробная часть округляется с добавлением единицы в старший разряд. Приэтом и все число округляется до 100, а число 100 вывести по этому формату нельзя). Минимальное выводимое число по этому формату –9.999.

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

Если выводимое число не может быть выведено по указанному формату (например, число 100 по F6.3), то вместо числа в отведенных позициях напечатаются символы « » (и вместо числа 100 получим ).

Ввод по спецификации Ew.d

Общая запись спецификации Е:

Еw.d

где w – количество позиций, отведенных под число;

d – количество позиций из w, в которых размещается дробная часть числа.

76

Например:

READ(5,9) A,B

9 FORMAT(E9.3,2X,E7.2)

При вводе исходных данных по спецификации Е в отведенном поле должно вводиться число в форме с плавающей запятой и в этом поле должна присутствовать латинская буква Е, которая выступает в роли показателя степени. У показателя степени буква Е может отсутствовать, но тогда при показателе степени обязательно должен стоять символ «+» или

«–».

Пример ввода по предыдущему FORMAT(E9.3,2X,Е7.2): –12345Е+1_ _1234Е–1

d=3 2X d=2 w=9 w=7

В результате считывания переменной А присвоится значение: А=–12.345*101, а переменной В присвоится значение: В=12.34*10–1. В памяти ЭВМ эти числа сохранятся как А= -0.12345*103 В= 0.1234*101.

Знак «+» у показателя степени можно опускать, если информация будет подготовлена следующим образом:

0123456Е2 1234Е–1

А=123.456*102 В=12.34*10–1

Или букву Е у показателя степени можно опускать

0123456+2 1234–01

А=123.456*102 В=12.34*10–1

или

0123456+0 1234–1

А=123.456 В=12.34*10–1

Информация, вводимая по спецификации Е, может быть подготовлена с десятичной точкой. В этом случае число читается из отведённого поля w позиций, а параметр d не играет никакой роли (смотри аналогичное положение по спецификации F).

Пример:

012345.Е2 .1234–1

А=12345*102 В=0.1234*10–1=0.01234

Вывод информации по спецификации Еw.d

Вывод осуществляется в нормализованном виде. В обязательном порядке выводится служебная информация в виде:

–0.ххх…хЕ± 0N d

w

Поэтому данные выводятся по спецификации E12.5 в не совсем обычном виде:

0 отпечатает

0.00000Е+00

1 отпечатает

0.10000Е+01

-101 отпечатает

-0.10100Е+03

0.0012 отпечатает

0.12000Е–02

77

Символы «-», «+», «точка» занимают по одной позиции.

При выводе по спецификации Е обязательно должно выполняться правило: w–d7

Это происходит из-за того, что 3 позиции в начале выводимой строки и 4 позиции в конце строки отводятся под вывод служебной информации.

Пример:

А=–0.1234567Е± 12

3 4

По спецификации Ew.d, выполняя условие w-d 7, можно вывести любое вещественное число. По этой причине спецификация Е используется для вывода значений, результаты которых непредсказуемы.

Для ЭВМ, у которых при установке дистрибутива программного обеспечения

установлено гашение незначащего нуля,

 

w–d6

.100Е+01.

В этом случае число 1 по спецификации Е10.3 отпечатается как

Необходимо предусматривать достаточное количество цифр после запятой, то есть параметр d (иначе при выводе будет происходить округление отбрасываемой части и результат

может сильно измениться).

 

 

Примеры:

 

 

вывод числа 1.4878960

 

 

При выводе по Е9.1 ошибка округления может достигать 30–40%; получим

0.1E+01

при выводе по Е9.2 ошибка округления может достигать 5%;

получим

0.15E+01

при выводе по Е10.3 ошибка округления может достигать 0.5%.

получим

0.149E+01

Наиболее оптимальным, по мнению автора, является вывод по спецификации Е10.3, а при гашении незначащего нуля E10.4.

Примечание:

При бесформатном выводе данные автоматически выводятся по спецификации

Е15.7.

Ввод и вывод информации по спецификации Gw.d

Спецификация G является универсальной для ввода и вывода переменных:

1)целого типа;

2)вещественного типа.

Для переменных целого типа формат Gw.d соответствует и работает как формат Iw.

Для переменных вещественного типа при вводе информации, она может быть представлена, как по формату Fw.d, так и по формату Еw.d. Если информацию вводить без десятичной или с десятичной точкой, то спецификация G будет полностью работать, как формат F. Если информацию вводить с плавающей запятой, то спецификация G будет работать, как формат Е. Если вводить информацию для переменной целого типа (I, J, K, L, M, N), то спецификация G будет работать, как формат I.

Вывод переменных целого типа осуществляется, как и по спецификации Iw.

78

Пример:

WRITE(6,10)M

 

10 FORMAT(1X,G8.2)

 

Если М=1235, то выведем:

1235, (как по формату I8).

При выводе данных вещественного типа по спецификации Gw.d, если число может быть выведено по такому же формату Fw.d, то происходит вывод данных, как по формату Fw.d. Но если число не может быть выведено по формату F, то будет сделана попытка вывести его, как по формату Ew.d. При этом действует правило, как и при выводе по спецификации Е: w-d 7 или при гашении незначащего нуля w-d 6.

Пример:

WRITE(6,10) A

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10 FORMAT(1X,G8.2)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Число 16.879 по этому формату выведет:

 

 

 

 

 

 

 

 

 

 

 

16.88

число –389.456 выведет:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

– 389.46

число –33924.1621 нельзя вывести по формату F8.2, поэтому будет сделана попытка вывести его по формату Е8.2. Но это число нельзя вывести и по формату E8.2, так как w-d=6 и на экран выведутся символы « ». Однако на некоторых ЭВМ стоит гашение незначащего нуля и на этих ЭВМ число –33924.1621 по формату G8.2 всё-таки выведется, как -

.34Е+05.

При вводе – выводе информации форматная строка может присутствовать в операторах READ и WRITE вместо метки оператора FORMAT. Она записывается в виде текстовой константы. Предыдущий пример может быть переписан проще и короче без оператора

FORMAT :

WRITE (6,’(1X,G8.2)’)A

Запись операторов ввода – вывода с оператором FORMAT длиннее, но позволяет несколько раз использовать один и тот же оператор FORMAT, обращаясь к нему из разных мест программы.

Задача:

Распечатать в таблицу значения массивов А и В, размерностью 10, и массив С, каждый элемент которого является результатом сложения элементов массивов А и В.

Отобразим в тексте программы символ «пробел» как _. Нам нужно вывести шапку таблицы в таком виде:

======================================

|_N_|_Массив_А_|_Массив_В_|_Массив_С_|

СПрограмма №26 DIMENSION A(10),B(10),C(10)

READ(5,*) A Самый простой ввод массива А

DO 1 I=1,10

WRITE(6,2) I

2 FORMAT(1X,'Введите по формату F5.3 элемент B(',I2,')='\)

Символ \ (обратный слэш) отменяет переход на новую строку по окончании работы оператора FORMAT

79

1 READ(5,3) B(I)

3FORMAT(F5.3) Оператор FORMAT может находиться за пределами цикла и вообще, может находиться в любом месте программы

DO 4 I=1,10

4C(I)=A(I)+B(I)

C

Вывод шапки таблицы

 

WRITE(6,7)

7

FORMAT(1X,38('=')/1X,'|_N_|_МАССИВ_А_|_МАССИВ_В_|_МАССИВ_С_|')

 

Выводится линия из 38 символов =, затем осуществляется переход на другую

 

строку, печатается текст с номером цикла и названиями массивов А,В,С.

 

DO 8 I=1,10

8

WRITE(6,10) I,A(I),B(I),C(I)

10

FORMAT(1X,38('-')/1X,'|',I2,'_|',3(F9.3,'_|'))

 

Выводится линия из 38 символов -, затем осуществляется переход на другую

 

строку, печатается номер цикла и по одному значению элементов трех массивов

 

А,В,С.

 

WRITE(6,11)

11

FORMAT(1X,38('='))

 

Конец таблицы подчеркнули двойной чертой

PAUSE

STOP

END

Задача:

Имеются элементы массива А: -12.8, 3.35 144.7, 16. Имеются элементы массива В: -13, 3.12, 4.275.

Необходимо заполнить двухмерный массив С следующим образом: Сij=Ai Bj.

При этом элементы массива А ввести без десятичной точки, элементы массива В ввести с десятичной точкой, массив С вывести в таблицу по формату Еw.d.

Произведём ввод элементов массива А по форматам: А(1)–F5.1, A(2)–F4.2, A(3)–F5.1, A(4)–F3.0; ввод элементов массива В по форматам: B(1)–F5.1, B(2)–F5.2, B(3)–F6.3.

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

_–128_335_1447_16 _–13._3.12_4.275

СПрограмма №27

 

DIMENSION A(4),B(3),C(4,3)

 

READ(5,6) A,B

6

FORMAT(F5.1,F4.2,F5.1,F3.0/F5.1,F5.2,F6.3)

 

DO 4 I=1,4

 

DO 4 J=1,3

4

C(I,J)=A(I)*B(J)

 

WRITE(6,7) ((C(I,J),J=1,3),I=1,4)

7FORMAT(1X,32('=')/1X,4(1Х,'|',3(E10.3,'|')/),1X,32('=')) PAUSE

STOP END

80